From e84949140b20f083c0f701f983f5e9fa85f8dda4 Mon Sep 17 00:00:00 2001 From: mleku Date: Sat, 27 Dec 2025 16:32:48 +0200 Subject: [PATCH] Add WireGuard VPN with random /31 subnet isolation (v0.40.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add embedded WireGuard VPN server using wireguard-go + netstack - Implement deterministic /31 subnet allocation from seed + sequence - Use Badger's built-in Sequence for atomic counter allocation - Add NIP-46 bunker server for remote signing over VPN - Add revoked key tracking and access audit logging for users - Add Bunker tab to web UI with WireGuard/bunker QR codes - Support key regeneration with old keypair archiving New environment variables: - ORLY_WG_ENABLED: Enable WireGuard VPN server - ORLY_WG_PORT: UDP port for WireGuard (default 51820) - ORLY_WG_ENDPOINT: Public endpoint for WireGuard - ORLY_WG_NETWORK: Base network for subnet pool (default 10.0.0.0/8) - ORLY_BUNKER_ENABLED: Enable NIP-46 bunker - ORLY_BUNKER_PORT: WebSocket port for bunker (default 3335) Files added: - pkg/wireguard/: WireGuard server, keygen, subnet pool, errors - pkg/bunker/: NIP-46 bunker server and session handling - pkg/database/wireguard.go: Peer storage with audit logging - app/handle-wireguard.go: API endpoints for config/regenerate/audit - app/wireguard-helpers.go: Key derivation helpers - app/web/src/BunkerView.svelte: Bunker UI with QR codes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/config/config.go | 29 ++ app/handle-wireguard.go | 514 ++++++++++++++++++++++ app/main.go | 111 +++++ app/server.go | 15 + app/web/dist/bundle.css | 1 + app/web/dist/bundle.js | 31 +- app/web/dist/bundle.js.map | 2 +- app/web/package-lock.json | 331 +++++++++++++- app/web/package.json | 1 + app/web/src/App.svelte | 10 + app/web/src/BunkerView.svelte | 804 ++++++++++++++++++++++++++++++++++ app/web/src/api.js | 95 ++++ app/wireguard-helpers.go | 19 + go.mod | 5 + go.sum | 10 + pkg/bunker/server.go | 182 ++++++++ pkg/bunker/session.go | 240 ++++++++++ pkg/database/wireguard.go | 591 +++++++++++++++++++++++++ pkg/version/version | 2 +- pkg/wireguard/errors.go | 23 + pkg/wireguard/keygen.go | 42 ++ pkg/wireguard/server.go | 281 ++++++++++++ pkg/wireguard/subnet_pool.go | 184 ++++++++ 23 files changed, 3498 insertions(+), 25 deletions(-) create mode 100644 app/handle-wireguard.go create mode 100644 app/web/src/BunkerView.svelte create mode 100644 app/wireguard-helpers.go create mode 100644 pkg/bunker/server.go create mode 100644 pkg/bunker/session.go create mode 100644 pkg/database/wireguard.go create mode 100644 pkg/wireguard/errors.go create mode 100644 pkg/wireguard/keygen.go create mode 100644 pkg/wireguard/server.go create mode 100644 pkg/wireguard/subnet_pool.go diff --git a/app/config/config.go b/app/config/config.go index b2a68bf..8b03766 100644 --- a/app/config/config.go +++ b/app/config/config.go @@ -133,6 +133,16 @@ type C struct { TLSDomains []string `env:"ORLY_TLS_DOMAINS" usage:"comma-separated list of domains to respond to for TLS"` Certs []string `env:"ORLY_CERTS" usage:"comma-separated list of paths to certificate root names (e.g., /path/to/cert will load /path/to/cert.pem and /path/to/cert.key)"` + // WireGuard VPN configuration (for secure bunker access) + WGEnabled bool `env:"ORLY_WG_ENABLED" default:"false" usage:"enable embedded WireGuard VPN server for private bunker access"` + WGPort int `env:"ORLY_WG_PORT" default:"51820" usage:"UDP port for WireGuard VPN server"` + WGEndpoint string `env:"ORLY_WG_ENDPOINT" usage:"public IP/domain for WireGuard endpoint (required if WG enabled)"` + WGNetwork string `env:"ORLY_WG_NETWORK" default:"10.73.0.0/16" usage:"WireGuard internal network CIDR"` + + // NIP-46 Bunker configuration (remote signing service) + BunkerEnabled bool `env:"ORLY_BUNKER_ENABLED" default:"false" usage:"enable NIP-46 bunker signing service (requires WireGuard)"` + BunkerPort int `env:"ORLY_BUNKER_PORT" default:"3335" usage:"internal port for bunker WebSocket (only accessible via WireGuard)"` + // Cluster replication configuration ClusterPropagatePrivilegedEvents bool `env:"ORLY_CLUSTER_PROPAGATE_PRIVILEGED_EVENTS" default:"true" usage:"propagate privileged events (DMs, gift wraps, etc.) to relay peers for replication"` @@ -494,3 +504,22 @@ func (cfg *C) GetRateLimitConfigValues() ( cfg.RateLimitEmergencyThreshold, cfg.RateLimitRecoveryThreshold, cfg.RateLimitEmergencyMaxMs } + +// GetWireGuardConfigValues returns the WireGuard VPN configuration values. +// This avoids circular imports with pkg/wireguard while allowing main.go to construct +// the WireGuard server configuration. +func (cfg *C) GetWireGuardConfigValues() ( + enabled bool, + port int, + endpoint string, + network string, + bunkerEnabled bool, + bunkerPort int, +) { + return cfg.WGEnabled, + cfg.WGPort, + cfg.WGEndpoint, + cfg.WGNetwork, + cfg.BunkerEnabled, + cfg.BunkerPort +} diff --git a/app/handle-wireguard.go b/app/handle-wireguard.go new file mode 100644 index 0000000..9fe77b2 --- /dev/null +++ b/app/handle-wireguard.go @@ -0,0 +1,514 @@ +package app + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "net/http" + + "git.mleku.dev/mleku/nostr/encoders/bech32encoding" + "git.mleku.dev/mleku/nostr/encoders/hex" + "git.mleku.dev/mleku/nostr/httpauth" + "lol.mleku.dev/chk" + "lol.mleku.dev/log" + + "next.orly.dev/pkg/acl" + "next.orly.dev/pkg/database" +) + +// WireGuardConfigResponse is returned by the /api/wireguard/config endpoint. +type WireGuardConfigResponse struct { + ConfigText string `json:"config_text"` + Interface WGInterface `json:"interface"` + Peer WGPeer `json:"peer"` +} + +// WGInterface represents the [Interface] section of a WireGuard config. +type WGInterface struct { + Address string `json:"address"` + PrivateKey string `json:"private_key"` +} + +// WGPeer represents the [Peer] section of a WireGuard config. +type WGPeer struct { + PublicKey string `json:"public_key"` + Endpoint string `json:"endpoint"` + AllowedIPs string `json:"allowed_ips"` +} + +// BunkerURLResponse is returned by the /api/bunker/url endpoint. +type BunkerURLResponse struct { + URL string `json:"url"` + RelayNpub string `json:"relay_npub"` + RelayPubkey string `json:"relay_pubkey"` + InternalIP string `json:"internal_ip"` +} + +// handleWireGuardConfig returns the user's WireGuard configuration. +// Requires NIP-98 authentication and write+ access. +func (s *Server) handleWireGuardConfig(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // Check if WireGuard is enabled + if !s.Config.WGEnabled { + http.Error(w, "WireGuard is not enabled on this relay", http.StatusNotFound) + return + } + + // Check if ACL mode supports WireGuard + if s.Config.ACLMode == "none" { + http.Error(w, "WireGuard requires ACL mode 'follows' or 'managed'", http.StatusForbidden) + return + } + + // Validate NIP-98 authentication + valid, pubkey, err := httpauth.CheckAuth(r) + if chk.E(err) || !valid { + http.Error(w, "NIP-98 authentication required", http.StatusUnauthorized) + return + } + + // Check user has write+ access + accessLevel := acl.Registry.GetAccessLevel(pubkey, r.RemoteAddr) + if accessLevel != "write" && accessLevel != "admin" && accessLevel != "owner" { + http.Error(w, "Write access required for WireGuard", http.StatusForbidden) + return + } + + // Type assert to Badger database for WireGuard methods + badgerDB, ok := s.DB.(*database.D) + if !ok { + http.Error(w, "WireGuard requires Badger database backend", http.StatusInternalServerError) + return + } + + // Check subnet pool is available + if s.subnetPool == nil { + http.Error(w, "WireGuard subnet pool not initialized", http.StatusInternalServerError) + return + } + + // Get or create WireGuard peer for this user + peer, err := badgerDB.GetOrCreateWireGuardPeer(pubkey, s.subnetPool) + if chk.E(err) { + log.E.F("failed to get/create WireGuard peer: %v", err) + http.Error(w, "Failed to create WireGuard configuration", http.StatusInternalServerError) + return + } + + // Derive subnet IPs from sequence + subnet := s.subnetPool.SubnetForSequence(peer.Sequence) + clientIP := subnet.ClientIP.String() + serverIP := subnet.ServerIP.String() + + // Get server public key + serverKey, err := badgerDB.GetOrCreateWireGuardServerKey() + if chk.E(err) { + log.E.F("failed to get WireGuard server key: %v", err) + http.Error(w, "WireGuard server not configured", http.StatusInternalServerError) + return + } + + serverPubKey, err := deriveWGPublicKey(serverKey) + if chk.E(err) { + log.E.F("failed to derive server public key: %v", err) + http.Error(w, "WireGuard server error", http.StatusInternalServerError) + return + } + + // Build endpoint + endpoint := fmt.Sprintf("%s:%d", s.Config.WGEndpoint, s.Config.WGPort) + + // Build response + resp := WireGuardConfigResponse{ + Interface: WGInterface{ + Address: clientIP + "/32", + PrivateKey: base64.StdEncoding.EncodeToString(peer.WGPrivateKey), + }, + Peer: WGPeer{ + PublicKey: base64.StdEncoding.EncodeToString(serverPubKey), + Endpoint: endpoint, + AllowedIPs: serverIP + "/32", // Only route bunker traffic to this peer's server IP + }, + } + + // Generate config text + resp.ConfigText = fmt.Sprintf(`[Interface] +Address = %s +PrivateKey = %s + +[Peer] +PublicKey = %s +Endpoint = %s +AllowedIPs = %s +PersistentKeepalive = 25 +`, resp.Interface.Address, resp.Interface.PrivateKey, + resp.Peer.PublicKey, resp.Peer.Endpoint, resp.Peer.AllowedIPs) + + // If WireGuard server is running, add the peer + if s.wireguardServer != nil && s.wireguardServer.IsRunning() { + if err := s.wireguardServer.AddPeer(pubkey, peer.WGPublicKey, clientIP); chk.E(err) { + log.W.F("failed to add peer to running WireGuard server: %v", err) + } + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) +} + +// handleWireGuardRegenerate generates a new WireGuard keypair for the user. +// Requires NIP-98 authentication and write+ access. +func (s *Server) handleWireGuardRegenerate(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // Check if WireGuard is enabled + if !s.Config.WGEnabled { + http.Error(w, "WireGuard is not enabled on this relay", http.StatusNotFound) + return + } + + // Check if ACL mode supports WireGuard + if s.Config.ACLMode == "none" { + http.Error(w, "WireGuard requires ACL mode 'follows' or 'managed'", http.StatusForbidden) + return + } + + // Validate NIP-98 authentication + valid, pubkey, err := httpauth.CheckAuth(r) + if chk.E(err) || !valid { + http.Error(w, "NIP-98 authentication required", http.StatusUnauthorized) + return + } + + // Check user has write+ access + accessLevel := acl.Registry.GetAccessLevel(pubkey, r.RemoteAddr) + if accessLevel != "write" && accessLevel != "admin" && accessLevel != "owner" { + http.Error(w, "Write access required for WireGuard", http.StatusForbidden) + return + } + + // Type assert to Badger database for WireGuard methods + badgerDB, ok := s.DB.(*database.D) + if !ok { + http.Error(w, "WireGuard requires Badger database backend", http.StatusInternalServerError) + return + } + + // Check subnet pool is available + if s.subnetPool == nil { + http.Error(w, "WireGuard subnet pool not initialized", http.StatusInternalServerError) + return + } + + // Remove old peer from running server if exists + oldPeer, err := badgerDB.GetWireGuardPeer(pubkey) + if err == nil && oldPeer != nil && s.wireguardServer != nil && s.wireguardServer.IsRunning() { + s.wireguardServer.RemovePeer(oldPeer.WGPublicKey) + } + + // Regenerate keypair + peer, err := badgerDB.RegenerateWireGuardPeer(pubkey, s.subnetPool) + if chk.E(err) { + log.E.F("failed to regenerate WireGuard peer: %v", err) + http.Error(w, "Failed to regenerate WireGuard configuration", http.StatusInternalServerError) + return + } + + // Derive subnet IPs from sequence (same sequence as before) + subnet := s.subnetPool.SubnetForSequence(peer.Sequence) + clientIP := subnet.ClientIP.String() + + log.I.F("regenerated WireGuard keypair for user: %s", hex.Enc(pubkey[:8])) + + // Return success with IP (same subnet as before) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]string{ + "status": "regenerated", + "assigned_ip": clientIP, + }) +} + +// handleBunkerURL returns the bunker connection URL. +// Requires NIP-98 authentication and write+ access. +func (s *Server) handleBunkerURL(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // Check if bunker is enabled + if !s.Config.BunkerEnabled { + http.Error(w, "Bunker is not enabled on this relay", http.StatusNotFound) + return + } + + // Check if WireGuard is enabled (required for bunker) + if !s.Config.WGEnabled { + http.Error(w, "WireGuard is required for bunker access", http.StatusNotFound) + return + } + + // Check if ACL mode supports WireGuard + if s.Config.ACLMode == "none" { + http.Error(w, "Bunker requires ACL mode 'follows' or 'managed'", http.StatusForbidden) + return + } + + // Validate NIP-98 authentication + valid, pubkey, err := httpauth.CheckAuth(r) + if chk.E(err) || !valid { + http.Error(w, "NIP-98 authentication required", http.StatusUnauthorized) + return + } + + // Check user has write+ access + accessLevel := acl.Registry.GetAccessLevel(pubkey, r.RemoteAddr) + if accessLevel != "write" && accessLevel != "admin" && accessLevel != "owner" { + http.Error(w, "Write access required for bunker", http.StatusForbidden) + return + } + + // Type assert to Badger database for WireGuard methods + badgerDB, ok := s.DB.(*database.D) + if !ok { + http.Error(w, "Bunker requires Badger database backend", http.StatusInternalServerError) + return + } + + // Check subnet pool is available + if s.subnetPool == nil { + http.Error(w, "WireGuard subnet pool not initialized", http.StatusInternalServerError) + return + } + + // Get or create WireGuard peer to get their subnet + peer, err := badgerDB.GetOrCreateWireGuardPeer(pubkey, s.subnetPool) + if chk.E(err) { + log.E.F("failed to get/create WireGuard peer for bunker: %v", err) + http.Error(w, "Failed to get WireGuard configuration", http.StatusInternalServerError) + return + } + + // Derive server IP for this peer's subnet + subnet := s.subnetPool.SubnetForSequence(peer.Sequence) + serverIP := subnet.ServerIP.String() + + // Get relay identity + relaySecret, err := s.DB.GetOrCreateRelayIdentitySecret() + if chk.E(err) { + log.E.F("failed to get relay identity: %v", err) + http.Error(w, "Failed to get relay identity", http.StatusInternalServerError) + return + } + + relayPubkey, err := deriveNostrPublicKey(relaySecret) + if chk.E(err) { + log.E.F("failed to derive relay public key: %v", err) + http.Error(w, "Failed to derive relay public key", http.StatusInternalServerError) + return + } + + // Encode as npub + relayNpubBytes, err := bech32encoding.BinToNpub(relayPubkey) + relayNpub := string(relayNpubBytes) + if chk.E(err) { + relayNpub = hex.Enc(relayPubkey) // Fallback to hex + } + + // Build bunker URL using this peer's server IP + // Format: bunker://?relay=ws://:3335 + relayPubkeyHex := hex.Enc(relayPubkey) + bunkerURL := fmt.Sprintf("bunker://%s?relay=ws://%s:%d", + relayPubkeyHex, + serverIP, + s.Config.BunkerPort, + ) + + resp := BunkerURLResponse{ + URL: bunkerURL, + RelayNpub: relayNpub, + RelayPubkey: relayPubkeyHex, + InternalIP: serverIP, + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) +} + +// handleWireGuardStatus returns whether WireGuard/Bunker are available. +func (s *Server) handleWireGuardStatus(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + resp := map[string]interface{}{ + "wireguard_enabled": s.Config.WGEnabled, + "bunker_enabled": s.Config.BunkerEnabled, + "acl_mode": s.Config.ACLMode, + "available": s.Config.WGEnabled && s.Config.ACLMode != "none", + } + + if s.wireguardServer != nil { + resp["wireguard_running"] = s.wireguardServer.IsRunning() + resp["peer_count"] = s.wireguardServer.PeerCount() + } + + if s.bunkerServer != nil { + resp["bunker_sessions"] = s.bunkerServer.SessionCount() + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) +} + +// RevokedKeyResponse is the JSON response for revoked keys. +type RevokedKeyResponse struct { + NostrPubkey string `json:"nostr_pubkey"` + WGPublicKey string `json:"wg_public_key"` + Sequence uint32 `json:"sequence"` + ClientIP string `json:"client_ip"` + ServerIP string `json:"server_ip"` + CreatedAt int64 `json:"created_at"` + RevokedAt int64 `json:"revoked_at"` + AccessCount int `json:"access_count"` + LastAccessAt int64 `json:"last_access_at"` +} + +// AccessLogResponse is the JSON response for access logs. +type AccessLogResponse struct { + NostrPubkey string `json:"nostr_pubkey"` + WGPublicKey string `json:"wg_public_key"` + Sequence uint32 `json:"sequence"` + ClientIP string `json:"client_ip"` + Timestamp int64 `json:"timestamp"` + RemoteAddr string `json:"remote_addr"` +} + +// handleWireGuardAudit returns the user's own revoked keys and access logs. +// This lets users see if their old WireGuard keys are still being used, +// which could indicate they left something on or someone copied their credentials. +// Requires NIP-98 authentication and write+ access. +func (s *Server) handleWireGuardAudit(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // Check if WireGuard is enabled + if !s.Config.WGEnabled { + http.Error(w, "WireGuard is not enabled on this relay", http.StatusNotFound) + return + } + + // Validate NIP-98 authentication + valid, pubkey, err := httpauth.CheckAuth(r) + if chk.E(err) || !valid { + http.Error(w, "NIP-98 authentication required", http.StatusUnauthorized) + return + } + + // Check user has write+ access (same as other WireGuard endpoints) + accessLevel := acl.Registry.GetAccessLevel(pubkey, r.RemoteAddr) + if accessLevel != "write" && accessLevel != "admin" && accessLevel != "owner" { + http.Error(w, "Write access required", http.StatusForbidden) + return + } + + // Type assert to Badger database for WireGuard methods + badgerDB, ok := s.DB.(*database.D) + if !ok { + http.Error(w, "WireGuard requires Badger database backend", http.StatusInternalServerError) + return + } + + // Check subnet pool is available + if s.subnetPool == nil { + http.Error(w, "WireGuard subnet pool not initialized", http.StatusInternalServerError) + return + } + + // Get this user's revoked keys only + revokedKeys, err := badgerDB.GetRevokedKeys(pubkey) + if chk.E(err) { + log.E.F("failed to get revoked keys: %v", err) + http.Error(w, "Failed to get revoked keys", http.StatusInternalServerError) + return + } + + // Get this user's access logs only + accessLogs, err := badgerDB.GetAccessLogs(pubkey) + if chk.E(err) { + log.E.F("failed to get access logs: %v", err) + http.Error(w, "Failed to get access logs", http.StatusInternalServerError) + return + } + + // Convert to response format + var revokedResp []RevokedKeyResponse + for _, key := range revokedKeys { + subnet := s.subnetPool.SubnetForSequence(key.Sequence) + revokedResp = append(revokedResp, RevokedKeyResponse{ + NostrPubkey: hex.Enc(key.NostrPubkey), + WGPublicKey: hex.Enc(key.WGPublicKey), + Sequence: key.Sequence, + ClientIP: subnet.ClientIP.String(), + ServerIP: subnet.ServerIP.String(), + CreatedAt: key.CreatedAt, + RevokedAt: key.RevokedAt, + AccessCount: key.AccessCount, + LastAccessAt: key.LastAccessAt, + }) + } + + var accessResp []AccessLogResponse + for _, logEntry := range accessLogs { + subnet := s.subnetPool.SubnetForSequence(logEntry.Sequence) + accessResp = append(accessResp, AccessLogResponse{ + NostrPubkey: hex.Enc(logEntry.NostrPubkey), + WGPublicKey: hex.Enc(logEntry.WGPublicKey), + Sequence: logEntry.Sequence, + ClientIP: subnet.ClientIP.String(), + Timestamp: logEntry.Timestamp, + RemoteAddr: logEntry.RemoteAddr, + }) + } + + resp := map[string]interface{}{ + "revoked_keys": revokedResp, + "access_logs": accessResp, + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) +} + +// deriveWGPublicKey derives a Curve25519 public key from a private key. +func deriveWGPublicKey(privateKey []byte) ([]byte, error) { + if len(privateKey) != 32 { + return nil, fmt.Errorf("invalid private key length: %d", len(privateKey)) + } + + // Use wireguard package + return derivePublicKey(privateKey) +} + +// deriveNostrPublicKey derives a secp256k1 public key from a secret key. +func deriveNostrPublicKey(secretKey []byte) ([]byte, error) { + if len(secretKey) != 32 { + return nil, fmt.Errorf("invalid secret key length: %d", len(secretKey)) + } + + // Use nostr library's key derivation + pk, err := deriveSecp256k1PublicKey(secretKey) + if err != nil { + return nil, err + } + return pk, nil +} diff --git a/app/main.go b/app/main.go index ddeb7f4..bc18f14 100644 --- a/app/main.go +++ b/app/main.go @@ -22,9 +22,13 @@ import ( "next.orly.dev/pkg/protocol/graph" "next.orly.dev/pkg/protocol/nip43" "next.orly.dev/pkg/protocol/publish" + "next.orly.dev/pkg/bunker" "next.orly.dev/pkg/ratelimit" "next.orly.dev/pkg/spider" dsync "next.orly.dev/pkg/sync" + "next.orly.dev/pkg/wireguard" + + "git.mleku.dev/mleku/nostr/interfaces/signer/p8k" ) func Run( @@ -330,6 +334,101 @@ func Run( log.I.F("Non-Badger backend detected (type: %T), Blossom server not available", db) } + // Initialize WireGuard VPN and NIP-46 Bunker (only for Badger backend) + // Requires ACL mode 'follows' or 'managed' - no point for open relays + if badgerDB, ok := db.(*database.D); ok && cfg.WGEnabled && cfg.ACLMode != "none" { + if cfg.WGEndpoint == "" { + log.E.F("WireGuard enabled but ORLY_WG_ENDPOINT not set - skipping") + } else { + // Get or create the subnet pool (restores seed and allocations from DB) + subnetPool, err := badgerDB.GetOrCreateSubnetPool(cfg.WGNetwork) + if err != nil { + log.E.F("failed to create subnet pool: %v", err) + } else { + l.subnetPool = subnetPool + + // Get or create WireGuard server key + wgServerKey, err := badgerDB.GetOrCreateWireGuardServerKey() + if err != nil { + log.E.F("failed to get WireGuard server key: %v", err) + } else { + // Create WireGuard server + wgConfig := &wireguard.Config{ + Port: cfg.WGPort, + Endpoint: cfg.WGEndpoint, + PrivateKey: wgServerKey, + Network: cfg.WGNetwork, + ServerIP: "10.73.0.1", + } + + l.wireguardServer, err = wireguard.New(wgConfig) + if err != nil { + log.E.F("failed to create WireGuard server: %v", err) + } else { + if err = l.wireguardServer.Start(); err != nil { + log.E.F("failed to start WireGuard server: %v", err) + } else { + log.I.F("WireGuard VPN server started on UDP port %d", cfg.WGPort) + + // Load existing peers from database and add to server + peers, err := badgerDB.GetAllWireGuardPeers() + if err != nil { + log.W.F("failed to load existing WireGuard peers: %v", err) + } else { + for _, peer := range peers { + // Derive client IP from sequence + subnet := subnetPool.SubnetForSequence(peer.Sequence) + clientIP := subnet.ClientIP.String() + if err := l.wireguardServer.AddPeer(peer.NostrPubkey, peer.WGPublicKey, clientIP); err != nil { + log.W.F("failed to add existing peer: %v", err) + } + } + if len(peers) > 0 { + log.I.F("loaded %d existing WireGuard peers", len(peers)) + } + } + + // Initialize bunker if enabled + if cfg.BunkerEnabled { + // Get relay identity for signing + relaySecretKey, err := badgerDB.GetOrCreateRelayIdentitySecret() + if err != nil { + log.E.F("failed to get relay identity for bunker: %v", err) + } else { + // Create signer from secret key + relaySigner, sigErr := p8k.New() + if sigErr != nil { + log.E.F("failed to create signer for bunker: %v", sigErr) + } else if sigErr = relaySigner.InitSec(relaySecretKey); sigErr != nil { + log.E.F("failed to init signer for bunker: %v", sigErr) + } else { + relayPubkey := relaySigner.Pub() + + bunkerConfig := &bunker.Config{ + RelaySigner: relaySigner, + RelayPubkey: relayPubkey[:], + Netstack: l.wireguardServer.GetNetstack(), + ListenAddr: fmt.Sprintf("10.73.0.1:%d", cfg.BunkerPort), + } + + l.bunkerServer = bunker.New(bunkerConfig) + if err = l.bunkerServer.Start(); err != nil { + log.E.F("failed to start bunker server: %v", err) + } else { + log.I.F("NIP-46 bunker server started on 10.73.0.1:%d (WireGuard only)", cfg.BunkerPort) + } + } + } + } + } + } + } + } + } + } else if cfg.WGEnabled && cfg.ACLMode == "none" { + log.I.F("WireGuard disabled: requires ACL mode 'follows' or 'managed' (currently: 'none')") + } + // Initialize event domain services (validation, routing, processing) l.InitEventServices() @@ -492,6 +591,18 @@ func Run( log.I.F("rate limiter stopped") } + // Stop bunker server if running + if l.bunkerServer != nil { + l.bunkerServer.Stop() + log.I.F("bunker server stopped") + } + + // Stop WireGuard server if running + if l.wireguardServer != nil { + l.wireguardServer.Stop() + log.I.F("WireGuard server stopped") + } + // Create shutdown context with timeout shutdownCtx, cancelShutdown := context.WithTimeout(context.Background(), 10*time.Second) defer cancelShutdown() diff --git a/app/server.go b/app/server.go index fcd4b04..757dbb8 100644 --- a/app/server.go +++ b/app/server.go @@ -33,9 +33,11 @@ import ( "next.orly.dev/pkg/protocol/graph" "next.orly.dev/pkg/protocol/nip43" "next.orly.dev/pkg/protocol/publish" + "next.orly.dev/pkg/bunker" "next.orly.dev/pkg/ratelimit" "next.orly.dev/pkg/spider" dsync "next.orly.dev/pkg/sync" + "next.orly.dev/pkg/wireguard" ) type Server struct { @@ -78,6 +80,11 @@ type Server struct { eventAuthorizer *authorization.Service eventRouter *routing.DefaultRouter eventProcessor *processing.Service + + // WireGuard VPN and NIP-46 Bunker + wireguardServer *wireguard.Server + bunkerServer *bunker.Server + subnetPool *wireguard.SubnetPool } // isIPBlacklisted checks if an IP address is blacklisted using the managed ACL system @@ -335,6 +342,14 @@ func (s *Server) UserInterface() { s.mux.HandleFunc("/cluster/events", s.clusterManager.HandleEventsRange) log.Printf("Cluster replication API enabled at /cluster") } + + // WireGuard VPN and Bunker API endpoints + // These are always registered but will return errors if not enabled + s.mux.HandleFunc("/api/wireguard/config", s.handleWireGuardConfig) + s.mux.HandleFunc("/api/wireguard/regenerate", s.handleWireGuardRegenerate) + s.mux.HandleFunc("/api/wireguard/status", s.handleWireGuardStatus) + s.mux.HandleFunc("/api/wireguard/audit", s.handleWireGuardAudit) + s.mux.HandleFunc("/api/bunker/url", s.handleBunkerURL) } // handleFavicon serves orly-favicon.png as favicon.ico diff --git a/app/web/dist/bundle.css b/app/web/dist/bundle.css index d5f9469..ebfcb0d 100644 --- a/app/web/dist/bundle.css +++ b/app/web/dist/bundle.css @@ -12,6 +12,7 @@ .sprocket-view.svelte-fiaj1r.svelte-fiaj1r{width:100%;max-width:1200px;margin:0;padding:20px;background:var(--header-bg);color:var(--text-color);border-radius:8px}.sprocket-view.svelte-fiaj1r h2.svelte-fiaj1r{margin:0 0 1.5rem 0;color:var(--text-color);font-size:1.8rem;font-weight:600}.sprocket-section.svelte-fiaj1r.svelte-fiaj1r{background-color:var(--card-bg);border-radius:8px;padding:1em;margin-bottom:1.5rem;border:1px solid var(--border-color);width:32em}.sprocket-header.svelte-fiaj1r.svelte-fiaj1r{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.sprocket-header.svelte-fiaj1r h3.svelte-fiaj1r{margin:0;color:var(--text-color);font-size:1.2rem;font-weight:600}.sprocket-controls.svelte-fiaj1r.svelte-fiaj1r{display:flex;gap:0.5rem}.sprocket-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em;transition:background-color 0.2s;display:flex;align-items:center;gap:0.25em}.sprocket-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--accent-hover-color)}.sprocket-btn.svelte-fiaj1r.svelte-fiaj1r:disabled{background:var(--secondary);cursor:not-allowed}.restart-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--warning)}.restart-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--warning);filter:brightness(0.9)}.delete-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--danger)}.delete-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--danger);filter:brightness(0.9)}.sprocket-upload-section.svelte-fiaj1r.svelte-fiaj1r{margin-bottom:1.5rem}.sprocket-upload-section.svelte-fiaj1r h4.svelte-fiaj1r{margin:0 0 0.5rem 0;color:var(--text-color);font-size:1rem;font-weight:600}.upload-controls.svelte-fiaj1r.svelte-fiaj1r{display:flex;flex-direction:column;gap:0.5rem}#sprocket-upload-file.svelte-fiaj1r.svelte-fiaj1r{padding:0.5em;border:1px solid var(--border-color);border-radius:4px;background:var(--input-bg);color:var(--input-text-color)}.upload-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--success);align-self:flex-start}.upload-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--success);filter:brightness(0.9)}.sprocket-status.svelte-fiaj1r.svelte-fiaj1r{display:flex;flex-direction:column;gap:0.5rem;margin-bottom:1.5rem;padding:1rem;background:var(--bg-color);border-radius:4px;border:1px solid var(--border-color)}.status-item.svelte-fiaj1r.svelte-fiaj1r{display:flex;justify-content:space-between;align-items:center}.status-label.svelte-fiaj1r.svelte-fiaj1r{font-weight:600;color:var(--text-color)}.status-value.svelte-fiaj1r.svelte-fiaj1r{color:var(--text-color)}.status-value.running.svelte-fiaj1r.svelte-fiaj1r{color:var(--success)}.script-editor-container.svelte-fiaj1r.svelte-fiaj1r{margin-bottom:1.5rem}.script-editor.svelte-fiaj1r.svelte-fiaj1r{width:100%;height:300px;padding:1em;border:1px solid var(--border-color);border-radius:4px;background:var(--input-bg);color:var(--input-text-color);font-family:monospace;font-size:0.9em;line-height:1.4;resize:vertical}.script-editor.svelte-fiaj1r.svelte-fiaj1r:disabled{opacity:0.6;cursor:not-allowed}.script-actions.svelte-fiaj1r.svelte-fiaj1r{display:flex;gap:0.5rem;margin-bottom:1rem}.save-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--success)}.save-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--success);filter:brightness(0.9)}.load-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--info)}.load-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--info);filter:brightness(0.9)}.sprocket-message.svelte-fiaj1r.svelte-fiaj1r{padding:1rem;border-radius:4px;margin-top:1rem;background:var(--success-bg);color:var(--success-text);border:1px solid var(--success)}.sprocket-message.error.svelte-fiaj1r.svelte-fiaj1r{background:var(--danger-bg);color:var(--danger-text);border:1px solid var(--danger)}.versions-list.svelte-fiaj1r.svelte-fiaj1r{display:flex;flex-direction:column;gap:0.5rem;margin-bottom:1rem}.version-item.svelte-fiaj1r.svelte-fiaj1r{display:flex;justify-content:space-between;align-items:center;padding:0.75rem;background:var(--bg-color);border:1px solid var(--border-color);border-radius:4px}.version-item.current.svelte-fiaj1r.svelte-fiaj1r{border-color:var(--primary);background:var(--primary-bg)}.version-info.svelte-fiaj1r.svelte-fiaj1r{flex:1}.version-name.svelte-fiaj1r.svelte-fiaj1r{font-weight:600;color:var(--text-color);margin-bottom:0.25rem}.version-date.svelte-fiaj1r.svelte-fiaj1r{font-size:0.8em;color:var(--text-color);opacity:0.7;display:flex;align-items:center;gap:0.5rem}.current-badge.svelte-fiaj1r.svelte-fiaj1r{background:var(--primary);color:var(--text-color);padding:0.1em 0.4em;border-radius:0.25rem;font-size:0.7em;font-weight:600}.version-actions.svelte-fiaj1r.svelte-fiaj1r{display:flex;gap:0.25rem}.version-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--primary);color:var(--text-color);border:none;padding:0.25em 0.5em;border-radius:0.25rem;cursor:pointer;font-size:0.8em;transition:background-color 0.2s}.version-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--accent-hover-color)}.version-btn.svelte-fiaj1r.svelte-fiaj1r:disabled{background:var(--secondary);cursor:not-allowed}.version-btn.delete-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--danger)}.version-btn.delete-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--danger);filter:brightness(0.9)}.refresh-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--info)}.refresh-btn.svelte-fiaj1r.svelte-fiaj1r:hover:not(:disabled){background:var(--info);filter:brightness(0.9)}.permission-denied.svelte-fiaj1r.svelte-fiaj1r,.login-prompt.svelte-fiaj1r.svelte-fiaj1r{text-align:center;padding:2em;background-color:var(--card-bg);border-radius:8px;border:1px solid var(--border-color);color:var(--text-color)}.permission-denied.svelte-fiaj1r p.svelte-fiaj1r,.login-prompt.svelte-fiaj1r p.svelte-fiaj1r{margin:0 0 1rem 0;line-height:1.4}.permission-denied.svelte-fiaj1r code.svelte-fiaj1r{background:var(--code-bg);padding:0.2em 0.4em;border-radius:0.25rem;font-family:monospace;font-size:0.9em}.login-btn.svelte-fiaj1r.svelte-fiaj1r{background:var(--primary);color:var(--text-color);border:none;padding:0.75em 1.5em;border-radius:4px;cursor:pointer;font-weight:bold;font-size:0.9em;transition:background-color 0.2s}.login-btn.svelte-fiaj1r.svelte-fiaj1r:hover{background:var(--accent-hover-color)} .policy-view.svelte-gkxvxc.svelte-gkxvxc{width:100%;max-width:1200px;margin:0;padding:20px;background:var(--header-bg);color:var(--text-color);border-radius:8px;box-sizing:border-box}.policy-view.svelte-gkxvxc h2.svelte-gkxvxc{margin:0 0 1.5rem 0;color:var(--text-color);font-size:1.8rem;font-weight:600}.policy-section.svelte-gkxvxc.svelte-gkxvxc{background-color:var(--card-bg);border-radius:8px;padding:1.5em;margin-bottom:1.5rem;border:1px solid var(--border-color)}.policy-header.svelte-gkxvxc.svelte-gkxvxc{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.policy-header.svelte-gkxvxc h3.svelte-gkxvxc{margin:0;color:var(--text-color);font-size:1.2rem;font-weight:600}.policy-status.svelte-gkxvxc.svelte-gkxvxc{display:flex;gap:0.5rem}.status-badge.svelte-gkxvxc.svelte-gkxvxc{padding:0.25em 0.75em;border-radius:1rem;font-size:0.8em;font-weight:600;background:var(--danger);color:white}.status-badge.enabled.svelte-gkxvxc.svelte-gkxvxc{background:var(--success)}.admin-badge.svelte-gkxvxc.svelte-gkxvxc{padding:0.25em 0.75em;border-radius:1rem;font-size:0.8em;font-weight:600;background:var(--primary);color:white}.policy-info.svelte-gkxvxc.svelte-gkxvxc{margin-bottom:1rem;padding:1rem;background:var(--bg-color);border-radius:4px;border:1px solid var(--border-color)}.policy-info.svelte-gkxvxc p.svelte-gkxvxc{margin:0 0 0.5rem 0;line-height:1.5}.policy-info.svelte-gkxvxc p.svelte-gkxvxc:last-child{margin-bottom:0}.info-note.svelte-gkxvxc.svelte-gkxvxc{font-size:0.9em;opacity:0.8}.editor-container.svelte-gkxvxc.svelte-gkxvxc{margin-bottom:1rem}.policy-editor.svelte-gkxvxc.svelte-gkxvxc{width:100%;height:400px;padding:1em;border:1px solid var(--border-color);border-radius:4px;background:var(--input-bg);color:var(--input-text-color);font-family:'Monaco', 'Menlo', 'Ubuntu Mono', monospace;font-size:0.85em;line-height:1.5;resize:vertical;tab-size:2}.policy-editor.svelte-gkxvxc.svelte-gkxvxc:disabled{opacity:0.6;cursor:not-allowed}.validation-errors.svelte-gkxvxc.svelte-gkxvxc{margin-bottom:1rem;padding:1rem;background:var(--danger-bg, rgba(220, 53, 69, 0.1));border:1px solid var(--danger);border-radius:4px}.validation-errors.svelte-gkxvxc h4.svelte-gkxvxc{margin:0 0 0.5rem 0;color:var(--danger);font-size:1rem}.validation-errors.svelte-gkxvxc ul.svelte-gkxvxc{margin:0;padding-left:1.5rem}.validation-errors.svelte-gkxvxc li.svelte-gkxvxc{color:var(--danger);margin-bottom:0.25rem}.policy-actions.svelte-gkxvxc.svelte-gkxvxc{display:flex;gap:0.5rem;flex-wrap:wrap}.policy-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--primary);color:white;border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em;transition:background-color 0.2s, filter 0.2s;display:flex;align-items:center;gap:0.25em}.policy-btn.svelte-gkxvxc.svelte-gkxvxc:hover:not(:disabled){filter:brightness(1.1)}.policy-btn.svelte-gkxvxc.svelte-gkxvxc:disabled{background:var(--secondary);cursor:not-allowed}.load-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--info)}.format-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--secondary)}.validate-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--warning)}.save-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--success)}.policy-message.svelte-gkxvxc.svelte-gkxvxc{padding:1rem;border-radius:4px;margin-top:1rem;background:var(--info-bg, rgba(23, 162, 184, 0.1));color:var(--info-text, var(--text-color));border:1px solid var(--info)}.policy-message.error.svelte-gkxvxc.svelte-gkxvxc{background:var(--danger-bg, rgba(220, 53, 69, 0.1));color:var(--danger-text, var(--danger));border:1px solid var(--danger)}.policy-message.success.svelte-gkxvxc.svelte-gkxvxc{background:var(--success-bg, rgba(40, 167, 69, 0.1));color:var(--success-text, var(--success));border:1px solid var(--success)}.reference-content.svelte-gkxvxc h4.svelte-gkxvxc{margin:1rem 0 0.5rem 0;color:var(--text-color);font-size:1rem}.reference-content.svelte-gkxvxc h4.svelte-gkxvxc:first-child{margin-top:0}.field-list.svelte-gkxvxc.svelte-gkxvxc{margin:0 0 1rem 0;padding-left:1.5rem}.field-list.svelte-gkxvxc li.svelte-gkxvxc{margin-bottom:0.25rem;line-height:1.5}.field-list.svelte-gkxvxc code.svelte-gkxvxc{background:var(--code-bg, rgba(0, 0, 0, 0.1));padding:0.1em 0.4em;border-radius:3px;font-family:'Monaco', 'Menlo', 'Ubuntu Mono', monospace;font-size:0.9em}.example-json.svelte-gkxvxc.svelte-gkxvxc{background:var(--input-bg);color:var(--input-text-color);padding:1rem;border-radius:4px;border:1px solid var(--border-color);font-family:'Monaco', 'Menlo', 'Ubuntu Mono', monospace;font-size:0.8em;line-height:1.4;overflow-x:auto;white-space:pre;margin:0}.permission-denied.svelte-gkxvxc.svelte-gkxvxc,.login-prompt.svelte-gkxvxc.svelte-gkxvxc{text-align:center;padding:2em;background-color:var(--card-bg);border-radius:8px;border:1px solid var(--border-color);color:var(--text-color)}.permission-denied.svelte-gkxvxc p.svelte-gkxvxc,.login-prompt.svelte-gkxvxc p.svelte-gkxvxc{margin:0 0 1rem 0;line-height:1.4}.permission-denied.svelte-gkxvxc code.svelte-gkxvxc{background:var(--code-bg, rgba(0, 0, 0, 0.1));padding:0.2em 0.4em;border-radius:0.25rem;font-family:monospace;font-size:0.9em}.login-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--primary);color:white;border:none;padding:0.75em 1.5em;border-radius:4px;cursor:pointer;font-weight:bold;font-size:0.9em;transition:background-color 0.2s}.login-btn.svelte-gkxvxc.svelte-gkxvxc:hover{filter:brightness(1.1)}.admin-list.svelte-gkxvxc.svelte-gkxvxc{margin-bottom:1rem}.admin-item.svelte-gkxvxc.svelte-gkxvxc{display:flex;justify-content:space-between;align-items:center;padding:0.5em 0.75em;background:var(--bg-color);border:1px solid var(--border-color);border-radius:4px;margin-bottom:0.5rem}.admin-pubkey.svelte-gkxvxc.svelte-gkxvxc{font-family:'Monaco', 'Menlo', 'Ubuntu Mono', monospace;font-size:0.85em;color:var(--text-color)}.remove-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--danger);color:white;border:none;width:24px;height:24px;border-radius:50%;cursor:pointer;font-size:0.8em;display:flex;align-items:center;justify-content:center;transition:filter 0.2s}.remove-btn.svelte-gkxvxc.svelte-gkxvxc:hover:not(:disabled){filter:brightness(0.9)}.remove-btn.svelte-gkxvxc.svelte-gkxvxc:disabled{opacity:0.5;cursor:not-allowed}.add-admin.svelte-gkxvxc.svelte-gkxvxc{display:flex;gap:0.5rem}.add-admin.svelte-gkxvxc input.svelte-gkxvxc{flex:1;padding:0.5em 0.75em;border:1px solid var(--border-color);border-radius:4px;background:var(--input-bg);color:var(--input-text-color);font-family:'Monaco', 'Menlo', 'Ubuntu Mono', monospace;font-size:0.85em}.add-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--success);white-space:nowrap}.no-items.svelte-gkxvxc.svelte-gkxvxc{color:var(--text-color);opacity:0.6;font-style:italic;padding:1rem;text-align:center}.follows-header.svelte-gkxvxc.svelte-gkxvxc{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.follows-count.svelte-gkxvxc.svelte-gkxvxc{font-weight:600;color:var(--text-color)}.refresh-btn.svelte-gkxvxc.svelte-gkxvxc{background:var(--info)}.follows-list.svelte-gkxvxc.svelte-gkxvxc{max-height:300px;overflow-y:auto;border:1px solid var(--border-color);border-radius:4px;background:var(--bg-color)}.follows-grid.svelte-gkxvxc.svelte-gkxvxc{display:grid;grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));gap:0.5rem;padding:0.75rem}.follow-item.svelte-gkxvxc.svelte-gkxvxc{padding:0.4em 0.6em;background:var(--card-bg);border:1px solid var(--border-color);border-radius:4px;font-family:'Monaco', 'Menlo', 'Ubuntu Mono', monospace;font-size:0.75em;color:var(--text-color);text-overflow:ellipsis;overflow:hidden;white-space:nowrap} .blossom-view.svelte-on0yal.svelte-on0yal{padding:1em;box-sizing:border-box}.header-section.svelte-on0yal.svelte-on0yal{display:flex;justify-content:space-between;align-items:center;margin-bottom:1em}.header-section.svelte-on0yal h3.svelte-on0yal{margin:0;color:var(--text-color);flex:1}.header-buttons.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:0.5em}.back-btn.svelte-on0yal.svelte-on0yal{background:transparent;border:1px solid var(--border-color);color:var(--text-color);padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em;margin-right:0.5em}.back-btn.svelte-on0yal.svelte-on0yal:hover{background-color:var(--sidebar-bg)}.admin-btn.svelte-on0yal.svelte-on0yal{background-color:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.admin-btn.svelte-on0yal.svelte-on0yal:hover:not(:disabled){background-color:var(--accent-hover-color)}.admin-btn.svelte-on0yal.svelte-on0yal:disabled{opacity:0.6;cursor:not-allowed}.user-header.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:0.5em}.header-avatar.svelte-on0yal.svelte-on0yal{width:28px;height:28px;border-radius:50%;object-fit:cover}.refresh-btn.svelte-on0yal.svelte-on0yal{background-color:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.refresh-btn.svelte-on0yal.svelte-on0yal:hover:not(:disabled){background-color:var(--accent-hover-color)}.refresh-btn.svelte-on0yal.svelte-on0yal:disabled{opacity:0.6;cursor:not-allowed}.upload-section.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:0.75em;padding:0.75em 1em;background-color:var(--card-bg);border-radius:6px;margin-bottom:1em;flex-wrap:wrap}.upload-label.svelte-on0yal.svelte-on0yal{color:var(--text-color);font-size:0.95em;flex:1}.file-input-hidden.svelte-on0yal.svelte-on0yal{display:none}.select-btn.svelte-on0yal.svelte-on0yal{background-color:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.select-btn.svelte-on0yal.svelte-on0yal:hover:not(:disabled){background-color:var(--accent-hover-color)}.select-btn.svelte-on0yal.svelte-on0yal:disabled{opacity:0.6;cursor:not-allowed}.selected-count.svelte-on0yal.svelte-on0yal{color:var(--text-color);font-size:0.9em}.upload-btn.svelte-on0yal.svelte-on0yal{background-color:var(--success, #28a745);color:white;border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em;font-weight:bold}.upload-btn.svelte-on0yal.svelte-on0yal:hover:not(:disabled){opacity:0.9}.upload-btn.svelte-on0yal.svelte-on0yal:disabled{opacity:0.7;cursor:not-allowed}.error-message.svelte-on0yal.svelte-on0yal{background-color:var(--warning);color:var(--text-color);padding:0.75em 1em;border-radius:4px;margin-bottom:1em}.loading.svelte-on0yal.svelte-on0yal,.empty-state.svelte-on0yal.svelte-on0yal{text-align:center;padding:2em;color:var(--text-color);opacity:0.7}.blob-list.svelte-on0yal.svelte-on0yal{display:flex;flex-direction:column;gap:0.5em;width:100%}.blob-item.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:1em;padding:0.75em 1em;background-color:var(--card-bg);border-radius:6px;cursor:pointer;transition:background-color 0.2s}.blob-item.svelte-on0yal.svelte-on0yal:hover{background-color:var(--sidebar-bg)}.blob-thumbnail.svelte-on0yal.svelte-on0yal{width:48px;height:48px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color);border-radius:4px;overflow:hidden}.thumbnail-img.svelte-on0yal.svelte-on0yal,.thumbnail-video.svelte-on0yal.svelte-on0yal{width:100%;height:100%;object-fit:cover}.thumbnail-icon.svelte-on0yal.svelte-on0yal{font-size:1.5em}.blob-info.svelte-on0yal.svelte-on0yal{flex:1;min-width:0}.blob-hash.svelte-on0yal.svelte-on0yal{font-family:monospace;font-size:0.9em;color:var(--text-color)}.hash-full.svelte-on0yal.svelte-on0yal{display:inline}.hash-truncated.svelte-on0yal.svelte-on0yal{display:none}.blob-meta.svelte-on0yal.svelte-on0yal{display:flex;gap:1em;font-size:0.8em;color:var(--text-color);opacity:0.7;margin-top:0.25em}.blob-date.svelte-on0yal.svelte-on0yal{font-size:0.85em;color:var(--text-color);opacity:0.6;white-space:nowrap}.delete-btn.svelte-on0yal.svelte-on0yal{background:transparent;border:1px solid var(--warning);color:var(--warning);width:1.75em;height:1.75em;border-radius:4px;cursor:pointer;font-size:0.85em;display:flex;align-items:center;justify-content:center}.delete-btn.svelte-on0yal.svelte-on0yal:hover{background-color:var(--warning);color:var(--text-color)}.admin-users-list.svelte-on0yal.svelte-on0yal{display:flex;flex-direction:column;gap:0.5em;width:100%}.user-stat-item.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:1em;padding:0.75em 1em;background-color:var(--card-bg);border-radius:6px;cursor:pointer;transition:background-color 0.2s}.user-stat-item.svelte-on0yal.svelte-on0yal:hover{background-color:var(--sidebar-bg)}.user-avatar-container.svelte-on0yal.svelte-on0yal{flex-shrink:0}.user-avatar.svelte-on0yal.svelte-on0yal{width:40px;height:40px;border-radius:50%;object-fit:cover}.user-avatar-placeholder.svelte-on0yal.svelte-on0yal{width:40px;height:40px;border-radius:50%;background-color:var(--border-color)}.user-info.svelte-on0yal.svelte-on0yal{flex:1;min-width:0}.user-name.svelte-on0yal.svelte-on0yal{font-weight:500;color:var(--text-color)}.user-npub.svelte-on0yal.svelte-on0yal{font-family:monospace;font-size:0.8em;color:var(--text-color);opacity:0.6}.npub-full.svelte-on0yal.svelte-on0yal{display:inline}.npub-truncated.svelte-on0yal.svelte-on0yal{display:none}.user-stats.svelte-on0yal.svelte-on0yal{display:flex;flex-direction:column;align-items:flex-end;gap:0.25em}.user-stats.svelte-on0yal .blob-count.svelte-on0yal,.user-stats.svelte-on0yal .total-size.svelte-on0yal{font-size:0.85em;color:var(--text-color);opacity:0.7}.login-prompt.svelte-on0yal.svelte-on0yal{text-align:center;padding:2em;background-color:var(--card-bg);border-radius:8px;border:1px solid var(--border-color);max-width:32em;margin:1em}.login-prompt.svelte-on0yal p.svelte-on0yal{margin:0 0 1.5rem 0;color:var(--text-color);font-size:1.1rem}.login-btn.svelte-on0yal.svelte-on0yal{background-color:var(--primary);color:var(--text-color);border:none;padding:0.75em 1.5em;border-radius:4px;cursor:pointer;font-weight:bold;font-size:0.9em}.login-btn.svelte-on0yal.svelte-on0yal:hover{background-color:var(--accent-hover-color)}.modal-overlay.svelte-on0yal.svelte-on0yal{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0, 0, 0, 0.8);display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content.svelte-on0yal.svelte-on0yal{background-color:var(--bg-color);border-radius:8px;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;overflow:hidden}.modal-header.svelte-on0yal.svelte-on0yal{display:flex;justify-content:space-between;align-items:center;padding:0.75em 1em;border-bottom:1px solid var(--border-color);background-color:var(--card-bg)}.modal-title.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:1em}.modal-hash.svelte-on0yal.svelte-on0yal{font-family:monospace;color:var(--text-color)}.modal-type.svelte-on0yal.svelte-on0yal{font-size:0.85em;color:var(--text-color);opacity:0.7}.modal-controls.svelte-on0yal.svelte-on0yal{display:flex;align-items:center;gap:0.5em}.zoom-btn.svelte-on0yal.svelte-on0yal{background-color:var(--primary);color:var(--text-color);border:none;width:2em;height:2em;border-radius:4px;cursor:pointer;font-size:1em;font-weight:bold}.zoom-btn.svelte-on0yal.svelte-on0yal:hover:not(:disabled){background-color:var(--accent-hover-color)}.zoom-btn.svelte-on0yal.svelte-on0yal:disabled{opacity:0.5;cursor:not-allowed}.zoom-level.svelte-on0yal.svelte-on0yal{font-size:0.85em;color:var(--text-color);min-width:3em;text-align:center}.close-btn.svelte-on0yal.svelte-on0yal{background:transparent;border:1px solid var(--border-color);color:var(--text-color);width:2em;height:2em;border-radius:4px;cursor:pointer;font-size:1em;margin-left:0.5em}.close-btn.svelte-on0yal.svelte-on0yal:hover{background-color:var(--warning);border-color:var(--warning)}.modal-body.svelte-on0yal.svelte-on0yal{flex:1;overflow:auto;display:flex;align-items:center;justify-content:center;padding:1em;min-height:200px}.media-container.svelte-on0yal.svelte-on0yal{transition:transform 0.2s ease;transform-origin:center center}.media-container.svelte-on0yal img.svelte-on0yal{max-width:80vw;max-height:70vh;object-fit:contain}.media-container.svelte-on0yal video.svelte-on0yal{max-width:80vw;max-height:70vh}.media-container.audio.svelte-on0yal.svelte-on0yal{width:100%;padding:2em}.media-container.svelte-on0yal audio.svelte-on0yal{width:100%}.file-preview.svelte-on0yal.svelte-on0yal{text-align:center;padding:2em;color:var(--text-color)}.file-icon.svelte-on0yal.svelte-on0yal{font-size:4em;margin-bottom:0.5em}.download-link.svelte-on0yal.svelte-on0yal{display:inline-block;margin-top:1em;padding:0.75em 1.5em;background-color:var(--primary);color:var(--text-color);text-decoration:none;border-radius:4px}.download-link.svelte-on0yal.svelte-on0yal:hover{background-color:var(--accent-hover-color)}.modal-footer.svelte-on0yal.svelte-on0yal{display:flex;flex-direction:column;gap:0.5em;padding:0.75em 1em;border-top:1px solid var(--border-color);background-color:var(--card-bg)}.blob-details.svelte-on0yal.svelte-on0yal{display:flex;gap:1.5em;font-size:0.85em;color:var(--text-color);opacity:0.7}.blob-url-section.svelte-on0yal.svelte-on0yal{display:flex;gap:0.5em;width:100%}.blob-url-input.svelte-on0yal.svelte-on0yal{flex:1;padding:0.4em 0.6em;font-family:monospace;font-size:0.85em;background-color:var(--bg-color);color:var(--text-color);border:1px solid var(--border-color);border-radius:4px;cursor:text}.blob-url-input.svelte-on0yal.svelte-on0yal:focus{outline:none;border-color:var(--primary)}.copy-btn.svelte-on0yal.svelte-on0yal{padding:0.4em 0.8em;background-color:var(--primary);color:var(--text-color);border:none;border-radius:4px;cursor:pointer;font-size:0.85em}.copy-btn.svelte-on0yal.svelte-on0yal:hover{background-color:var(--accent-hover-color)}.modal-actions.svelte-on0yal.svelte-on0yal{display:flex;gap:0.5em}.action-btn.svelte-on0yal.svelte-on0yal{padding:0.5em 1em;background-color:var(--primary);color:var(--text-color);border:none;border-radius:4px;cursor:pointer;text-decoration:none;font-size:0.9em}.action-btn.svelte-on0yal.svelte-on0yal:hover{background-color:var(--accent-hover-color)}.action-btn.danger.svelte-on0yal.svelte-on0yal{background-color:transparent;border:1px solid var(--warning);color:var(--warning)}.action-btn.danger.svelte-on0yal.svelte-on0yal:hover{background-color:var(--warning);color:var(--text-color)}@media(max-width: 720px){.hash-full.svelte-on0yal.svelte-on0yal{display:none}.hash-truncated.svelte-on0yal.svelte-on0yal{display:inline}.npub-full.svelte-on0yal.svelte-on0yal{display:none}.npub-truncated.svelte-on0yal.svelte-on0yal{display:inline}}@media(max-width: 600px){.blob-item.svelte-on0yal.svelte-on0yal{flex-wrap:wrap}.blob-date.svelte-on0yal.svelte-on0yal{width:100%;margin-top:0.5em;padding-left:3.5em}.modal-footer.svelte-on0yal.svelte-on0yal{flex-direction:column;gap:0.75em}.blob-details.svelte-on0yal.svelte-on0yal{flex-direction:column;gap:0.25em}} +.bunker-view.svelte-mnczw.svelte-mnczw{padding:1em;box-sizing:border-box}.header-section.svelte-mnczw.svelte-mnczw{display:flex;justify-content:space-between;align-items:center;margin-bottom:1em}.header-section.svelte-mnczw h3.svelte-mnczw{margin:0;color:var(--text-color)}.refresh-btn.svelte-mnczw.svelte-mnczw{background-color:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.refresh-btn.svelte-mnczw.svelte-mnczw:hover:not(:disabled){background-color:var(--accent-hover-color)}.refresh-btn.svelte-mnczw.svelte-mnczw:disabled{opacity:0.6;cursor:not-allowed}.error-message.svelte-mnczw.svelte-mnczw{background-color:var(--warning);color:var(--text-color);padding:0.75em 1em;border-radius:4px;margin-bottom:1em}.loading.svelte-mnczw.svelte-mnczw{text-align:center;padding:2em;color:var(--text-color);opacity:0.7}.instructions.svelte-mnczw.svelte-mnczw{background-color:var(--card-bg);padding:1em;border-radius:6px;margin-bottom:1.5em}.instructions.svelte-mnczw p.svelte-mnczw{margin:0;color:var(--text-color)}.config-sections.svelte-mnczw.svelte-mnczw{display:flex;flex-direction:column;gap:1.5em}.config-section.svelte-mnczw.svelte-mnczw{background-color:var(--card-bg);padding:1.25em;border-radius:8px}.config-section.svelte-mnczw h4.svelte-mnczw{margin:0 0 0.5em 0;color:var(--text-color)}.section-desc.svelte-mnczw.svelte-mnczw{margin:0 0 1em 0;color:var(--text-color);opacity:0.8;font-size:0.95em}.section-desc.svelte-mnczw a.svelte-mnczw{color:var(--primary)}.client-links.svelte-mnczw.svelte-mnczw{display:flex;flex-wrap:wrap;gap:0.75em}.client-link.svelte-mnczw.svelte-mnczw{display:flex;flex-direction:column;align-items:center;padding:0.75em 1em;background-color:var(--bg-color);border:1px solid var(--border-color);border-radius:6px;text-decoration:none;color:var(--text-color);transition:border-color 0.2s, background-color 0.2s;min-width:100px}.client-link.svelte-mnczw.svelte-mnczw:hover{border-color:var(--primary);background-color:var(--sidebar-bg)}.client-icon.svelte-mnczw.svelte-mnczw{font-weight:500;margin-bottom:0.25em}.client-store.svelte-mnczw.svelte-mnczw{font-size:0.8em;opacity:0.7}.qr-container.svelte-mnczw.svelte-mnczw{display:flex;justify-content:center;margin:1em 0}.qr-code.svelte-mnczw.svelte-mnczw{border-radius:8px;background:white;padding:8px}.qr-placeholder.svelte-mnczw.svelte-mnczw{width:256px;height:256px;display:flex;align-items:center;justify-content:center;background-color:var(--bg-color);border-radius:8px;color:var(--text-color);opacity:0.5}.config-actions.svelte-mnczw.svelte-mnczw{display:flex;justify-content:center;gap:0.75em;margin-top:1em}.config-actions.svelte-mnczw button.svelte-mnczw{padding:0.5em 1em;background-color:var(--primary);color:var(--text-color);border:none;border-radius:4px;cursor:pointer;font-size:0.9em}.config-actions.svelte-mnczw button.svelte-mnczw:hover{background-color:var(--accent-hover-color)}.config-text-details.svelte-mnczw.svelte-mnczw{margin-top:1em}.config-text-details.svelte-mnczw summary.svelte-mnczw{cursor:pointer;color:var(--text-color);opacity:0.8;font-size:0.9em}.config-text.svelte-mnczw.svelte-mnczw{margin-top:0.5em;padding:1em;background-color:var(--bg-color);border-radius:4px;font-size:0.85em;overflow-x:auto;white-space:pre;color:var(--text-color)}.ip-info.svelte-mnczw.svelte-mnczw,.relay-info.svelte-mnczw.svelte-mnczw{display:flex;align-items:center;gap:0.5em;margin-top:0.5em}.label.svelte-mnczw.svelte-mnczw{color:var(--text-color);opacity:0.7}code.svelte-mnczw.svelte-mnczw{font-family:monospace;padding:0.25em 0.5em;background-color:var(--bg-color);border-radius:4px;color:var(--text-color)}.bunker-url-container.svelte-mnczw.svelte-mnczw{display:flex;align-items:center;gap:0.5em;justify-content:center;flex-wrap:wrap}.bunker-url.svelte-mnczw.svelte-mnczw{word-break:break-all;max-width:400px}.bunker-url-container.svelte-mnczw button.svelte-mnczw{padding:0.4em 0.8em;background-color:var(--primary);color:var(--text-color);border:none;border-radius:4px;cursor:pointer;font-size:0.85em}.bunker-url-container.svelte-mnczw button.svelte-mnczw:hover{background-color:var(--accent-hover-color)}.npub.svelte-mnczw.svelte-mnczw{word-break:break-all;font-size:0.85em}.danger-zone.svelte-mnczw.svelte-mnczw{margin-top:2em;padding:1.25em;border:1px solid var(--warning);border-radius:8px;background-color:rgba(255, 100, 100, 0.05)}.danger-zone.svelte-mnczw h4.svelte-mnczw{margin:0 0 0.5em 0;color:var(--warning)}.danger-zone.svelte-mnczw p.svelte-mnczw{margin:0 0 1em 0;color:var(--text-color);opacity:0.8;font-size:0.95em}.danger-btn.svelte-mnczw.svelte-mnczw{background-color:transparent;border:1px solid var(--warning);color:var(--warning);padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.danger-btn.svelte-mnczw.svelte-mnczw:hover:not(:disabled){background-color:var(--warning);color:var(--text-color)}.danger-btn.svelte-mnczw.svelte-mnczw:disabled{opacity:0.5;cursor:not-allowed}.unavailable-message.svelte-mnczw.svelte-mnczw,.access-denied.svelte-mnczw.svelte-mnczw{text-align:center;padding:2em;background-color:var(--card-bg);border-radius:8px}.unavailable-message.svelte-mnczw h3.svelte-mnczw,.access-denied.svelte-mnczw h3.svelte-mnczw{margin:0 0 0.5em 0;color:var(--text-color)}.unavailable-message.svelte-mnczw p.svelte-mnczw,.access-denied.svelte-mnczw p.svelte-mnczw{margin:0.5em 0;color:var(--text-color);opacity:0.8}.hint.svelte-mnczw.svelte-mnczw{font-size:0.9em;opacity:0.6 !important}.login-prompt.svelte-mnczw.svelte-mnczw{text-align:center;padding:2em;background-color:var(--card-bg);border-radius:8px;border:1px solid var(--border-color);max-width:32em;margin:1em}.login-prompt.svelte-mnczw p.svelte-mnczw{margin:0 0 1.5rem 0;color:var(--text-color);font-size:1.1rem}.login-btn.svelte-mnczw.svelte-mnczw{background-color:var(--primary);color:var(--text-color);border:none;padding:0.75em 1.5em;border-radius:4px;cursor:pointer;font-weight:bold;font-size:0.9em}.login-btn.svelte-mnczw.svelte-mnczw:hover{background-color:var(--accent-hover-color)}.audit-section.svelte-mnczw.svelte-mnczw{margin-top:2em;padding:1.25em;border:1px solid var(--border-color);border-radius:8px;background-color:var(--card-bg)}.audit-section.svelte-mnczw h4.svelte-mnczw{margin:0 0 0.5em 0;color:var(--text-color)}.audit-desc.svelte-mnczw.svelte-mnczw{margin:0 0 1em 0;color:var(--text-color);opacity:0.8;font-size:0.9em}.audit-subsection.svelte-mnczw.svelte-mnczw{margin-bottom:1.5em}.audit-subsection.svelte-mnczw.svelte-mnczw:last-child{margin-bottom:0}.audit-subsection.svelte-mnczw h5.svelte-mnczw{margin:0 0 0.5em 0;color:var(--text-color);font-size:0.95em}.audit-table-container.svelte-mnczw.svelte-mnczw{overflow-x:auto}.audit-table.svelte-mnczw.svelte-mnczw{width:100%;border-collapse:collapse;font-size:0.85em}.audit-table.svelte-mnczw th.svelte-mnczw,.audit-table.svelte-mnczw td.svelte-mnczw{padding:0.5em 0.75em;text-align:left;border-bottom:1px solid var(--border-color)}.audit-table.svelte-mnczw th.svelte-mnczw{background-color:var(--bg-color);color:var(--text-color);font-weight:500}.audit-table.svelte-mnczw td.svelte-mnczw{color:var(--text-color)}.audit-table.svelte-mnczw td code.svelte-mnczw{font-size:0.9em;padding:0.15em 0.3em}.audit-table.svelte-mnczw tr.warning.svelte-mnczw{background-color:rgba(255, 100, 100, 0.1)}.audit-table.svelte-mnczw td.highlight.svelte-mnczw{color:var(--warning);font-weight:600}@media(max-width: 600px){.client-links.svelte-mnczw.svelte-mnczw{flex-direction:column}.client-link.svelte-mnczw.svelte-mnczw{width:100%}.bunker-url.svelte-mnczw.svelte-mnczw{font-size:0.75em}.audit-table.svelte-mnczw.svelte-mnczw{font-size:0.75em}.audit-table.svelte-mnczw th.svelte-mnczw,.audit-table.svelte-mnczw td.svelte-mnczw{padding:0.4em 0.5em}} .log-view.svelte-w6h7aj.svelte-w6h7aj{padding:1em;box-sizing:border-box;width:100%}.header-section.svelte-w6h7aj.svelte-w6h7aj{display:flex;justify-content:space-between;align-items:center;margin-bottom:1em;flex-wrap:wrap;gap:0.5em}.header-section.svelte-w6h7aj h3.svelte-w6h7aj{margin:0;color:var(--text-color)}.header-controls.svelte-w6h7aj.svelte-w6h7aj{display:flex;align-items:center;gap:0.75em;flex-wrap:wrap}.level-selector.svelte-w6h7aj.svelte-w6h7aj{display:flex;align-items:center;gap:0.5em}.level-selector.svelte-w6h7aj label.svelte-w6h7aj{color:var(--text-color);font-size:0.9em}.level-selector.svelte-w6h7aj select.svelte-w6h7aj{padding:0.4em 0.6em;border:1px solid var(--border-color);border-radius:4px;background-color:var(--card-bg);color:var(--text-color);font-size:0.9em}.clear-btn.svelte-w6h7aj.svelte-w6h7aj{background-color:transparent;border:1px solid var(--warning);color:var(--warning);padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.clear-btn.svelte-w6h7aj.svelte-w6h7aj:hover:not(:disabled){background-color:var(--warning);color:var(--text-color)}.clear-btn.svelte-w6h7aj.svelte-w6h7aj:disabled{opacity:0.5;cursor:not-allowed}.refresh-btn.svelte-w6h7aj.svelte-w6h7aj{background-color:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em}.refresh-btn.svelte-w6h7aj.svelte-w6h7aj:hover:not(:disabled){background-color:var(--accent-hover-color)}.refresh-btn.svelte-w6h7aj.svelte-w6h7aj:disabled{opacity:0.6;cursor:not-allowed}.error-message.svelte-w6h7aj.svelte-w6h7aj{background-color:var(--warning);color:var(--text-color);padding:0.75em 1em;border-radius:4px;margin-bottom:1em}.log-info.svelte-w6h7aj.svelte-w6h7aj{font-size:0.85em;color:var(--text-color);opacity:0.7;margin-bottom:0.75em}.log-list.svelte-w6h7aj.svelte-w6h7aj{display:flex;flex-direction:column;gap:0.25em;width:100%}.log-entry.svelte-w6h7aj.svelte-w6h7aj{display:flex;align-items:flex-start;gap:0.75em;padding:0.5em 0.75em;background-color:var(--card-bg);border-radius:4px;font-family:monospace;font-size:0.85em;word-break:break-word}.log-timestamp.svelte-w6h7aj.svelte-w6h7aj{color:var(--text-color);opacity:0.6;white-space:nowrap;flex-shrink:0}.log-level.svelte-w6h7aj.svelte-w6h7aj{font-weight:bold;padding:0.1em 0.4em;border-radius:3px;text-transform:uppercase;flex-shrink:0;min-width:3.5em;text-align:center}.level-trace.svelte-w6h7aj.svelte-w6h7aj{background-color:#6c757d;color:white}.level-debug.svelte-w6h7aj.svelte-w6h7aj{background-color:#17a2b8;color:white}.level-info.svelte-w6h7aj.svelte-w6h7aj{background-color:#28a745;color:white}.level-warn.svelte-w6h7aj.svelte-w6h7aj{background-color:#ffc107;color:#212529}.level-error.svelte-w6h7aj.svelte-w6h7aj{background-color:#dc3545;color:white}.level-fatal.svelte-w6h7aj.svelte-w6h7aj{background-color:#721c24;color:white}.log-location.svelte-w6h7aj.svelte-w6h7aj{color:var(--text-color);opacity:0.5;flex-shrink:0}.log-message.svelte-w6h7aj.svelte-w6h7aj{color:var(--text-color);flex:1}.load-more-trigger.svelte-w6h7aj.svelte-w6h7aj{padding:1em;text-align:center;color:var(--text-color);opacity:0.6;font-size:0.9em}.empty-state.svelte-w6h7aj.svelte-w6h7aj{text-align:center;padding:2em;color:var(--text-color);opacity:0.7}.login-prompt.svelte-w6h7aj.svelte-w6h7aj{text-align:center;padding:2em;background-color:var(--card-bg);border-radius:8px;border:1px solid var(--border-color);max-width:32em;margin:1em}.login-prompt.svelte-w6h7aj p.svelte-w6h7aj{margin:0 0 1.5rem 0;color:var(--text-color);font-size:1.1rem}.login-btn.svelte-w6h7aj.svelte-w6h7aj{background-color:var(--primary);color:var(--text-color);border:none;padding:0.75em 1.5em;border-radius:4px;cursor:pointer;font-weight:bold;font-size:0.9em}.login-btn.svelte-w6h7aj.svelte-w6h7aj:hover{background-color:var(--accent-hover-color)}.access-denied.svelte-w6h7aj.svelte-w6h7aj{font-size:0.9em;opacity:0.7}@media(max-width: 600px){.header-section.svelte-w6h7aj.svelte-w6h7aj{flex-direction:column;align-items:flex-start}.header-controls.svelte-w6h7aj.svelte-w6h7aj{width:100%;justify-content:flex-end}.log-entry.svelte-w6h7aj.svelte-w6h7aj{flex-wrap:wrap}.log-timestamp.svelte-w6h7aj.svelte-w6h7aj{width:100%;margin-bottom:0.25em}} .search-results-view.svelte-porghq.svelte-porghq{width:100%;height:100%;display:flex;flex-direction:column}.search-results-header.svelte-porghq.svelte-porghq{display:flex;justify-content:space-between;align-items:center;padding:1em;border-bottom:1px solid var(--border-color);background:var(--header-bg)}.search-results-header.svelte-porghq h2.svelte-porghq{margin:0;color:var(--text-color);font-size:1.2rem;font-weight:600}.refresh-btn.svelte-porghq.svelte-porghq{background:var(--primary);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em;transition:background-color 0.2s}.refresh-btn.svelte-porghq.svelte-porghq:hover:not(:disabled){background:var(--accent-hover-color)}.refresh-btn.svelte-porghq.svelte-porghq:disabled{background:var(--secondary);cursor:not-allowed}.search-results-content.svelte-porghq.svelte-porghq{flex:1;overflow-y:auto;padding:1em}.search-result-item.svelte-porghq.svelte-porghq{border:1px solid var(--border-color);border-radius:8px;margin-bottom:0.5em;background:var(--card-bg);transition:all 0.2s ease}.search-result-item.svelte-porghq.svelte-porghq:hover{border-color:var(--primary);box-shadow:0 2px 8px rgba(0, 0, 0, 0.1)}.search-result-item.expanded.svelte-porghq.svelte-porghq{border-color:var(--primary);box-shadow:0 4px 12px rgba(0, 0, 0, 0.15)}.search-result-row.svelte-porghq.svelte-porghq{display:flex;align-items:center;padding:1em;cursor:pointer;gap:1em}.search-result-avatar.svelte-porghq.svelte-porghq{flex-shrink:0}.avatar-placeholder.svelte-porghq.svelte-porghq{width:40px;height:40px;border-radius:50%;background:var(--bg-color);display:flex;align-items:center;justify-content:center;font-size:1.2em;border:1px solid var(--border-color)}.search-result-info.svelte-porghq.svelte-porghq{flex-shrink:0;min-width:120px}.search-result-author.svelte-porghq.svelte-porghq{font-weight:600;color:var(--text-color);font-size:0.9em;font-family:monospace}.search-result-kind.svelte-porghq.svelte-porghq{display:flex;align-items:center;gap:0.5em;margin-top:0.25em}.kind-number.svelte-porghq.svelte-porghq{background:var(--primary);color:var(--text-color);padding:0.1em 0.4em;border-radius:0.25rem;font-size:0.7em;font-weight:600;font-family:monospace}.kind-name.svelte-porghq.svelte-porghq{font-size:0.8em;color:var(--text-color);opacity:0.8}.search-result-content.svelte-porghq.svelte-porghq{flex:1;min-width:0}.event-timestamp.svelte-porghq.svelte-porghq{font-size:0.8em;color:var(--text-color);opacity:0.6;margin-bottom:0.5em}.event-content-single-line.svelte-porghq.svelte-porghq{color:var(--text-color);line-height:1.4;word-wrap:break-word}.delete-btn.svelte-porghq.svelte-porghq{background:var(--danger);color:var(--text-color);border:none;padding:0.5em;border-radius:4px;cursor:pointer;font-size:0.9em;flex-shrink:0;transition:background-color 0.2s}.delete-btn.svelte-porghq.svelte-porghq:hover{background:var(--danger);filter:brightness(0.9)}.search-result-details.svelte-porghq.svelte-porghq{border-top:1px solid var(--border-color);padding:1em;background:var(--bg-color)}.json-container.svelte-porghq.svelte-porghq{position:relative}.event-json.svelte-porghq.svelte-porghq{background:var(--code-bg);padding:1em;border:0;font-size:0.8em;line-height:1.4;overflow-x:auto;margin:0;color:var(--code-text)}.copy-json-btn.svelte-porghq.svelte-porghq{position:absolute;top:0.5em;right:0.5em;background:var(--primary);color:var(--text-color);border:none;padding:0.25em 0.5em;border-radius:0.25rem;cursor:pointer;font-size:0.8em;opacity:0.8;transition:opacity 0.2s}.copy-json-btn.svelte-porghq.svelte-porghq:hover{opacity:1}.no-results.svelte-porghq.svelte-porghq{text-align:center;padding:2em;color:var(--text-color);opacity:0.7}.loading-search.svelte-porghq.svelte-porghq{text-align:center;padding:2em;color:var(--text-color)}.spinner.svelte-porghq.svelte-porghq{width:20px;height:20px;border:2px solid var(--border-color);border-top:2px solid var(--primary);border-radius:50%;animation:svelte-porghq-spin 1s linear infinite;margin:0 auto 1em}@keyframes svelte-porghq-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}} .filter-display.svelte-1tyqaa5.svelte-1tyqaa5{background:var(--card-bg);border:1px solid var(--border-color);border-radius:8px;margin:1em;overflow:hidden}.filter-display-header.svelte-1tyqaa5.svelte-1tyqaa5{display:flex;justify-content:space-between;align-items:center;padding:0.75em 1em;background:var(--bg-color);border-bottom:1px solid var(--border-color)}.filter-display-header.svelte-1tyqaa5 h3.svelte-1tyqaa5{margin:0;font-size:1em;font-weight:600;color:var(--text-color)}.sweep-btn.svelte-1tyqaa5.svelte-1tyqaa5{background:var(--danger);color:var(--text-color);border:none;padding:0.5em 1em;border-radius:4px;cursor:pointer;font-size:0.9em;font-weight:600;transition:all 0.2s}.sweep-btn.svelte-1tyqaa5.svelte-1tyqaa5:hover{filter:brightness(0.9);transform:translateY(-1px);box-shadow:0 2px 8px rgba(255, 0, 0, 0.3)}.filter-json-container.svelte-1tyqaa5.svelte-1tyqaa5{padding:1em;max-height:200px;overflow:auto}.filter-json.svelte-1tyqaa5.svelte-1tyqaa5{background:var(--code-bg);padding:1em;border-radius:4px;font-family:'Courier New', Courier, monospace;font-size:0.85em;line-height:1.5;color:var(--code-text);margin:0;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.filter-json-container.svelte-1tyqaa5.svelte-1tyqaa5::-webkit-scrollbar{width:8px;height:8px}.filter-json-container.svelte-1tyqaa5.svelte-1tyqaa5::-webkit-scrollbar-track{background:var(--bg-color)}.filter-json-container.svelte-1tyqaa5.svelte-1tyqaa5::-webkit-scrollbar-thumb{background:var(--border-color);border-radius:4px}.filter-json-container.svelte-1tyqaa5.svelte-1tyqaa5::-webkit-scrollbar-thumb:hover{background:var(--primary)} diff --git a/app/web/dist/bundle.js b/app/web/dist/bundle.js index a269b33..c5fe8b8 100644 --- a/app/web/dist/bundle.js +++ b/app/web/dist/bundle.js @@ -1,24 +1,27 @@ -var app=function(){"use strict";function e(){}function t(e){return e()}function n(){return Object.create(null)}function r(e){e.forEach(t)}function i(e){return"function"==typeof e}function o(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}let s;function a(e,t){return s||(s=document.createElement("a")),s.href=t,e===s.href}const l="undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:global;function c(e,t){e.appendChild(t)}function u(e,t,n){e.insertBefore(t,n||null)}function d(e){e.parentNode&&e.parentNode.removeChild(e)}function f(e,t){for(let n=0;ne.removeEventListener(t,n,r)}function v(e){return function(t){return t.stopPropagation(),e.call(this,t)}}function A(e,t,n){null==n?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}function b(e){return""===e?null:+e}function I(e,t){t=""+t,e.data!==t&&(e.data=t)}function k(e,t){e.value=null==t?"":t}function C(e,t,n,r){null==n?e.style.removeProperty(t):e.style.setProperty(t,n,r?"important":"")}function E(e,t,n){for(let n=0;n{const i=e.$$.callbacks[t];if(i){const o=function(e,t,{bubbles:n=!1,cancelable:r=!1}={}){const i=document.createEvent("CustomEvent");return i.initCustomEvent(e,n,r,t),i}(t,n,{cancelable:r});return i.slice().forEach(t=>{t.call(e,o)}),!o.defaultPrevented}return!0}}function R(e,t){const n=e.$$.callbacks[t.type];n&&n.slice().forEach(e=>e.call(this,t))}const T=[],P=[];let N=[];const O=[],L=Promise.resolve();let M=!1;function _(e){N.push(e)}function j(e){O.push(e)}const H=new Set;let G=0;function J(){if(0!==G)return;const e=S;do{try{for(;G{V.delete(e),r&&(n&&e.d(1),r())}),e.o(t)}else r&&r()}function X(e,t,n){const r=e.$$.props[t];void 0!==r&&(e.$$.bound[r]=n,n(e.$$.ctx[r]))}function ee(e){e&&e.c()}function te(e,n,o,s){const{fragment:a,after_update:l}=e.$$;a&&a.m(n,o),s||_(()=>{const n=e.$$.on_mount.map(t).filter(i);e.$$.on_destroy?e.$$.on_destroy.push(...n):r(n),e.$$.on_mount=[]}),l.forEach(_)}function ne(e,t){const n=e.$$;null!==n.fragment&&(!function(e){const t=[],n=[];N.forEach(r=>-1===e.indexOf(r)?t.push(r):n.push(r)),n.forEach(e=>e()),N=t}(n.after_update),r(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function re(e,t){-1===e.$$.dirty[0]&&(T.push(e),M||(M=!0,L.then(J)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<{const i=r.length?r[0]:n;return p.ctx&&a(p.ctx[e],p.ctx[e]=i)&&(!p.skip_bound&&p.bound[e]&&p.bound[e](i),h&&re(t,e)),n}):[],p.update(),h=!0,r(p.before_update),p.fragment=!!s&&s(p.ctx),i.target){if(i.hydrate){const e=function(e){return Array.from(e.childNodes)}(i.target);p.fragment&&p.fragment.l(e),e.forEach(d)}else p.fragment&&p.fragment.c();i.intro&&z(t.$$.fragment),te(t,i.target,i.anchor,i.customElement),J()}Q(f)}class oe{$destroy(){ne(this,1),this.$destroy=e}$on(t,n){if(!i(n))return e;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(n),()=>{const e=r.indexOf(n);-1!==e&&r.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function se(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function ae(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function le(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}const ce="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,ue=e=>e instanceof Uint8Array,de=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),fe=(e,t)=>e<<32-t|e>>>t; -/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function pe(e){if("string"==typeof e&&(e=function(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}(e)),!ue(e))throw new Error("expected Uint8Array, got "+typeof e);return e}let he=class{clone(){return this._cloneInto()}};function ge(e){const t=t=>e().update(pe(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function me(e=32){if(ce&&"function"==typeof ce.getRandomValues)return ce.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}let ye=class extends he{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=de(this.buffer)}update(e){le(this);const{view:t,buffer:n,blockLen:r}=this,i=(e=pe(e)).length;for(let o=0;or-o&&(this.process(n,0),o=0);for(let e=o;e>i&o),a=Number(n&o),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}(n,r-8,BigInt(8*this.length),i),this.process(n,0);const s=de(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^~e&n,ve=(e,t,n)=>e&t^e&n^t&n,Ae=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),be=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Ie=new Uint32Array(64);let ke=class extends ye{constructor(){super(64,32,8,!1),this.A=0|be[0],this.B=0|be[1],this.C=0|be[2],this.D=0|be[3],this.E=0|be[4],this.F=0|be[5],this.G=0|be[6],this.H=0|be[7]}get(){const{A:e,B:t,C:n,D:r,E:i,F:o,G:s,H:a}=this;return[e,t,n,r,i,o,s,a]}set(e,t,n,r,i,o,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|i,this.F=0|o,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)Ie[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=Ie[e-15],n=Ie[e-2],r=fe(t,7)^fe(t,18)^t>>>3,i=fe(n,17)^fe(n,19)^n>>>10;Ie[e]=i+Ie[e-7]+r+Ie[e-16]|0}let{A:n,B:r,C:i,D:o,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(fe(s,6)^fe(s,11)^fe(s,25))+we(s,a,l)+Ae[e]+Ie[e]|0,u=(fe(n,2)^fe(n,13)^fe(n,22))+ve(n,r,i)|0;c=l,l=a,a=s,s=o+t|0,o=i,i=r,r=n,n=t+u|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,o=o+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,i,o,s,a,l,c)}roundClean(){Ie.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};const Ce=ge(()=>new ke),Ee=BigInt(0),xe=BigInt(1),Be=BigInt(2),Se=e=>e instanceof Uint8Array,Qe=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0")); -/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Fe(e){if(!Se(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length,0));let n=0;return e.forEach(e=>{if(!Se(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}const Me=e=>(Be<new Uint8Array(e),je=e=>Uint8Array.from(e);function He(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");let r=_e(e),i=_e(e),o=0;const s=()=>{r.fill(1),i.fill(0),o=0},a=(...e)=>n(i,r,...e),l=(e=_e())=>{i=a(je([0]),e),r=a(),0!==e.length&&(i=a(je([1]),e),r=a())},c=()=>{if(o++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e{let n;for(s(),l(e);!(n=t(c()));)l();return s(),n}}const Ge={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||e instanceof Uint8Array,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function Je(e,t,n={}){const r=(t,n,r)=>{const i=Ge[n];if("function"!=typeof i)throw new Error(`Invalid validator "${n}", expected function`);const o=e[t];if(!(r&&void 0===o||i(o,e)))throw new Error(`Invalid param ${String(t)}=${o} (${typeof o}), expected ${n}`)};for(const[e,n]of Object.entries(t))r(e,n,!1);for(const[e,t]of Object.entries(n))r(e,t,!0);return e}var Ke=Object.freeze({__proto__:null,bitGet:function(e,t){return e>>BigInt(t)&xe},bitLen:function(e){let t;for(t=0;e>Ee;e>>=xe,t+=1);return t},bitMask:Me,bitSet:(e,t,n)=>e|(n?xe:Ee)<=Ve?n:t+n}function tt(e,t,n){if(n<=Ve||t 0");if(n===qe)return Ve;let r=qe;for(;t>Ve;)t&qe&&(r=r*e%n),e=e*e%n,t>>=qe;return r}function nt(e,t,n){let r=e;for(;t-- >Ve;)r*=r,r%=n;return r}function rt(e,t){if(e===Ve||t<=Ve)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=et(e,t),r=t,i=Ve,o=qe;for(;n!==Ve;){const e=r%n,t=i-o*(r/n);r=n,n=e,i=o,o=t}if(r!==qe)throw new Error("invert: does not exist");return et(i,t)}function it(e){if(e%ze===We){const t=(e+qe)/ze;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}if(e%Xe===Ze){const t=(e-Ze)/Xe;return function(e,n){const r=e.mul(n,Ye),i=e.pow(r,t),o=e.mul(n,i),s=e.mul(e.mul(o,Ye),i),a=e.mul(o,e.sub(s,e.ONE));if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}return function(e){const t=(e-qe)/Ye;let n,r,i;for(n=e-qe,r=0;n%Ye===Ve;n/=Ye,r++);for(i=Ye;ie.removeEventListener(t,n,r)}function v(e){return function(t){return t.stopPropagation(),e.call(this,t)}}function A(e,t,n){null==n?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}function b(e){return""===e?null:+e}function k(e,t){t=""+t,e.data!==t&&(e.data=t)}function I(e,t){e.value=null==t?"":t}function C(e,t,n,r){null==n?e.style.removeProperty(t):e.style.setProperty(t,n,r?"important":"")}function E(e,t,n){for(let n=0;n{const i=e.$$.callbacks[t];if(i){const o=function(e,t,{bubbles:n=!1,cancelable:r=!1}={}){const i=document.createEvent("CustomEvent");return i.initCustomEvent(e,n,r,t),i}(t,n,{cancelable:r});return i.slice().forEach(t=>{t.call(e,o)}),!o.defaultPrevented}return!0}}function P(e,t){const n=e.$$.callbacks[t.type];n&&n.slice().forEach(e=>e.call(this,t))}const T=[],U=[];let N=[];const L=[],M=Promise.resolve();let _=!1;function O(e){N.push(e)}function H(e){L.push(e)}const j=new Set;let G=0;function J(){if(0!==G)return;const e=S;do{try{for(;G{V.delete(e),r&&(n&&e.d(1),r())}),e.o(t)}else r&&r()}function X(e,t,n){const r=e.$$.props[t];void 0!==r&&(e.$$.bound[r]=n,n(e.$$.ctx[r]))}function ee(e){e&&e.c()}function te(e,n,o,s){const{fragment:a,after_update:l}=e.$$;a&&a.m(n,o),s||O(()=>{const n=e.$$.on_mount.map(t).filter(i);e.$$.on_destroy?e.$$.on_destroy.push(...n):r(n),e.$$.on_mount=[]}),l.forEach(O)}function ne(e,t){const n=e.$$;null!==n.fragment&&(!function(e){const t=[],n=[];N.forEach(r=>-1===e.indexOf(r)?t.push(r):n.push(r)),n.forEach(e=>e()),N=t}(n.after_update),r(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function re(e,t){-1===e.$$.dirty[0]&&(T.push(e),_||(_=!0,M.then(J)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<{const i=r.length?r[0]:n;return h.ctx&&a(h.ctx[e],h.ctx[e]=i)&&(!h.skip_bound&&h.bound[e]&&h.bound[e](i),p&&re(t,e)),n}):[],h.update(),p=!0,r(h.before_update),h.fragment=!!s&&s(h.ctx),i.target){if(i.hydrate){const e=function(e){return Array.from(e.childNodes)}(i.target);h.fragment&&h.fragment.l(e),e.forEach(d)}else h.fragment&&h.fragment.c();i.intro&&W(t.$$.fragment),te(t,i.target,i.anchor,i.customElement),J()}Q(f)}class oe{$destroy(){ne(this,1),this.$destroy=e}$on(t,n){if(!i(n))return e;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(n),()=>{const e=r.indexOf(n);-1!==e&&r.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function se(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function ae(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function le(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}const ce="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,ue=e=>e instanceof Uint8Array,de=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),fe=(e,t)=>e<<32-t|e>>>t; +/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function he(e){if("string"==typeof e&&(e=function(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}(e)),!ue(e))throw new Error("expected Uint8Array, got "+typeof e);return e}let pe=class{clone(){return this._cloneInto()}};function ge(e){const t=t=>e().update(he(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function me(e=32){if(ce&&"function"==typeof ce.getRandomValues)return ce.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}let ye=class extends pe{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=de(this.buffer)}update(e){le(this);const{view:t,buffer:n,blockLen:r}=this,i=(e=he(e)).length;for(let o=0;or-o&&(this.process(n,0),o=0);for(let e=o;e>i&o),a=Number(n&o),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}(n,r-8,BigInt(8*this.length),i),this.process(n,0);const s=de(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^~e&n,ve=(e,t,n)=>e&t^e&n^t&n,Ae=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),be=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),ke=new Uint32Array(64);let Ie=class extends ye{constructor(){super(64,32,8,!1),this.A=0|be[0],this.B=0|be[1],this.C=0|be[2],this.D=0|be[3],this.E=0|be[4],this.F=0|be[5],this.G=0|be[6],this.H=0|be[7]}get(){const{A:e,B:t,C:n,D:r,E:i,F:o,G:s,H:a}=this;return[e,t,n,r,i,o,s,a]}set(e,t,n,r,i,o,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|i,this.F=0|o,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)ke[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=ke[e-15],n=ke[e-2],r=fe(t,7)^fe(t,18)^t>>>3,i=fe(n,17)^fe(n,19)^n>>>10;ke[e]=i+ke[e-7]+r+ke[e-16]|0}let{A:n,B:r,C:i,D:o,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(fe(s,6)^fe(s,11)^fe(s,25))+we(s,a,l)+Ae[e]+ke[e]|0,u=(fe(n,2)^fe(n,13)^fe(n,22))+ve(n,r,i)|0;c=l,l=a,a=s,s=o+t|0,o=i,i=r,r=n,n=t+u|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,o=o+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,i,o,s,a,l,c)}roundClean(){ke.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};const Ce=ge(()=>new Ie),Ee=BigInt(0),xe=BigInt(1),Be=BigInt(2),Se=e=>e instanceof Uint8Array,Qe=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0")); +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Fe(e){if(!Se(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length,0));let n=0;return e.forEach(e=>{if(!Se(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}const _e=e=>(Be<new Uint8Array(e),He=e=>Uint8Array.from(e);function je(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");let r=Oe(e),i=Oe(e),o=0;const s=()=>{r.fill(1),i.fill(0),o=0},a=(...e)=>n(i,r,...e),l=(e=Oe())=>{i=a(He([0]),e),r=a(),0!==e.length&&(i=a(He([1]),e),r=a())},c=()=>{if(o++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e{let n;for(s(),l(e);!(n=t(c()));)l();return s(),n}}const Ge={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||e instanceof Uint8Array,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function Je(e,t,n={}){const r=(t,n,r)=>{const i=Ge[n];if("function"!=typeof i)throw new Error(`Invalid validator "${n}", expected function`);const o=e[t];if(!(r&&void 0===o||i(o,e)))throw new Error(`Invalid param ${String(t)}=${o} (${typeof o}), expected ${n}`)};for(const[e,n]of Object.entries(t))r(e,n,!1);for(const[e,t]of Object.entries(n))r(e,t,!0);return e}var Ke=Object.freeze({__proto__:null,bitGet:function(e,t){return e>>BigInt(t)&xe},bitLen:function(e){let t;for(t=0;e>Ee;e>>=xe,t+=1);return t},bitMask:_e,bitSet:(e,t,n)=>e|(n?xe:Ee)<=Ve?n:t+n}function tt(e,t,n){if(n<=Ve||t 0");if(n===ze)return Ve;let r=ze;for(;t>Ve;)t&ze&&(r=r*e%n),e=e*e%n,t>>=ze;return r}function nt(e,t,n){let r=e;for(;t-- >Ve;)r*=r,r%=n;return r}function rt(e,t){if(e===Ve||t<=Ve)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=et(e,t),r=t,i=Ve,o=ze;for(;n!==Ve;){const e=r%n,t=i-o*(r/n);r=n,n=e,i=o,o=t}if(r!==ze)throw new Error("invert: does not exist");return et(i,t)}function it(e){if(e%We===Ye){const t=(e+ze)/We;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}if(e%Xe===Ze){const t=(e-Ze)/Xe;return function(e,n){const r=e.mul(n,qe),i=e.pow(r,t),o=e.mul(n,i),s=e.mul(e.mul(o,qe),i),a=e.mul(o,e.sub(s,e.ONE));if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}return function(e){const t=(e-ze)/qe;let n,r,i;for(n=e-ze,r=0;n%qe===Ve;n/=qe,r++);for(i=qe;i(e[t]="function",e),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});Je(e,t)}(e.Fp),Je(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...st(e.n,e.nBitLength),...e,p:e.Fp.ORDER})} -/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const{bytesToNumberBE:ft,hexToBytes:pt}=Ke,ht={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=ht;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:ft(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=ht,n="string"==typeof e?pt(e):e;if(!(n instanceof Uint8Array))throw new Error("ui8a expected");let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:i,l:o}=ht._parseInt(n.subarray(2)),{d:s,l:a}=ht._parseInt(o);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:i,s:s}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),i=t(n(e.r)),o=r.length/2,s=i.length/2,a=n(o),l=n(s);return`30${n(s+o+4)}02${l}${i}02${a}${r}`}},gt=BigInt(0),mt=BigInt(1);BigInt(2);const yt=BigInt(3);function wt(e){const t=function(e){const t=dt(e);Je(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:i}=t;if(n){if(!r.eql(i,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const i=t.toAffine();return Le(Uint8Array.from([4]),n.toBytes(i.x),n.toBytes(i.y))}),i=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function o(e){const{a:r,b:i}=t,o=n.sqr(e),s=n.mul(o,e);return n.add(n.add(s,n.mul(e,r)),i)}if(!n.eql(n.sqr(t.Gy),o(t.Gx)))throw new Error("bad generator point: equation left != right");function s(e){return"bigint"==typeof e&>n.eql(e,n.ZERO);return i(t)&&i(r)?d.ZERO:new d(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(d.fromAffine)}static fromHex(e){const t=d.fromAffine(i(Oe("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return d.BASE.multiply(l(e))}_setWindowSize(e){this._WINDOW_SIZE=e,c.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const i=n.sqr(r),s=o(e);if(!n.eql(i,s))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){u(e);const{px:t,py:r,pz:i}=this,{px:o,py:s,pz:a}=e,l=n.eql(n.mul(t,a),n.mul(o,i)),c=n.eql(n.mul(r,a),n.mul(s,i));return l&&c}negate(){return new d(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,i=n.mul(r,yt),{px:o,py:s,pz:a}=this;let l=n.ZERO,c=n.ZERO,u=n.ZERO,f=n.mul(o,o),p=n.mul(s,s),h=n.mul(a,a),g=n.mul(o,s);return g=n.add(g,g),u=n.mul(o,a),u=n.add(u,u),l=n.mul(e,u),c=n.mul(i,h),c=n.add(l,c),l=n.sub(p,c),c=n.add(p,c),c=n.mul(l,c),l=n.mul(g,l),u=n.mul(i,u),h=n.mul(e,h),g=n.sub(f,h),g=n.mul(e,g),g=n.add(g,u),u=n.add(f,f),f=n.add(u,f),f=n.add(f,h),f=n.mul(f,g),c=n.add(c,f),h=n.mul(s,a),h=n.add(h,h),f=n.mul(h,g),l=n.sub(l,f),u=n.mul(h,p),u=n.add(u,u),u=n.add(u,u),new d(l,c,u)}add(e){u(e);const{px:r,py:i,pz:o}=this,{px:s,py:a,pz:l}=e;let c=n.ZERO,f=n.ZERO,p=n.ZERO;const h=t.a,g=n.mul(t.b,yt);let m=n.mul(r,s),y=n.mul(i,a),w=n.mul(o,l),v=n.add(r,i),A=n.add(s,a);v=n.mul(v,A),A=n.add(m,y),v=n.sub(v,A),A=n.add(r,o);let b=n.add(s,l);return A=n.mul(A,b),b=n.add(m,w),A=n.sub(A,b),b=n.add(i,o),c=n.add(a,l),b=n.mul(b,c),c=n.add(y,w),b=n.sub(b,c),p=n.mul(h,A),c=n.mul(g,w),p=n.add(c,p),c=n.sub(y,p),p=n.add(y,p),f=n.mul(c,p),y=n.add(m,m),y=n.add(y,m),w=n.mul(h,w),A=n.mul(g,A),y=n.add(y,w),w=n.sub(m,w),w=n.mul(h,w),A=n.add(A,w),m=n.mul(y,A),f=n.add(f,m),m=n.mul(b,A),c=n.mul(v,c),c=n.sub(c,m),m=n.mul(v,y),p=n.mul(b,p),p=n.add(p,m),new d(c,f,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(d.ZERO)}wNAF(e){return p.wNAFCached(this,c,e,e=>{const t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(d.fromAffine)})}multiplyUnsafe(e){const r=d.ZERO;if(e===gt)return r;if(a(e),e===mt)return this;const{endo:i}=t;if(!i)return p.unsafeLadder(this,e);let{k1neg:o,k1:s,k2neg:l,k2:c}=i.splitScalar(e),u=r,f=r,h=this;for(;s>gt||c>gt;)s&mt&&(u=u.add(h)),c&mt&&(f=f.add(h)),h=h.double(),s>>=mt,c>>=mt;return o&&(u=u.negate()),l&&(f=f.negate()),f=new d(n.mul(f.px,i.beta),f.py,f.pz),u.add(f)}multiply(e){a(e);let r,i,o=e;const{endo:s}=t;if(s){const{k1neg:e,k1:t,k2neg:a,k2:l}=s.splitScalar(o);let{p:c,f:u}=this.wNAF(t),{p:f,f:h}=this.wNAF(l);c=p.constTimeNegate(e,c),f=p.constTimeNegate(a,f),f=new d(n.mul(f.px,s.beta),f.py,f.pz),r=c.add(f),i=u.add(h)}else{const{p:e,f:t}=this.wNAF(o);r=e,i=t}return d.normalizeZ([r,i])[0]}multiplyAndAddUnsafe(e,t,n){const r=d.BASE,i=(e,t)=>t!==gt&&t!==mt&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),o=i(this,t).add(i(e,n));return o.is0()?void 0:o}toAffine(e){const{px:t,py:r,pz:i}=this,o=this.is0();null==e&&(e=o?n.ONE:n.inv(i));const s=n.mul(t,e),a=n.mul(r,e),l=n.mul(i,e);if(o)return{x:n.ZERO,y:n.ZERO};if(!n.eql(l,n.ONE))throw new Error("invZ was invalid");return{x:s,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===mt)return!0;if(n)return n(d,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===mt?this:n?n(d,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(d,this,e)}toHex(e=!0){return Fe(this.toRawBytes(e))}}d.BASE=new d(t.Gx,t.Gy,n.ONE),d.ZERO=new d(n.ZERO,n.ONE,n.ZERO);const f=t.nBitLength,p=function(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},r=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let r=e.ZERO,i=t;for(;n>ct;)n&ut&&(r=r.add(i)),i=i.double(),n>>=ut;return r},precomputeWindow(e,t){const{windows:n,windowSize:i}=r(t),o=[];let s=e,a=s;for(let e=0;e>=f,r>a&&(r-=d,o+=ut);const s=t,p=t+Math.abs(r)-1,h=e%2!=0,g=r<0;0===r?c=c.add(n(h,i[s])):l=l.add(n(g,i[p]))}return{p:l,f:c}},wNAFCached(e,t,n,r){const i=e._WINDOW_SIZE||1;let o=t.get(e);return o||(o=this.precomputeWindow(e,i),1!==i&&t.set(e,r(o))),this.wNAF(i,o,n)}}}(d,t.endo?Math.ceil(f/2):f);return{CURVE:t,ProjectivePoint:d,normPrivateKeyToScalar:l,weierstrassEquation:o,isWithinCurveOrder:s}}function vt(e){const t=function(e){const t=dt(e);return Je(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:r}=t,i=n.BYTES+1,o=2*n.BYTES+1;function s(e){return et(e,r)}function a(e){return rt(e,r)}const{ProjectivePoint:l,normPrivateKeyToScalar:c,weierstrassEquation:u,isWithinCurveOrder:d}=wt({...t,toBytes(e,t,r){const i=t.toAffine(),o=n.toBytes(i.x),s=Le;return r?s(Uint8Array.from([t.hasEvenY()?2:3]),o):s(Uint8Array.from([4]),o,n.toBytes(i.y))},fromBytes(e){const t=e.length,r=e[0],s=e.subarray(1);if(t!==i||2!==r&&3!==r){if(t===o&&4===r){return{x:n.fromBytes(s.subarray(0,n.BYTES)),y:n.fromBytes(s.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${i} compressed bytes or ${o} uncompressed bytes`)}{const e=Re(s);if(!(gt<(a=e)&&aFe(Pe(e,t.nByteLength));function p(e){return e>r>>mt}const h=(e,t,n)=>Re(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=Oe("compactSignature",e,2*n),new g(h(e,0,n),h(e,n,2*n))}static fromDER(e){const{r:t,s:n}=ht.toSig(Oe("DER",e));return new g(t,n)}assertValidity(){if(!d(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!d(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:i,recovery:o}=this,c=v(Oe("msgHash",e));if(null==o||![0,1,2,3].includes(o))throw new Error("recovery id invalid");const u=2===o||3===o?r+t.n:r;if(u>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const d=1&o?"03":"02",p=l.fromHex(d+f(u)),h=a(u),g=s(-c*h),m=s(i*h),y=l.BASE.multiplyAndAddUnsafe(p,g,m);if(!y)throw new Error("point at infinify");return y.assertValidity(),y}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,s(-this.s),this.recovery):this}toDERRawBytes(){return Ue(this.toDERHex())}toDERHex(){return ht.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return Ue(this.toCompactHex())}toCompactHex(){return f(this.r)+f(this.s)}}const m={isValidPrivateKey(e){try{return c(e),!0}catch(e){return!1}},normPrivateKeyToScalar:c,randomPrivateKey:()=>{const e=lt(t.n);return function(e,t,n=!1){const r=e.length,i=at(t),o=lt(t);if(r<16||r1024)throw new Error(`expected ${o}-1024 bytes of input, got ${r}`);const s=et(n?Re(e):Te(e),t-qe)+qe;return n?Ne(s,i):Pe(s,i)}(t.randomBytes(e),t.n)},precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function y(e){const t=e instanceof Uint8Array,n="string"==typeof e,r=(t||n)&&e.length;return t?r===i||r===o:n?r===2*i||r===2*o:e instanceof l}const w=t.bits2int||function(e){const n=Re(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},v=t.bits2int_modN||function(e){return s(w(e))},A=Me(t.nBitLength);function b(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(gt<=e&&ee in i))throw new Error("sign() legacy options not supported");const{hash:o,randomBytes:u}=t;let{lowS:f,prehash:h,extraEntropy:m}=i;null==f&&(f=!0),e=Oe("msgHash",e),h&&(e=Oe("prehashed msgHash",o(e)));const y=v(e),A=c(r),I=[b(A),b(y)];if(null!=m){const e=!0===m?u(n.BYTES):m;I.push(Oe("extraEntropy",e))}const C=Le(...I),E=y;return{seed:C,k2sig:function(e){const t=w(e);if(!d(t))return;const n=a(t),r=l.BASE.multiply(t).toAffine(),i=s(r.x);if(i===gt)return;const o=s(n*s(E+i*A));if(o===gt)return;let c=(r.x===i?0:2)|Number(r.y&mt),u=o;return f&&p(o)&&(u=function(e){return p(e)?s(-e):e}(o),c^=1),new g(i,u,c)}}}const k={lowS:t.lowS,prehash:!1},C={lowS:t.lowS,prehash:!1};return l.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return l.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(y(e))throw new Error("first arg must be private key");if(!y(t))throw new Error("second arg must be public key");return l.fromHex(t).multiply(c(e)).toRawBytes(n)},sign:function(e,n,r=k){const{seed:i,k2sig:o}=I(e,n,r),s=t;return He(s.hash.outputLen,s.nByteLength,s.hmac)(i,o)},verify:function(e,n,r,i=C){const o=e;if(n=Oe("msgHash",n),r=Oe("publicKey",r),"strict"in i)throw new Error("options.strict was renamed to lowS");const{lowS:c,prehash:u}=i;let d,f;try{if("string"==typeof o||o instanceof Uint8Array)try{d=g.fromDER(o)}catch(e){if(!(e instanceof ht.Err))throw e;d=g.fromCompact(o)}else{if("object"!=typeof o||"bigint"!=typeof o.r||"bigint"!=typeof o.s)throw new Error("PARSE");{const{r:e,s:t}=o;d=new g(e,t)}}f=l.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(c&&d.hasHighS())return!1;u&&(n=t.hash(n));const{r:p,s:h}=d,m=v(n),y=a(h),w=s(m*y),A=s(p*y),b=l.BASE.multiplyAndAddUnsafe(f,w,A)?.toAffine();return!!b&&s(b.x)===p},ProjectivePoint:l,Signature:g,utils:m}}BigInt(4);let At=class extends he{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");se(e.outputLen),se(e.blockLen)}(e);const n=pe(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,i=new Uint8Array(r);i.set(n.length>r?e.create().update(n).digest():n);for(let e=0;enew At(e,t).update(n).digest(); +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const{bytesToNumberBE:ft,hexToBytes:ht}=Ke,pt={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=pt;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:ft(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=pt,n="string"==typeof e?ht(e):e;if(!(n instanceof Uint8Array))throw new Error("ui8a expected");let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:i,l:o}=pt._parseInt(n.subarray(2)),{d:s,l:a}=pt._parseInt(o);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:i,s:s}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),i=t(n(e.r)),o=r.length/2,s=i.length/2,a=n(o),l=n(s);return`30${n(s+o+4)}02${l}${i}02${a}${r}`}},gt=BigInt(0),mt=BigInt(1);BigInt(2);const yt=BigInt(3);function wt(e){const t=function(e){const t=dt(e);Je(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:i}=t;if(n){if(!r.eql(i,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const i=t.toAffine();return Me(Uint8Array.from([4]),n.toBytes(i.x),n.toBytes(i.y))}),i=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function o(e){const{a:r,b:i}=t,o=n.sqr(e),s=n.mul(o,e);return n.add(n.add(s,n.mul(e,r)),i)}if(!n.eql(n.sqr(t.Gy),o(t.Gx)))throw new Error("bad generator point: equation left != right");function s(e){return"bigint"==typeof e&>n.eql(e,n.ZERO);return i(t)&&i(r)?d.ZERO:new d(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(d.fromAffine)}static fromHex(e){const t=d.fromAffine(i(Le("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return d.BASE.multiply(l(e))}_setWindowSize(e){this._WINDOW_SIZE=e,c.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const i=n.sqr(r),s=o(e);if(!n.eql(i,s))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){u(e);const{px:t,py:r,pz:i}=this,{px:o,py:s,pz:a}=e,l=n.eql(n.mul(t,a),n.mul(o,i)),c=n.eql(n.mul(r,a),n.mul(s,i));return l&&c}negate(){return new d(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,i=n.mul(r,yt),{px:o,py:s,pz:a}=this;let l=n.ZERO,c=n.ZERO,u=n.ZERO,f=n.mul(o,o),h=n.mul(s,s),p=n.mul(a,a),g=n.mul(o,s);return g=n.add(g,g),u=n.mul(o,a),u=n.add(u,u),l=n.mul(e,u),c=n.mul(i,p),c=n.add(l,c),l=n.sub(h,c),c=n.add(h,c),c=n.mul(l,c),l=n.mul(g,l),u=n.mul(i,u),p=n.mul(e,p),g=n.sub(f,p),g=n.mul(e,g),g=n.add(g,u),u=n.add(f,f),f=n.add(u,f),f=n.add(f,p),f=n.mul(f,g),c=n.add(c,f),p=n.mul(s,a),p=n.add(p,p),f=n.mul(p,g),l=n.sub(l,f),u=n.mul(p,h),u=n.add(u,u),u=n.add(u,u),new d(l,c,u)}add(e){u(e);const{px:r,py:i,pz:o}=this,{px:s,py:a,pz:l}=e;let c=n.ZERO,f=n.ZERO,h=n.ZERO;const p=t.a,g=n.mul(t.b,yt);let m=n.mul(r,s),y=n.mul(i,a),w=n.mul(o,l),v=n.add(r,i),A=n.add(s,a);v=n.mul(v,A),A=n.add(m,y),v=n.sub(v,A),A=n.add(r,o);let b=n.add(s,l);return A=n.mul(A,b),b=n.add(m,w),A=n.sub(A,b),b=n.add(i,o),c=n.add(a,l),b=n.mul(b,c),c=n.add(y,w),b=n.sub(b,c),h=n.mul(p,A),c=n.mul(g,w),h=n.add(c,h),c=n.sub(y,h),h=n.add(y,h),f=n.mul(c,h),y=n.add(m,m),y=n.add(y,m),w=n.mul(p,w),A=n.mul(g,A),y=n.add(y,w),w=n.sub(m,w),w=n.mul(p,w),A=n.add(A,w),m=n.mul(y,A),f=n.add(f,m),m=n.mul(b,A),c=n.mul(v,c),c=n.sub(c,m),m=n.mul(v,y),h=n.mul(b,h),h=n.add(h,m),new d(c,f,h)}subtract(e){return this.add(e.negate())}is0(){return this.equals(d.ZERO)}wNAF(e){return h.wNAFCached(this,c,e,e=>{const t=n.invertBatch(e.map(e=>e.pz));return e.map((e,n)=>e.toAffine(t[n])).map(d.fromAffine)})}multiplyUnsafe(e){const r=d.ZERO;if(e===gt)return r;if(a(e),e===mt)return this;const{endo:i}=t;if(!i)return h.unsafeLadder(this,e);let{k1neg:o,k1:s,k2neg:l,k2:c}=i.splitScalar(e),u=r,f=r,p=this;for(;s>gt||c>gt;)s&mt&&(u=u.add(p)),c&mt&&(f=f.add(p)),p=p.double(),s>>=mt,c>>=mt;return o&&(u=u.negate()),l&&(f=f.negate()),f=new d(n.mul(f.px,i.beta),f.py,f.pz),u.add(f)}multiply(e){a(e);let r,i,o=e;const{endo:s}=t;if(s){const{k1neg:e,k1:t,k2neg:a,k2:l}=s.splitScalar(o);let{p:c,f:u}=this.wNAF(t),{p:f,f:p}=this.wNAF(l);c=h.constTimeNegate(e,c),f=h.constTimeNegate(a,f),f=new d(n.mul(f.px,s.beta),f.py,f.pz),r=c.add(f),i=u.add(p)}else{const{p:e,f:t}=this.wNAF(o);r=e,i=t}return d.normalizeZ([r,i])[0]}multiplyAndAddUnsafe(e,t,n){const r=d.BASE,i=(e,t)=>t!==gt&&t!==mt&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),o=i(this,t).add(i(e,n));return o.is0()?void 0:o}toAffine(e){const{px:t,py:r,pz:i}=this,o=this.is0();null==e&&(e=o?n.ONE:n.inv(i));const s=n.mul(t,e),a=n.mul(r,e),l=n.mul(i,e);if(o)return{x:n.ZERO,y:n.ZERO};if(!n.eql(l,n.ONE))throw new Error("invZ was invalid");return{x:s,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===mt)return!0;if(n)return n(d,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===mt?this:n?n(d,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(d,this,e)}toHex(e=!0){return Fe(this.toRawBytes(e))}}d.BASE=new d(t.Gx,t.Gy,n.ONE),d.ZERO=new d(n.ZERO,n.ONE,n.ZERO);const f=t.nBitLength,h=function(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},r=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let r=e.ZERO,i=t;for(;n>ct;)n&ut&&(r=r.add(i)),i=i.double(),n>>=ut;return r},precomputeWindow(e,t){const{windows:n,windowSize:i}=r(t),o=[];let s=e,a=s;for(let e=0;e>=f,r>a&&(r-=d,o+=ut);const s=t,h=t+Math.abs(r)-1,p=e%2!=0,g=r<0;0===r?c=c.add(n(p,i[s])):l=l.add(n(g,i[h]))}return{p:l,f:c}},wNAFCached(e,t,n,r){const i=e._WINDOW_SIZE||1;let o=t.get(e);return o||(o=this.precomputeWindow(e,i),1!==i&&t.set(e,r(o))),this.wNAF(i,o,n)}}}(d,t.endo?Math.ceil(f/2):f);return{CURVE:t,ProjectivePoint:d,normPrivateKeyToScalar:l,weierstrassEquation:o,isWithinCurveOrder:s}}function vt(e){const t=function(e){const t=dt(e);return Je(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:r}=t,i=n.BYTES+1,o=2*n.BYTES+1;function s(e){return et(e,r)}function a(e){return rt(e,r)}const{ProjectivePoint:l,normPrivateKeyToScalar:c,weierstrassEquation:u,isWithinCurveOrder:d}=wt({...t,toBytes(e,t,r){const i=t.toAffine(),o=n.toBytes(i.x),s=Me;return r?s(Uint8Array.from([t.hasEvenY()?2:3]),o):s(Uint8Array.from([4]),o,n.toBytes(i.y))},fromBytes(e){const t=e.length,r=e[0],s=e.subarray(1);if(t!==i||2!==r&&3!==r){if(t===o&&4===r){return{x:n.fromBytes(s.subarray(0,n.BYTES)),y:n.fromBytes(s.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${i} compressed bytes or ${o} uncompressed bytes`)}{const e=Pe(s);if(!(gt<(a=e)&&aFe(Ue(e,t.nByteLength));function h(e){return e>r>>mt}const p=(e,t,n)=>Pe(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=Le("compactSignature",e,2*n),new g(p(e,0,n),p(e,n,2*n))}static fromDER(e){const{r:t,s:n}=pt.toSig(Le("DER",e));return new g(t,n)}assertValidity(){if(!d(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!d(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:i,recovery:o}=this,c=v(Le("msgHash",e));if(null==o||![0,1,2,3].includes(o))throw new Error("recovery id invalid");const u=2===o||3===o?r+t.n:r;if(u>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const d=1&o?"03":"02",h=l.fromHex(d+f(u)),p=a(u),g=s(-c*p),m=s(i*p),y=l.BASE.multiplyAndAddUnsafe(h,g,m);if(!y)throw new Error("point at infinify");return y.assertValidity(),y}hasHighS(){return h(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,s(-this.s),this.recovery):this}toDERRawBytes(){return Re(this.toDERHex())}toDERHex(){return pt.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return Re(this.toCompactHex())}toCompactHex(){return f(this.r)+f(this.s)}}const m={isValidPrivateKey(e){try{return c(e),!0}catch(e){return!1}},normPrivateKeyToScalar:c,randomPrivateKey:()=>{const e=lt(t.n);return function(e,t,n=!1){const r=e.length,i=at(t),o=lt(t);if(r<16||r1024)throw new Error(`expected ${o}-1024 bytes of input, got ${r}`);const s=et(n?Pe(e):Te(e),t-ze)+ze;return n?Ne(s,i):Ue(s,i)}(t.randomBytes(e),t.n)},precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function y(e){const t=e instanceof Uint8Array,n="string"==typeof e,r=(t||n)&&e.length;return t?r===i||r===o:n?r===2*i||r===2*o:e instanceof l}const w=t.bits2int||function(e){const n=Pe(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},v=t.bits2int_modN||function(e){return s(w(e))},A=_e(t.nBitLength);function b(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(gt<=e&&ee in i))throw new Error("sign() legacy options not supported");const{hash:o,randomBytes:u}=t;let{lowS:f,prehash:p,extraEntropy:m}=i;null==f&&(f=!0),e=Le("msgHash",e),p&&(e=Le("prehashed msgHash",o(e)));const y=v(e),A=c(r),k=[b(A),b(y)];if(null!=m){const e=!0===m?u(n.BYTES):m;k.push(Le("extraEntropy",e))}const C=Me(...k),E=y;return{seed:C,k2sig:function(e){const t=w(e);if(!d(t))return;const n=a(t),r=l.BASE.multiply(t).toAffine(),i=s(r.x);if(i===gt)return;const o=s(n*s(E+i*A));if(o===gt)return;let c=(r.x===i?0:2)|Number(r.y&mt),u=o;return f&&h(o)&&(u=function(e){return h(e)?s(-e):e}(o),c^=1),new g(i,u,c)}}}const I={lowS:t.lowS,prehash:!1},C={lowS:t.lowS,prehash:!1};return l.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return l.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(y(e))throw new Error("first arg must be private key");if(!y(t))throw new Error("second arg must be public key");return l.fromHex(t).multiply(c(e)).toRawBytes(n)},sign:function(e,n,r=I){const{seed:i,k2sig:o}=k(e,n,r),s=t;return je(s.hash.outputLen,s.nByteLength,s.hmac)(i,o)},verify:function(e,n,r,i=C){const o=e;if(n=Le("msgHash",n),r=Le("publicKey",r),"strict"in i)throw new Error("options.strict was renamed to lowS");const{lowS:c,prehash:u}=i;let d,f;try{if("string"==typeof o||o instanceof Uint8Array)try{d=g.fromDER(o)}catch(e){if(!(e instanceof pt.Err))throw e;d=g.fromCompact(o)}else{if("object"!=typeof o||"bigint"!=typeof o.r||"bigint"!=typeof o.s)throw new Error("PARSE");{const{r:e,s:t}=o;d=new g(e,t)}}f=l.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(c&&d.hasHighS())return!1;u&&(n=t.hash(n));const{r:h,s:p}=d,m=v(n),y=a(p),w=s(m*y),A=s(h*y),b=l.BASE.multiplyAndAddUnsafe(f,w,A)?.toAffine();return!!b&&s(b.x)===h},ProjectivePoint:l,Signature:g,utils:m}}BigInt(4);let At=class extends pe{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");se(e.outputLen),se(e.blockLen)}(e);const n=he(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,i=new Uint8Array(r);i.set(n.length>r?e.create().update(n).digest():n);for(let e=0;enew At(e,t).update(n).digest(); /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ -function It(e){return{hash:e,hmac:(t,...n)=>bt(e,t,function(...e){const t=new Uint8Array(e.reduce((e,t)=>e+t.length,0));let n=0;return e.forEach(e=>{if(!ue(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}(...n)),randomBytes:me}}bt.create=(e,t)=>new At(e,t); +function kt(e){return{hash:e,hmac:(t,...n)=>bt(e,t,function(...e){const t=new Uint8Array(e.reduce((e,t)=>e+t.length,0));let n=0;return e.forEach(e=>{if(!ue(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}(...n)),randomBytes:me}}bt.create=(e,t)=>new At(e,t); /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ -const kt=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Ct=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Et=BigInt(1),xt=BigInt(2),Bt=(e,t)=>(e+t/xt)/t;function St(e){const t=kt,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=nt(u,n,t)*u%t,f=nt(d,n,t)*u%t,p=nt(f,xt,t)*c%t,h=nt(p,i,t)*p%t,g=nt(h,o,t)*h%t,m=nt(g,a,t)*g%t,y=nt(m,l,t)*m%t,w=nt(y,a,t)*g%t,v=nt(w,n,t)*u%t,A=nt(v,s,t)*h%t,b=nt(A,r,t)*c%t,I=nt(b,xt,t);if(!Qt.eql(Qt.sqr(I),e))throw new Error("Cannot find square root");return I}const Qt=function(e,t,n=!1,r={}){if(e<=Ve)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:i,nByteLength:o}=st(e,t);if(o>2048)throw new Error("Field lengths over 2048 bytes are not supported");const s=it(e),a=Object.freeze({ORDER:e,BITS:i,BYTES:o,MASK:Me(i),ZERO:Ve,ONE:qe,create:t=>et(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return Ve<=t&&te===Ve,isOdd:e=>(e&qe)===qe,neg:t=>et(-t,e),eql:(e,t)=>e===t,sqr:t=>et(t*t,e),add:(t,n)=>et(t+n,e),sub:(t,n)=>et(t-n,e),mul:(t,n)=>et(t*n,e),pow:(e,t)=>function(e,t,n){if(n 0");if(n===Ve)return e.ONE;if(n===qe)return t;let r=e.ONE,i=t;for(;n>Ve;)n&qe&&(r=e.mul(r,i)),i=e.sqr(i),n>>=qe;return r}(a,e,t),div:(t,n)=>et(t*rt(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>rt(t,e),sqrt:r.sqrt||(e=>s(a,e)),invertBatch:e=>function(e,t){const n=new Array(t.length),r=t.reduce((t,r,i)=>e.is0(r)?t:(n[i]=t,e.mul(t,r)),e.ONE),i=e.inv(r);return t.reduceRight((t,r,i)=>e.is0(r)?t:(n[i]=e.mul(t,n[i]),e.mul(t,r)),i),n}(a,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?Ne(e,o):Pe(e,o),fromBytes:e=>{if(e.length!==o)throw new Error(`Fp.fromBytes: expected ${o}, got ${e.length}`);return n?Te(e):Re(e)}});return Object.freeze(a)}(kt,void 0,void 0,{sqrt:St}),Ft=function(e,t){const n=t=>vt({...e,...It(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Qt,n:Ct,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Ct,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Et*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),i=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),o=n,s=BigInt("0x100000000000000000000000000000000"),a=Bt(o*e,t),l=Bt(-r*e,t);let c=et(e-a*n-l*i,t),u=et(-a*r-l*o,t);const d=c>s,f=u>s;if(d&&(c=t-c),f&&(u=t-u),c>s||u>s)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:d,k1:c,k2neg:f,k2:u}}}},Ce),Dt=BigInt(0),$t=e=>"bigint"==typeof e&&Dte.charCodeAt(0)));n=Le(t,t),Ut[e]=n}return Ce(Le(n,...t))}const Tt=e=>e.toRawBytes(!0).slice(1),Pt=e=>Pe(e,32),Nt=e=>et(e,kt),Ot=e=>et(e,Ct),Lt=Ft.ProjectivePoint;function Mt(e){let t=Ft.utils.normPrivateKeyToScalar(e),n=Lt.fromPrivateKey(t);return{scalar:n.hasEvenY()?t:Ot(-t),bytes:Tt(n)}}function _t(e){if(!$t(e))throw new Error("bad x: need 0 < x < p");const t=Nt(e*e);let n=St(Nt(t*e+BigInt(7)));n%xt!==Dt&&(n=Nt(-n));const r=new Lt(e,n,Et);return r.assertValidity(),r}function jt(...e){return Ot(Re(Rt("BIP0340/challenge",...e)))}function Ht(e){return Mt(e).bytes}function Gt(e,t,n=me(32)){const r=Oe("message",e),{bytes:i,scalar:o}=Mt(t),s=Oe("auxRand",n,32),a=Pt(o^Re(Rt("BIP0340/aux",s))),l=Rt("BIP0340/nonce",a,i,r),c=Ot(Re(l));if(c===Dt)throw new Error("sign failed: k is zero");const{bytes:u,scalar:d}=Mt(c),f=jt(u,i,r),p=new Uint8Array(64);if(p.set(u,0),p.set(Pt(Ot(d+f*o)),32),!Jt(p,r,i))throw new Error("sign: Invalid signature produced");return p}function Jt(e,t,n){const r=Oe("signature",e,64),i=Oe("message",t),o=Oe("publicKey",n,32);try{const e=_t(Re(o)),t=Re(r.subarray(0,32));if(!$t(t))return!1;const n=Re(r.subarray(32,64));if(!("bigint"==typeof(c=n)&&Dt({getPublicKey:Ht,sign:Gt,verify:Jt,utils:{randomPrivateKey:Ft.utils.randomPrivateKey,lift_x:_t,pointToBytes:Tt,numberToBytesBE:Pe,bytesToNumberBE:Re,taggedHash:Rt,mod:et}}))(),Vt="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,qt=e=>e instanceof Uint8Array,Yt=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),Wt=(e,t)=>e<<32-t|e>>>t;if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");const zt=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Zt(e){if(!qt(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length,0));let n=0;return e.forEach(e=>{if(!qt(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}class nn{clone(){return this._cloneInto()}}function rn(e){const t=t=>e().update(en(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function on(e=32){if(Vt&&"function"==typeof Vt.getRandomValues)return Vt.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}function sn(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function an(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}const ln={number:sn,bool:function(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)},bytes:an,hash:function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");sn(e.outputLen),sn(e.blockLen)},exists:function(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")},output:function(e,t){an(e);const n=t.outputLen;if(e.lengthr-o&&(this.process(n,0),o=0);for(let e=o;e>i&o),a=Number(n&o),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}(n,r-8,BigInt(8*this.length),i),this.process(n,0);const s=Yt(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^~e&n,dn=(e,t,n)=>e&t^e&n^t&n,fn=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),pn=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),hn=new Uint32Array(64);class gn extends cn{constructor(){super(64,32,8,!1),this.A=0|pn[0],this.B=0|pn[1],this.C=0|pn[2],this.D=0|pn[3],this.E=0|pn[4],this.F=0|pn[5],this.G=0|pn[6],this.H=0|pn[7]}get(){const{A:e,B:t,C:n,D:r,E:i,F:o,G:s,H:a}=this;return[e,t,n,r,i,o,s,a]}set(e,t,n,r,i,o,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|i,this.F=0|o,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)hn[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=hn[e-15],n=hn[e-2],r=Wt(t,7)^Wt(t,18)^t>>>3,i=Wt(n,17)^Wt(n,19)^n>>>10;hn[e]=i+hn[e-7]+r+hn[e-16]|0}let{A:n,B:r,C:i,D:o,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(Wt(s,6)^Wt(s,11)^Wt(s,25))+un(s,a,l)+fn[e]+hn[e]|0,u=(Wt(n,2)^Wt(n,13)^Wt(n,22))+dn(n,r,i)|0;c=l,l=a,a=s,s=o+t|0,o=i,i=r,r=n,n=t+u|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,o=o+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,i,o,s,a,l,c)}roundClean(){hn.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}class mn extends gn{constructor(){super(),this.A=-1056596264,this.B=914150663,this.C=812702999,this.D=-150054599,this.E=-4191439,this.F=1750603025,this.G=1694076839,this.H=-1090891868,this.outputLen=28}}const yn=rn(()=>new gn);rn(()=>new mn);var wn=Symbol("verified");function vn(e){if(!(e instanceof Object))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;te===n.slice(1)&&-1!==r.indexOf(t)))return!1}return!(e.since&&t.created_ate.until)}async function Sn(){return new Promise(e=>{const t=new MessageChannel,n=()=>{t.port1.removeEventListener("message",n),e()};t.port1.addEventListener("message",n),t.port2.postMessage(0),t.port1.start()})}var Qn,Fn=e=>(e[wn]=!0,!0),Dn=class extends Error{constructor(e,t){super(`Tried to send message '${e} on a closed connection to ${t}.`),this.name="SendingOnClosedConnection"}},$n=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);baseEoseTimeout=4400;connectionTimeout=4400;publishTimeout=4400;pingFrequency=2e4;pingTimeout=2e4;openSubs=new Map;enablePing;connectionTimeoutHandle;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;incomingMessageQueue=new kn;queueRunning=!1;challenge;authPromise;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=bn(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket,this.enablePing=t.enablePing}static async connect(e,t){const n=new $n(e,t);return await n.connect(),n}closeAllSubscriptions(e){for(let[t,n]of this.openSubs)n.close(e);this.openSubs.clear();for(let[t,n]of this.openEventPublishes)n.reject(new Error(e));this.openEventPublishes.clear();for(let[t,n]of this.openCountRequests)n.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async connect(){return this.connectionPromise||(this.challenge=void 0,this.authPromise=void 0,this.connectionPromise=new Promise((e,t)=>{this.connectionTimeoutHandle=setTimeout(()=>{t("connection timed out"),this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection timed out")},this.connectionTimeout);try{this.ws=new this._WebSocket(this.url)}catch(e){return clearTimeout(this.connectionTimeoutHandle),void t(e)}this.ws.onopen=()=>{clearTimeout(this.connectionTimeoutHandle),this._connected=!0,this.enablePing&&this.pingpong(),e()},this.ws.onerror=e=>{clearTimeout(this.connectionTimeoutHandle),t(e.message||"websocket error"),this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection errored")},this.ws.onclose=e=>{clearTimeout(this.connectionTimeoutHandle),t(e.message||"websocket closed"),this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection closed")},this.ws.onmessage=this._onmessage.bind(this)})),this.connectionPromise}async waitForPingPong(){return new Promise((e,t)=>{this.ws&&this.ws.on&&this.ws.on("pong",()=>e(!0))||t("ws can't listen for pong"),this.ws&&this.ws.ping&&this.ws.ping()})}async waitForDummyReq(){return new Promise((e,t)=>{const n=this.subscribe([{ids:["a".repeat(64)]}],{oneose:()=>{n.close(),e(!0)},eoseTimeout:this.pingTimeout+1e3})})}async pingpong(){if(1===this.ws?.readyState){await Promise.any([this.ws&&this.ws.ping&&this.ws.on?this.waitForPingPong():this.waitForDummyReq(),new Promise(e=>setTimeout(()=>e(!1),this.pingTimeout))])?setTimeout(()=>this.pingpong(),this.pingFrequency):(this.closeAllSubscriptions("pingpong timed out"),this._connected=!1,this.onclose?.(),this.ws?.close())}}async runQueue(){for(this.queueRunning=!0;!1!==this.handleNext();)await Sn();this.queueRunning=!1}handleNext(){const e=this.incomingMessageQueue.dequeue();if(!e)return!1;const t=function(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let r=t+7+1+n,i=e.slice(r+1,80).indexOf('"');if(-1===i)return null;let o=r+1+i;return e.slice(r+1,o)}(e);if(t){const n=this.openSubs.get(t);if(!n)return;const r=function(e,t){let n=t.length+3,r=e.indexOf(`"${t}":`)+n,i=e.slice(r).indexOf('"')+r+1;return e.slice(i,i+64)}(e,"id"),i=n.alreadyHaveEvent?.(r);if(n.receivedEvent?.(this,r),i)return}try{let t=JSON.parse(e);switch(t[0]){case"EVENT":{const e=this.openSubs.get(t[1]),n=t[2];return void(this.verifyEvent(n)&&function(e,t){for(let n=0;n{this.ws?.send(e)})}async auth(e){const t=this.challenge;if(!t)throw new Error("can't perform auth, no challenge was received");return this.authPromise||(this.authPromise=new Promise(async(n,r)=>{try{let i=await e(function(e,t){return{kind:22242,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}(this.url,t)),o=setTimeout(()=>{let e=this.openEventPublishes.get(i.id);e&&(e.reject(new Error("auth timed out")),this.openEventPublishes.delete(i.id))},this.publishTimeout);this.openEventPublishes.set(i.id,{resolve:n,reject:r,timeout:o}),this.send('["AUTH",'+JSON.stringify(i)+"]")}catch(e){console.warn("subscribe auth function failed:",e)}})),this.authPromise}async publish(e){const t=new Promise((t,n)=>{const r=setTimeout(()=>{const t=this.openEventPublishes.get(e.id);t&&(t.reject(new Error("publish timed out")),this.openEventPublishes.delete(e.id))},this.publishTimeout);this.openEventPublishes.set(e.id,{resolve:t,reject:n,timeout:r})});return this.send('["EVENT",'+JSON.stringify(e)+"]"),t}async count(e,t){this.serial++;const n=t?.id||"count:"+this.serial,r=new Promise((e,t)=>{this.openCountRequests.set(n,{resolve:e,reject:t})});return this.send('["COUNT","'+n+'",'+JSON.stringify(e).substring(1)),r}subscribe(e,t){const n=this.prepareSubscription(e,t);return n.fire(),n}prepareSubscription(e,t){this.serial++;const n=t.id||(t.label?t.label+":":"sub:")+this.serial,r=new Un(this,n,e,t);return this.openSubs.set(n,r),r}close(){this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.onclose?.(),this.ws?.close()}_onmessage(e){this.incomingMessageQueue.enqueue(e.data),this.queueRunning||this.runQueue()}},Un=class{relay;id;closed=!1;eosed=!1;filters;alreadyHaveEvent;receivedEvent;onevent;oneose;onclose;eoseTimeout;eoseTimeoutHandle;constructor(e,t,n,r){this.relay=e,this.filters=n,this.id=t,this.alreadyHaveEvent=r.alreadyHaveEvent,this.receivedEvent=r.receivedEvent,this.eoseTimeout=r.eoseTimeout||e.baseEoseTimeout,this.oneose=r.oneose,this.onclose=r.onclose,this.onevent=r.onevent||(e=>{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,e)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){if(!this.closed&&this.relay.connected){try{this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]")}catch(e){if(!(e instanceof Dn))throw e}this.closed=!0}this.relay.openSubs.delete(this.id),this.onclose?.(e)}},Rn=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;enablePing;trustedRelayURLs=new Set;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation,this.enablePing=e.enablePing}async ensureRelay(e,t){e=bn(e);let n=this.relays.get(e);return n||(n=new $n(e,{verifyEvent:this.trustedRelayURLs.has(e)?Fn:this.verifyEvent,websocketImplementation:this._WebSocket,enablePing:this.enablePing}),n.onclose=()=>{this.relays.delete(e)},t?.connectionTimeout&&(n.connectionTimeout=t.connectionTimeout),this.relays.set(e,n)),await n.connect(),n}close(e){e.map(bn).forEach(e=>{this.relays.get(e)?.close(),this.relays.delete(e)})}subscribe(e,t,n){n.onauth=n.onauth||n.doauth;const r=[];for(let n=0;ne.url===i)||r.push({url:i,filter:t})}return this.subscribeMap(r,n)}subscribeMany(e,t,n){n.onauth=n.onauth||n.doauth;const r=[],i=[];for(let n=0;n({url:e,filters:t}));this.trackRelays&&(t.receivedEvent=(e,t)=>{let n=this.seenOn.get(t);n||(n=new Set,this.seenOn.set(t,n)),n.add(e)});const i=new Set,o=[],s=[];let a=n=>{s[n]||(s[n]=!0,s.filter(e=>e).length===e.length&&(t.oneose?.(),a=()=>{}))};const l=[];let c=(n,r)=>{l[n]||(a(n),l[n]=r,l.filter(e=>e).length===e.length&&(t.onclose?.(l),c=()=>{}))};const u=e=>{if(t.alreadyHaveEvent?.(e))return!0;const n=i.has(e);return i.add(e),n},d=Promise.all(r.map(async({url:e,filters:n},r)=>{let i;try{i=await this.ensureRelay(e,{connectionTimeout:t.maxWait?Math.max(.8*t.maxWait,t.maxWait-1e3):void 0})}catch(e){return void c(r,e?.message||String(e))}let s=i.subscribe(n,{...t,oneose:()=>a(r),onclose:e=>{e.startsWith("auth-required: ")&&t.onauth?i.auth(t.onauth).then(()=>{i.subscribe(n,{...t,oneose:()=>a(r),onclose:e=>{c(r,e)},alreadyHaveEvent:u,eoseTimeout:t.maxWait})}).catch(e=>{c(r,`auth was required and attempted, but failed with: ${e}`)}):c(r,e)},alreadyHaveEvent:u,eoseTimeout:t.maxWait});o.push(s)}));return{async close(e){await d,o.forEach(t=>{t.close(e)})}}}subscribeEose(e,t,n){n.onauth=n.onauth||n.doauth;const r=this.subscribe(e,t,{...n,oneose(){r.close("closed automatically on eose")}});return r}subscribeManyEose(e,t,n){n.onauth=n.onauth||n.doauth;const r=this.subscribeMany(e,t,{...n,oneose(){r.close("closed automatically on eose")}});return r}async querySync(e,t,n){return new Promise(async r=>{const i=[];this.subscribeEose(e,t,{...n,onevent(e){i.push(e)},onclose(e){r(i)}})})}async get(e,t,n){t.limit=1;const r=await this.querySync(e,t,n);return r.sort((e,t)=>t.created_at-e.created_at),r[0]||null}publish(e,t,n){return e.map(bn).map(async(e,r,i)=>{if(i.indexOf(e)!==r)return Promise.reject("duplicate url");let o=await this.ensureRelay(e);return o.publish(t).catch(async e=>{if(e instanceof Error&&e.message.startsWith("auth-required: ")&&n?.onauth)return await o.auth(n.onauth),o.publish(t);throw e}).then(e=>{if(this.trackRelays){let e=this.seenOn.get(t.id);e||(e=new Set,this.seenOn.set(t.id,e)),e.add(o)}return e})})}listConnectionStatus(){const e=new Map;return this.relays.forEach((t,n)=>e.set(n,t.connected)),e}destroy(){this.relays.forEach(e=>e.close()),this.relays=new Map}};try{Qn=WebSocket}catch{}var Tn=class extends Rn{constructor(e){super({verifyEvent:xn,websocketImplementation:Qn,...e})}}; -/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Pn(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function Nn(...e){const t=(e,t)=>n=>e(t(n)),n=Array.from(e).reverse().reduce((e,n)=>e?t(e,n.encode):n.encode,void 0),r=e.reduce((e,n)=>e?t(e,n.decode):n.decode,void 0);return{encode:n,decode:r}}function On(e){return{encode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("alphabet.encode input should be an array of numbers");return t.map(t=>{if(Pn(t),t<0||t>=e.length)throw new Error(`Digit index outside alphabet: ${t} (alphabet: ${e.length})`);return e[t]})},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map(t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n})}}}function Ln(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function Mn(e,t="="){if(Pn(e),"string"!=typeof t)throw new Error("padding chr should be string");return{encode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;n.length*e%8;)n.push(t);return n},decode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let r=n.length;if(r*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;r>0&&n[r-1]===t;r--)if(!((r-1)*e%8))throw new Error("Invalid padding: string has too much padding");return n.slice(0,r)}}}function _n(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function jn(e,t,n){if(t<2)throw new Error(`convertRadix: wrong from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: wrong to=${n}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let r=0;const i=[],o=Array.from(e);for(o.forEach(e=>{if(Pn(e),e<0||e>=t)throw new Error(`Wrong integer: ${e}`)});;){let e=0,s=!0;for(let i=r;it?Hn(t,e%t):e,Gn=(e,t)=>e+(t-Hn(e,t));function Jn(e,t,n,r){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(Gn(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${Gn(t,n)}`);let i=0,o=0;const s=2**n-1,a=[];for(const r of e){if(Pn(r),r>=2**t)throw new Error(`convertRadix2: invalid data word=${r} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${o} from=${t}`);for(o+=t;o>=n;o-=n)a.push((i>>o-n&s)>>>0);i&=2**o-1}if(i=i<=t)throw new Error("Excess padding");if(!r&&i)throw new Error(`Non-zero padding: ${i}`);return r&&o>0&&a.push(i>>>0),a}function Kn(e,t=!1){if(Pn(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(Gn(8,e)>32||Gn(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!(n instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return Jn(Array.from(n),8,e,!t)},decode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(Jn(n,e,8,t))}}}function Vn(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}const qn=Nn(Kn(4),On("0123456789ABCDEF"),Ln("")),Yn=Nn(Kn(5),On("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),Mn(5),Ln(""));Nn(Kn(5),On("0123456789ABCDEFGHIJKLMNOPQRSTUV"),Mn(5),Ln("")),Nn(Kn(5),On("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),Ln(""),_n(e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1")));const Wn=Nn(Kn(6),On("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),Mn(6),Ln("")),zn=Nn(Kn(6),On("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),Mn(6),Ln("")),Zn=e=>{return Nn((Pn(t=58),{encode:e=>{if(!(e instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return jn(Array.from(e),256,t)},decode:e=>{if(!Array.isArray(e)||e.length&&"number"!=typeof e[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(jn(e,t,256))}}),On(e),Ln(""));var t},Xn=Zn("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");Zn("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),Zn("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz");const er=[0,2,3,5,6,7,9,10,11],tr={encode(e){let t="";for(let n=0;n>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=rr[e]);return n}function or(e,t,n=1){const r=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=ir(i)^n>>5}i=ir(i);for(let t=0;tn)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const r=e.toLowerCase();if(e!==r&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const i=(e=r).lastIndexOf("1");if(0===i||-1===i)throw new Error('Letter "1" must be present between prefix and data only');const o=e.slice(0,i),s=e.slice(i+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const a=nr.decode(s).slice(0,-6),l=or(o,a,t);if(!s.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:o,words:a}}return{encode:function(e,n,r=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const i=e.length+7+n.length;if(!1!==r&&i>r)throw new TypeError(`Length ${i} exceeds limit ${r}`);return`${e=e.toLowerCase()}1${nr.encode(n)}${or(e,n,t)}`},decode:s,decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:r(n)}},decodeUnsafe:Vn(s),fromWords:r,fromWordsUnsafe:o,toWords:i}}const ar=sr("bech32");sr("bech32m");const lr={utf8:{encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},hex:Nn(Kn(4),On("0123456789abcdef"),Ln(""),_n(e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()})),base16:qn,base32:Yn,base64:Wn,base64url:zn,base58:Xn,base58xmr:tr};function cr(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function ur(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function dr(e,...t){if(!((n=e)instanceof Uint8Array||null!=n&&"object"==typeof n&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)} -/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */Object.keys(lr).join(", ");const fr=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");const pr=16;function hr(e){return e<<1^283&-(e>>7)}function gr(e,t){let n=0;for(;t>0;t>>=1)n^=e&-(1&t),e=hr(e);return n}const mr=(()=>{let e=new Uint8Array(256);for(let t=0,n=1;t<256;t++,n^=hr(n))e[t]=n;const t=new Uint8Array(256);t[0]=99;for(let n=0;n<255;n++){let r=e[255-n];r|=r<<8,t[e[n]]=255&(r^r>>4^r>>5^r>>6^r>>7^99)}return t})(),yr=mr.map((e,t)=>mr.indexOf(t)),wr=e=>e<<24|e>>>8,vr=e=>e<<8|e>>>24;function Ar(e,t){if(256!==e.length)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map((n,r)=>t(e[r])),r=n.map(vr),i=r.map(vr),o=i.map(vr),s=new Uint32Array(65536),a=new Uint32Array(65536),l=new Uint16Array(65536);for(let t=0;t<256;t++)for(let c=0;c<256;c++){const u=256*t+c;s[u]=n[t]^r[c],a[u]=i[t]^o[c],l[u]=e[t]<<8|e[c]}return{sbox:e,sbox2:l,T0:n,T1:r,T2:i,T3:o,T01:s,T23:a}}const br=Ar(mr,e=>gr(e,3)<<24|e<<16|e<<8|gr(e,2)),Ir=Ar(yr,e=>gr(e,11)<<24|gr(e,13)<<16|gr(e,9)<<8|gr(e,14)),kr=(()=>{const e=new Uint8Array(16);for(let t=0,n=1;t<16;t++,n=hr(n))e[t]=n;return e})();function Cr(e){dr(e);const t=e.length;if(![16,24,32].includes(t))throw new Error(`aes: wrong key size: should be 16, 24 or 32, got: ${t}`);const{sbox2:n}=br,r=fr(e),i=r.length,o=e=>xr(n,e,e,e,e),s=new Uint32Array(t+28);s.set(r);for(let e=i;e6&&e%i===4&&(t=o(t)),s[e]=s[e-i]^t}return s}function Er(e,t,n,r,i,o){return e[n<<8&65280|r>>>8&255]^t[i>>>8&65280|o>>>24&255]}function xr(e,t,n,r,i){return e[255&t|65280&n]|e[r>>>16&255|i>>>16&65280]<<16}function Br(e,t,n,r,i){const{sbox2:o,T01:s,T23:a}=br;let l=0;t^=e[l++],n^=e[l++],r^=e[l++],i^=e[l++];const c=e.length/4-2;for(let o=0;o{const o=Cr(e),{b:s,o:a,out:l}=function(e,t,n){let r=e.length;const i=r%pr;if(!t&&0!==i)throw new Error("aec/(cbc-ecb): unpadded plaintext with disabled padding");const o=fr(e);if(t){let e=pr-i;e||(e=pr),r+=e}const s=Qr(r,n);return{b:o,o:fr(s),out:s}}(n,r,i),c=fr(t);let u=c[0],d=c[1],f=c[2],p=c[3],h=0;for(;h+4<=s.length;)u^=s[h+0],d^=s[h+1],f^=s[h+2],p^=s[h+3],({s0:u,s1:d,s2:f,s3:p}=Br(o,u,d,f,p)),a[h++]=u,a[h++]=d,a[h++]=f,a[h++]=p;if(r){const e=function(e){const t=new Uint8Array(16),n=fr(t);t.set(e);const r=pr-e.length;for(let e=pr-r;e{!function(e){if(dr(e),e.length%pr!==0)throw new Error("aes/(cbc-ecb).decrypt ciphertext should consist of blocks with size 16")}(n);const o=function(e){const t=Cr(e),n=t.slice(),r=t.length,{sbox2:i}=br,{T0:o,T1:s,T2:a,T3:l}=Ir;for(let e=0;e>>8&255]^a[r>>>16&255]^l[r>>>24]}return n}(e),s=fr(t),a=Qr(n.length,i),l=fr(n),c=fr(a);let u=s[0],d=s[1],f=s[2],p=s[3];for(let e=0;e+4<=l.length;){const t=u,n=d,r=f,i=p;u=l[e+0],d=l[e+1],f=l[e+2],p=l[e+3];const{s0:s,s1:a,s2:h,s3:g}=Sr(o,u,d,f,p);c[e++]=s^t,c[e++]=a^n,c[e++]=h^r,c[e++]=g^i}return o.fill(0),function(e,t){if(!t)return e;const n=e.length;if(!n)throw new Error("aes/pcks5: empty ciphertext not allowed");const r=e[n-1];if(r<=0||r>16)throw new Error(`aes/pcks5: wrong padding byte: ${r}`);const i=e.subarray(0,-r);for(let t=0;tUint8Array.from(e.split("").map(e=>e.charCodeAt(0))),Rr=Ur("expand 16-byte k"),Tr=Ur("expand 32-byte k"),Pr=fr(Rr),Nr=fr(Tr);function Or(e,t){return e<>>32-t}function Lr(e){return e.byteOffset%4==0}Nr.slice();const Mr=2**32-1,_r=new Uint32Array;function jr(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:o,rounds:s}=function(e,t){if(null==t||"object"!=typeof t)throw new Error("options must be defined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return cr(i),cr(s),ur(o),ur(n),(t,a,l,c,u=0)=>{dr(t),dr(a),dr(l);const d=l.length;if(c||(c=new Uint8Array(d)),dr(c),cr(u),u<0||u>=Mr)throw new Error("arx: counter overflow");if(c.length=Mr)throw new Error("arx: counter overflow");const g=Math.min(64,l-h);if(d&&64===g){const e=h/4;if(h%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<16;n++)t=e+n,p[t]=f[t]^u[n];h+=64;continue}for(let e,t=0;t0;)f.pop().fill(0);return c}}function Hr(e,t,n,r,i,o=20){let s=e[0],a=e[1],l=e[2],c=e[3],u=t[0],d=t[1],f=t[2],p=t[3],h=t[4],g=t[5],m=t[6],y=t[7],w=i,v=n[0],A=n[1],b=n[2],I=s,k=a,C=l,E=c,x=u,B=d,S=f,Q=p,F=h,D=g,$=m,U=y,R=w,T=v,P=A,N=b;for(let e=0;er?e.create().update(n).digest():n);for(let e=0;enew Jr(e,t).update(n).digest();Kr.create=(e,t)=>new Jr(e,t);const Vr=new Uint8Array([0]),qr=new Uint8Array;var Yr=Object.defineProperty,Wr=(e,t)=>{for(var n in t)Yr(e,n,{get:t[n],enumerable:!0})},zr=Symbol("verified");function Zr(e){if(!(e instanceof Object))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;tsi,QueueNode:()=>oi,binarySearch:()=>ii,bytesToHex:()=>Zt,hexToBytes:()=>Xt,insertEventIntoAscendingList:()=>ri,insertEventIntoDescendingList:()=>ni,normalizeURL:()=>ti,utf8Decoder:()=>Xr,utf8Encoder:()=>ei});var Xr=new TextDecoder("utf-8"),ei=new TextEncoder;function ti(e){try{-1===e.indexOf("://")&&(e="wss://"+e);let t=new URL(e);return t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}catch(t){throw new Error(`Invalid URL: ${e}`)}}function ni(e,t){const[n,r]=ii(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at);return r||e.splice(n,0,t),e}function ri(e,t){const[n,r]=ii(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:t.created_at-e.created_at);return r||e.splice(n,0,t),e}function ii(e,t){let n=0,r=e.length-1;for(;n<=r;){const i=Math.floor((n+r)/2),o=t(e[i]);if(0===o)return[i,!0];o<0?r=i-1:n=i+1}return[n,!1]}var oi=class{value;next=null;prev=null;constructor(e){this.value=e}},si=class{first;last;constructor(){this.first=null,this.last=null}enqueue(e){const t=new oi(e);return this.last?this.last===this.first?(this.last=t,this.last.prev=this.first,this.first.next=t):(t.prev=this.last,this.last.next=t,this.last=t):(this.first=t,this.last=t),!0}dequeue(){if(!this.first)return null;if(this.first===this.last){const e=this.first;return this.first=null,this.last=null,e.value}const e=this.first;return this.first=e.next,this.first&&(this.first.prev=null),e.value}};function ai(e){return Zt(yn(ei.encode(function(e){if(!Zr(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}(e))))}var li=new class{generateSecretKey(){return Kt.utils.randomPrivateKey()}getPublicKey(e){return Zt(Kt.getPublicKey(e))}finalizeEvent(e,t){const n=e;return n.pubkey=Zt(Kt.getPublicKey(t)),n.id=ai(n),n.sig=Zt(Kt.sign(ai(n),t)),n[zr]=!0,n}verifyEvent(e){if("boolean"==typeof e[zr])return e[zr];const t=ai(e);if(t!==e.id)return e[zr]=!1,!1;try{const n=Kt.verify(e.sig,t,e.pubkey);return e[zr]=n,n}catch(t){return e[zr]=!1,!1}}},ci=li.generateSecretKey,ui=li.getPublicKey,di=li.finalizeEvent,fi=li.verifyEvent,pi={};function hi(e){return 1e3<=e&&e<1e4||[1,2,4,5,6,7,8,16,40,41,42,43,44].includes(e)}function gi(e){return[0,3].includes(e)||1e4<=e&&e<2e4}function mi(e){return 2e4<=e&&e<3e4}function yi(e){return 3e4<=e&&e<4e4}function wi(e){return hi(e)?"regular":gi(e)?"replaceable":mi(e)?"ephemeral":yi(e)?"parameterized":"unknown"}function vi(e,t){const n=t instanceof Array?t:[t];return Zr(e)&&n.includes(e.kind)||!1}Wr(pi,{Application:()=>$o,BadgeAward:()=>Si,BadgeDefinition:()=>Eo,BlockedRelaysList:()=>oo,BookmarkList:()=>no,Bookmarksets:()=>Io,Calendar:()=>Lo,CalendarEventRSVP:()=>Mo,ChannelCreation:()=>$i,ChannelHideMessage:()=>Ti,ChannelMessage:()=>Ri,ChannelMetadata:()=>Ui,ChannelMuteUser:()=>Pi,ClassifiedListing:()=>To,ClientAuth:()=>ho,CommunitiesList:()=>ro,CommunityDefinition:()=>Ho,CommunityPostApproval:()=>Ji,Contacts:()=>ki,CreateOrUpdateProduct:()=>So,CreateOrUpdateStall:()=>Bo,Curationsets:()=>ko,Date:()=>No,DirectMessageRelaysList:()=>co,DraftClassifiedListing:()=>Po,DraftLong:()=>Fo,Emojisets:()=>Do,EncryptedDirectMessage:()=>Ci,EventDeletion:()=>Ei,FileMetadata:()=>Li,FileServerPreference:()=>uo,Followsets:()=>vo,GenericRepost:()=>Di,Genericlists:()=>Ao,GiftWrap:()=>Oi,HTTPAuth:()=>wo,Handlerinformation:()=>jo,Handlerrecommendation:()=>_o,Highlights:()=>Zi,InterestsList:()=>ao,Interestsets:()=>xo,JobFeedback:()=>qi,JobRequest:()=>Ki,JobResult:()=>Vi,Label:()=>Gi,LightningPubRPC:()=>po,LiveChatMessage:()=>Mi,LiveEvent:()=>Uo,LongFormArticle:()=>Qo,Metadata:()=>Ai,Mutelist:()=>Xi,NWCWalletInfo:()=>fo,NWCWalletRequest:()=>go,NWCWalletResponse:()=>mo,NostrConnect:()=>yo,OpenTimestamps:()=>Ni,Pinlist:()=>eo,PrivateDirectMessage:()=>Fi,ProblemTracker:()=>_i,ProfileBadges:()=>Co,PublicChatsList:()=>io,Reaction:()=>Bi,RecommendRelay:()=>Ii,RelayList:()=>to,Relaysets:()=>bo,Report:()=>ji,Reporting:()=>Hi,Repost:()=>xi,Seal:()=>Qi,SearchRelaysList:()=>so,ShortTextNote:()=>bi,Time:()=>Oo,UserEmojiList:()=>lo,UserStatuses:()=>Ro,Zap:()=>zi,ZapGoal:()=>Yi,ZapRequest:()=>Wi,classifyKind:()=>wi,isAddressableKind:()=>yi,isEphemeralKind:()=>mi,isKind:()=>vi,isRegularKind:()=>hi,isReplaceableKind:()=>gi});var Ai=0,bi=1,Ii=2,ki=3,Ci=4,Ei=5,xi=6,Bi=7,Si=8,Qi=13,Fi=14,Di=16,$i=40,Ui=41,Ri=42,Ti=43,Pi=44,Ni=1040,Oi=1059,Li=1063,Mi=1311,_i=1971,ji=1984,Hi=1984,Gi=1985,Ji=4550,Ki=5999,Vi=6999,qi=7e3,Yi=9041,Wi=9734,zi=9735,Zi=9802,Xi=1e4,eo=10001,to=10002,no=10003,ro=10004,io=10005,oo=10006,so=10007,ao=10015,lo=10030,co=10050,uo=10096,fo=13194,po=21e3,ho=22242,go=23194,mo=23195,yo=24133,wo=27235,vo=3e4,Ao=30001,bo=30002,Io=30003,ko=30004,Co=30008,Eo=30009,xo=30015,Bo=30017,So=30018,Qo=30023,Fo=30024,Do=30030,$o=30078,Uo=30311,Ro=30315,To=30402,Po=30403,No=31922,Oo=31923,Lo=31924,Mo=31925,_o=31989,jo=31990,Ho=34550;function Go(e,t){let n=t.length+3,r=e.indexOf(`"${t}":`)+n,i=e.slice(r).indexOf('"')+r+1;return e.slice(i,i+64)}function Jo(e,t){let n=t.length,r=e.indexOf(`"${t}":`)+n+3,i=e.slice(r),o=Math.min(i.indexOf(","),i.indexOf("}"));return parseInt(i.slice(0,o),10)}function Ko(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let r=t+7+1+n,i=e.slice(r+1,80).indexOf('"');if(-1===i)return null;let o=r+1+i;return e.slice(r+1,o)}function Vo(e,t){return t===Go(e,"id")}function qo(e,t){return t===Go(e,"pubkey")}function Yo(e,t){return t===Jo(e,"kind")}Wr({},{getHex64:()=>Go,getInt:()=>Jo,getSubscriptionId:()=>Ko,matchEventId:()=>Vo,matchEventKind:()=>Yo,matchEventPubkey:()=>qo});function Wo(e,t){return{kind:ho,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}Wr({},{makeAuthEvent:()=>Wo});try{WebSocket}catch{}try{WebSocket}catch{}var zo={};Wr(zo,{BECH32_REGEX:()=>es,Bech32MaxSize:()=>Xo,NostrTypeGuard:()=>Zo,decode:()=>ns,decodeNostrURI:()=>ts,encodeBytes:()=>ls,naddrEncode:()=>ds,neventEncode:()=>us,noteEncode:()=>ss,nprofileEncode:()=>cs,npubEncode:()=>os,nsecEncode:()=>is});var Zo={isNProfile:e=>/^nprofile1[a-z\d]+$/.test(e||""),isNEvent:e=>/^nevent1[a-z\d]+$/.test(e||""),isNAddr:e=>/^naddr1[a-z\d]+$/.test(e||""),isNSec:e=>/^nsec1[a-z\d]{58}$/.test(e||""),isNPub:e=>/^npub1[a-z\d]{58}$/.test(e||""),isNote:e=>/^note1[a-z\d]+$/.test(e||""),isNcryptsec:e=>/^ncryptsec1[a-z\d]+$/.test(e||"")},Xo=5e3,es=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function ts(e){try{return e.startsWith("nostr:")&&(e=e.substring(6)),ns(e)}catch(e){return{type:"invalid",data:null}}}function ns(e){let{prefix:t,words:n}=ar.decode(e,Xo),r=new Uint8Array(ar.fromWords(n));switch(t){case"nprofile":{let e=rs(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:Zt(e[0][0]),relays:e[1]?e[1].map(e=>Xr.decode(e)):[]}}}case"nevent":{let e=rs(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:Zt(e[0][0]),relays:e[1]?e[1].map(e=>Xr.decode(e)):[],author:e[2]?.[0]?Zt(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(Zt(e[3][0]),16):void 0}}}case"naddr":{let e=rs(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:Xr.decode(e[0][0]),pubkey:Zt(e[2][0]),kind:parseInt(Zt(e[3][0]),16),relays:e[1]?e[1].map(e=>Xr.decode(e)):[]}}}case"nsec":return{type:t,data:r};case"npub":case"note":return{type:t,data:Zt(r)};default:throw new Error(`unknown prefix ${t}`)}}function rs(e){let t={},n=e;for(;n.length>0;){let e=n[0],r=n[1],i=n.slice(2,2+r);if(n=n.slice(2+r),i.lengthei.encode(e))}))}function us(e){let t;return void 0!==e.kind&&(t=function(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}(e.kind)),as("nevent",fs({0:[Xt(e.id)],1:(e.relays||[]).map(e=>ei.encode(e)),2:e.author?[Xt(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function ds(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),as("naddr",fs({0:[ei.encode(e.identifier)],1:(e.relays||[]).map(e=>ei.encode(e)),2:[Xt(e.pubkey)],3:[new Uint8Array(t)]}))}function fs(e){let t=[];return Object.entries(e).reverse().forEach(([e,n])=>{n.forEach(n=>{let r=new Uint8Array(n.length+2);r.set([parseInt(e)],0),r.set([n.length],1),r.set(n,2),t.push(r)})}),tn(...t)}var ps={};function hs(e,t,n){const r=e instanceof Uint8Array?Zt(e):e,i=ms(Ft.getSharedSecret(r,"02"+t));let o=Uint8Array.from(on(16)),s=ei.encode(n),a=Fr(i,o).encrypt(s);return`${Wn.encode(new Uint8Array(a))}?iv=${Wn.encode(new Uint8Array(o.buffer))}`}function gs(e,t,n){const r=e instanceof Uint8Array?Zt(e):e;let[i,o]=n.split("?iv="),s=ms(Ft.getSharedSecret(r,"02"+t)),a=Wn.decode(o),l=Wn.decode(i),c=Fr(s,a).decrypt(l);return Xr.decode(c)}function ms(e){return e.slice(1,33)}Wr(ps,{decrypt:()=>gs,encrypt:()=>hs});Wr({},{NIP05_REGEX:()=>ws,isNip05:()=>vs,isValid:()=>ks,queryProfile:()=>Is,searchDomain:()=>bs,useFetchImplementation:()=>As});var ys,ws=/^(?:([\w.+-]+)@)?([\w_-]+(\.[\w_-]+)+)$/,vs=e=>ws.test(e||"");try{ys=fetch}catch(e){}function As(e){ys=e}async function bs(e,t=""){try{const n=`https://${e}/.well-known/nostr.json?name=${t}`,r=await ys(n,{redirect:"manual"});if(200!==r.status)throw Error("Wrong response code");return(await r.json()).names}catch(e){return{}}}async function Is(e){const t=e.match(ws);if(!t)return null;const[,n="_",r]=t;try{const e=`https://${r}/.well-known/nostr.json?name=${n}`,t=await ys(e,{redirect:"manual"});if(200!==t.status)throw Error("Wrong response code");const i=await t.json(),o=i.names[n];return o?{pubkey:o,relays:i.relays?.[o]}:null}catch(e){return null}}async function ks(e,t){const n=await Is(t);return!!n&&n.pubkey===e}function Cs(e){const t={reply:void 0,root:void 0,mentions:[],profiles:[],quotes:[]};let n,r;for(let i=e.tags.length-1;i>=0;i--){const o=e.tags[i];if("e"===o[0]&&o[1]){const[e,i,s,a,l]=o,c={id:i,relays:s?[s]:[],author:l};if("root"===a){t.root=c;continue}if("reply"===a){t.reply=c;continue}if("mention"===a){t.mentions.push(c);continue}n?r=c:n=c,t.mentions.push(c);continue}if("q"===o[0]&&o[1]){const[e,n,r]=o;t.quotes.push({id:n,relays:r?[r]:[]})}"p"===o[0]&&o[1]&&t.profiles.push({pubkey:o[1],relays:o[2]?[o[2]]:[]})}return t.root||(t.root=r||n||t.reply),t.reply||(t.reply=n||t.root),[t.reply,t.root].forEach(e=>{if(!e)return;let n=t.mentions.indexOf(e);if(-1!==n&&t.mentions.splice(n,1),e.author){let n=t.profiles.find(t=>t.pubkey===e.author);n&&n.relays&&(e.relays||(e.relays=[]),n.relays.forEach(t=>{-1===e.relays?.indexOf(t)&&e.relays.push(t)}),n.relays=e.relays)}}),t.mentions.forEach(e=>{if(e.author){let n=t.profiles.find(t=>t.pubkey===e.author);n&&n.relays&&(e.relays||(e.relays=[]),n.relays.forEach(t=>{-1===e.relays.indexOf(t)&&e.relays.push(t)}),n.relays=e.relays)}}),t}Wr({},{parse:()=>Cs});Wr({},{fetchRelayInformation:()=>xs,useFetchImplementation:()=>Es});try{fetch}catch{}function Es(e){0}async function xs(e){return await(await fetch(e.replace("ws://","http://").replace("wss://","https://"),{headers:{Accept:"application/nostr+json"}})).json()}function Bs(e){let t=0;for(let n=0;n<64;n+=8){const r=parseInt(e.substring(n,n+8),16);if(0!==r){t+=Math.clz32(r);break}t+=32}return t}function Ss(e,t){let n=0;const r=e,i=["nonce",n.toString(),t.toString()];for(r.tags.push(i);;){const e=Math.floor((new Date).getTime()/1e3);if(e!==r.created_at&&(n=0,r.created_at=e),i[1]=(++n).toString(),r.id=Qs(r),Bs(r.id)>=t)break}return r}function Qs(e){return Zt(yn(ei.encode(JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content]))))}Wr({},{fastEventHash:()=>Qs,getPow:()=>Bs,minePow:()=>Ss});Wr({},{unwrapEvent:()=>ta,unwrapManyEvents:()=>na,wrapEvent:()=>Xs,wrapManyEvents:()=>ea});Wr({},{createRumor:()=>Ks,createSeal:()=>Vs,createWrap:()=>qs,unwrapEvent:()=>zs,unwrapManyEvents:()=>Zs,wrapEvent:()=>Ys,wrapManyEvents:()=>Ws});var Fs={};Wr(Fs,{decrypt:()=>Ls,encrypt:()=>Os,getConversationKey:()=>Us,v2:()=>Ms});var Ds=1,$s=65535;function Us(e,t){const n=Ft.getSharedSecret(e,"02"+t).subarray(1,33);return function(e,t,n){return ln.hash(e),void 0===n&&(n=new Uint8Array(e.outputLen)),Kr(e,en(n),en(t))}(yn,n,"nip44-v2")}function Rs(e,t){const n=function(e,t,n,r=32){if(ln.hash(e),ln.number(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const i=Math.ceil(r/e.outputLen);void 0===n&&(n=qr);const o=new Uint8Array(i*e.outputLen),s=Kr.create(e,t),a=s._cloneInto(),l=new Uint8Array(s.outputLen);for(let t=0;t$s)throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");const t=new Uint8Array(2);return new DataView(t.buffer).setUint16(0,e,!1),t}(n),t,new Uint8Array(Ts(n)-n))}function Ns(e,t,n){if(32!==n.length)throw new Error("AAD associated data must be 32 bytes");const r=tn(n,t);return Kr(yn,e,r)}function Os(e,t,n=on(32)){const{chacha_key:r,chacha_nonce:i,hmac_key:o}=Rs(t,n),s=Ps(e),a=Gr(r,i,s),l=Ns(o,a,n);return Wn.encode(tn(new Uint8Array([2]),n,a,l))}function Ls(e,t){const{nonce:n,ciphertext:r,mac:i}=function(e){if("string"!=typeof e)throw new Error("payload must be a valid string");const t=e.length;if(t<132||t>87472)throw new Error("invalid payload length: "+t);if("#"===e[0])throw new Error("unknown encryption version");let n;try{n=Wn.decode(e)}catch(e){throw new Error("invalid base64: "+e.message)}const r=n.length;if(r<99||r>65603)throw new Error("invalid data length: "+r);const i=n[0];if(2!==i)throw new Error("unknown encryption version "+i);return{nonce:n.subarray(1,33),ciphertext:n.subarray(33,-32),mac:n.subarray(-32)}}(e),{chacha_key:o,chacha_nonce:s,hmac_key:a}=Rs(t,n);if(!function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r$s||n.length!==t||e.length!==2+Ts(t))throw new Error("invalid padding");return Xr.decode(n)}(Gr(o,s,r))}var Ms={utils:{getConversationKey:Us,calcPaddedLen:Ts},encrypt:Os,decrypt:Ls},_s=()=>Math.round(Date.now()/1e3),js=()=>Math.round(_s()-172800*Math.random()),Hs=(e,t)=>Us(e,t),Gs=(e,t,n)=>Os(JSON.stringify(e),Hs(t,n)),Js=(e,t)=>JSON.parse(Ls(e.content,Hs(t,e.pubkey)));function Ks(e,t){const n={created_at:_s(),content:"",tags:[],...e,pubkey:ui(t)};return n.id=ai(n),n}function Vs(e,t,n){return di({kind:Qi,content:Gs(e,t,n),created_at:js(),tags:[]},t)}function qs(e,t){const n=ci();return di({kind:Oi,content:Gs(e,n,t),created_at:js(),tags:[["p",t]]},n)}function Ys(e,t,n){return qs(Vs(Ks(e,t),t,n),n)}function Ws(e,t,n){if(!n||0===n.length)throw new Error("At least one recipient is required.");const r=ui(t),i=[Ys(e,t,r)];return n.forEach(n=>{i.push(Ys(e,t,n))}),i}function zs(e,t){const n=Js(e,t);return Js(n,t)}function Zs(e,t){let n=[];return e.forEach(e=>{n.push(zs(e,t))}),n.sort((e,t)=>e.created_at-t.created_at),n}function Xs(e,t,n,r,i){const o=function(e,t,n,r){const i={created_at:Math.ceil(Date.now()/1e3),kind:Fi,tags:[],content:t};return(Array.isArray(e)?e:[e]).forEach(({publicKey:e,relayUrl:t})=>{i.tags.push(t?["p",e,t]:["p",e])}),r&&i.tags.push(["e",r.eventId,r.relayUrl||"","reply"]),n&&i.tags.push(["subject",n]),i}(t,n,r,i);return Ys(o,e,t.publicKey)}function ea(e,t,n,r,i){if(!t||0===t.length)throw new Error("At least one recipient is required.");return[{publicKey:ui(e)},...t].map(t=>Xs(e,t,n,r,i))}var ta=zs,na=Zs;function ra(e,t,n,r){let i;const o=[...e.tags??[],["e",t.id,n],["p",t.pubkey]];return t.kind===bi?i=xi:(i=Di,o.push(["k",String(t.kind)])),di({kind:i,tags:o,content:""===e.content||t.tags?.find(e=>"-"===e[0])?"":JSON.stringify(t),created_at:e.created_at},r)}function ia(e){if(![xi,Di].includes(e.kind))return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const i=e.tags[r];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t?{id:t[1],relays:[t[2],n?.[2]].filter(e=>"string"==typeof e),author:n?.[1]}:void 0}function oa(e,{skipVerification:t}={}){const n=ia(e);if(void 0===n||""===e.content)return;let r;try{r=JSON.parse(e.content)}catch(e){return}return r.id===n.id&&(t||fi(r))?r:void 0}Wr({},{finishRepostEvent:()=>ra,getRepostedEvent:()=>oa,getRepostedEventPointer:()=>ia});Wr({},{NOSTR_URI_REGEX:()=>sa,parse:()=>la,test:()=>aa});var sa=new RegExp(`nostr:(${es.source})`);function aa(e){return"string"==typeof e&&new RegExp(`^${sa.source}$`).test(e)}function la(e){const t=e.match(new RegExp(`^${sa.source}$`));if(!t)throw new Error(`Invalid Nostr URI: ${e}`);return{uri:t[0],value:t[1],decoded:ns(t[1])}}function ca(e,t,n){const r=t.tags.filter(e=>e.length>=2&&("e"===e[0]||"p"===e[0]));return di({...e,kind:Bi,tags:[...e.tags??[],...r,["e",t.id],["p",t.pubkey]],content:e.content??"+"},n)}function ua(e){if(e.kind!==Bi)return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const i=e.tags[r];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t&&void 0!==n?{id:t[1],relays:[t[2],n[2]].filter(e=>void 0!==e),author:n[1]}:void 0}Wr({},{finishReactionEvent:()=>ca,getReactedEventPointer:()=>ua});Wr({},{parse:()=>pa});var da=/\W/m,fa=/\W |\W$|$|,| /m;function*pa(e){const t=e.length;let n=0,r=0;for(;rha,channelHideMessageEvent:()=>ya,channelMessageEvent:()=>ma,channelMetadataEvent:()=>ga,channelMuteUserEvent:()=>wa});var ha=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:$i,tags:[...e.tags??[]],content:n,created_at:e.created_at},t)},ga=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:Ui,tags:[["e",e.channel_create_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},ma=(e,t)=>{const n=[["e",e.channel_create_event_id,e.relay_url,"root"]];return e.reply_to_channel_message_event_id&&n.push(["e",e.reply_to_channel_message_event_id,e.relay_url,"reply"]),di({kind:Ri,tags:[...n,...e.tags??[]],content:e.content,created_at:e.created_at},t)},ya=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:Ti,tags:[["e",e.channel_message_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},wa=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:Pi,tags:[["p",e.pubkey_to_mute],...e.tags??[]],content:n,created_at:e.created_at},t)};Wr({},{EMOJI_SHORTCODE_REGEX:()=>va,matchAll:()=>ba,regex:()=>Aa,replaceAll:()=>Ia});var va=/:(\w+):/,Aa=()=>new RegExp(`\\B${va.source}\\B`,"g");function*ba(e){const t=e.matchAll(Aa());for(const e of t)try{const[t,n]=e;yield{shortcode:t,name:n,start:e.index,end:e.index+t.length}}catch(e){}}function Ia(e,t){return e.replaceAll(Aa(),(e,n)=>t({shortcode:e,name:n}))}var ka;Wr({},{useFetchImplementation:()=>Ca,validateGithub:()=>Ea});try{ka=fetch}catch{}function Ca(e){ka=e}async function Ea(e,t,n){try{return await(await ka(`https://gist.github.com/${t}/${n}/raw`)).text()===`Verifying that I control the following Nostr public key: ${e}`}catch(e){return!1}}function xa(e){const{host:t,pathname:n,searchParams:r}=new URL(e),i=n||t,o=r.get("relay"),s=r.get("secret");if(!i||!o||!s)throw new Error("invalid connection string");return{pubkey:i,relay:o,secret:s}}async function Ba(e,t,n){const r={method:"pay_invoice",params:{invoice:n}},i=hs(t,e,JSON.stringify(r)),o={kind:go,created_at:Math.round(Date.now()/1e3),content:i,tags:[["p",e]]};return di(o,t)}Wr({},{makeNwcRequestEvent:()=>Ba,parseConnectionString:()=>xa});function Sa(e){return e=(e=e.trim().toLowerCase()).normalize("NFKC"),Array.from(e).map(e=>/\p{Letter}/u.test(e)||/\p{Number}/u.test(e)?e:"-").join("")}Wr({},{normalizeIdentifier:()=>Sa});var Qa;Wr({},{getSatoshisAmountFromBolt11:()=>Ta,getZapEndpoint:()=>Da,makeZapReceipt:()=>Ra,makeZapRequest:()=>$a,useFetchImplementation:()=>Fa,validateZapRequest:()=>Ua});try{Qa=fetch}catch{}function Fa(e){Qa=e}async function Da(e){try{let t="",{lud06:n,lud16:r}=JSON.parse(e.content);if(n){let{words:e}=ar.decode(n,1e3),r=ar.fromWords(e);t=Xr.decode(r)}else{if(!r)return null;{let[e,n]=r.split("@");t=new URL(`/.well-known/lnurlp/${e}`,`https://${n}`).toString()}}let i=await Qa(t),o=await i.json();if(o.allowsNostr&&o.nostrPubkey)return o.callback}catch(e){}return null}function $a(e){let t={kind:9734,created_at:Math.round(Date.now()/1e3),content:e.comment||"",tags:[["p","pubkey"in e?e.pubkey:e.event.pubkey],["amount",e.amount.toString()],["relays",...e.relays]]};if("event"in e){if(t.tags.push(["e",e.event.id]),gi(e.event.kind)){const n=["a",`${e.event.kind}:${e.event.pubkey}:`];t.tags.push(n)}else if(yi(e.event.kind)){let n=e.event.tags.find(([e,t])=>"d"===e&&t);if(!n)throw new Error("d tag not found or is empty");const r=["a",`${e.event.kind}:${e.event.pubkey}:${n[1]}`];t.tags.push(r)}t.tags.push(["k",e.event.kind.toString()])}return t}function Ua(e){let t;try{t=JSON.parse(e)}catch(e){return"Invalid zap request JSON."}if(!Zr(t))return"Zap request is not a valid Nostr event.";if(!fi(t))return"Invalid signature on zap request.";let n=t.tags.find(([e,t])=>"p"===e&&t);if(!n)return"Zap request doesn't have a 'p' tag.";if(!n[1].match(/^[a-f0-9]{64}$/))return"Zap request 'p' tag is not valid hex.";let r=t.tags.find(([e,t])=>"e"===e&&t);return r&&!r[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find(([e,t])=>"relays"===e&&t)?null:"Zap request doesn't have a 'relays' tag."}function Ra({zapRequest:e,preimage:t,bolt11:n,paidAt:r}){let i=JSON.parse(e),o=i.tags.filter(([e])=>"e"===e||"p"===e||"a"===e),s={kind:9735,created_at:Math.round(r.getTime()/1e3),content:"",tags:[...o,["P",i.pubkey],["bolt11",n],["description",e]]};return t&&s.tags.push(["preimage",t]),s}function Ta(e){if(e.length<50)return 0;const t=(e=e.substring(0,50)).lastIndexOf("1");if(-1===t)return 0;const n=e.substring(0,t);if(!n.startsWith("lnbc"))return 0;const r=n.substring(4);if(r.length<1)return 0;const i=r[r.length-1],o=i.charCodeAt(0)-"0".charCodeAt(0),s=o>=0&&o<=9;let a=r.length-1;if(s&&a++,a<1)return 0;const l=parseInt(r.substring(0,a));switch(i){case"m":return 1e5*l;case"u":return 100*l;case"n":return l/10;case"p":return l/1e4;default:return 1e8*l}}Wr({},{getToken:()=>Na,hashPayload:()=>Ga,unpackEventFromToken:()=>La,validateEvent:()=>Ka,validateEventKind:()=>_a,validateEventMethodTag:()=>Ha,validateEventPayloadTag:()=>Ja,validateEventTimestamp:()=>Ma,validateEventUrlTag:()=>ja,validateToken:()=>Oa});var Pa="Nostr ";async function Na(e,t,n,r=!1,i){const o={kind:wo,tags:[["u",e],["method",t]],created_at:Math.round((new Date).getTime()/1e3),content:""};i&&o.tags.push(["payload",Ga(i)]);const s=await n(o);return(r?Pa:"")+Wn.encode(ei.encode(JSON.stringify(s)))}async function Oa(e,t,n){const r=await La(e).catch(e=>{throw e});return await Ka(r,t,n).catch(e=>{throw e})}async function La(e){if(!e)throw new Error("Missing token");e=e.replace(Pa,"");const t=Xr.decode(Wn.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}function Ma(e){return!!e.created_at&&Math.round((new Date).getTime()/1e3)-e.created_at<60}function _a(e){return e.kind===wo}function ja(e,t){const n=e.tags.find(e=>"u"===e[0]);return!!n&&(n.length>0&&n[1]===t)}function Ha(e,t){const n=e.tags.find(e=>"method"===e[0]);return!!n&&(n.length>0&&n[1].toLowerCase()===t.toLowerCase())}function Ga(e){return Zt(yn(ei.encode(JSON.stringify(e))))}function Ja(e,t){const n=e.tags.find(e=>"payload"===e[0]);if(!n)return!1;const r=Ga(t);return n.length>0&&n[1]===r}async function Ka(e,t,n,r){if(!fi(e))throw new Error("Invalid nostr event, signature invalid");if(!_a(e))throw new Error("Invalid nostr event, kind invalid");if(!Ma(e))throw new Error("Invalid nostr event, created_at timestamp invalid");if(!ja(e,t))throw new Error("Invalid nostr event, url tag invalid");if(!Ha(e,n))throw new Error("Invalid nostr event, method tag invalid");if(Boolean(r)&&"object"==typeof r&&Object.keys(r).length>0&&!Ja(e,r))throw new Error("Invalid nostr event, payload tag does not match request body hash");return!0}function Va(e){return[0,3].includes(e)||1e4<=e&&e<2e4}function qa(e){return 3e4<=e&&e<4e4}var Ya=function(e,t){return Ya=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Ya(e,t)};function Wa(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Ya(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function za(e,t,n,r){return new(n||(n=Promise))(function(i,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(s,a)}l((r=r.apply(e,t||[])).next())})}function Za(e,t){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function el(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}function tl(e,t,n){if(n||2===arguments.length)for(var r,i=0,o=t.length;i1||a(e,t)})},t&&(r[e]=t(r[e])))}function a(e,t){try{(n=i[e](t)).value instanceof nl?Promise.resolve(n.value.v).then(l,c):u(o[0][2],n)}catch(e){u(o[0][3],e)}var n}function l(e){a("next",e)}function c(e){a("throw",e)}function u(e,t){e(t),o.shift(),o.length&&a(o[0][0],o[0][1])}}function il(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=Xa(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise(function(r,i){(function(e,t,n,r){Promise.resolve(r).then(function(t){e({value:t,done:n})},t)})(r,i,(t=e[n](t)).done,t.value)})}}}function ol(e){return"function"==typeof e}function sl(e){var t=e(function(e){Error.call(e),e.stack=(new Error).stack});return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}"function"==typeof SuppressedError&&SuppressedError;var al=sl(function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map(function(e,t){return t+1+") "+e.toString()}).join("\n "):"",this.name="UnsubscriptionError",this.errors=t}});function ll(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var cl=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var e,t,n,r,i;if(!this.closed){this.closed=!0;var o=this._parentage;if(o)if(this._parentage=null,Array.isArray(o))try{for(var s=Xa(o),a=s.next();!a.done;a=s.next()){a.value.remove(this)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}else o.remove(this);var l=this.initialTeardown;if(ol(l))try{l()}catch(e){i=e instanceof al?e.errors:[e]}var c=this._finalizers;if(c){this._finalizers=null;try{for(var u=Xa(c),d=u.next();!d.done;d=u.next()){var f=d.value;try{fl(f)}catch(e){i=null!=i?i:[],e instanceof al?i=tl(tl([],el(i)),el(e.errors)):i.push(e)}}}catch(e){n={error:e}}finally{try{d&&!d.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}}if(i)throw new al(i)}},e.prototype.add=function(t){var n;if(t&&t!==this)if(this.closed)fl(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&ll(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&ll(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}(),ul=cl.EMPTY;function dl(e){return e instanceof cl||e&&"closed"in e&&ol(e.remove)&&ol(e.add)&&ol(e.unsubscribe)}function fl(e){ol(e)?e():e.unsubscribe()}var pl={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},hl={setTimeout:function(e,t){for(var n=[],r=2;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,i=n.isStopped,o=n.observers;return r||i?ul:(this.currentObservers=null,o.push(e),new cl(function(){t.currentObservers=null,ll(o,e)}))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,i=t.isStopped;n?e.error(r):i&&e.complete()},t.prototype.asObservable=function(){var e=new Bl;return e.source=this,e},t.create=function(e,t){return new Rl(e,t)},t}(Bl),Rl=function(e){function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return Wa(t,e),t.prototype.next=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===n||n.call(t,e)},t.prototype.error=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===n||n.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,n;return null!==(n=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==n?n:ul},t}(Ul),Tl={now:function(){return(Tl.delegate||Date).now()},delegate:void 0},Pl=function(e){function t(t,n,r){void 0===t&&(t=1/0),void 0===n&&(n=1/0),void 0===r&&(r=Tl);var i=e.call(this)||this;return i._bufferSize=t,i._windowTime=n,i._timestampProvider=r,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,t),i._windowTime=Math.max(1,n),i}return Wa(t,e),t.prototype.next=function(t){var n=this,r=n.isStopped,i=n._buffer,o=n._infiniteTimeWindow,s=n._timestampProvider,a=n._windowTime;r||(i.push(t),!o&&i.push(s.now()+a)),this._trimBuffer(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){this._throwIfClosed(),this._trimBuffer();for(var t=this._innerSubscribe(e),n=this._infiniteTimeWindow,r=this._buffer.slice(),i=0;i=2,!0))}function Nc(e,t){for(var n=[],r=2;rt.reduce((e,t)=>{const n=[];for(const r of e)try{const e=t(r);if(void 0===e)continue;n.push(e)}catch(e){}return n},e);var Vc=Symbol("verified");function qc(e){if(!(e instanceof Object))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;tt.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at);return r||e.splice(n,0,t),e}function nu(e,t){let n=0,r=e.length-1;for(;n<=r;){const i=Math.floor((n+r)/2),o=t(e[i]);if(0===o)return[i,!0];o<0?r=i-1:n=i+1}return[n,!1]}zc.finalizeEvent,zc.verifyEvent,new TextDecoder("utf-8"),new TextEncoder;const ru=Symbol.for("event-store"),iu=Symbol.for("event-uid"),ou=Symbol.for("replaceable-address"),su=Symbol.for("from-cache"),au=Symbol.for("replaceable-identifier");function lu(e){return Va(e)||qa(e)}function cu(e){let t=Reflect.get(e,iu);return t||(t=qa(e.kind)||Va(e.kind)?uu(e):e.id,Reflect.set(e,iu,t)),t}function uu(e){if(!qa(e.kind)&&!Va(e.kind))throw new Error("Event is not replaceable or addressable");return eu(e,ou,()=>du(e.kind,e.pubkey,fu(e)))}function du(e,t,n){return e+":"+t+":"+(n??"")}function fu(e){return eu(e,au,()=>e.tags.find(e=>"d"===e[0])?.[1]??"")}function pu(){return Math.round(Date.now()/1e3)}const hu=Symbol("expiration-timestamp");function gu(e){return eu(e,hu,()=>{const t=e.tags.find(e=>"expiration"===e[0])?.[1];return t?parseInt(t):void 0})}var mu=new TextDecoder("utf-8");new TextEncoder;function yu(e){let{prefix:t,words:n}=ar.decode(e,5e3),r=new Uint8Array(ar.fromWords(n));switch(t){case"nprofile":{let e=wu(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:Zt(e[0][0]),relays:e[1]?e[1].map(e=>mu.decode(e)):[]}}}case"nevent":{let e=wu(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:Zt(e[0][0]),relays:e[1]?e[1].map(e=>mu.decode(e)):[],author:e[2]?.[0]?Zt(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(Zt(e[3][0]),16):void 0}}}case"naddr":{let e=wu(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:mu.decode(e[0][0]),pubkey:Zt(e[2][0]),kind:parseInt(Zt(e[3][0]),16),relays:e[1]?e[1].map(e=>mu.decode(e)):[]}}}case"nsec":return{type:t,data:r};case"npub":case"note":return{type:t,data:Zt(r)};default:throw new Error(`unknown prefix ${t}`)}}function wu(e){let t={},n=e;for(;n.length>0;){let e=n[0],r=n[1],i=n.slice(2,2+r);if(n=n.slice(2+r),i.length=8&&Cu.test(e)}function xu(e){return!!e?.toLowerCase()?.match(/^[0-9a-f]{64}$/)}const Bu="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0; -/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Su(e,...t){if(!((n=e)instanceof Uint8Array||ArrayBuffer.isView(n)&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error("Uint8Array expected of length "+t+", got length="+e.length)}const Qu=(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)(),Fu=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Du(e){if(Su(e),Qu)return e.toHex();let t="";for(let n=0;n=$u&&e<=Uu?e-$u:e>=Ru&&e<=Tu?e-(Ru-10):e>=Pu&&e<=Nu?e-(Pu-10):void 0}function Lu(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);if(Qu)return Uint8Array.fromHex(e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;tArray.isArray(e)).map(e=>e.map(e=>String(e)));return Reflect.set(e,Xu,r),r}const id="abcdefghijklmnopqrstuvwxyz",od=new Set((id+id.toUpperCase()).split("")),sd=Symbol.for("indexable-tags");function ad(e){let t=Reflect.get(e,sd);if(!t){const n=new Set;for(const t of e.tags)t.length>=2&&1===t[0].length&&od.has(t[0])&&n.add(t[0]+":"+t[1]);t=n,Reflect.set(e,sd,n)}return t}class ld{first=null;items=Object.create(null);last=null;max;resetTtl;size;ttl;constructor(e=0,t=0,n=!1){this.first=null,this.items=Object.create(null),this.last=null,this.max=e,this.resetTtl=n,this.size=0,this.ttl=t}clear(){return this.first=null,this.items=Object.create(null),this.last=null,this.size=0,this}delete(e){if(this.has(e)){const t=this.items[e];delete this.items[e],this.size--,null!==t.prev&&(t.prev.next=t.next),null!==t.next&&(t.next.prev=t.prev),this.first===t&&(this.first=t.next),this.last===t&&(this.last=t.prev)}return this}entries(e=this.keys()){return e.map(e=>[e,this.get(e)])}evict(e=!1){if(e||this.size>0){const e=this.first;delete this.items[e.key],0===--this.size?(this.first=null,this.last=null):(this.first=e.next,this.first.prev=null)}return this}expiresAt(e){let t;return this.has(e)&&(t=this.items[e].expiry),t}get(e){let t;if(this.has(e)){const n=this.items[e];this.ttl>0&&n.expiry<=Date.now()?this.delete(e):(t=n.value,this.set(e,t,!0))}return t}has(e){return e in this.items}keys(){const e=[];let t=this.first;for(;null!==t;)e.push(t.key),t=t.next;return e}set(e,t,n=!1,r=this.resetTtl){let i;if(n||this.has(e)){if(i=this.items[e],i.value=t,!1===n&&r&&(i.expiry=this.ttl>0?Date.now()+this.ttl:this.ttl),this.last!==i){const e=this.last,t=i.next,n=i.prev;this.first===i&&(this.first=i.next),i.next=null,i.prev=this.last,e.next=i,null!==n&&(n.next=t),null!==t&&(t.prev=n)}}else this.max>0&&this.size===this.max&&this.evict(!0),i=this.items[e]={expiry:this.ttl>0?Date.now()+this.ttl:this.ttl,key:e,prev:this.last,next:null,value:t},1===++this.size?this.first=i:this.last.next=i;return this.last=i,this}values(e=this.keys()){return e.map(e=>this.get(e))}}function cd(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ud,dd,fd={exports:{}};function pd(){if(dd)return ud;dd=1;var e=1e3,t=60*e,n=60*t,r=24*n,i=7*r,o=365.25*r;function s(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}return ud=function(a,l){l=l||{};var c=typeof a;if("string"===c&&a.length>0)return function(s){if((s=String(s)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(s);if(!a)return;var l=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return l*o;case"weeks":case"week":case"w":return l*i;case"days":case"day":case"d":return l*r;case"hours":case"hour":case"hrs":case"hr":case"h":return l*n;case"minutes":case"minute":case"mins":case"min":case"m":return l*t;case"seconds":case"second":case"secs":case"sec":case"s":return l*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return l;default:return}}(a);if("number"===c&&isFinite(a))return l.long?function(i){var o=Math.abs(i);if(o>=r)return s(i,o,r,"day");if(o>=n)return s(i,o,n,"hour");if(o>=t)return s(i,o,t,"minute");if(o>=e)return s(i,o,e,"second");return i+" ms"}(a):function(i){var o=Math.abs(i);if(o>=r)return Math.round(i/r)+"d";if(o>=n)return Math.round(i/n)+"h";if(o>=t)return Math.round(i/t)+"m";if(o>=e)return Math.round(i/e)+"s";return i+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}var hd=function(e){function t(e){let r,i,o,s=null;function a(...e){if(!a.enabled)return;const n=a,i=Number(new Date),o=i-(r||i);n.diff=o,n.prev=r,n.curr=i,r=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let s=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(r,i)=>{if("%%"===r)return"%";s++;const o=t.formatters[i];if("function"==typeof o){const t=e[s];r=o.call(n,t),e.splice(s,1),s--}return r}),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==s?s:(i!==t.namespaces&&(i=t.namespaces,o=t.enabled(e)),o),set:e=>{s=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e,t){let n=0,r=0,i=-1,o=0;for(;n"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const n=("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const e of n)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const n of t.skips)if(r(e,n))return!1;for(const n of t.names)if(r(e,n))return!0;return!1},t.humanize=pd(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach(n=>{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t{"%%"!==e&&(r++,"%c"===e&&(i=r))}),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")||t.storage.getItem("DEBUG")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=hd(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(fd,fd.exports);const gd=cd(fd.exports)("applesauce");class md{log=gd.extend("EventMemory");kinds=new Map;authors=new Map;tags=new ld;created_at=[];kindAuthor=new Map;events=new ld;replaceable=new Map;get size(){return this.events.size}hasEvent(e){return this.events.has(e)}getEvent(e){return this.events.get(e)}hasReplaceable(e,t,n){const r=this.replaceable.get(du(e,t,n));return!!r&&r.length>0}getReplaceable(e,t,n){const r=du(e,t,n),i=this.replaceable.get(r);return i?.[0]}getReplaceableHistory(e,t,n){const r=du(e,t,n);return this.replaceable.get(r)}getByFilters(e){return Array.from(this.getEventsForFilters(Array.isArray(e)?e:[e]))}getTimeline(e){const t=[],n=this.getByFilters(e);for(const e of n)tu(t,e);return t}add(e){const t=e.id,n=this.events.get(t);if(n)return n;this.events.set(t,e),this.getKindIndex(e.kind).add(e),this.getAuthorsIndex(e.pubkey).add(e),this.getKindAuthorIndex(e.kind,e.pubkey).add(e);for(const t of ad(e))this.tags.has(t)&&this.getTagIndex(t).add(e);if(tu(this.created_at,e),lu(e.kind)){const t=e.tags.find(e=>"d"===e[0])?.[1],n=du(e.kind,e.pubkey,t);let r=this.replaceable.get(n);this.replaceable.has(n)||(r=[],this.replaceable.set(n,r)),tu(r,e)}return e}remove(e){let t="string"==typeof e?this.events.get(e):e;if(!t)return!1;const n=t.id;if(!this.events.has(n))return!1;this.getAuthorsIndex(t.pubkey).delete(t),this.getKindIndex(t.kind).delete(t);const r=`${t.kind}:${t.pubkey}`;this.kindAuthor.has(r)&&this.kindAuthor.get(r).delete(t);for(const e of ad(t))this.tags.has(e)&&this.getTagIndex(e).delete(t);if(this.removeFromSortedArray(this.created_at,t),this.events.delete(n),lu(t.kind)){const e=t.tags.find(e=>"d"===e[0])?.[1],n=du(t.kind,t.pubkey,e),r=this.replaceable.get(n);r&&this.removeFromSortedArray(r,t)}return this.claims.delete(t),!0}removeByFilters(e){const t=this.getByFilters(e);let n=0;for(const e of t)this.remove(e)&&n++;return n}update(e){}claims=new WeakMap;touch(e){this.events.has(e.id)&&this.events.set(e.id,e)}claim(e){const t=this.claims.get(e)||0;this.claims.set(e,t+1),this.touch(e)}isClaimed(e){const t=this.claims.get(e);return void 0!==t&&t>0}removeClaim(e){const t=this.claims.get(e);if(void 0!==t&&t>0){const n=t-1;0===n?this.claims.delete(e):this.claims.set(e,n)}}clearClaim(e){this.claims.delete(e)}*unclaimed(){let e=this.events.first;for(;e;){const t=e.value;this.isClaimed(t)||(yield t),e=e.next}return 0}prune(e){let t=0;const n=this.unclaimed();for(const r of n)if(this.remove(r),t++,e&&t>=e)break;return t}getKindIndex(e){return this.kinds.has(e)||this.kinds.set(e,new Set),this.kinds.get(e)}getAuthorsIndex(e){return this.authors.has(e)||this.authors.set(e,new Set),this.authors.get(e)}getKindAuthorIndex(e,t){const n=`${e}:${t}`;return this.kindAuthor.has(n)||this.kindAuthor.set(n,new Set),this.kindAuthor.get(n)}getTagIndex(e){if(!this.tags.has(e)){const t=new Set,n=Date.now();for(const n of this.events.values())ad(n).has(e)&&t.add(n);const r=Date.now()-n;r>100&&this.log(`Built index ${e} took ${r}ms`),this.tags.set(e,t)}return this.tags.get(e)}removeFromSortedArray(e,t){if(0===e.length)return;const n=nu(e,e=>e.created_at-t.created_at);if(n){let r=n[0],i=!1;if(e[r]===t)return void e.splice(r,1);for(let n=r-1;n>=0&&e[n].created_at===t.created_at;n--)if(e[n]===t){e.splice(n,1),i=!0;break}if(i)return;for(let n=r+1;ne.created_at-t):void 0;i&&(n=i[0]);const o=e?nu(this.created_at,t=>t.created_at-e):void 0;o&&(r=o[0]);for(let i=n;i<=r;i++){const n=this.created_at[i];if(!(void 0!==t&&n.created_at>t)){if(void 0!==e&&n.created_at{const r=e instanceof Set?e:new Set(e);if(t)n=r,t=!1;else for(const e of n)r.has(e)||n.delete(e);return n};e.ids&&r(this.iterateIds(e.ids));let i=null;void 0!==e.since&&(i=Array.from(this.iterateTime(e.since,e.until)),r(i));for(const t of od){const n=e[`&${t}`];if(n?.length)for(const e of n)r(this.iterateTag(t,[e]))}for(const t of od){const n=e[`#${t}`];if(n?.length){const i=e[`&${t}`],o=i?n.filter(e=>!i.includes(e)):n;o.length>0&&r(this.iterateTag(t,o))}}if(e.authors&&e.kinds&&e.authors.length*e.kinds.length<=20){const t=new Set;for(const n of e.kinds)for(const r of e.authors){const e=`${n}:${r}`,i=this.kindAuthor.get(e);if(i)for(const e of i)t.add(e)}r(t)}else e.authors&&r(this.iterateAuthors(e.authors)),e.kinds&&r(this.iterateKinds(e.kinds));if(void 0===e.since&&void 0!==e.until&&(i=Array.from(this.iterateTime(e.since,e.until)),r(i)),t)return new Set(this.events.values());if(e.limit&&i){const t=new Set;for(const r of i){if(t.size>=e.limit)break;n.has(r)&&t.add(r)}return t}return n}getEventsForFilters(e){if(0===e.length)return new Set;let t=new Set;for(const n of e){const e=this.getEventsForFilter(n);for(const n of e)t.add(n)}return t}reset(){this.events.clear(),this.kinds.clear(),this.authors.clear(),this.kindAuthor.clear(),this.tags.clear(),this.created_at=[],this.replaceable.clear(),this.claims=new WeakMap}}function yd(e,t){var n,r;if(0===t.length)return e;for(n=0,r=t.length;ne.until)return!1;for(let n in e)if("&"===n[0]){let r=n.slice(1),i=e[n];if(i&&i.length>0){const e=ad(t);for(const t of i)if(!e.has(r+":"+t))return!1}}for(let n in e)if("#"===n[0]){let r=n.slice(1),i=e[n];if(i){const n=e[`&${r}`],o=n?i.filter(e=>!n.includes(e)):i;if(0===o.length)continue;const s=ad(t);if(!1===o.some(e=>s.has(r+":"+e)))return!1}}return!0}function Id(e,t){for(let n=0;nt.replaceable({kind:10063,pubkey:e.pubkey,relays:e.relays}).pipe(fc(e=>e?function(e){const t=Array.isArray(e)?e:e.tags;return Kc(t,e=>Mc(e,"server")&&URL.canParse(e[1])?new URL("/",e[1]):void 0)}(e):[]))}const Cd=Symbol.for("profile-content");function Ed(e){return eu(e,Cd,()=>{const t=function(e){try{return JSON.parse(e)}catch(e){return}} -/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */(e.content);if(t)return t.nip05&&"string"!=typeof t.nip05&&(t.nip05=String(t.nip05)),t.website&&t.website?.length>0&&!1===t.website?.startsWith("http")&&(t.website="https://"+t.website),t})}function xd(e){return!!e&&((e.kind===pi.Metadata||e.kind===pi.Handlerinformation)&&!!Ed(e))}!function(e){function t(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function n(...e){const t=(e,t)=>n=>e(t(n)),n=Array.from(e).reverse().reduce((e,n)=>e?t(e,n.encode):n.encode,void 0),r=e.reduce((e,n)=>e?t(e,n.decode):n.decode,void 0);return{encode:n,decode:r}}function r(e){return{encode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("alphabet.encode input should be an array of numbers");return n.map(n=>{if(t(n),n<0||n>=e.length)throw new Error(`Digit index outside alphabet: ${n} (alphabet: ${e.length})`);return e[n]})},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map(t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n})}}}function i(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function o(e,n="="){if(t(e),"string"!=typeof n)throw new Error("padding chr should be string");return{encode(t){if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("padding.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;t.length*e%8;)t.push(n);return t},decode(t){if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("padding.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let r=t.length;if(r*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;r>0&&t[r-1]===n;r--)if(!((r-1)*e%8))throw new Error("Invalid padding: string has too much padding");return t.slice(0,r)}}}function s(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function a(e,n,r){if(n<2)throw new Error(`convertRadix: wrong from=${n}, base cannot be less than 2`);if(r<2)throw new Error(`convertRadix: wrong to=${r}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let i=0;const o=[],s=Array.from(e);for(s.forEach(e=>{if(t(e),e<0||e>=n)throw new Error(`Wrong integer: ${e}`)});;){let e=0,t=!0;for(let o=i;o(e+t/xt)/t;function St(e){const t=It,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=nt(u,n,t)*u%t,f=nt(d,n,t)*u%t,h=nt(f,xt,t)*c%t,p=nt(h,i,t)*h%t,g=nt(p,o,t)*p%t,m=nt(g,a,t)*g%t,y=nt(m,l,t)*m%t,w=nt(y,a,t)*g%t,v=nt(w,n,t)*u%t,A=nt(v,s,t)*p%t,b=nt(A,r,t)*c%t,k=nt(b,xt,t);if(!Qt.eql(Qt.sqr(k),e))throw new Error("Cannot find square root");return k}const Qt=function(e,t,n=!1,r={}){if(e<=Ve)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:i,nByteLength:o}=st(e,t);if(o>2048)throw new Error("Field lengths over 2048 bytes are not supported");const s=it(e),a=Object.freeze({ORDER:e,BITS:i,BYTES:o,MASK:_e(i),ZERO:Ve,ONE:ze,create:t=>et(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return Ve<=t&&te===Ve,isOdd:e=>(e&ze)===ze,neg:t=>et(-t,e),eql:(e,t)=>e===t,sqr:t=>et(t*t,e),add:(t,n)=>et(t+n,e),sub:(t,n)=>et(t-n,e),mul:(t,n)=>et(t*n,e),pow:(e,t)=>function(e,t,n){if(n 0");if(n===Ve)return e.ONE;if(n===ze)return t;let r=e.ONE,i=t;for(;n>Ve;)n&ze&&(r=e.mul(r,i)),i=e.sqr(i),n>>=ze;return r}(a,e,t),div:(t,n)=>et(t*rt(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>rt(t,e),sqrt:r.sqrt||(e=>s(a,e)),invertBatch:e=>function(e,t){const n=new Array(t.length),r=t.reduce((t,r,i)=>e.is0(r)?t:(n[i]=t,e.mul(t,r)),e.ONE),i=e.inv(r);return t.reduceRight((t,r,i)=>e.is0(r)?t:(n[i]=e.mul(t,n[i]),e.mul(t,r)),i),n}(a,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?Ne(e,o):Ue(e,o),fromBytes:e=>{if(e.length!==o)throw new Error(`Fp.fromBytes: expected ${o}, got ${e.length}`);return n?Te(e):Pe(e)}});return Object.freeze(a)}(It,void 0,void 0,{sqrt:St}),Ft=function(e,t){const n=t=>vt({...e,...kt(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Qt,n:Ct,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Ct,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Et*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),i=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),o=n,s=BigInt("0x100000000000000000000000000000000"),a=Bt(o*e,t),l=Bt(-r*e,t);let c=et(e-a*n-l*i,t),u=et(-a*r-l*o,t);const d=c>s,f=u>s;if(d&&(c=t-c),f&&(u=t-u),c>s||u>s)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:d,k1:c,k2neg:f,k2:u}}}},Ce),Dt=BigInt(0),$t=e=>"bigint"==typeof e&&Dte.charCodeAt(0)));n=Me(t,t),Rt[e]=n}return Ce(Me(n,...t))}const Tt=e=>e.toRawBytes(!0).slice(1),Ut=e=>Ue(e,32),Nt=e=>et(e,It),Lt=e=>et(e,Ct),Mt=Ft.ProjectivePoint;function _t(e){let t=Ft.utils.normPrivateKeyToScalar(e),n=Mt.fromPrivateKey(t);return{scalar:n.hasEvenY()?t:Lt(-t),bytes:Tt(n)}}function Ot(e){if(!$t(e))throw new Error("bad x: need 0 < x < p");const t=Nt(e*e);let n=St(Nt(t*e+BigInt(7)));n%xt!==Dt&&(n=Nt(-n));const r=new Mt(e,n,Et);return r.assertValidity(),r}function Ht(...e){return Lt(Pe(Pt("BIP0340/challenge",...e)))}function jt(e){return _t(e).bytes}function Gt(e,t,n=me(32)){const r=Le("message",e),{bytes:i,scalar:o}=_t(t),s=Le("auxRand",n,32),a=Ut(o^Pe(Pt("BIP0340/aux",s))),l=Pt("BIP0340/nonce",a,i,r),c=Lt(Pe(l));if(c===Dt)throw new Error("sign failed: k is zero");const{bytes:u,scalar:d}=_t(c),f=Ht(u,i,r),h=new Uint8Array(64);if(h.set(u,0),h.set(Ut(Lt(d+f*o)),32),!Jt(h,r,i))throw new Error("sign: Invalid signature produced");return h}function Jt(e,t,n){const r=Le("signature",e,64),i=Le("message",t),o=Le("publicKey",n,32);try{const e=Ot(Pe(o)),t=Pe(r.subarray(0,32));if(!$t(t))return!1;const n=Pe(r.subarray(32,64));if(!("bigint"==typeof(c=n)&&Dt({getPublicKey:jt,sign:Gt,verify:Jt,utils:{randomPrivateKey:Ft.utils.randomPrivateKey,lift_x:Ot,pointToBytes:Tt,numberToBytesBE:Ue,bytesToNumberBE:Pe,taggedHash:Pt,mod:et}}))(),Vt="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,zt=e=>e instanceof Uint8Array,qt=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),Yt=(e,t)=>e<<32-t|e>>>t;if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");const Wt=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Zt(e){if(!zt(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length,0));let n=0;return e.forEach(e=>{if(!zt(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length}),t}class nn{clone(){return this._cloneInto()}}function rn(e){const t=t=>e().update(en(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function on(e=32){if(Vt&&"function"==typeof Vt.getRandomValues)return Vt.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}function sn(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function an(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}const ln={number:sn,bool:function(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)},bytes:an,hash:function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");sn(e.outputLen),sn(e.blockLen)},exists:function(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")},output:function(e,t){an(e);const n=t.outputLen;if(e.lengthr-o&&(this.process(n,0),o=0);for(let e=o;e>i&o),a=Number(n&o),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}(n,r-8,BigInt(8*this.length),i),this.process(n,0);const s=qt(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^~e&n,dn=(e,t,n)=>e&t^e&n^t&n,fn=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),hn=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),pn=new Uint32Array(64);class gn extends cn{constructor(){super(64,32,8,!1),this.A=0|hn[0],this.B=0|hn[1],this.C=0|hn[2],this.D=0|hn[3],this.E=0|hn[4],this.F=0|hn[5],this.G=0|hn[6],this.H=0|hn[7]}get(){const{A:e,B:t,C:n,D:r,E:i,F:o,G:s,H:a}=this;return[e,t,n,r,i,o,s,a]}set(e,t,n,r,i,o,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|i,this.F=0|o,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)pn[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=pn[e-15],n=pn[e-2],r=Yt(t,7)^Yt(t,18)^t>>>3,i=Yt(n,17)^Yt(n,19)^n>>>10;pn[e]=i+pn[e-7]+r+pn[e-16]|0}let{A:n,B:r,C:i,D:o,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(Yt(s,6)^Yt(s,11)^Yt(s,25))+un(s,a,l)+fn[e]+pn[e]|0,u=(Yt(n,2)^Yt(n,13)^Yt(n,22))+dn(n,r,i)|0;c=l,l=a,a=s,s=o+t|0,o=i,i=r,r=n,n=t+u|0}n=n+this.A|0,r=r+this.B|0,i=i+this.C|0,o=o+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,i,o,s,a,l,c)}roundClean(){pn.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}class mn extends gn{constructor(){super(),this.A=-1056596264,this.B=914150663,this.C=812702999,this.D=-150054599,this.E=-4191439,this.F=1750603025,this.G=1694076839,this.H=-1090891868,this.outputLen=28}}const yn=rn(()=>new gn);rn(()=>new mn);var wn=Symbol("verified");function vn(e){if(!(e instanceof Object))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;te===n.slice(1)&&-1!==r.indexOf(t)))return!1}return!(e.since&&t.created_ate.until)}async function Sn(){return new Promise(e=>{const t=new MessageChannel,n=()=>{t.port1.removeEventListener("message",n),e()};t.port1.addEventListener("message",n),t.port2.postMessage(0),t.port1.start()})}var Qn,Fn=e=>(e[wn]=!0,!0),Dn=class extends Error{constructor(e,t){super(`Tried to send message '${e} on a closed connection to ${t}.`),this.name="SendingOnClosedConnection"}},$n=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);baseEoseTimeout=4400;connectionTimeout=4400;publishTimeout=4400;pingFrequency=2e4;pingTimeout=2e4;openSubs=new Map;enablePing;connectionTimeoutHandle;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;incomingMessageQueue=new In;queueRunning=!1;challenge;authPromise;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=bn(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket,this.enablePing=t.enablePing}static async connect(e,t){const n=new $n(e,t);return await n.connect(),n}closeAllSubscriptions(e){for(let[t,n]of this.openSubs)n.close(e);this.openSubs.clear();for(let[t,n]of this.openEventPublishes)n.reject(new Error(e));this.openEventPublishes.clear();for(let[t,n]of this.openCountRequests)n.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async connect(){return this.connectionPromise||(this.challenge=void 0,this.authPromise=void 0,this.connectionPromise=new Promise((e,t)=>{this.connectionTimeoutHandle=setTimeout(()=>{t("connection timed out"),this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection timed out")},this.connectionTimeout);try{this.ws=new this._WebSocket(this.url)}catch(e){return clearTimeout(this.connectionTimeoutHandle),void t(e)}this.ws.onopen=()=>{clearTimeout(this.connectionTimeoutHandle),this._connected=!0,this.enablePing&&this.pingpong(),e()},this.ws.onerror=e=>{clearTimeout(this.connectionTimeoutHandle),t(e.message||"websocket error"),this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection errored")},this.ws.onclose=e=>{clearTimeout(this.connectionTimeoutHandle),t(e.message||"websocket closed"),this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection closed")},this.ws.onmessage=this._onmessage.bind(this)})),this.connectionPromise}async waitForPingPong(){return new Promise((e,t)=>{this.ws&&this.ws.on&&this.ws.on("pong",()=>e(!0))||t("ws can't listen for pong"),this.ws&&this.ws.ping&&this.ws.ping()})}async waitForDummyReq(){return new Promise((e,t)=>{const n=this.subscribe([{ids:["a".repeat(64)]}],{oneose:()=>{n.close(),e(!0)},eoseTimeout:this.pingTimeout+1e3})})}async pingpong(){if(1===this.ws?.readyState){await Promise.any([this.ws&&this.ws.ping&&this.ws.on?this.waitForPingPong():this.waitForDummyReq(),new Promise(e=>setTimeout(()=>e(!1),this.pingTimeout))])?setTimeout(()=>this.pingpong(),this.pingFrequency):(this.closeAllSubscriptions("pingpong timed out"),this._connected=!1,this.onclose?.(),this.ws?.close())}}async runQueue(){for(this.queueRunning=!0;!1!==this.handleNext();)await Sn();this.queueRunning=!1}handleNext(){const e=this.incomingMessageQueue.dequeue();if(!e)return!1;const t=function(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let r=t+7+1+n,i=e.slice(r+1,80).indexOf('"');if(-1===i)return null;let o=r+1+i;return e.slice(r+1,o)}(e);if(t){const n=this.openSubs.get(t);if(!n)return;const r=function(e,t){let n=t.length+3,r=e.indexOf(`"${t}":`)+n,i=e.slice(r).indexOf('"')+r+1;return e.slice(i,i+64)}(e,"id"),i=n.alreadyHaveEvent?.(r);if(n.receivedEvent?.(this,r),i)return}try{let t=JSON.parse(e);switch(t[0]){case"EVENT":{const e=this.openSubs.get(t[1]),n=t[2];return void(this.verifyEvent(n)&&function(e,t){for(let n=0;n{this.ws?.send(e)})}async auth(e){const t=this.challenge;if(!t)throw new Error("can't perform auth, no challenge was received");return this.authPromise||(this.authPromise=new Promise(async(n,r)=>{try{let i=await e(function(e,t){return{kind:22242,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}(this.url,t)),o=setTimeout(()=>{let e=this.openEventPublishes.get(i.id);e&&(e.reject(new Error("auth timed out")),this.openEventPublishes.delete(i.id))},this.publishTimeout);this.openEventPublishes.set(i.id,{resolve:n,reject:r,timeout:o}),this.send('["AUTH",'+JSON.stringify(i)+"]")}catch(e){console.warn("subscribe auth function failed:",e)}})),this.authPromise}async publish(e){const t=new Promise((t,n)=>{const r=setTimeout(()=>{const t=this.openEventPublishes.get(e.id);t&&(t.reject(new Error("publish timed out")),this.openEventPublishes.delete(e.id))},this.publishTimeout);this.openEventPublishes.set(e.id,{resolve:t,reject:n,timeout:r})});return this.send('["EVENT",'+JSON.stringify(e)+"]"),t}async count(e,t){this.serial++;const n=t?.id||"count:"+this.serial,r=new Promise((e,t)=>{this.openCountRequests.set(n,{resolve:e,reject:t})});return this.send('["COUNT","'+n+'",'+JSON.stringify(e).substring(1)),r}subscribe(e,t){const n=this.prepareSubscription(e,t);return n.fire(),n}prepareSubscription(e,t){this.serial++;const n=t.id||(t.label?t.label+":":"sub:")+this.serial,r=new Rn(this,n,e,t);return this.openSubs.set(n,r),r}close(){this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.onclose?.(),this.ws?.close()}_onmessage(e){this.incomingMessageQueue.enqueue(e.data),this.queueRunning||this.runQueue()}},Rn=class{relay;id;closed=!1;eosed=!1;filters;alreadyHaveEvent;receivedEvent;onevent;oneose;onclose;eoseTimeout;eoseTimeoutHandle;constructor(e,t,n,r){this.relay=e,this.filters=n,this.id=t,this.alreadyHaveEvent=r.alreadyHaveEvent,this.receivedEvent=r.receivedEvent,this.eoseTimeout=r.eoseTimeout||e.baseEoseTimeout,this.oneose=r.oneose,this.onclose=r.onclose,this.onevent=r.onevent||(e=>{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,e)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){if(!this.closed&&this.relay.connected){try{this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]")}catch(e){if(!(e instanceof Dn))throw e}this.closed=!0}this.relay.openSubs.delete(this.id),this.onclose?.(e)}},Pn=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;enablePing;trustedRelayURLs=new Set;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation,this.enablePing=e.enablePing}async ensureRelay(e,t){e=bn(e);let n=this.relays.get(e);return n||(n=new $n(e,{verifyEvent:this.trustedRelayURLs.has(e)?Fn:this.verifyEvent,websocketImplementation:this._WebSocket,enablePing:this.enablePing}),n.onclose=()=>{this.relays.delete(e)},t?.connectionTimeout&&(n.connectionTimeout=t.connectionTimeout),this.relays.set(e,n)),await n.connect(),n}close(e){e.map(bn).forEach(e=>{this.relays.get(e)?.close(),this.relays.delete(e)})}subscribe(e,t,n){n.onauth=n.onauth||n.doauth;const r=[];for(let n=0;ne.url===i)||r.push({url:i,filter:t})}return this.subscribeMap(r,n)}subscribeMany(e,t,n){n.onauth=n.onauth||n.doauth;const r=[],i=[];for(let n=0;n({url:e,filters:t}));this.trackRelays&&(t.receivedEvent=(e,t)=>{let n=this.seenOn.get(t);n||(n=new Set,this.seenOn.set(t,n)),n.add(e)});const i=new Set,o=[],s=[];let a=n=>{s[n]||(s[n]=!0,s.filter(e=>e).length===e.length&&(t.oneose?.(),a=()=>{}))};const l=[];let c=(n,r)=>{l[n]||(a(n),l[n]=r,l.filter(e=>e).length===e.length&&(t.onclose?.(l),c=()=>{}))};const u=e=>{if(t.alreadyHaveEvent?.(e))return!0;const n=i.has(e);return i.add(e),n},d=Promise.all(r.map(async({url:e,filters:n},r)=>{let i;try{i=await this.ensureRelay(e,{connectionTimeout:t.maxWait?Math.max(.8*t.maxWait,t.maxWait-1e3):void 0})}catch(e){return void c(r,e?.message||String(e))}let s=i.subscribe(n,{...t,oneose:()=>a(r),onclose:e=>{e.startsWith("auth-required: ")&&t.onauth?i.auth(t.onauth).then(()=>{i.subscribe(n,{...t,oneose:()=>a(r),onclose:e=>{c(r,e)},alreadyHaveEvent:u,eoseTimeout:t.maxWait})}).catch(e=>{c(r,`auth was required and attempted, but failed with: ${e}`)}):c(r,e)},alreadyHaveEvent:u,eoseTimeout:t.maxWait});o.push(s)}));return{async close(e){await d,o.forEach(t=>{t.close(e)})}}}subscribeEose(e,t,n){n.onauth=n.onauth||n.doauth;const r=this.subscribe(e,t,{...n,oneose(){r.close("closed automatically on eose")}});return r}subscribeManyEose(e,t,n){n.onauth=n.onauth||n.doauth;const r=this.subscribeMany(e,t,{...n,oneose(){r.close("closed automatically on eose")}});return r}async querySync(e,t,n){return new Promise(async r=>{const i=[];this.subscribeEose(e,t,{...n,onevent(e){i.push(e)},onclose(e){r(i)}})})}async get(e,t,n){t.limit=1;const r=await this.querySync(e,t,n);return r.sort((e,t)=>t.created_at-e.created_at),r[0]||null}publish(e,t,n){return e.map(bn).map(async(e,r,i)=>{if(i.indexOf(e)!==r)return Promise.reject("duplicate url");let o=await this.ensureRelay(e);return o.publish(t).catch(async e=>{if(e instanceof Error&&e.message.startsWith("auth-required: ")&&n?.onauth)return await o.auth(n.onauth),o.publish(t);throw e}).then(e=>{if(this.trackRelays){let e=this.seenOn.get(t.id);e||(e=new Set,this.seenOn.set(t.id,e)),e.add(o)}return e})})}listConnectionStatus(){const e=new Map;return this.relays.forEach((t,n)=>e.set(n,t.connected)),e}destroy(){this.relays.forEach(e=>e.close()),this.relays=new Map}};try{Qn=WebSocket}catch{}var Tn=class extends Pn{constructor(e){super({verifyEvent:xn,websocketImplementation:Qn,...e})}}; +/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Un(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function Nn(...e){const t=(e,t)=>n=>e(t(n)),n=Array.from(e).reverse().reduce((e,n)=>e?t(e,n.encode):n.encode,void 0),r=e.reduce((e,n)=>e?t(e,n.decode):n.decode,void 0);return{encode:n,decode:r}}function Ln(e){return{encode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("alphabet.encode input should be an array of numbers");return t.map(t=>{if(Un(t),t<0||t>=e.length)throw new Error(`Digit index outside alphabet: ${t} (alphabet: ${e.length})`);return e[t]})},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map(t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n})}}}function Mn(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function _n(e,t="="){if(Un(e),"string"!=typeof t)throw new Error("padding chr should be string");return{encode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;n.length*e%8;)n.push(t);return n},decode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let r=n.length;if(r*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;r>0&&n[r-1]===t;r--)if(!((r-1)*e%8))throw new Error("Invalid padding: string has too much padding");return n.slice(0,r)}}}function On(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function Hn(e,t,n){if(t<2)throw new Error(`convertRadix: wrong from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: wrong to=${n}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let r=0;const i=[],o=Array.from(e);for(o.forEach(e=>{if(Un(e),e<0||e>=t)throw new Error(`Wrong integer: ${e}`)});;){let e=0,s=!0;for(let i=r;it?jn(t,e%t):e,Gn=(e,t)=>e+(t-jn(e,t));function Jn(e,t,n,r){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(Gn(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${Gn(t,n)}`);let i=0,o=0;const s=2**n-1,a=[];for(const r of e){if(Un(r),r>=2**t)throw new Error(`convertRadix2: invalid data word=${r} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${o} from=${t}`);for(o+=t;o>=n;o-=n)a.push((i>>o-n&s)>>>0);i&=2**o-1}if(i=i<=t)throw new Error("Excess padding");if(!r&&i)throw new Error(`Non-zero padding: ${i}`);return r&&o>0&&a.push(i>>>0),a}function Kn(e,t=!1){if(Un(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(Gn(8,e)>32||Gn(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!(n instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return Jn(Array.from(n),8,e,!t)},decode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(Jn(n,e,8,t))}}}function Vn(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}const zn=Nn(Kn(4),Ln("0123456789ABCDEF"),Mn("")),qn=Nn(Kn(5),Ln("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),_n(5),Mn(""));Nn(Kn(5),Ln("0123456789ABCDEFGHIJKLMNOPQRSTUV"),_n(5),Mn("")),Nn(Kn(5),Ln("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),Mn(""),On(e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1")));const Yn=Nn(Kn(6),Ln("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),_n(6),Mn("")),Wn=Nn(Kn(6),Ln("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),_n(6),Mn("")),Zn=e=>{return Nn((Un(t=58),{encode:e=>{if(!(e instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return Hn(Array.from(e),256,t)},decode:e=>{if(!Array.isArray(e)||e.length&&"number"!=typeof e[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(Hn(e,t,256))}}),Ln(e),Mn(""));var t},Xn=Zn("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");Zn("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),Zn("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz");const er=[0,2,3,5,6,7,9,10,11],tr={encode(e){let t="";for(let n=0;n>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=rr[e]);return n}function or(e,t,n=1){const r=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=ir(i)^n>>5}i=ir(i);for(let t=0;tn)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const r=e.toLowerCase();if(e!==r&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const i=(e=r).lastIndexOf("1");if(0===i||-1===i)throw new Error('Letter "1" must be present between prefix and data only');const o=e.slice(0,i),s=e.slice(i+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const a=nr.decode(s).slice(0,-6),l=or(o,a,t);if(!s.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:o,words:a}}return{encode:function(e,n,r=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const i=e.length+7+n.length;if(!1!==r&&i>r)throw new TypeError(`Length ${i} exceeds limit ${r}`);return`${e=e.toLowerCase()}1${nr.encode(n)}${or(e,n,t)}`},decode:s,decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:r(n)}},decodeUnsafe:Vn(s),fromWords:r,fromWordsUnsafe:o,toWords:i}}const ar=sr("bech32");sr("bech32m");const lr={utf8:{encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},hex:Nn(Kn(4),Ln("0123456789abcdef"),Mn(""),On(e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()})),base16:zn,base32:qn,base64:Yn,base64url:Wn,base58:Xn,base58xmr:tr};function cr(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function ur(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function dr(e,...t){if(!((n=e)instanceof Uint8Array||null!=n&&"object"==typeof n&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)} +/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */Object.keys(lr).join(", ");const fr=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");const hr=16;function pr(e){return e<<1^283&-(e>>7)}function gr(e,t){let n=0;for(;t>0;t>>=1)n^=e&-(1&t),e=pr(e);return n}const mr=(()=>{let e=new Uint8Array(256);for(let t=0,n=1;t<256;t++,n^=pr(n))e[t]=n;const t=new Uint8Array(256);t[0]=99;for(let n=0;n<255;n++){let r=e[255-n];r|=r<<8,t[e[n]]=255&(r^r>>4^r>>5^r>>6^r>>7^99)}return t})(),yr=mr.map((e,t)=>mr.indexOf(t)),wr=e=>e<<24|e>>>8,vr=e=>e<<8|e>>>24;function Ar(e,t){if(256!==e.length)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map((n,r)=>t(e[r])),r=n.map(vr),i=r.map(vr),o=i.map(vr),s=new Uint32Array(65536),a=new Uint32Array(65536),l=new Uint16Array(65536);for(let t=0;t<256;t++)for(let c=0;c<256;c++){const u=256*t+c;s[u]=n[t]^r[c],a[u]=i[t]^o[c],l[u]=e[t]<<8|e[c]}return{sbox:e,sbox2:l,T0:n,T1:r,T2:i,T3:o,T01:s,T23:a}}const br=Ar(mr,e=>gr(e,3)<<24|e<<16|e<<8|gr(e,2)),kr=Ar(yr,e=>gr(e,11)<<24|gr(e,13)<<16|gr(e,9)<<8|gr(e,14)),Ir=(()=>{const e=new Uint8Array(16);for(let t=0,n=1;t<16;t++,n=pr(n))e[t]=n;return e})();function Cr(e){dr(e);const t=e.length;if(![16,24,32].includes(t))throw new Error(`aes: wrong key size: should be 16, 24 or 32, got: ${t}`);const{sbox2:n}=br,r=fr(e),i=r.length,o=e=>xr(n,e,e,e,e),s=new Uint32Array(t+28);s.set(r);for(let e=i;e6&&e%i===4&&(t=o(t)),s[e]=s[e-i]^t}return s}function Er(e,t,n,r,i,o){return e[n<<8&65280|r>>>8&255]^t[i>>>8&65280|o>>>24&255]}function xr(e,t,n,r,i){return e[255&t|65280&n]|e[r>>>16&255|i>>>16&65280]<<16}function Br(e,t,n,r,i){const{sbox2:o,T01:s,T23:a}=br;let l=0;t^=e[l++],n^=e[l++],r^=e[l++],i^=e[l++];const c=e.length/4-2;for(let o=0;o{const o=Cr(e),{b:s,o:a,out:l}=function(e,t,n){let r=e.length;const i=r%hr;if(!t&&0!==i)throw new Error("aec/(cbc-ecb): unpadded plaintext with disabled padding");const o=fr(e);if(t){let e=hr-i;e||(e=hr),r+=e}const s=Qr(r,n);return{b:o,o:fr(s),out:s}}(n,r,i),c=fr(t);let u=c[0],d=c[1],f=c[2],h=c[3],p=0;for(;p+4<=s.length;)u^=s[p+0],d^=s[p+1],f^=s[p+2],h^=s[p+3],({s0:u,s1:d,s2:f,s3:h}=Br(o,u,d,f,h)),a[p++]=u,a[p++]=d,a[p++]=f,a[p++]=h;if(r){const e=function(e){const t=new Uint8Array(16),n=fr(t);t.set(e);const r=hr-e.length;for(let e=hr-r;e{!function(e){if(dr(e),e.length%hr!==0)throw new Error("aes/(cbc-ecb).decrypt ciphertext should consist of blocks with size 16")}(n);const o=function(e){const t=Cr(e),n=t.slice(),r=t.length,{sbox2:i}=br,{T0:o,T1:s,T2:a,T3:l}=kr;for(let e=0;e>>8&255]^a[r>>>16&255]^l[r>>>24]}return n}(e),s=fr(t),a=Qr(n.length,i),l=fr(n),c=fr(a);let u=s[0],d=s[1],f=s[2],h=s[3];for(let e=0;e+4<=l.length;){const t=u,n=d,r=f,i=h;u=l[e+0],d=l[e+1],f=l[e+2],h=l[e+3];const{s0:s,s1:a,s2:p,s3:g}=Sr(o,u,d,f,h);c[e++]=s^t,c[e++]=a^n,c[e++]=p^r,c[e++]=g^i}return o.fill(0),function(e,t){if(!t)return e;const n=e.length;if(!n)throw new Error("aes/pcks5: empty ciphertext not allowed");const r=e[n-1];if(r<=0||r>16)throw new Error(`aes/pcks5: wrong padding byte: ${r}`);const i=e.subarray(0,-r);for(let t=0;tUint8Array.from(e.split("").map(e=>e.charCodeAt(0))),Pr=Rr("expand 16-byte k"),Tr=Rr("expand 32-byte k"),Ur=fr(Pr),Nr=fr(Tr);function Lr(e,t){return e<>>32-t}function Mr(e){return e.byteOffset%4==0}Nr.slice();const _r=2**32-1,Or=new Uint32Array;function Hr(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:i,counterRight:o,rounds:s}=function(e,t){if(null==t||"object"!=typeof t)throw new Error("options must be defined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return cr(i),cr(s),ur(o),ur(n),(t,a,l,c,u=0)=>{dr(t),dr(a),dr(l);const d=l.length;if(c||(c=new Uint8Array(d)),dr(c),cr(u),u<0||u>=_r)throw new Error("arx: counter overflow");if(c.length=_r)throw new Error("arx: counter overflow");const g=Math.min(64,l-p);if(d&&64===g){const e=p/4;if(p%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<16;n++)t=e+n,h[t]=f[t]^u[n];p+=64;continue}for(let e,t=0;t0;)f.pop().fill(0);return c}}function jr(e,t,n,r,i,o=20){let s=e[0],a=e[1],l=e[2],c=e[3],u=t[0],d=t[1],f=t[2],h=t[3],p=t[4],g=t[5],m=t[6],y=t[7],w=i,v=n[0],A=n[1],b=n[2],k=s,I=a,C=l,E=c,x=u,B=d,S=f,Q=h,F=p,D=g,$=m,R=y,P=w,T=v,U=A,N=b;for(let e=0;er?e.create().update(n).digest():n);for(let e=0;enew Jr(e,t).update(n).digest();Kr.create=(e,t)=>new Jr(e,t);const Vr=new Uint8Array([0]),zr=new Uint8Array;var qr=Object.defineProperty,Yr=(e,t)=>{for(var n in t)qr(e,n,{get:t[n],enumerable:!0})},Wr=Symbol("verified");function Zr(e){if(!(e instanceof Object))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;tsi,QueueNode:()=>oi,binarySearch:()=>ii,bytesToHex:()=>Zt,hexToBytes:()=>Xt,insertEventIntoAscendingList:()=>ri,insertEventIntoDescendingList:()=>ni,normalizeURL:()=>ti,utf8Decoder:()=>Xr,utf8Encoder:()=>ei});var Xr=new TextDecoder("utf-8"),ei=new TextEncoder;function ti(e){try{-1===e.indexOf("://")&&(e="wss://"+e);let t=new URL(e);return t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}catch(t){throw new Error(`Invalid URL: ${e}`)}}function ni(e,t){const[n,r]=ii(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at);return r||e.splice(n,0,t),e}function ri(e,t){const[n,r]=ii(e,e=>t.id===e.id?0:t.created_at===e.created_at?-1:t.created_at-e.created_at);return r||e.splice(n,0,t),e}function ii(e,t){let n=0,r=e.length-1;for(;n<=r;){const i=Math.floor((n+r)/2),o=t(e[i]);if(0===o)return[i,!0];o<0?r=i-1:n=i+1}return[n,!1]}var oi=class{value;next=null;prev=null;constructor(e){this.value=e}},si=class{first;last;constructor(){this.first=null,this.last=null}enqueue(e){const t=new oi(e);return this.last?this.last===this.first?(this.last=t,this.last.prev=this.first,this.first.next=t):(t.prev=this.last,this.last.next=t,this.last=t):(this.first=t,this.last=t),!0}dequeue(){if(!this.first)return null;if(this.first===this.last){const e=this.first;return this.first=null,this.last=null,e.value}const e=this.first;return this.first=e.next,this.first&&(this.first.prev=null),e.value}};function ai(e){return Zt(yn(ei.encode(function(e){if(!Zr(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}(e))))}var li=new class{generateSecretKey(){return Kt.utils.randomPrivateKey()}getPublicKey(e){return Zt(Kt.getPublicKey(e))}finalizeEvent(e,t){const n=e;return n.pubkey=Zt(Kt.getPublicKey(t)),n.id=ai(n),n.sig=Zt(Kt.sign(ai(n),t)),n[Wr]=!0,n}verifyEvent(e){if("boolean"==typeof e[Wr])return e[Wr];const t=ai(e);if(t!==e.id)return e[Wr]=!1,!1;try{const n=Kt.verify(e.sig,t,e.pubkey);return e[Wr]=n,n}catch(t){return e[Wr]=!1,!1}}},ci=li.generateSecretKey,ui=li.getPublicKey,di=li.finalizeEvent,fi=li.verifyEvent,hi={};function pi(e){return 1e3<=e&&e<1e4||[1,2,4,5,6,7,8,16,40,41,42,43,44].includes(e)}function gi(e){return[0,3].includes(e)||1e4<=e&&e<2e4}function mi(e){return 2e4<=e&&e<3e4}function yi(e){return 3e4<=e&&e<4e4}function wi(e){return pi(e)?"regular":gi(e)?"replaceable":mi(e)?"ephemeral":yi(e)?"parameterized":"unknown"}function vi(e,t){const n=t instanceof Array?t:[t];return Zr(e)&&n.includes(e.kind)||!1}Yr(hi,{Application:()=>$o,BadgeAward:()=>Si,BadgeDefinition:()=>Eo,BlockedRelaysList:()=>oo,BookmarkList:()=>no,Bookmarksets:()=>ko,Calendar:()=>Mo,CalendarEventRSVP:()=>_o,ChannelCreation:()=>$i,ChannelHideMessage:()=>Ti,ChannelMessage:()=>Pi,ChannelMetadata:()=>Ri,ChannelMuteUser:()=>Ui,ClassifiedListing:()=>To,ClientAuth:()=>po,CommunitiesList:()=>ro,CommunityDefinition:()=>jo,CommunityPostApproval:()=>Ji,Contacts:()=>Ii,CreateOrUpdateProduct:()=>So,CreateOrUpdateStall:()=>Bo,Curationsets:()=>Io,Date:()=>No,DirectMessageRelaysList:()=>co,DraftClassifiedListing:()=>Uo,DraftLong:()=>Fo,Emojisets:()=>Do,EncryptedDirectMessage:()=>Ci,EventDeletion:()=>Ei,FileMetadata:()=>Mi,FileServerPreference:()=>uo,Followsets:()=>vo,GenericRepost:()=>Di,Genericlists:()=>Ao,GiftWrap:()=>Li,HTTPAuth:()=>wo,Handlerinformation:()=>Ho,Handlerrecommendation:()=>Oo,Highlights:()=>Zi,InterestsList:()=>ao,Interestsets:()=>xo,JobFeedback:()=>zi,JobRequest:()=>Ki,JobResult:()=>Vi,Label:()=>Gi,LightningPubRPC:()=>ho,LiveChatMessage:()=>_i,LiveEvent:()=>Ro,LongFormArticle:()=>Qo,Metadata:()=>Ai,Mutelist:()=>Xi,NWCWalletInfo:()=>fo,NWCWalletRequest:()=>go,NWCWalletResponse:()=>mo,NostrConnect:()=>yo,OpenTimestamps:()=>Ni,Pinlist:()=>eo,PrivateDirectMessage:()=>Fi,ProblemTracker:()=>Oi,ProfileBadges:()=>Co,PublicChatsList:()=>io,Reaction:()=>Bi,RecommendRelay:()=>ki,RelayList:()=>to,Relaysets:()=>bo,Report:()=>Hi,Reporting:()=>ji,Repost:()=>xi,Seal:()=>Qi,SearchRelaysList:()=>so,ShortTextNote:()=>bi,Time:()=>Lo,UserEmojiList:()=>lo,UserStatuses:()=>Po,Zap:()=>Wi,ZapGoal:()=>qi,ZapRequest:()=>Yi,classifyKind:()=>wi,isAddressableKind:()=>yi,isEphemeralKind:()=>mi,isKind:()=>vi,isRegularKind:()=>pi,isReplaceableKind:()=>gi});var Ai=0,bi=1,ki=2,Ii=3,Ci=4,Ei=5,xi=6,Bi=7,Si=8,Qi=13,Fi=14,Di=16,$i=40,Ri=41,Pi=42,Ti=43,Ui=44,Ni=1040,Li=1059,Mi=1063,_i=1311,Oi=1971,Hi=1984,ji=1984,Gi=1985,Ji=4550,Ki=5999,Vi=6999,zi=7e3,qi=9041,Yi=9734,Wi=9735,Zi=9802,Xi=1e4,eo=10001,to=10002,no=10003,ro=10004,io=10005,oo=10006,so=10007,ao=10015,lo=10030,co=10050,uo=10096,fo=13194,ho=21e3,po=22242,go=23194,mo=23195,yo=24133,wo=27235,vo=3e4,Ao=30001,bo=30002,ko=30003,Io=30004,Co=30008,Eo=30009,xo=30015,Bo=30017,So=30018,Qo=30023,Fo=30024,Do=30030,$o=30078,Ro=30311,Po=30315,To=30402,Uo=30403,No=31922,Lo=31923,Mo=31924,_o=31925,Oo=31989,Ho=31990,jo=34550;function Go(e,t){let n=t.length+3,r=e.indexOf(`"${t}":`)+n,i=e.slice(r).indexOf('"')+r+1;return e.slice(i,i+64)}function Jo(e,t){let n=t.length,r=e.indexOf(`"${t}":`)+n+3,i=e.slice(r),o=Math.min(i.indexOf(","),i.indexOf("}"));return parseInt(i.slice(0,o),10)}function Ko(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let r=t+7+1+n,i=e.slice(r+1,80).indexOf('"');if(-1===i)return null;let o=r+1+i;return e.slice(r+1,o)}function Vo(e,t){return t===Go(e,"id")}function zo(e,t){return t===Go(e,"pubkey")}function qo(e,t){return t===Jo(e,"kind")}Yr({},{getHex64:()=>Go,getInt:()=>Jo,getSubscriptionId:()=>Ko,matchEventId:()=>Vo,matchEventKind:()=>qo,matchEventPubkey:()=>zo});function Yo(e,t){return{kind:po,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}Yr({},{makeAuthEvent:()=>Yo});try{WebSocket}catch{}try{WebSocket}catch{}var Wo={};Yr(Wo,{BECH32_REGEX:()=>es,Bech32MaxSize:()=>Xo,NostrTypeGuard:()=>Zo,decode:()=>ns,decodeNostrURI:()=>ts,encodeBytes:()=>ls,naddrEncode:()=>ds,neventEncode:()=>us,noteEncode:()=>ss,nprofileEncode:()=>cs,npubEncode:()=>os,nsecEncode:()=>is});var Zo={isNProfile:e=>/^nprofile1[a-z\d]+$/.test(e||""),isNEvent:e=>/^nevent1[a-z\d]+$/.test(e||""),isNAddr:e=>/^naddr1[a-z\d]+$/.test(e||""),isNSec:e=>/^nsec1[a-z\d]{58}$/.test(e||""),isNPub:e=>/^npub1[a-z\d]{58}$/.test(e||""),isNote:e=>/^note1[a-z\d]+$/.test(e||""),isNcryptsec:e=>/^ncryptsec1[a-z\d]+$/.test(e||"")},Xo=5e3,es=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function ts(e){try{return e.startsWith("nostr:")&&(e=e.substring(6)),ns(e)}catch(e){return{type:"invalid",data:null}}}function ns(e){let{prefix:t,words:n}=ar.decode(e,Xo),r=new Uint8Array(ar.fromWords(n));switch(t){case"nprofile":{let e=rs(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:Zt(e[0][0]),relays:e[1]?e[1].map(e=>Xr.decode(e)):[]}}}case"nevent":{let e=rs(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:Zt(e[0][0]),relays:e[1]?e[1].map(e=>Xr.decode(e)):[],author:e[2]?.[0]?Zt(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(Zt(e[3][0]),16):void 0}}}case"naddr":{let e=rs(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:Xr.decode(e[0][0]),pubkey:Zt(e[2][0]),kind:parseInt(Zt(e[3][0]),16),relays:e[1]?e[1].map(e=>Xr.decode(e)):[]}}}case"nsec":return{type:t,data:r};case"npub":case"note":return{type:t,data:Zt(r)};default:throw new Error(`unknown prefix ${t}`)}}function rs(e){let t={},n=e;for(;n.length>0;){let e=n[0],r=n[1],i=n.slice(2,2+r);if(n=n.slice(2+r),i.lengthei.encode(e))}))}function us(e){let t;return void 0!==e.kind&&(t=function(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}(e.kind)),as("nevent",fs({0:[Xt(e.id)],1:(e.relays||[]).map(e=>ei.encode(e)),2:e.author?[Xt(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function ds(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),as("naddr",fs({0:[ei.encode(e.identifier)],1:(e.relays||[]).map(e=>ei.encode(e)),2:[Xt(e.pubkey)],3:[new Uint8Array(t)]}))}function fs(e){let t=[];return Object.entries(e).reverse().forEach(([e,n])=>{n.forEach(n=>{let r=new Uint8Array(n.length+2);r.set([parseInt(e)],0),r.set([n.length],1),r.set(n,2),t.push(r)})}),tn(...t)}var hs={};function ps(e,t,n){const r=e instanceof Uint8Array?Zt(e):e,i=ms(Ft.getSharedSecret(r,"02"+t));let o=Uint8Array.from(on(16)),s=ei.encode(n),a=Fr(i,o).encrypt(s);return`${Yn.encode(new Uint8Array(a))}?iv=${Yn.encode(new Uint8Array(o.buffer))}`}function gs(e,t,n){const r=e instanceof Uint8Array?Zt(e):e;let[i,o]=n.split("?iv="),s=ms(Ft.getSharedSecret(r,"02"+t)),a=Yn.decode(o),l=Yn.decode(i),c=Fr(s,a).decrypt(l);return Xr.decode(c)}function ms(e){return e.slice(1,33)}Yr(hs,{decrypt:()=>gs,encrypt:()=>ps});Yr({},{NIP05_REGEX:()=>ws,isNip05:()=>vs,isValid:()=>Is,queryProfile:()=>ks,searchDomain:()=>bs,useFetchImplementation:()=>As});var ys,ws=/^(?:([\w.+-]+)@)?([\w_-]+(\.[\w_-]+)+)$/,vs=e=>ws.test(e||"");try{ys=fetch}catch(e){}function As(e){ys=e}async function bs(e,t=""){try{const n=`https://${e}/.well-known/nostr.json?name=${t}`,r=await ys(n,{redirect:"manual"});if(200!==r.status)throw Error("Wrong response code");return(await r.json()).names}catch(e){return{}}}async function ks(e){const t=e.match(ws);if(!t)return null;const[,n="_",r]=t;try{const e=`https://${r}/.well-known/nostr.json?name=${n}`,t=await ys(e,{redirect:"manual"});if(200!==t.status)throw Error("Wrong response code");const i=await t.json(),o=i.names[n];return o?{pubkey:o,relays:i.relays?.[o]}:null}catch(e){return null}}async function Is(e,t){const n=await ks(t);return!!n&&n.pubkey===e}function Cs(e){const t={reply:void 0,root:void 0,mentions:[],profiles:[],quotes:[]};let n,r;for(let i=e.tags.length-1;i>=0;i--){const o=e.tags[i];if("e"===o[0]&&o[1]){const[e,i,s,a,l]=o,c={id:i,relays:s?[s]:[],author:l};if("root"===a){t.root=c;continue}if("reply"===a){t.reply=c;continue}if("mention"===a){t.mentions.push(c);continue}n?r=c:n=c,t.mentions.push(c);continue}if("q"===o[0]&&o[1]){const[e,n,r]=o;t.quotes.push({id:n,relays:r?[r]:[]})}"p"===o[0]&&o[1]&&t.profiles.push({pubkey:o[1],relays:o[2]?[o[2]]:[]})}return t.root||(t.root=r||n||t.reply),t.reply||(t.reply=n||t.root),[t.reply,t.root].forEach(e=>{if(!e)return;let n=t.mentions.indexOf(e);if(-1!==n&&t.mentions.splice(n,1),e.author){let n=t.profiles.find(t=>t.pubkey===e.author);n&&n.relays&&(e.relays||(e.relays=[]),n.relays.forEach(t=>{-1===e.relays?.indexOf(t)&&e.relays.push(t)}),n.relays=e.relays)}}),t.mentions.forEach(e=>{if(e.author){let n=t.profiles.find(t=>t.pubkey===e.author);n&&n.relays&&(e.relays||(e.relays=[]),n.relays.forEach(t=>{-1===e.relays.indexOf(t)&&e.relays.push(t)}),n.relays=e.relays)}}),t}Yr({},{parse:()=>Cs});Yr({},{fetchRelayInformation:()=>xs,useFetchImplementation:()=>Es});try{fetch}catch{}function Es(e){0}async function xs(e){return await(await fetch(e.replace("ws://","http://").replace("wss://","https://"),{headers:{Accept:"application/nostr+json"}})).json()}function Bs(e){let t=0;for(let n=0;n<64;n+=8){const r=parseInt(e.substring(n,n+8),16);if(0!==r){t+=Math.clz32(r);break}t+=32}return t}function Ss(e,t){let n=0;const r=e,i=["nonce",n.toString(),t.toString()];for(r.tags.push(i);;){const e=Math.floor((new Date).getTime()/1e3);if(e!==r.created_at&&(n=0,r.created_at=e),i[1]=(++n).toString(),r.id=Qs(r),Bs(r.id)>=t)break}return r}function Qs(e){return Zt(yn(ei.encode(JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content]))))}Yr({},{fastEventHash:()=>Qs,getPow:()=>Bs,minePow:()=>Ss});Yr({},{unwrapEvent:()=>ta,unwrapManyEvents:()=>na,wrapEvent:()=>Xs,wrapManyEvents:()=>ea});Yr({},{createRumor:()=>Ks,createSeal:()=>Vs,createWrap:()=>zs,unwrapEvent:()=>Ws,unwrapManyEvents:()=>Zs,wrapEvent:()=>qs,wrapManyEvents:()=>Ys});var Fs={};Yr(Fs,{decrypt:()=>Ms,encrypt:()=>Ls,getConversationKey:()=>Rs,v2:()=>_s});var Ds=1,$s=65535;function Rs(e,t){const n=Ft.getSharedSecret(e,"02"+t).subarray(1,33);return function(e,t,n){return ln.hash(e),void 0===n&&(n=new Uint8Array(e.outputLen)),Kr(e,en(n),en(t))}(yn,n,"nip44-v2")}function Ps(e,t){const n=function(e,t,n,r=32){if(ln.hash(e),ln.number(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const i=Math.ceil(r/e.outputLen);void 0===n&&(n=zr);const o=new Uint8Array(i*e.outputLen),s=Kr.create(e,t),a=s._cloneInto(),l=new Uint8Array(s.outputLen);for(let t=0;t$s)throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");const t=new Uint8Array(2);return new DataView(t.buffer).setUint16(0,e,!1),t}(n),t,new Uint8Array(Ts(n)-n))}function Ns(e,t,n){if(32!==n.length)throw new Error("AAD associated data must be 32 bytes");const r=tn(n,t);return Kr(yn,e,r)}function Ls(e,t,n=on(32)){const{chacha_key:r,chacha_nonce:i,hmac_key:o}=Ps(t,n),s=Us(e),a=Gr(r,i,s),l=Ns(o,a,n);return Yn.encode(tn(new Uint8Array([2]),n,a,l))}function Ms(e,t){const{nonce:n,ciphertext:r,mac:i}=function(e){if("string"!=typeof e)throw new Error("payload must be a valid string");const t=e.length;if(t<132||t>87472)throw new Error("invalid payload length: "+t);if("#"===e[0])throw new Error("unknown encryption version");let n;try{n=Yn.decode(e)}catch(e){throw new Error("invalid base64: "+e.message)}const r=n.length;if(r<99||r>65603)throw new Error("invalid data length: "+r);const i=n[0];if(2!==i)throw new Error("unknown encryption version "+i);return{nonce:n.subarray(1,33),ciphertext:n.subarray(33,-32),mac:n.subarray(-32)}}(e),{chacha_key:o,chacha_nonce:s,hmac_key:a}=Ps(t,n);if(!function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r$s||n.length!==t||e.length!==2+Ts(t))throw new Error("invalid padding");return Xr.decode(n)}(Gr(o,s,r))}var _s={utils:{getConversationKey:Rs,calcPaddedLen:Ts},encrypt:Ls,decrypt:Ms},Os=()=>Math.round(Date.now()/1e3),Hs=()=>Math.round(Os()-172800*Math.random()),js=(e,t)=>Rs(e,t),Gs=(e,t,n)=>Ls(JSON.stringify(e),js(t,n)),Js=(e,t)=>JSON.parse(Ms(e.content,js(t,e.pubkey)));function Ks(e,t){const n={created_at:Os(),content:"",tags:[],...e,pubkey:ui(t)};return n.id=ai(n),n}function Vs(e,t,n){return di({kind:Qi,content:Gs(e,t,n),created_at:Hs(),tags:[]},t)}function zs(e,t){const n=ci();return di({kind:Li,content:Gs(e,n,t),created_at:Hs(),tags:[["p",t]]},n)}function qs(e,t,n){return zs(Vs(Ks(e,t),t,n),n)}function Ys(e,t,n){if(!n||0===n.length)throw new Error("At least one recipient is required.");const r=ui(t),i=[qs(e,t,r)];return n.forEach(n=>{i.push(qs(e,t,n))}),i}function Ws(e,t){const n=Js(e,t);return Js(n,t)}function Zs(e,t){let n=[];return e.forEach(e=>{n.push(Ws(e,t))}),n.sort((e,t)=>e.created_at-t.created_at),n}function Xs(e,t,n,r,i){const o=function(e,t,n,r){const i={created_at:Math.ceil(Date.now()/1e3),kind:Fi,tags:[],content:t};return(Array.isArray(e)?e:[e]).forEach(({publicKey:e,relayUrl:t})=>{i.tags.push(t?["p",e,t]:["p",e])}),r&&i.tags.push(["e",r.eventId,r.relayUrl||"","reply"]),n&&i.tags.push(["subject",n]),i}(t,n,r,i);return qs(o,e,t.publicKey)}function ea(e,t,n,r,i){if(!t||0===t.length)throw new Error("At least one recipient is required.");return[{publicKey:ui(e)},...t].map(t=>Xs(e,t,n,r,i))}var ta=Ws,na=Zs;function ra(e,t,n,r){let i;const o=[...e.tags??[],["e",t.id,n],["p",t.pubkey]];return t.kind===bi?i=xi:(i=Di,o.push(["k",String(t.kind)])),di({kind:i,tags:o,content:""===e.content||t.tags?.find(e=>"-"===e[0])?"":JSON.stringify(t),created_at:e.created_at},r)}function ia(e){if(![xi,Di].includes(e.kind))return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const i=e.tags[r];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t?{id:t[1],relays:[t[2],n?.[2]].filter(e=>"string"==typeof e),author:n?.[1]}:void 0}function oa(e,{skipVerification:t}={}){const n=ia(e);if(void 0===n||""===e.content)return;let r;try{r=JSON.parse(e.content)}catch(e){return}return r.id===n.id&&(t||fi(r))?r:void 0}Yr({},{finishRepostEvent:()=>ra,getRepostedEvent:()=>oa,getRepostedEventPointer:()=>ia});Yr({},{NOSTR_URI_REGEX:()=>sa,parse:()=>la,test:()=>aa});var sa=new RegExp(`nostr:(${es.source})`);function aa(e){return"string"==typeof e&&new RegExp(`^${sa.source}$`).test(e)}function la(e){const t=e.match(new RegExp(`^${sa.source}$`));if(!t)throw new Error(`Invalid Nostr URI: ${e}`);return{uri:t[0],value:t[1],decoded:ns(t[1])}}function ca(e,t,n){const r=t.tags.filter(e=>e.length>=2&&("e"===e[0]||"p"===e[0]));return di({...e,kind:Bi,tags:[...e.tags??[],...r,["e",t.id],["p",t.pubkey]],content:e.content??"+"},n)}function ua(e){if(e.kind!==Bi)return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const i=e.tags[r];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t&&void 0!==n?{id:t[1],relays:[t[2],n[2]].filter(e=>void 0!==e),author:n[1]}:void 0}Yr({},{finishReactionEvent:()=>ca,getReactedEventPointer:()=>ua});Yr({},{parse:()=>ha});var da=/\W/m,fa=/\W |\W$|$|,| /m;function*ha(e){const t=e.length;let n=0,r=0;for(;rpa,channelHideMessageEvent:()=>ya,channelMessageEvent:()=>ma,channelMetadataEvent:()=>ga,channelMuteUserEvent:()=>wa});var pa=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:$i,tags:[...e.tags??[]],content:n,created_at:e.created_at},t)},ga=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:Ri,tags:[["e",e.channel_create_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},ma=(e,t)=>{const n=[["e",e.channel_create_event_id,e.relay_url,"root"]];return e.reply_to_channel_message_event_id&&n.push(["e",e.reply_to_channel_message_event_id,e.relay_url,"reply"]),di({kind:Pi,tags:[...n,...e.tags??[]],content:e.content,created_at:e.created_at},t)},ya=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:Ti,tags:[["e",e.channel_message_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},wa=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return di({kind:Ui,tags:[["p",e.pubkey_to_mute],...e.tags??[]],content:n,created_at:e.created_at},t)};Yr({},{EMOJI_SHORTCODE_REGEX:()=>va,matchAll:()=>ba,regex:()=>Aa,replaceAll:()=>ka});var va=/:(\w+):/,Aa=()=>new RegExp(`\\B${va.source}\\B`,"g");function*ba(e){const t=e.matchAll(Aa());for(const e of t)try{const[t,n]=e;yield{shortcode:t,name:n,start:e.index,end:e.index+t.length}}catch(e){}}function ka(e,t){return e.replaceAll(Aa(),(e,n)=>t({shortcode:e,name:n}))}var Ia;Yr({},{useFetchImplementation:()=>Ca,validateGithub:()=>Ea});try{Ia=fetch}catch{}function Ca(e){Ia=e}async function Ea(e,t,n){try{return await(await Ia(`https://gist.github.com/${t}/${n}/raw`)).text()===`Verifying that I control the following Nostr public key: ${e}`}catch(e){return!1}}function xa(e){const{host:t,pathname:n,searchParams:r}=new URL(e),i=n||t,o=r.get("relay"),s=r.get("secret");if(!i||!o||!s)throw new Error("invalid connection string");return{pubkey:i,relay:o,secret:s}}async function Ba(e,t,n){const r={method:"pay_invoice",params:{invoice:n}},i=ps(t,e,JSON.stringify(r)),o={kind:go,created_at:Math.round(Date.now()/1e3),content:i,tags:[["p",e]]};return di(o,t)}Yr({},{makeNwcRequestEvent:()=>Ba,parseConnectionString:()=>xa});function Sa(e){return e=(e=e.trim().toLowerCase()).normalize("NFKC"),Array.from(e).map(e=>/\p{Letter}/u.test(e)||/\p{Number}/u.test(e)?e:"-").join("")}Yr({},{normalizeIdentifier:()=>Sa});var Qa;Yr({},{getSatoshisAmountFromBolt11:()=>Ta,getZapEndpoint:()=>Da,makeZapReceipt:()=>Pa,makeZapRequest:()=>$a,useFetchImplementation:()=>Fa,validateZapRequest:()=>Ra});try{Qa=fetch}catch{}function Fa(e){Qa=e}async function Da(e){try{let t="",{lud06:n,lud16:r}=JSON.parse(e.content);if(n){let{words:e}=ar.decode(n,1e3),r=ar.fromWords(e);t=Xr.decode(r)}else{if(!r)return null;{let[e,n]=r.split("@");t=new URL(`/.well-known/lnurlp/${e}`,`https://${n}`).toString()}}let i=await Qa(t),o=await i.json();if(o.allowsNostr&&o.nostrPubkey)return o.callback}catch(e){}return null}function $a(e){let t={kind:9734,created_at:Math.round(Date.now()/1e3),content:e.comment||"",tags:[["p","pubkey"in e?e.pubkey:e.event.pubkey],["amount",e.amount.toString()],["relays",...e.relays]]};if("event"in e){if(t.tags.push(["e",e.event.id]),gi(e.event.kind)){const n=["a",`${e.event.kind}:${e.event.pubkey}:`];t.tags.push(n)}else if(yi(e.event.kind)){let n=e.event.tags.find(([e,t])=>"d"===e&&t);if(!n)throw new Error("d tag not found or is empty");const r=["a",`${e.event.kind}:${e.event.pubkey}:${n[1]}`];t.tags.push(r)}t.tags.push(["k",e.event.kind.toString()])}return t}function Ra(e){let t;try{t=JSON.parse(e)}catch(e){return"Invalid zap request JSON."}if(!Zr(t))return"Zap request is not a valid Nostr event.";if(!fi(t))return"Invalid signature on zap request.";let n=t.tags.find(([e,t])=>"p"===e&&t);if(!n)return"Zap request doesn't have a 'p' tag.";if(!n[1].match(/^[a-f0-9]{64}$/))return"Zap request 'p' tag is not valid hex.";let r=t.tags.find(([e,t])=>"e"===e&&t);return r&&!r[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find(([e,t])=>"relays"===e&&t)?null:"Zap request doesn't have a 'relays' tag."}function Pa({zapRequest:e,preimage:t,bolt11:n,paidAt:r}){let i=JSON.parse(e),o=i.tags.filter(([e])=>"e"===e||"p"===e||"a"===e),s={kind:9735,created_at:Math.round(r.getTime()/1e3),content:"",tags:[...o,["P",i.pubkey],["bolt11",n],["description",e]]};return t&&s.tags.push(["preimage",t]),s}function Ta(e){if(e.length<50)return 0;const t=(e=e.substring(0,50)).lastIndexOf("1");if(-1===t)return 0;const n=e.substring(0,t);if(!n.startsWith("lnbc"))return 0;const r=n.substring(4);if(r.length<1)return 0;const i=r[r.length-1],o=i.charCodeAt(0)-"0".charCodeAt(0),s=o>=0&&o<=9;let a=r.length-1;if(s&&a++,a<1)return 0;const l=parseInt(r.substring(0,a));switch(i){case"m":return 1e5*l;case"u":return 100*l;case"n":return l/10;case"p":return l/1e4;default:return 1e8*l}}Yr({},{getToken:()=>Na,hashPayload:()=>Ga,unpackEventFromToken:()=>Ma,validateEvent:()=>Ka,validateEventKind:()=>Oa,validateEventMethodTag:()=>ja,validateEventPayloadTag:()=>Ja,validateEventTimestamp:()=>_a,validateEventUrlTag:()=>Ha,validateToken:()=>La});var Ua="Nostr ";async function Na(e,t,n,r=!1,i){const o={kind:wo,tags:[["u",e],["method",t]],created_at:Math.round((new Date).getTime()/1e3),content:""};i&&o.tags.push(["payload",Ga(i)]);const s=await n(o);return(r?Ua:"")+Yn.encode(ei.encode(JSON.stringify(s)))}async function La(e,t,n){const r=await Ma(e).catch(e=>{throw e});return await Ka(r,t,n).catch(e=>{throw e})}async function Ma(e){if(!e)throw new Error("Missing token");e=e.replace(Ua,"");const t=Xr.decode(Yn.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}function _a(e){return!!e.created_at&&Math.round((new Date).getTime()/1e3)-e.created_at<60}function Oa(e){return e.kind===wo}function Ha(e,t){const n=e.tags.find(e=>"u"===e[0]);return!!n&&(n.length>0&&n[1]===t)}function ja(e,t){const n=e.tags.find(e=>"method"===e[0]);return!!n&&(n.length>0&&n[1].toLowerCase()===t.toLowerCase())}function Ga(e){return Zt(yn(ei.encode(JSON.stringify(e))))}function Ja(e,t){const n=e.tags.find(e=>"payload"===e[0]);if(!n)return!1;const r=Ga(t);return n.length>0&&n[1]===r}async function Ka(e,t,n,r){if(!fi(e))throw new Error("Invalid nostr event, signature invalid");if(!Oa(e))throw new Error("Invalid nostr event, kind invalid");if(!_a(e))throw new Error("Invalid nostr event, created_at timestamp invalid");if(!Ha(e,t))throw new Error("Invalid nostr event, url tag invalid");if(!ja(e,n))throw new Error("Invalid nostr event, method tag invalid");if(Boolean(r)&&"object"==typeof r&&Object.keys(r).length>0&&!Ja(e,r))throw new Error("Invalid nostr event, payload tag does not match request body hash");return!0}function Va(e){return[0,3].includes(e)||1e4<=e&&e<2e4}function za(e){return 3e4<=e&&e<4e4}var qa=function(e,t){return qa=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},qa(e,t)};function Ya(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}qa(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function Wa(e,t,n,r){return new(n||(n=Promise))(function(i,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(s,a)}l((r=r.apply(e,t||[])).next())})}function Za(e,t){var n,r,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(n=1,r&&(i=2&a[0]?r.return:a[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,a[1])).done)return i;switch(r=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,r=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function el(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}function tl(e,t,n){if(n||2===arguments.length)for(var r,i=0,o=t.length;i1||a(e,t)})},t&&(r[e]=t(r[e])))}function a(e,t){try{(n=i[e](t)).value instanceof nl?Promise.resolve(n.value.v).then(l,c):u(o[0][2],n)}catch(e){u(o[0][3],e)}var n}function l(e){a("next",e)}function c(e){a("throw",e)}function u(e,t){e(t),o.shift(),o.length&&a(o[0][0],o[0][1])}}function il(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=Xa(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise(function(r,i){(function(e,t,n,r){Promise.resolve(r).then(function(t){e({value:t,done:n})},t)})(r,i,(t=e[n](t)).done,t.value)})}}}function ol(e){return"function"==typeof e}function sl(e){var t=e(function(e){Error.call(e),e.stack=(new Error).stack});return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}"function"==typeof SuppressedError&&SuppressedError;var al=sl(function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map(function(e,t){return t+1+") "+e.toString()}).join("\n "):"",this.name="UnsubscriptionError",this.errors=t}});function ll(e,t){if(e){var n=e.indexOf(t);0<=n&&e.splice(n,1)}}var cl=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var e,t,n,r,i;if(!this.closed){this.closed=!0;var o=this._parentage;if(o)if(this._parentage=null,Array.isArray(o))try{for(var s=Xa(o),a=s.next();!a.done;a=s.next()){a.value.remove(this)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=s.return)&&t.call(s)}finally{if(e)throw e.error}}else o.remove(this);var l=this.initialTeardown;if(ol(l))try{l()}catch(e){i=e instanceof al?e.errors:[e]}var c=this._finalizers;if(c){this._finalizers=null;try{for(var u=Xa(c),d=u.next();!d.done;d=u.next()){var f=d.value;try{fl(f)}catch(e){i=null!=i?i:[],e instanceof al?i=tl(tl([],el(i)),el(e.errors)):i.push(e)}}}catch(e){n={error:e}}finally{try{d&&!d.done&&(r=u.return)&&r.call(u)}finally{if(n)throw n.error}}}if(i)throw new al(i)}},e.prototype.add=function(t){var n;if(t&&t!==this)if(this.closed)fl(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=null!==(n=this._finalizers)&&void 0!==n?n:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&ll(t,e)},e.prototype.remove=function(t){var n=this._finalizers;n&&ll(n,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}(),ul=cl.EMPTY;function dl(e){return e instanceof cl||e&&"closed"in e&&ol(e.remove)&&ol(e.add)&&ol(e.unsubscribe)}function fl(e){ol(e)?e():e.unsubscribe()}var hl={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},pl={setTimeout:function(e,t){for(var n=[],r=2;r0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,n=this,r=n.hasError,i=n.isStopped,o=n.observers;return r||i?ul:(this.currentObservers=null,o.push(e),new cl(function(){t.currentObservers=null,ll(o,e)}))},t.prototype._checkFinalizedStatuses=function(e){var t=this,n=t.hasError,r=t.thrownError,i=t.isStopped;n?e.error(r):i&&e.complete()},t.prototype.asObservable=function(){var e=new Bl;return e.source=this,e},t.create=function(e,t){return new Pl(e,t)},t}(Bl),Pl=function(e){function t(t,n){var r=e.call(this)||this;return r.destination=t,r.source=n,r}return Ya(t,e),t.prototype.next=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===n||n.call(t,e)},t.prototype.error=function(e){var t,n;null===(n=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===n||n.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,n;return null!==(n=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==n?n:ul},t}(Rl),Tl={now:function(){return(Tl.delegate||Date).now()},delegate:void 0},Ul=function(e){function t(t,n,r){void 0===t&&(t=1/0),void 0===n&&(n=1/0),void 0===r&&(r=Tl);var i=e.call(this)||this;return i._bufferSize=t,i._windowTime=n,i._timestampProvider=r,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,t),i._windowTime=Math.max(1,n),i}return Ya(t,e),t.prototype.next=function(t){var n=this,r=n.isStopped,i=n._buffer,o=n._infiniteTimeWindow,s=n._timestampProvider,a=n._windowTime;r||(i.push(t),!o&&i.push(s.now()+a)),this._trimBuffer(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){this._throwIfClosed(),this._trimBuffer();for(var t=this._innerSubscribe(e),n=this._infiniteTimeWindow,r=this._buffer.slice(),i=0;i=2,!0))}function Nc(e,t){for(var n=[],r=2;rt.reduce((e,t)=>{const n=[];for(const r of e)try{const e=t(r);if(void 0===e)continue;n.push(e)}catch(e){}return n},e);var Vc=Symbol("verified");function zc(e){if(!(e instanceof Object))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;tt.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at);return r||e.splice(n,0,t),e}function nu(e,t){let n=0,r=e.length-1;for(;n<=r;){const i=Math.floor((n+r)/2),o=t(e[i]);if(0===o)return[i,!0];o<0?r=i-1:n=i+1}return[n,!1]}Wc.finalizeEvent,Wc.verifyEvent,new TextDecoder("utf-8"),new TextEncoder;const ru=Symbol.for("event-store"),iu=Symbol.for("event-uid"),ou=Symbol.for("replaceable-address"),su=Symbol.for("from-cache"),au=Symbol.for("replaceable-identifier");function lu(e){return Va(e)||za(e)}function cu(e){let t=Reflect.get(e,iu);return t||(t=za(e.kind)||Va(e.kind)?uu(e):e.id,Reflect.set(e,iu,t)),t}function uu(e){if(!za(e.kind)&&!Va(e.kind))throw new Error("Event is not replaceable or addressable");return eu(e,ou,()=>du(e.kind,e.pubkey,fu(e)))}function du(e,t,n){return e+":"+t+":"+(n??"")}function fu(e){return eu(e,au,()=>e.tags.find(e=>"d"===e[0])?.[1]??"")}function hu(){return Math.round(Date.now()/1e3)}const pu=Symbol("expiration-timestamp");function gu(e){return eu(e,pu,()=>{const t=e.tags.find(e=>"expiration"===e[0])?.[1];return t?parseInt(t):void 0})}var mu=new TextDecoder("utf-8");new TextEncoder;function yu(e){let{prefix:t,words:n}=ar.decode(e,5e3),r=new Uint8Array(ar.fromWords(n));switch(t){case"nprofile":{let e=wu(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:Zt(e[0][0]),relays:e[1]?e[1].map(e=>mu.decode(e)):[]}}}case"nevent":{let e=wu(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:Zt(e[0][0]),relays:e[1]?e[1].map(e=>mu.decode(e)):[],author:e[2]?.[0]?Zt(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(Zt(e[3][0]),16):void 0}}}case"naddr":{let e=wu(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:mu.decode(e[0][0]),pubkey:Zt(e[2][0]),kind:parseInt(Zt(e[3][0]),16),relays:e[1]?e[1].map(e=>mu.decode(e)):[]}}}case"nsec":return{type:t,data:r};case"npub":case"note":return{type:t,data:Zt(r)};default:throw new Error(`unknown prefix ${t}`)}}function wu(e){let t={},n=e;for(;n.length>0;){let e=n[0],r=n[1],i=n.slice(2,2+r);if(n=n.slice(2+r),i.length=8&&Cu.test(e)}function xu(e){return!!e?.toLowerCase()?.match(/^[0-9a-f]{64}$/)} +/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Bu=(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)(),Su=48,Qu=57,Fu=65,Du=70,$u=97,Ru=102;function Pu(e){return e>=Su&&e<=Qu?e-Su:e>=Fu&&e<=Du?e-(Fu-10):e>=$u&&e<=Ru?e-($u-10):void 0}function Tu(e,t=!1,n=!0){const r=e.split(":"),i=r[0]?parseInt(r[0]):void 0,o=r[1],s=r[2];if(void 0===i){if(n)return null;throw new Error("Missing kind")}if(void 0===o||""===o){if(n)return null;throw new Error("Missing pubkey")}if(t&&void 0===s){if(n)return null;throw new Error("Missing identifier")}return{kind:i,pubkey:o,identifier:s}}function Uu(e){if(!e[1])throw new Error("Missing coordinate in tag");const t=Tu(e[1],!0,!1);return e[2]&&Eu(e[2])&&(t.relays=[e[2]]),t}function Nu(e){if(!e[1])throw new Error("Missing pubkey in tag");if(!xu(e[1]))throw new Error("Invalid pubkey");const t={pubkey:e[1]};return e[2]&&Eu(e[2])&&(t.relays=[bu(e[2])]),t}function Lu(e){return e.kind+":"+e.pubkey+":"+e.identifier}function Mu(e){if(e instanceof Uint8Array)return e;if(xu(e))return function(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);if(Bu)return Uint8Array.fromHex(e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;tArray.isArray(e)).map(e=>e.map(e=>String(e)));return Reflect.set(e,qu,r),r}const ed="abcdefghijklmnopqrstuvwxyz",td=new Set((ed+ed.toUpperCase()).split("")),nd=Symbol.for("indexable-tags");function rd(e){let t=Reflect.get(e,nd);if(!t){const n=new Set;for(const t of e.tags)t.length>=2&&1===t[0].length&&td.has(t[0])&&n.add(t[0]+":"+t[1]);t=n,Reflect.set(e,nd,n)}return t}class id{first=null;items=Object.create(null);last=null;max;resetTtl;size;ttl;constructor(e=0,t=0,n=!1){this.first=null,this.items=Object.create(null),this.last=null,this.max=e,this.resetTtl=n,this.size=0,this.ttl=t}clear(){return this.first=null,this.items=Object.create(null),this.last=null,this.size=0,this}delete(e){if(this.has(e)){const t=this.items[e];delete this.items[e],this.size--,null!==t.prev&&(t.prev.next=t.next),null!==t.next&&(t.next.prev=t.prev),this.first===t&&(this.first=t.next),this.last===t&&(this.last=t.prev)}return this}entries(e=this.keys()){return e.map(e=>[e,this.get(e)])}evict(e=!1){if(e||this.size>0){const e=this.first;delete this.items[e.key],0===--this.size?(this.first=null,this.last=null):(this.first=e.next,this.first.prev=null)}return this}expiresAt(e){let t;return this.has(e)&&(t=this.items[e].expiry),t}get(e){let t;if(this.has(e)){const n=this.items[e];this.ttl>0&&n.expiry<=Date.now()?this.delete(e):(t=n.value,this.set(e,t,!0))}return t}has(e){return e in this.items}keys(){const e=[];let t=this.first;for(;null!==t;)e.push(t.key),t=t.next;return e}set(e,t,n=!1,r=this.resetTtl){let i;if(n||this.has(e)){if(i=this.items[e],i.value=t,!1===n&&r&&(i.expiry=this.ttl>0?Date.now()+this.ttl:this.ttl),this.last!==i){const e=this.last,t=i.next,n=i.prev;this.first===i&&(this.first=i.next),i.next=null,i.prev=this.last,e.next=i,null!==n&&(n.next=t),null!==t&&(t.prev=n)}}else this.max>0&&this.size===this.max&&this.evict(!0),i=this.items[e]={expiry:this.ttl>0?Date.now()+this.ttl:this.ttl,key:e,prev:this.last,next:null,value:t},1===++this.size?this.first=i:this.last.next=i;return this.last=i,this}values(e=this.keys()){return e.map(e=>this.get(e))}}function od(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var sd,ad,ld={exports:{}};function cd(){if(ad)return sd;ad=1;var e=1e3,t=60*e,n=60*t,r=24*n,i=7*r,o=365.25*r;function s(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}return sd=function(a,l){l=l||{};var c=typeof a;if("string"===c&&a.length>0)return function(s){if((s=String(s)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(s);if(!a)return;var l=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return l*o;case"weeks":case"week":case"w":return l*i;case"days":case"day":case"d":return l*r;case"hours":case"hour":case"hrs":case"hr":case"h":return l*n;case"minutes":case"minute":case"mins":case"min":case"m":return l*t;case"seconds":case"second":case"secs":case"sec":case"s":return l*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return l;default:return}}(a);if("number"===c&&isFinite(a))return l.long?function(i){var o=Math.abs(i);if(o>=r)return s(i,o,r,"day");if(o>=n)return s(i,o,n,"hour");if(o>=t)return s(i,o,t,"minute");if(o>=e)return s(i,o,e,"second");return i+" ms"}(a):function(i){var o=Math.abs(i);if(o>=r)return Math.round(i/r)+"d";if(o>=n)return Math.round(i/n)+"h";if(o>=t)return Math.round(i/t)+"m";if(o>=e)return Math.round(i/e)+"s";return i+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}var ud=function(e){function t(e){let r,i,o,s=null;function a(...e){if(!a.enabled)return;const n=a,i=Number(new Date),o=i-(r||i);n.diff=o,n.prev=r,n.curr=i,r=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let s=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(r,i)=>{if("%%"===r)return"%";s++;const o=t.formatters[i];if("function"==typeof o){const t=e[s];r=o.call(n,t),e.splice(s,1),s--}return r}),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==s?s:(i!==t.namespaces&&(i=t.namespaces,o=t.enabled(e)),o),set:e=>{s=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e,t){let n=0,r=0,i=-1,o=0;for(;n"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const n=("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const e of n)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const n of t.skips)if(r(e,n))return!1;for(const n of t.names)if(r(e,n))return!0;return!1},t.humanize=cd(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach(n=>{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t{"%%"!==e&&(r++,"%c"===e&&(i=r))}),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")||t.storage.getItem("DEBUG")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=ud(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(ld,ld.exports);const dd=od(ld.exports)("applesauce");class fd{log=dd.extend("EventMemory");kinds=new Map;authors=new Map;tags=new id;created_at=[];kindAuthor=new Map;events=new id;replaceable=new Map;get size(){return this.events.size}hasEvent(e){return this.events.has(e)}getEvent(e){return this.events.get(e)}hasReplaceable(e,t,n){const r=this.replaceable.get(du(e,t,n));return!!r&&r.length>0}getReplaceable(e,t,n){const r=du(e,t,n),i=this.replaceable.get(r);return i?.[0]}getReplaceableHistory(e,t,n){const r=du(e,t,n);return this.replaceable.get(r)}getByFilters(e){return Array.from(this.getEventsForFilters(Array.isArray(e)?e:[e]))}getTimeline(e){const t=[],n=this.getByFilters(e);for(const e of n)tu(t,e);return t}add(e){const t=e.id,n=this.events.get(t);if(n)return n;this.events.set(t,e),this.getKindIndex(e.kind).add(e),this.getAuthorsIndex(e.pubkey).add(e),this.getKindAuthorIndex(e.kind,e.pubkey).add(e);for(const t of rd(e))this.tags.has(t)&&this.getTagIndex(t).add(e);if(tu(this.created_at,e),lu(e.kind)){const t=e.tags.find(e=>"d"===e[0])?.[1],n=du(e.kind,e.pubkey,t);let r=this.replaceable.get(n);this.replaceable.has(n)||(r=[],this.replaceable.set(n,r)),tu(r,e)}return e}remove(e){let t="string"==typeof e?this.events.get(e):e;if(!t)return!1;const n=t.id;if(!this.events.has(n))return!1;this.getAuthorsIndex(t.pubkey).delete(t),this.getKindIndex(t.kind).delete(t);const r=`${t.kind}:${t.pubkey}`;this.kindAuthor.has(r)&&this.kindAuthor.get(r).delete(t);for(const e of rd(t))this.tags.has(e)&&this.getTagIndex(e).delete(t);if(this.removeFromSortedArray(this.created_at,t),this.events.delete(n),lu(t.kind)){const e=t.tags.find(e=>"d"===e[0])?.[1],n=du(t.kind,t.pubkey,e),r=this.replaceable.get(n);r&&this.removeFromSortedArray(r,t)}return this.claims.delete(t),!0}removeByFilters(e){const t=this.getByFilters(e);let n=0;for(const e of t)this.remove(e)&&n++;return n}update(e){}claims=new WeakMap;touch(e){this.events.has(e.id)&&this.events.set(e.id,e)}claim(e){const t=this.claims.get(e)||0;this.claims.set(e,t+1),this.touch(e)}isClaimed(e){const t=this.claims.get(e);return void 0!==t&&t>0}removeClaim(e){const t=this.claims.get(e);if(void 0!==t&&t>0){const n=t-1;0===n?this.claims.delete(e):this.claims.set(e,n)}}clearClaim(e){this.claims.delete(e)}*unclaimed(){let e=this.events.first;for(;e;){const t=e.value;this.isClaimed(t)||(yield t),e=e.next}return 0}prune(e){let t=0;const n=this.unclaimed();for(const r of n)if(this.remove(r),t++,e&&t>=e)break;return t}getKindIndex(e){return this.kinds.has(e)||this.kinds.set(e,new Set),this.kinds.get(e)}getAuthorsIndex(e){return this.authors.has(e)||this.authors.set(e,new Set),this.authors.get(e)}getKindAuthorIndex(e,t){const n=`${e}:${t}`;return this.kindAuthor.has(n)||this.kindAuthor.set(n,new Set),this.kindAuthor.get(n)}getTagIndex(e){if(!this.tags.has(e)){const t=new Set,n=Date.now();for(const n of this.events.values())rd(n).has(e)&&t.add(n);const r=Date.now()-n;r>100&&this.log(`Built index ${e} took ${r}ms`),this.tags.set(e,t)}return this.tags.get(e)}removeFromSortedArray(e,t){if(0===e.length)return;const n=nu(e,e=>e.created_at-t.created_at);if(n){let r=n[0],i=!1;if(e[r]===t)return void e.splice(r,1);for(let n=r-1;n>=0&&e[n].created_at===t.created_at;n--)if(e[n]===t){e.splice(n,1),i=!0;break}if(i)return;for(let n=r+1;ne.created_at-t):void 0;i&&(n=i[0]);const o=e?nu(this.created_at,t=>t.created_at-e):void 0;o&&(r=o[0]);for(let i=n;i<=r;i++){const n=this.created_at[i];if(!(void 0!==t&&n.created_at>t)){if(void 0!==e&&n.created_at{const r=e instanceof Set?e:new Set(e);if(t)n=r,t=!1;else for(const e of n)r.has(e)||n.delete(e);return n};e.ids&&r(this.iterateIds(e.ids));let i=null;void 0!==e.since&&(i=Array.from(this.iterateTime(e.since,e.until)),r(i));for(const t of td){const n=e[`&${t}`];if(n?.length)for(const e of n)r(this.iterateTag(t,[e]))}for(const t of td){const n=e[`#${t}`];if(n?.length){const i=e[`&${t}`],o=i?n.filter(e=>!i.includes(e)):n;o.length>0&&r(this.iterateTag(t,o))}}if(e.authors&&e.kinds&&e.authors.length*e.kinds.length<=20){const t=new Set;for(const n of e.kinds)for(const r of e.authors){const e=`${n}:${r}`,i=this.kindAuthor.get(e);if(i)for(const e of i)t.add(e)}r(t)}else e.authors&&r(this.iterateAuthors(e.authors)),e.kinds&&r(this.iterateKinds(e.kinds));if(void 0===e.since&&void 0!==e.until&&(i=Array.from(this.iterateTime(e.since,e.until)),r(i)),t)return new Set(this.events.values());if(e.limit&&i){const t=new Set;for(const r of i){if(t.size>=e.limit)break;n.has(r)&&t.add(r)}return t}return n}getEventsForFilters(e){if(0===e.length)return new Set;let t=new Set;for(const n of e){const e=this.getEventsForFilter(n);for(const n of e)t.add(n)}return t}reset(){this.events.clear(),this.kinds.clear(),this.authors.clear(),this.kindAuthor.clear(),this.tags.clear(),this.created_at=[],this.replaceable.clear(),this.claims=new WeakMap}}function hd(e,t){var n,r;if(0===t.length)return e;for(n=0,r=t.length;ne.until)return!1;for(let n in e)if("&"===n[0]){let r=n.slice(1),i=e[n];if(i&&i.length>0){const e=rd(t);for(const t of i)if(!e.has(r+":"+t))return!1}}for(let n in e)if("#"===n[0]){let r=n.slice(1),i=e[n];if(i){const n=e[`&${r}`],o=n?i.filter(e=>!n.includes(e)):i;if(0===o.length)continue;const s=rd(t);if(!1===o.some(e=>s.has(r+":"+e)))return!1}}return!0}function wd(e,t){for(let n=0;nt.replaceable({kind:10063,pubkey:e.pubkey,relays:e.relays}).pipe(fc(e=>e?function(e){const t=Array.isArray(e)?e:e.tags;return Kc(t,e=>_c(e,"server")&&URL.canParse(e[1])?new URL("/",e[1]):void 0)}(e):[]))}const Ad=Symbol.for("profile-content");function bd(e){return eu(e,Ad,()=>{const t=function(e){try{return JSON.parse(e)}catch(e){return}}(e.content);if(t)return t.nip05&&"string"!=typeof t.nip05&&(t.nip05=String(t.nip05)),t.website&&t.website?.length>0&&!1===t.website?.startsWith("http")&&(t.website="https://"+t.website),t})}function kd(e){return!!e&&((e.kind===hi.Metadata||e.kind===hi.Handlerinformation)&&!!bd(e))}!function(e){function t(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function n(...e){const t=(e,t)=>n=>e(t(n)),n=Array.from(e).reverse().reduce((e,n)=>e?t(e,n.encode):n.encode,void 0),r=e.reduce((e,n)=>e?t(e,n.decode):n.decode,void 0);return{encode:n,decode:r}}function r(e){return{encode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("alphabet.encode input should be an array of numbers");return n.map(n=>{if(t(n),n<0||n>=e.length)throw new Error(`Digit index outside alphabet: ${n} (alphabet: ${e.length})`);return e[n]})},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map(t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n})}}}function i(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function o(e,n="="){if(t(e),"string"!=typeof n)throw new Error("padding chr should be string");return{encode(t){if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("padding.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;t.length*e%8;)t.push(n);return t},decode(t){if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("padding.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let r=t.length;if(r*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;r>0&&t[r-1]===n;r--)if(!((r-1)*e%8))throw new Error("Invalid padding: string has too much padding");return t.slice(0,r)}}}function s(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function a(e,n,r){if(n<2)throw new Error(`convertRadix: wrong from=${n}, base cannot be less than 2`);if(r<2)throw new Error(`convertRadix: wrong to=${r}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let i=0;const o=[],s=Array.from(e);for(s.forEach(e=>{if(t(e),e<0||e>=n)throw new Error(`Wrong integer: ${e}`)});;){let e=0,t=!0;for(let o=i;ot?l(t,e%t):e,c=(e,t)=>e+(t-l(e,t));function u(e,n,r,i){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(n<=0||n>32)throw new Error(`convertRadix2: wrong from=${n}`);if(r<=0||r>32)throw new Error(`convertRadix2: wrong to=${r}`);if(c(n,r)>32)throw new Error(`convertRadix2: carry overflow from=${n} to=${r} carryBits=${c(n,r)}`);let o=0,s=0;const a=2**r-1,l=[];for(const i of e){if(t(i),i>=2**n)throw new Error(`convertRadix2: invalid data word=${i} from=${n}`);if(o=o<32)throw new Error(`convertRadix2: carry overflow pos=${s} from=${n}`);for(s+=n;s>=r;s-=r)l.push((o>>s-r&a)>>>0);o&=2**s-1}if(o=o<=n)throw new Error("Excess padding");if(!i&&o)throw new Error(`Non-zero padding: ${o}`);return i&&s>0&&l.push(o>>>0),l}function d(e){return t(e),{encode:t=>{if(!(t instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return a(Array.from(t),256,e)},decode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(a(t,e,256))}}}function f(e,n=!1){if(t(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(c(8,e)>32||c(e,8)>32)throw new Error("radix2: carry overflow");return{encode:t=>{if(!(t instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return u(Array.from(t),8,e,!n)},decode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(u(t,e,8,n))}}}function p(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}function h(e,n){if(t(e),"function"!=typeof n)throw new Error("checksum fn should be function");return{encode(t){if(!(t instanceof Uint8Array))throw new Error("checksum.encode: input should be Uint8Array");const r=n(t).slice(0,e),i=new Uint8Array(t.length+e);return i.set(t),i.set(r,t.length),i},decode(t){if(!(t instanceof Uint8Array))throw new Error("checksum.decode: input should be Uint8Array");const r=t.slice(0,-e),i=n(r).slice(0,e),o=t.slice(-e);for(let t=0;te.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1"))),e.base64=n(f(6),r("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),o(6),i("")),e.base64url=n(f(6),r("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),o(6),i(""));const g=e=>n(d(58),r(e),i(""));e.base58=g("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),e.base58flickr=g("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),e.base58xrp=g("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz");const m=[0,2,3,5,6,7,9,10,11];e.base58xmr={encode(t){let n="";for(let r=0;rn(h(4,e=>t(t(e))),e.base58);const y=n(r("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),i("")),w=[996825010,642813549,513874426,1027748829,705979059];function v(e){const t=e>>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=w[e]);return n}function A(e,t,n=1){const r=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=v(i)^n>>5}i=v(i);for(let t=0;tn)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const r=e.toLowerCase();if(e!==r&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const i=(e=r).lastIndexOf("1");if(0===i||-1===i)throw new Error('Letter "1" must be present between prefix and data only');const o=e.slice(0,i),s=e.slice(i+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const a=y.decode(s).slice(0,-6),l=A(o,a,t);if(!s.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:o,words:a}}return{encode:function(e,n,r=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const i=e.length+7+n.length;if(!1!==r&&i>r)throw new TypeError(`Length ${i} exceeds limit ${r}`);return`${e=e.toLowerCase()}1${y.encode(n)}${A(e,n,t)}`},decode:s,decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:r(n)}},decodeUnsafe:p(s),fromWords:r,fromWordsUnsafe:o,toWords:i}}e.bech32=b("bech32"),e.bech32m=b("bech32m"),e.utf8={encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},e.hex=n(f(4),r("0123456789abcdef"),i(""),s(e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()}));const I={utf8:e.utf8,hex:e.hex,base16:e.base16,base32:e.base32,base64:e.base64,base64url:e.base64url,base58:e.base58,base58xmr:e.base58xmr},k=`Invalid encoding type. Available types: ${Object.keys(I).join(", ")}`;e.bytesToString=(e,t)=>{if("string"!=typeof e||!I.hasOwnProperty(e))throw new TypeError(k);if(!(t instanceof Uint8Array))throw new TypeError("bytesToString() expects Uint8Array");return I[e].encode(t)},e.str=e.bytesToString;e.stringToBytes=(e,t)=>{if(!I.hasOwnProperty(e))throw new TypeError(k);if("string"!=typeof t)throw new TypeError("stringToBytes() expects string");return I[e].decode(t)},e.bytes=e.stringToBytes}({}),BigInt(1e3),BigInt(1e6),BigInt(1e9),BigInt(1e12),BigInt("2100000000000000000"),BigInt(1e11);const Bd={payment_hash:1,payment_secret:16,description:13,payee:19,description_hash:23,expiry:6,min_final_cltv_expiry:24,fallback_address:9,route_hint:3,feature_bits:5,metadata:27};for(let e=0,t=Object.keys(Bd);eKc(e.tags,e=>jc(e)?e:void 0,ju))}(e),function(e){if(function(e){return nd(e)&&Reflect.has(e,Qd)}(e))return e[Qd];const t=rd(e);if(!t)return;const n=Kc(t,e=>jc(e)?e:void 0,ju);return Reflect.set(e,Qd,n),n}(e))}function Dd(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}function $d(e,t){return!!Array.isArray(t)&&(0===t.length||(e?t.every(e=>"string"==typeof e):t.every(e=>Number.isSafeInteger(e))))}function Ud(e,t){if("string"!=typeof t)throw new Error(`${e}: string expected`);return!0}function Rd(e){if(!Number.isSafeInteger(e))throw new Error(`invalid integer: ${e}`)}function Td(e){if(!Array.isArray(e))throw new Error("array expected")}function Pd(e,t){if(!$d(!0,t))throw new Error(`${e}: array of strings expected`)}gd.extend("EncryptedContentCache"),gd.extend("event-cache");const Nd=(e,t)=>0===t?e:Nd(t,e%t),Od=(e,t)=>e+(t-Nd(e,t)),Ld=(()=>{let e=[];for(let t=0;t<40;t++)e.push(2**t);return e})();function Md(e,t,n,r){if(Td(e),t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(Od(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${Od(t,n)}`);let i=0,o=0;const s=Ld[t],a=Ld[n]-1,l=[];for(const r of e){if(Rd(r),r>=s)throw new Error(`convertRadix2: invalid data word=${r} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${o} from=${t}`);for(o+=t;o>=n;o-=n)l.push((i>>o-n&a)>>>0);const e=Ld[o];if(void 0===e)throw new Error("invalid carry");i&=e-1}if(i=i<=t)throw new Error("Excess padding");if(!r&&i>0)throw new Error(`Non-zero padding: ${i}`);return r&&o>0&&l.push(i>>>0),l}const _d=(()=>"function"==typeof Uint8Array.from([]).toBase64&&"function"==typeof Uint8Array.fromBase64)()?{encode:e=>(function(e,...t){if(!Dd(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error("Uint8Array expected of length "+t+", got length="+e.length)}(e),e.toBase64()),decode:e=>((e,t)=>{Ud("base64",e);const n=t?/^[A-Za-z0-9=_-]+$/:/^[A-Za-z0-9=+/]+$/,r=t?"base64url":"base64";if(e.length>0&&!n.test(e))throw new Error("invalid base64");return Uint8Array.fromBase64(e,{alphabet:r,lastChunkHandling:"strict"})})(e,!1)}:function(...e){const t=e=>e,n=(e,t)=>n=>e(t(n));return{encode:e.map(e=>e.encode).reduceRight(n,t),decode:e.map(e=>e.decode).reduce(n,t)}}(function(e,t=!1){if(Rd(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(Od(8,e)>32||Od(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!Dd(n))throw new Error("radix2.encode input should be Uint8Array");return Md(Array.from(n),8,e,!t)},decode:n=>(function(e,t){if(!$d(!1,t))throw new Error(`${e}: array of numbers expected`)}("radix2.decode",n),Uint8Array.from(Md(n,e,8,t)))}}(6),function(e){const t="string"==typeof e?e.split(""):e,n=t.length;Pd("alphabet",t);const r=new Map(t.map((e,t)=>[e,t]));return{encode:r=>(Td(r),r.map(r=>{if(!Number.isSafeInteger(r)||r<0||r>=n)throw new Error(`alphabet.encode: digit index outside alphabet "${r}". Allowed: ${e}`);return t[r]})),decode:t=>(Td(t),t.map(t=>{Ud("alphabet.decode",t);const n=r.get(t);if(void 0===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),function(e,t="="){return Rd(e),Ud("padding",t),{encode(n){for(Pd("padding.encode",n);n.length*e%8;)n.push(t);return n},decode(n){Pd("padding.decode",n);let r=n.length;if(r*e%8)throw new Error("padding: invalid, string should have whole number of bytes");for(;r>0&&n[r-1]===t;r--){if((r-1)*e%8==0)throw new Error("padding: invalid, string has too much padding")}return n.slice(0,r)}}}(6),function(e=""){return Ud("join",e),{encode:t=>(Pd("join.decode",t),t.join(e)),decode:t=>(Ud("join.decode",t),t.split(e))}}(""));new TextDecoder;const jd=Symbol.for("mailboxes-inboxes"),Hd=Symbol.for("mailboxes-outboxes");function Gd(e){return eu(e,jd,()=>{const t=[];for(const n of e.tags)if(Hc(n))try{const[,e,r]=n;!e||!Eu(e)||t.includes(e)||"read"!==r&&void 0!==r||t.push(bu(e))}catch{}return t})}function Jd(e){return eu(e,Hd,()=>{const t=[];for(const n of e.tags)if(Hc(n))try{const[e,r,i]=n;"r"!==e||!Eu(r)||t.includes(r)||"write"!==i&&void 0!==i||t.push(bu(r))}catch{}return t})}const Kd=Symbol.for("mute-public"),Vd=Symbol.for("mute-hidden");function qd(e){return{pubkeys:new Set(e.filter(jc).map(e=>e[1])),threads:new Set(e.filter(_c).map(e=>e[1])),hashtags:new Set(e.filter(Jc).map(e=>e[1].toLocaleLowerCase())),words:new Set(e.filter(e=>"word"===e[0]&&e[1]).map(e=>e[1].toLocaleLowerCase()))}}function Yd(e){const t=function(e){if(function(e){return nd(e)&&Reflect.has(e,Vd)}(e))return e[Vd];const t=rd(e);if(!t)return;const n=qd(t);return Reflect.set(e,Vd,n),n}(e),n=function(e){return eu(e,Kd,()=>qd(e.tags))}(e);return t?function(...e){const t={pubkeys:new Set,threads:new Set,hashtags:new Set,words:new Set};for(const n of e){for(const e of n.pubkeys)t.pubkeys.add(e);for(const e of n.threads)t.threads.add(e);for(const e of n.hashtags)t.hashtags.add(e);for(const e of n.words)t.words.add(e)}return t}(t,n):n}var Wd;!function(e){e.nudity="nudity",e.malware="malware",e.profanity="profanity",e.illegal="illegal",e.spam="spam",e.impersonation="impersonation",e.other="other"}(Wd||(Wd={}));const zd=Symbol.for("nip10-thread-refs");function Zd(e){if(!e[1])throw new Error("Missing event id in tag");let t={id:e[1]};return e[2]&&Eu(e[2])&&(t.relays=[e[2]]),"e"!==e[0]||"root"!==e[3]&&"reply"!==e[3]&&"mention"!==e[3]||!e[4]||64!==e[4].length||(t.author=e[4]),t}function Xd(e){return t=>{const n=new Set;return t.pipe(Lc(t=>{if(void 0!==t)if(Array.isArray(t))for(const r of t)n.has(r)||(n.add(r),e.claim(r));else n.has(t)||(n.add(t),e.claim(t))}),Uc(()=>{for(const t of n)e.removeClaim(t)}))}}function ef(e){return t=>{let n;return t.pipe(Lc(t=>{n!==t&&(n&&e.removeClaim(n),t&&e.claim(t),n=t)}),Uc(()=>{n&&e.removeClaim(n)}))}}function tf(){return e=>e.pipe(Sc(e=>null!=e))}function nf(e){return t=>new Bl(n=>{let r=!1;const i=t.subscribe({next:e=>{r=!0,n.next(e)},error:e=>n.error(e),complete:()=>n.complete()});return r||n.next(e),i})}function rf(e){return"string"==typeof e&&(e={id:e}),t=>Bc(Ec(()=>function(e,t){const n=e.getEvent(t.id);return n instanceof Promise?uc(n):dc(n)}(t,e)).pipe(function(e,t){return Oc(n=>n?dc(n):e.eventLoader?uc(e.eventLoader(t)):Hl)}(t,e),tf()),t.insert$.pipe(Sc(t=>t.id===e.id)),t.remove$.pipe(Sc(t=>t.id===e.id),Qc(1),Ql(function(e,t){e.subscribe(Fl(t,ml))}),$c(void 0))).pipe(ef(t),Fc((e,t)=>e?.id===t?.id),nf(void 0))}function of(e){return t=>{let n;return Bc(Ec(()=>function(e,t){const n=e.getReplaceable(t.kind,t.pubkey,t.identifier);return n instanceof Promise?uc(n):dc(n)}(t,e)).pipe(function(e,t){return Oc(n=>n?dc(n):void 0!==t.identifier?e.addressableLoader?uc(e.addressableLoader(t)).pipe(Sc(e=>!!e)):Hl:e.replaceableLoader?uc(e.replaceableLoader(t)).pipe(Sc(e=>!!e)):Hl)}(t,e),tf()),t.insert$.pipe(Sc(t=>t.pubkey==e.pubkey&&t.kind===e.kind&&(void 0===e.identifier||fu(t)===e.identifier)))).pipe(Fc((e,t)=>e.created_at>=t.created_at),Lc(e=>n=e),(r=t.remove$.pipe(Sc(e=>e.id===n?.id)),Ql(function(e,t){rc(r).subscribe(Fl(t,function(){return t.complete()},ml)),!t.closed&&e.subscribe(t)})),$c(void 0),function(e){var t,n,r=1/0;return null!=e&&("object"==typeof e?(t=e.count,r=void 0===t?1/0:t,n=e.delay):r=e),r<=0?function(){return Hl}:Ql(function(e,t){var i,o=0,s=function(){if(null==i||i.unsubscribe(),i=null,null!=n){var e="number"==typeof n?xc(n):rc(n(o)),r=Fl(t,function(){r.unsubscribe(),a()});e.subscribe(r)}else a()},a=function(){var n=!1;i=e.subscribe(Fl(t,void 0,function(){++o{const r=new Map;return Ec(()=>{const t=n.getTimeline(e);return t instanceof Promise?uc(t):dc(t)}).pipe(Xd(n),Tc(n.insert$.pipe(Sc(t=>Id(e,t)),Xd(n))),Tc(n.remove$.pipe(Sc(t=>Id(e,t)),fc(e=>e.id))),Pc((e,n)=>{if("string"==typeof n)return e.filter(e=>e.id!==n);if(Array.isArray(n)){if(!t)for(const e of n)lu(e.kind)&&r.set(cu(e),e);return n}let i=[...e];if(!t&&lu(n.kind)){const t=cu(n),o=r.get(t);if(o&&n.created_atr.clear()))}}function af(e){return t=>Ac(Object.fromEntries(e.map(e=>[e,t.model(rf,{id:e})])))}function lf(e){return t=>Ac(Object.fromEntries(e.map(e=>[du(e.kind,e.pubkey,e.identifier),t.model(of,e)])))}function cf(e){return t=>{let n;return Bc(t.pipe(Lc(e=>n=e)),e.update$.pipe(Sc(e=>e.id===n?.id)))}}function uf(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:pi.Contacts,pubkey:e.pubkey,relays:e.relays}).pipe(cf(t),fc(e=>e?Fd(e):[]))}function df(e){return t=>{const n=[{kinds:[1111],"#e":[e.id]}];return qa(e.kind)&&n.push({kinds:[1111],"#a":[uu(e)]}),t.timeline(n)}}function ff(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:pi.RelayList,pubkey:e.pubkey,relays:e.relays}).pipe(fc(e=>e&&{inboxes:Gd(e),outboxes:Jd(e)}))}function pf(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:pi.Mutelist,pubkey:e.pubkey,relays:e.relays}).pipe(cf(t),fc(e=>e&&Yd(e)))}function hf(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:pi.Metadata,pubkey:e.pubkey,relays:e.relays}).pipe(Sc(xd),fc(e=>e&&Ed(e)),nf(void 0))}function gf(e){return t=>t.timeline(lu(e.kind)?[{kinds:[pi.Reaction],"#e":[e.id]},{kinds:[pi.Reaction],"#a":[cu(e)]}]:[{kinds:[pi.Reaction],"#e":[e.id]}])}const mf={kinds:[pi.ShortTextNote]};function yf(e,t){const n=new Map,r=new Map,{kinds:i}={...mf,...t};let o="";const s={},a={kinds:i};var l;return"string"!=typeof(l=e)&&Reflect.has(l,"identifier")&&Reflect.has(l,"pubkey")&&Reflect.has(l,"kind")?(o=Hu(e),s.kinds=[e.kind],s.authors=[e.pubkey],s["#d"]=[e.identifier],a["#a"]=[o]):"string"==typeof e?(o=e,s.ids=[e],a["#e"]=[e]):(o=e.id,s.ids=[e.id],a["#e"]=[e.id]),e=>e.filters([s,a]).pipe(fc(e=>{if(!r.has(cu(e))){const t=function(e){return eu(e,zd,()=>{const t=function(e){const t=e.filter(e=>"e"===e[0]&&e[1]),n=e.filter(e=>"a"===e[0]&&e[1]);let r=t.find(e=>"root"===e[3]),i=t.find(e=>"reply"===e[3]),o=n.find(e=>"root"===e[3]),s=n.find(e=>"reply"===e[3]);if(r&&i||(r=i=r||i),o&&s||(o=s=o||s),!r&&!i){const e=t.filter(e=>!e[3]);e.length>=1&&(r=e[0],i=e[e.length-1]??r)}return{root:r||o?{e:r,a:o}:void 0,reply:i||s?{e:i,a:s}:void 0}}(e.tags);let n,r;if(t.root)try{n={e:t.root.e&&Zd(t.root.e),a:t.root.a&&_u(t.root.a)}}catch(e){}if(t.reply)try{r={e:t.reply.e&&Zd(t.reply.e),a:t.reply.a&&_u(t.reply.a)}}catch(e){}return{root:n,reply:r}})}(e),i=n.get(cu(e))||new Set,o={event:e,refs:t,replies:i};for(const e of i)e.parent=o;if(t.reply?.e||t.reply?.a){let e=t.reply.e?t.reply.e.id:Hu(t.reply.a);if(o.parent=r.get(e),o.parent)o.parent.replies.add(o);else{let t=n.get(e);t||(t=new Set,n.set(e,t)),t.add(o)}}r.set(cu(e),o)}return{root:r.get(o),all:r}}))}function wf(e){return class extends e{models=new Map;modelKeepWarm=6e4;model(e,...t){let n=this.models.get(e);n||(n=new Map,this.models.set(e,n));const r=e.getKey?e.getKey(...t):Ad(t);let i=n.get(r);if(!i){const o=()=>{n.get(r)===i&&n.delete(r)};i=e(...t)(this).pipe(Uc(o),function(e){void 0===e&&(e={});var t=e.connector,n=void 0===t?function(){return new Ul}:t,r=e.resetOnError,i=void 0===r||r,o=e.resetOnComplete,s=void 0===o||o,a=e.resetOnRefCountZero,l=void 0===a||a;return function(e){var t,r,o,a=0,c=!1,u=!1,d=function(){null==r||r.unsubscribe(),r=void 0},f=function(){d(),t=o=void 0,c=u=!1},p=function(){var e=t;f(),null==e||e.unsubscribe()};return Ql(function(e,h){a++,u||c||d();var g=o=null!=o?o:n();h.add(function(){0!==--a||u||c||(r=Nc(p,l))}),g.subscribe(h),!t&&a>0&&(t=new Il({next:function(e){return g.next(e)},error:function(e){u=!0,d(),r=Nc(f,i,e),g.error(e)},complete:function(){c=!0,d(),r=Nc(f,s),g.complete()}}),rc(e).subscribe(t))})(e)}}({connector:()=>new Pl(1),resetOnComplete:()=>xc(this.modelKeepWarm),resetOnRefCountZero:()=>xc(this.modelKeepWarm)})),n.set(r,i)}return i}filters(e,t=!1){e=Array.isArray(e)?e:[e];const n=this.getByFilters(e);return Bc(t?Hl:n&&"function"==typeof n.then?uc(n).pipe(Ic(e=>uc(Array.from(e)))):uc(Array.from(n)),this.insert$.pipe(Sc(t=>Id(e,t))))}event(e){return"string"==typeof e&&(e={id:e}),this.model(rf,e)}replaceable(...e){let t;if(1===e.length)t=e[0];else if(3===e.length||2===e.length){let[n,r,i]=e;t={kind:n,pubkey:r,identifier:i}}if(!t)throw new Error("Invalid arguments, expected address pointer or kind, pubkey, identifier");return this.model(of,t)}addressable(e){return this.model(of,e)}timeline(e,t=!1){return this.model(sf,e,t)}profile(e){return this.model(hf,e)}contacts(e){return"string"==typeof e&&(e={pubkey:e}),this.model(uf,e)}mutes(e){return"string"==typeof e&&(e={pubkey:e}),this.model(pf,e)}mailboxes(e){return"string"==typeof e&&(e={pubkey:e}),this.model(ff,e)}blossomServers(e){return"string"==typeof e&&(e={pubkey:e}),this.model(kd,e)}reactions(e){return this.model(gf,e)}thread(e){return this.model(yf,e)}comments(e){return this.model(df,e)}events(e){return this.model(af,e)}replaceableSet(e){return this.model(lf,e)}}}class vf extends(wf(class{})){database;memory;keepOldVersions=!1;keepExpired=!1;verifyEvent;insert$=new Ul;update$=new Ul;remove$=new Ul;eventLoader;replaceableLoader;addressableLoader;constructor(e=new md){super(),e?(this.database=e,this.memory=new md):this.database=this.memory=new md,this.insert$.subscribe(e=>{Reflect.set(e,ru,this)}),this.remove$.subscribe(e=>{Reflect.deleteProperty(e,ru)})}mapToMemory(e){if(void 0!==e)return this.memory?this.memory.add(e):e}deletedIds=new Set;deletedCoords=new Map;checkDeleted(e){if("string"==typeof e)return this.deletedIds.has(e);if(this.deletedIds.has(e.id))return!0;if(qa(e.kind)){const t=e.tags.find(e=>"d"===e[0])?.[1],n=this.deletedCoords.get(du(e.kind,e.pubkey,t));if(n)return n>e.created_at}return!1}expirations=new Map;addExpiration(e){const t=gu(e);t&&Number.isFinite(t)&&this.expirations.set(e.id,t)}expirationTimeout=null;nextExpirationCheck=null;handleExpiringEvent(e){const t=gu(e);if(!t)return;if(this.expirations.set(e.id,t),this.expirationTimeout&&this.nextExpirationCheck&&this.nextExpirationChecke[1])}(e);for(const e of t)this.deletedIds.add(e),this.remove(e);const n=function(e){return e.tags.filter(Gc).map(e=>e[1])}(e);for(const t of n){this.deletedCoords.set(t,Math.max(this.deletedCoords.get(t)??0,e.created_at));const n=Mu(t);if(!n)continue;const r=this.database.getReplaceableHistory(n.kind,n.pubkey,n.identifier)??[];for(const t of r)t.created_at"d"===e[0])?.[1]:void 0;if(!this.keepOldVersions&&lu(e.kind)){const t=this.database.getReplaceableHistory(e.kind,e.pubkey,r);if(t&&t.length>0&&t[0].created_at>=e.created_at)return vf.mergeDuplicateEvent(e,t[0]),t[0]}if(this.verifyEvent&&!1===this.verifyEvent(e))return null;const i=this.memory?.add(e);if(i&&i!==e)return vf.mergeDuplicateEvent(e,i),t&&ku(i,t),i;const o=this.mapToMemory(this.database.add(e));if(e!==o&&vf.mergeDuplicateEvent(e,o),t&&ku(o,t),o===e&&this.insert$.next(o),!this.keepOldVersions&&lu(e.kind)){const t=this.database.getReplaceableHistory(e.kind,e.pubkey,r);if(t&&t.length>0){const n=Array.from(t).filter(t=>t.created_atthis.mapToMemory(e)??e)}getByFilters(e){const t=this.database.getByFilters(e);return this.memory?t.map(e=>this.mapToMemory(e)):t}getTimeline(e){const t=this.database.getTimeline(e);return this.memory?t.map(e=>this.mapToMemory(e)):t}touch(e){return this.memory?.touch(e)}claim(e){return this.memory?.claim(e)}isClaimed(e){return this.memory?.isClaimed(e)??!1}removeClaim(e){return this.memory?.removeClaim(e)}clearClaim(e){return this.memory?.clearClaim(e)}unclaimed(){return this.memory?.unclaimed()||function*(){}()}prune(e){return this.memory?.prune(e)??0}removed(e){return this.checkDeleted(e)?Hl:this.remove$.pipe(Sc(t=>t.id===e),Qc(1),Ic(()=>Hl))}updated(e){return this.update$.pipe(Sc(t=>t.id===e||t===e))}}function Af(){let e,t;const n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n}"navigator"in globalThis&&navigator.userAgent.includes("Android")&&navigator.clipboard&&navigator.clipboard.readText;var bf,If;Yu(pi.NostrConnect,"nip44"),function(e){e.GetPublicKey="get_pubic_key",e.SignEvent="sign_event",e.Nip04Encrypt="nip04_encrypt",e.Nip04Decrypt="nip04_decrypt",e.Nip44Encrypt="nip44_encrypt",e.Nip44Decrypt="nip44_decrypt"}(bf||(bf={})),function(e){e.Connect="connect",e.CreateAccount="create_account",e.GetPublicKey="get_public_key",e.SignEvent="sign_event",e.Nip04Encrypt="nip04_encrypt",e.Nip04Decrypt="nip04_decrypt",e.Nip44Encrypt="nip44_encrypt",e.Nip44Decrypt="nip44_decrypt"}(If||(If={}));class kf{key;constructor(e){this.key=e||ci()}async getPublicKey(){return ui(this.key)}async signEvent(e){return di(e,this.key)}nip04={encrypt:async(e,t)=>ps.encrypt(this.key,e,t),decrypt:async(e,t)=>ps.decrypt(this.key,e,t)};nip44={encrypt:async(e,t)=>Fs.v2.encrypt(t,Fs.v2.utils.getConversationKey(this.key,e)),decrypt:async(e,t)=>Fs.v2.decrypt(t,Fs.v2.utils.getConversationKey(this.key,e))};static fromKey(e){return new kf(function(e){if(e instanceof Uint8Array)return e;if(xu(e))return Lu(e);{const t=zo.decode(e);if("nsec"!==t.type)throw new Error(`Cant get secret key from ${t.type}`);return t.data}}(e))}} -/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */const Cf=BigInt(0),Ef=BigInt(1),xf=BigInt(2),Bf=BigInt(3),Sf=BigInt(8),Qf=Object.freeze({a:Cf,b:BigInt(7),P:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:Ef,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee")}),Ff=(e,t)=>(e+t/xf)/t,Df={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar(e){const{n:t}=Qf,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Ef*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),i=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),o=n,s=BigInt("0x100000000000000000000000000000000"),a=Ff(o*e,t),l=Ff(-r*e,t);let c=np(e-a*n-l*i,t),u=np(-a*r-l*o,t);const d=c>s,f=u>s;if(d&&(c=t-c),f&&(u=t-u),c>s||u>s)throw new Error("splitScalarEndo: Endomorphism failed, k="+e);return{k1neg:d,k1:c,k2neg:f,k2:u}}},$f=32;function Uf(e){const{a:t,b:n}=Qf,r=np(e*e),i=np(r*e);return np(i+t*e+n)}const Rf=Qf.a===Cf;function Tf(e){if(!(e instanceof Pf))throw new TypeError("JacobianPoint expected")}class Pf{constructor(e,t,n){this.x=e,this.y=t,this.z=n}static fromAffine(e){if(!(e instanceof Lf))throw new TypeError("JacobianPoint#fromAffine: expected Point");return e.equals(Lf.ZERO)?Pf.ZERO:new Pf(e.x,e.y,Ef)}static toAffineBatch(e){const t=function(e,t=Qf.P){const n=new Array(e.length),r=e.reduce((e,r,i)=>r===Cf?e:(n[i]=e,np(e*r,t)),Ef),i=ip(r,t);return e.reduceRight((e,r,i)=>r===Cf?e:(n[i]=np(e*n[i],t),np(e*r,t)),i),n}(e.map(e=>e.z));return e.map((e,n)=>e.toAffine(t[n]))}static normalizeZ(e){return Pf.toAffineBatch(e).map(Pf.fromAffine)}equals(e){Tf(e);const{x:t,y:n,z:r}=this,{x:i,y:o,z:s}=e,a=np(r*r),l=np(s*s),c=np(t*l),u=np(i*a),d=np(np(n*s)*l),f=np(np(o*r)*a);return c===u&&d===f}negate(){return new Pf(this.x,np(-this.y),this.z)}double(){const{x:e,y:t,z:n}=this,r=np(e*e),i=np(t*t),o=np(i*i),s=e+i,a=np(xf*(np(s*s)-r-o)),l=np(Bf*r),c=np(l*l),u=np(c-xf*a),d=np(l*(a-u)-Sf*o),f=np(xf*t*n);return new Pf(u,d,f)}add(e){Tf(e);const{x:t,y:n,z:r}=this,{x:i,y:o,z:s}=e;if(i===Cf||o===Cf)return this;if(t===Cf||n===Cf)return e;const a=np(r*r),l=np(s*s),c=np(t*l),u=np(i*a),d=np(np(n*s)*l),f=np(np(o*r)*a),p=np(u-c),h=np(f-d);if(p===Cf)return h===Cf?this.double():Pf.ZERO;const g=np(p*p),m=np(p*g),y=np(c*g),w=np(h*h-m-xf*y),v=np(h*(y-w)-d*m),A=np(r*s*p);return new Pf(w,v,A)}subtract(e){return this.add(e.negate())}multiplyUnsafe(e){const t=Pf.ZERO;if("bigint"==typeof e&&e===Cf)return t;let n=tp(e);if(n===Ef)return this;if(!Rf){let e=t,r=this;for(;n>Cf;)n&Ef&&(e=e.add(r)),r=r.double(),n>>=Ef;return e}let{k1neg:r,k1:i,k2neg:o,k2:s}=Df.splitScalar(n),a=t,l=t,c=this;for(;i>Cf||s>Cf;)i&Ef&&(a=a.add(c)),s&Ef&&(l=l.add(c)),c=c.double(),i>>=Ef,s>>=Ef;return r&&(a=a.negate()),o&&(l=l.negate()),l=new Pf(np(l.x*Df.beta),l.y,l.z),a.add(l)}precomputeWindow(e){const t=Rf?128/e+1:256/e+1,n=[];let r=this,i=r;for(let o=0;o>=u,s>a&&(s-=c,e+=Ef);const d=n,f=n+Math.abs(s)-1,p=t%2!=0,h=s<0;0===s?o=o.add(Nf(p,r[d])):i=i.add(Nf(h,r[f]))}return{p:i,f:o}}multiply(e,t){let n,r,i=tp(e);if(Rf){const{k1neg:e,k1:o,k2neg:s,k2:a}=Df.splitScalar(i);let{p:l,f:c}=this.wNAF(o,t),{p:u,f:d}=this.wNAF(a,t);l=Nf(e,l),u=Nf(s,u),u=new Pf(np(u.x*Df.beta),u.y,u.z),n=l.add(u),r=c.add(d)}else{const{p:e,f:o}=this.wNAF(i,t);n=e,r=o}return Pf.normalizeZ([n,r])[0]}toAffine(e){const{x:t,y:n,z:r}=this,i=this.equals(Pf.ZERO);null==e&&(e=i?Sf:ip(r));const o=e,s=np(o*o),a=np(s*o),l=np(t*s),c=np(n*a),u=np(r*o);if(i)return Lf.ZERO;if(u!==Ef)throw new Error("invZ was invalid");return new Lf(l,c)}}function Nf(e,t){const n=t.negate();return e?n:t}Pf.BASE=new Pf(Qf.Gx,Qf.Gy,Ef),Pf.ZERO=new Pf(Cf,Ef,Cf);const Of=new WeakMap;class Lf{constructor(e,t){this.x=e,this.y=t}_setWindowSize(e){this._WINDOW_SIZE=e,Of.delete(this)}hasEvenY(){return this.y%xf===Cf}static fromCompressedHex(e){const t=32===e.length,n=Xf(t?e:e.subarray(1));if(!sp(n))throw new Error("Point is not on curve");let r=function(e){const{P:t}=Qf,n=BigInt(6),r=BigInt(11),i=BigInt(22),o=BigInt(23),s=BigInt(44),a=BigInt(88),l=e*e*e%t,c=l*l*e%t,u=rp(c,Bf)*c%t,d=rp(u,Bf)*c%t,f=rp(d,xf)*l%t,p=rp(f,r)*f%t,h=rp(p,i)*p%t,g=rp(h,s)*h%t,m=rp(g,a)*g%t,y=rp(m,s)*h%t,w=rp(y,Bf)*c%t,v=rp(w,o)*p%t,A=rp(v,n)*l%t,b=rp(A,xf);if(b*b%t!==e)throw new Error("Cannot find square root");return b}(Uf(n));const i=(r&Ef)===Ef;if(t)i&&(r=np(-r));else{!(1&~e[0])!==i&&(r=np(-r))}const o=new Lf(n,r);return o.assertValidity(),o}static fromUncompressedHex(e){const t=Xf(e.subarray(1,33)),n=Xf(e.subarray(33,65)),r=new Lf(t,n);return r.assertValidity(),r}static fromHex(e){const t=ep(e),n=t.length,r=t[0];if(n===$f)return this.fromCompressedHex(t);if(33===n&&(2===r||3===r))return this.fromCompressedHex(t);if(65===n&&4===r)return this.fromUncompressedHex(t);throw new Error(`Point.fromHex: received invalid point. Expected 32-33 compressed bytes or 65 uncompressed bytes, not ${n}`)}static fromPrivateKey(e){return Lf.BASE.multiply(function(e){let t;if("bigint"==typeof e)t=e;else if("number"==typeof e&&Number.isSafeInteger(e)&&e>0)t=BigInt(e);else if("string"==typeof e){if(64!==e.length)throw new Error("Expected 32 bytes of private key");t=Zf(e)}else{if(!Hf(e))throw new TypeError("Expected valid private key");if(32!==e.length)throw new Error("Expected 32 bytes of private key");t=Xf(e)}if(!op(t))throw new Error("Expected private key: 0 < key < n");return t}(e))}static fromSignature(e,t,n){const{r:r,s:i}=function(e){if(e instanceof jf)return e.assertValidity(),e;try{return jf.fromDER(e)}catch(t){return jf.fromCompact(e)}}(t);if(![0,1,2,3].includes(n))throw new Error("Cannot recover: invalid recovery bit");const o=function(e,t=!1){const n=function(e){const t=8*e.length-256,n=Xf(e);return t>0?n>>BigInt(t):n}(e);if(t)return n;const{n:r}=Qf;return n>=r?n-r:n}(ep(e)),{n:s}=Qf,a=2===n||3===n?r+s:r,l=ip(a,s),c=np(-o*l,s),u=np(i*l,s),d=1&n?"03":"02",f=Lf.fromHex(d+Wf(a)),p=Lf.BASE.multiplyAndAddUnsafe(f,c,u);if(!p)throw new Error("Cannot recover signature: point at infinify");return p.assertValidity(),p}toRawBytes(e=!1){return qf(this.toHex(e))}toHex(e=!1){const t=Wf(this.x);if(e){return`${this.hasEvenY()?"02":"03"}${t}`}return`04${t}${Wf(this.y)}`}toHexX(){return this.toHex(!0).slice(2)}toRawX(){return this.toRawBytes(!0).slice(1)}assertValidity(){const e="Point is not on elliptic curve",{x:t,y:n}=this;if(!sp(t)||!sp(n))throw new Error(e);const r=np(n*n);if(np(r-Uf(t))!==Cf)throw new Error(e)}equals(e){return this.x===e.x&&this.y===e.y}negate(){return new Lf(this.x,np(-this.y))}double(){return Pf.fromAffine(this).double().toAffine()}add(e){return Pf.fromAffine(this).add(Pf.fromAffine(e)).toAffine()}subtract(e){return this.add(e.negate())}multiply(e){return Pf.fromAffine(this).multiply(e,this).toAffine()}multiplyAndAddUnsafe(e,t,n){const r=Pf.fromAffine(this),i=t===Cf||t===Ef||this!==Lf.BASE?r.multiplyUnsafe(t):r.multiply(t),o=Pf.fromAffine(e).multiplyUnsafe(n),s=i.add(o);return s.equals(Pf.ZERO)?void 0:s.toAffine()}}function Mf(e){return Number.parseInt(e[0],16)>=8?"00"+e:e}function _f(e){if(e.length<2||2!==e[0])throw new Error(`Invalid signature integer tag: ${Jf(e)}`);const t=e[1],n=e.subarray(2,t+2);if(!t||n.length!==t)throw new Error("Invalid signature integer: wrong length");if(0===n[0]&&n[1]<=127)throw new Error("Invalid signature integer: trailing length");return{data:Xf(n),left:e.subarray(t+2)}}Lf.BASE=new Lf(Qf.Gx,Qf.Gy),Lf.ZERO=new Lf(Cf,Cf);class jf{constructor(e,t){this.r=e,this.s=t,this.assertValidity()}static fromCompact(e){const t=Hf(e),n="Signature.fromCompact";if("string"!=typeof e&&!t)throw new TypeError(`${n}: Expected string or Uint8Array`);const r=t?Jf(e):e;if(128!==r.length)throw new Error(`${n}: Expected 64-byte hex`);return new jf(Zf(r.slice(0,64)),Zf(r.slice(64,128)))}static fromDER(e){const t=Hf(e);if("string"!=typeof e&&!t)throw new TypeError("Signature.fromDER: Expected string or Uint8Array");const{r:n,s:r}=function(e){if(e.length<2||48!=e[0])throw new Error(`Invalid signature tag: ${Jf(e)}`);if(e[1]!==e.length-2)throw new Error("Invalid signature: incorrect length");const{data:t,left:n}=_f(e.subarray(2)),{data:r,left:i}=_f(n);if(i.length)throw new Error(`Invalid signature: left bytes after parsing: ${Jf(i)}`);return{r:t,s:r}}(t?e:qf(e));return new jf(n,r)}static fromHex(e){return this.fromDER(e)}assertValidity(){const{r:e,s:t}=this;if(!op(e))throw new Error("Invalid Signature: r must be 0 < r < n");if(!op(t))throw new Error("Invalid Signature: s must be 0 < s < n")}hasHighS(){const e=Qf.n>>Ef;return this.s>e}normalizeS(){return this.hasHighS()?new jf(this.r,np(-this.s,Qf.n)):this}toDERRawBytes(){return qf(this.toDERHex())}toDERHex(){const e=Mf(zf(this.s)),t=Mf(zf(this.r)),n=e.length/2,r=t.length/2,i=zf(n),o=zf(r);return`30${zf(r+n+4)}02${o}${t}02${i}${e}`}toRawBytes(){return this.toDERRawBytes()}toHex(){return this.toDERHex()}toCompactRawBytes(){return qf(this.toCompactHex())}toCompactHex(){return Wf(this.r)+Wf(this.s)}}function Hf(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}const Gf=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Jf(e){!function(e){if(!Hf(e))throw new Error("Uint8Array expected")}(e);let t="";for(let n=0;n=Kf._0&&e<=Kf._9?e-Kf._0:e>=Kf.A&&e<=Kf.F?e-(Kf.A-10):e>=Kf.a&&e<=Kf.f?e-(Kf.a-10):void 0}function qf(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;t0)return BigInt(e);if("bigint"==typeof e&&op(e))return e;throw new TypeError("Expected valid private scalar: 0 < scalar < curve.n")}function np(e,t=Qf.P){const n=e%t;return n>=Cf?n:t+n}function rp(e,t){const{P:n}=Qf;let r=e;for(;t-- >Cf;)r*=r,r%=n;return r}function ip(e,t=Qf.P){if(e===Cf||t<=Cf)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=np(e,t),r=t,i=Cf,o=Ef;for(;n!==Cf;){const e=r%n,t=i-o*(r/n);r=n,n=e,i=o,o=t}if(r!==Ef)throw new Error("invert: does not exist");return np(i,t)}function op(e){return Cf{r.reject(new Error("Device timeout")),this.lastCommand===r&&(this.lastCommand=null)},6e3),this.lastCommand}async connectToDevice({onConnect:e,onDisconnect:t,onError:n,onDone:r}){let i,o=await window.navigator.serial.requestPort();await o.open({baudRate:9600}),await(e=>new Promise(t=>setTimeout(t,e)))(1e3),(async()=>{for(;o&&o.readable;){const e=new window.TextDecoderStream;o.readable.pipeTo(e.writable),i=e.readable.getReader();const t=this.readFromSerialPort(i);try{for(;;){const{value:e,done:n}=await t("\n");if(e){const{method:t,data:n}=this.parseResponse(e);if("/ping"===t&&this.log("Pong"),-1===up.PUBLIC_METHODS.indexOf(t))continue;this.log("Received: ",t,n),this.lastCommand&&(this.lastCommand.resolve(n),this.lastCommand=null)}if(n)return this.lastCommand=null,this.writer=null,void(r&&r())}}catch(e){if(e instanceof Error)throw this.writer=null,n&&n(e),this.lastCommand&&(this.lastCommand.reject(e),this.lastCommand=null),e}}})();const s=new window.TextEncoderStream;s.readable.pipeTo(o.writable),this.writer=s.writable.getWriter(),await this.sendCommand(up.METHOD_PING),await this.sendCommand(up.METHOD_PING,[window.location.host]),e&&e(),o.addEventListener("disconnect",()=>{this.log("Disconnected"),this.lastCommand=null,this.writer=null,t&&t()})}async sendCommand(e,t=[]){if(!this.writer)return;this.log("Send command",e,t);const n=[e].concat(t).join(" ");await this.writer.write(n+"\n")}readFromSerialPort(e){let t,n=[];return async(r="\n")=>{if(n.length)return{value:n.shift().trim(),done:!1};const i=[];for(t&&(i.push(t),t=void 0);;){const{value:o,done:s}=await e.read();if(o){const e=o.split(r);if(e.length>1)return i.push(e.shift()),t=e.pop(),n=e,{value:i.join("").trim(),done:!1};i.push(o)}if(s)return{value:i.join("").trim(),done:!0}}}}parseResponse(e){const t=e.split(" ")[0];return{method:t,data:e.substring(t.length).trim()}}async nip04Encrypt(e,t){const n=Lu(await this.callMethodOnDevice(up.METHOD_SHARED_SECRET,[ap(e)]));let r=Uint8Array.from(function(e=32){if(Bu&&"function"==typeof Bu.getRandomValues)return Bu.getRandomValues(new Uint8Array(e));if(Bu&&"function"==typeof Bu.randomBytes)return Uint8Array.from(Bu.randomBytes(e));throw new Error("crypto.getRandomValues must be defined")}(16)),i=cp.encode(t),o=await crypto.subtle.importKey("raw",n,{name:"AES-CBC"},!1,["encrypt"]),s=await crypto.subtle.encrypt({name:"AES-CBC",iv:r},o,i);return`${_d.encode(new Uint8Array(s))}?iv=${_d.encode(new Uint8Array(r.buffer))}`}async nip04Decrypt(e,t){let[n,r]=t.split("?iv=");const i=Lu(await this.callMethodOnDevice(up.METHOD_SHARED_SECRET,[ap(e)]));let o=await crypto.subtle.importKey("raw",i,{name:"AES-CBC"},!1,["decrypt"]),s=_d.decode(n),a=_d.decode(r),l=await crypto.subtle.decrypt({name:"AES-CBC",iv:a},o,s);return lp.decode(l)}async getPublicKey(){const e=await this.callMethodOnDevice(up.METHOD_PUBLIC_KEY,[]);return this.pubkey=e,e}async restore(e){await this.callMethodOnDevice(up.METHOD_RESTORE,[Du(e)])}async signEvent(e){const t=e.pubkey||this.pubkey;if(!t)throw new Error("Unknown signer pubkey");const n={...e,id:ai({...e,pubkey:t})},r=await this.callMethodOnDevice(up.METHOD_SIGN_MESSAGE,[n.id]),i={...n,sig:r,pubkey:t};if(!this.verifyEvent(i))throw new Error("Invalid signature");return i}ping(){this.sendCommand(up.METHOD_PING,[window.location.host])}static SUPPORTED="navigator"in globalThis&&!!navigator.serial;static METHOD_PING="/ping";static METHOD_LOG="/log";static METHOD_SIGN_MESSAGE="/sign-message";static METHOD_SHARED_SECRET="/shared-secret";static METHOD_PUBLIC_KEY="/public-key";static METHOD_RESTORE="/restore";static PUBLIC_METHODS=[up.METHOD_PUBLIC_KEY,up.METHOD_SIGN_MESSAGE,up.METHOD_SHARED_SECRET,up.METHOD_RESTORE]}const dp=[`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`],fp=[{value:0,label:"User Metadata (0)"},{value:3,label:"Follows (3)"},{value:1e4,label:"Mute list (10000)"},{value:10001,label:"Pin list (10001)"},{value:10002,label:"Relay List Metadata (10002)"},{value:10003,label:"Bookmark list (10003)"},{value:10004,label:"Communities list (10004)"},{value:10005,label:"Public chats list (10005)"},{value:10006,label:"Blocked relays list (10006)"},{value:10007,label:"Search relays list (10007)"},{value:10009,label:"User groups (10009)"},{value:10012,label:"Favorite relays list (10012)"},{value:10013,label:"Private event relay list (10013)"},{value:10015,label:"Interests list (10015)"},{value:10019,label:"Nutzap Mint Recommendation (10019)"},{value:10020,label:"Media follows (10020)"},{value:10030,label:"User emoji list (10030)"},{value:10050,label:"Relay list to receive DMs (10050)"},{value:10051,label:"KeyPackage Relays List (10051)"},{value:10063,label:"User server list (10063)"},{value:10096,label:"File storage server list (10096)"},{value:10166,label:"Relay Monitor Announcement (10166)"},{value:10312,label:"Room Presence (10312)"},{value:10377,label:"Proxy Announcement (10377)"},{value:11111,label:"Transport Method Announcement (11111)"},{value:13194,label:"Wallet Info (13194)"},{value:17375,label:"Cashu Wallet Event (17375)"},{value:3e4,label:"Follow sets (30000)"},{value:30001,label:"Generic lists (30001)"},{value:30002,label:"Relay sets (30002)"},{value:30003,label:"Bookmark sets (30003)"},{value:30004,label:"Curation sets (30004)"},{value:30005,label:"Video sets (30005)"},{value:30007,label:"Kind mute sets (30007)"},{value:30008,label:"Profile Badges (30008)"},{value:30009,label:"Badge Definition (30009)"},{value:30015,label:"Interest sets (30015)"},{value:30017,label:"Create or update a stall (30017)"},{value:30018,label:"Create or update a product (30018)"},{value:30019,label:"Marketplace UI/UX (30019)"},{value:30020,label:"Product sold as an auction (30020)"},{value:30023,label:"Long-form Content (30023)"},{value:30024,label:"Draft Long-form Content (30024)"},{value:30030,label:"Emoji sets (30030)"},{value:30040,label:"Curated Publication Index (30040)"},{value:30041,label:"Curated Publication Content (30041)"},{value:30063,label:"Release artifact sets (30063)"},{value:30078,label:"Application-specific Data (30078)"},{value:30166,label:"Relay Discovery (30166)"},{value:30267,label:"App curation sets (30267)"},{value:30311,label:"Live Event (30311)"},{value:30312,label:"Interactive Room (30312)"},{value:30313,label:"Conference Event (30313)"},{value:30315,label:"User Statuses (30315)"},{value:30388,label:"Slide Set (30388)"},{value:30402,label:"Classified Listing (30402)"},{value:30403,label:"Draft Classified Listing (30403)"},{value:30617,label:"Repository announcements (30617)"},{value:30618,label:"Repository state announcements (30618)"},{value:30818,label:"Wiki article (30818)"},{value:30819,label:"Redirects (30819)"},{value:31234,label:"Draft Event (31234)"},{value:31388,label:"Link Set (31388)"},{value:31890,label:"Feed (31890)"},{value:31922,label:"Date-Based Calendar Event (31922)"},{value:31923,label:"Time-Based Calendar Event (31923)"},{value:31924,label:"Calendar (31924)"},{value:31925,label:"Calendar Event RSVP (31925)"},{value:31989,label:"Handler recommendation (31989)"},{value:31990,label:"Handler information (31990)"},{value:32267,label:"Software Application (32267)"},{value:34550,label:"Community Definition (34550)"},{value:37516,label:"Geocache listing (37516)"},{value:38172,label:"Cashu Mint Announcement (38172)"},{value:38173,label:"Fedimint Announcement (38173)"},{value:38383,label:"Peer-to-peer Order events (38383)"},{value:39089,label:"Starter packs (39089)"},{value:39092,label:"Media starter packs (39092)"},{value:39701,label:"Web bookmarks (39701)"}],pp={0:"User Metadata",1:"Short Text Note",2:"Recommend Relay",3:"Follows",4:"Encrypted Direct Messages",5:"Event Deletion Request",6:"Repost",7:"Reaction",8:"Badge Award",9:"Chat Message",10:"Group Chat Threaded Reply",11:"Thread",12:"Group Thread Reply",13:"Seal",14:"Direct Message",15:"File Message",16:"Generic Repost",17:"Reaction to a website",20:"Picture",40:"Channel Creation",41:"Channel Metadata",42:"Channel Message",43:"Channel Hide Message",44:"Channel Mute User",1021:"Bid",1022:"Bid Confirmation",1040:"OpenTimestamps",1063:"File Metadata",1311:"Live Chat Message",1971:"Problem Tracker",1984:"Reporting",1985:"Label",4550:"Community Post Approval",5e3:"Job Request",5999:"Job Request",6e3:"Job Result",6999:"Job Result",7e3:"Job Feedback",9041:"Zap Goal",9734:"Zap Request",9735:"Zap",9882:"Highlights",1e4:"Mute list",10001:"Pin list",10002:"Relay List Metadata",10003:"Bookmarks list",10004:"Communities list",10005:"Public Chats list",10006:"Blocked Relays list",10007:"Search Relays list",10015:"Interests",10030:"User Emoji list",10050:"DM relays",10096:"File Storage Server List",13194:"Wallet Service Info",21e3:"Lightning pub RPC",22242:"Client Authentication",23194:"Wallet Request",23195:"Wallet Response",23196:"Wallet Notification",23197:"Wallet Notification",24133:"Nostr Connect",27235:"HTTP Auth",3e4:"Follow sets",30001:"Generic lists",30002:"Relay sets",30003:"Bookmark sets",30004:"Curation sets",30008:"Profile Badges",30009:"Badge Definition",30015:"Interest sets",30017:"Stall Definition",30018:"Product Definition",30019:"Marketplace UI/UX",30020:"Product sold as an auction",30023:"Long-form Content",30024:"Draft Long-form Content",30030:"Emoji sets",30078:"Application-specific Data",30311:"Live Event",30315:"User Statuses",30402:"Classified Listing",30403:"Draft Classified Listing",31922:"Date-Based Calendar Event",31923:"Time-Based Calendar Event",31924:"Calendar",31925:"Calendar Event RSVP",31989:"Handler recommendation",31990:"Handler information",34235:"Video Event Horizontal",34236:"Video Event Vertical",34550:"Community Definition"},hp=3e5;class gp{constructor(){this.pool=new Tn,this.eventStore=new vf,this.isConnected=!1,this.signer=null,this.relays=[...dp]}async connect(){console.log("Starting connection to",this.relays.length,"relays...");try{this.isConnected=!0,console.log("✓ Successfully initialized relay pool"),await new Promise(e=>setTimeout(e,1e3))}catch(e){throw console.error("✗ Connection failed:",e),e}}async connectToRelay(e){console.log(`Adding relay: ${e}`);try{return this.relays.includes(e)||this.relays.push(e),console.log(`✓ Successfully added relay ${e}`),!0}catch(t){return console.error(`✗ Failed to add relay ${e}:`,t),!1}}subscribe(e,t){console.log("Creating subscription with filters:",e);const n=this.pool.subscribeMany(this.relays,e,{onevent(e){console.log("Event received:",e),t(e)},oneose(){console.log("EOSE received"),window.dispatchEvent(new CustomEvent("nostr-eose",{detail:{subscriptionId:n.id}}))}});return n}unsubscribe(e){console.log("Closing subscription"),e&&e.close&&e.close()}disconnect(){console.log("Disconnecting relay pool"),this.pool&&this.pool.close(this.relays),this.isConnected=!1}async publish(e,t=null){this.isConnected||(console.warn("Not connected to any relays, attempting to connect first"),await this.connect());try{const n=t||this.relays,r=this.pool.publish(n,e);return await Promise.allSettled(r),console.log("✓ Event published successfully"),await Ip([e]),console.log("Event stored in IndexedDB"),{success:!0,okCount:1,errorCount:0}}catch(e){throw console.error("✗ Failed to publish event:",e),e}}getPool(){return this.pool}getEventStore(){return this.eventStore}getSigner(){return this.signer}setSigner(e){this.signer=e}}const mp=new gp,yp="nostrCache",wp=2,vp="events";function Ap(){return new Promise((e,t)=>{try{const n=indexedDB.open(yp,wp);n.onupgradeneeded=e=>{const t=n.result;e.oldVersion;let r;r=t.objectStoreNames.contains(vp)?n.transaction.objectStore(vp):t.createObjectStore(vp,{keyPath:"id"}),r.indexNames.contains("byKindAuthor")||r.createIndex("byKindAuthor",["kind","pubkey"],{unique:!1}),r.indexNames.contains("byKindAuthorCreated")||r.createIndex("byKindAuthorCreated",["kind","pubkey","created_at"],{unique:!1}),r.indexNames.contains("byKind")||r.createIndex("byKind","kind",{unique:!1}),r.indexNames.contains("byAuthor")||r.createIndex("byAuthor","pubkey",{unique:!1}),r.indexNames.contains("byCreatedAt")||r.createIndex("byCreatedAt","created_at",{unique:!1})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)}catch(e){console.error("Failed to open IndexedDB",e),t(e)}})}async function bp(e){try{const t=await Ap();await new Promise((n,r)=>{const i=t.transaction(vp,"readwrite");i.oncomplete=()=>n(),i.onerror=()=>r(i.error),i.objectStore(vp).put(e)})}catch(e){console.warn("IDB putEvent failed",e)}}async function Ip(e){if(e&&0!==e.length)try{const t=await Ap();await new Promise((n,r)=>{const i=t.transaction(vp,"readwrite");i.oncomplete=()=>n(),i.onerror=()=>r(i.error);const o=i.objectStore(vp);for(const t of e)o.put(t)}),console.log(`Stored ${e.length} events in IndexedDB`)}catch(e){console.warn("IDB putEvents failed",e)}}async function kp(e){try{const t=await Ap(),n=[];console.log("QueryEventsFromDB: Starting query with filters:",e);for(const r of e){console.log("QueryEventsFromDB: Processing filter:",r);const e=await new Promise((e,n)=>{const i=t.transaction(vp,"readonly").objectStore(vp),o=[];let s;if(r.kinds&&r.kinds.length>0&&r.authors&&r.authors.length>0){const e=r.kinds[0],t=r.authors[0];console.log(`QueryEventsFromDB: Using byKindAuthorCreated index for kind=${e}, author=${t.substring(0,8)}...`);const n=i.index("byKindAuthorCreated"),o=IDBKeyRange.bound([e,t,-1/0],[e,t,1/0]);s=n.openCursor(o,"prev")}else if(r.kinds&&r.kinds.length>0){console.log(`QueryEventsFromDB: Using byKind index for kind=${r.kinds[0]}`);const e=i.index("byKind");s=e.openCursor(IDBKeyRange.only(r.kinds[0]))}else if(r.authors&&r.authors.length>0){console.log(`QueryEventsFromDB: Using byAuthor index for author=${r.authors[0].substring(0,8)}...`);const e=i.index("byAuthor");s=e.openCursor(IDBKeyRange.only(r.authors[0]))}else console.log("QueryEventsFromDB: Scanning all events (no specific index)"),s=i.openCursor();s.onsuccess=t=>{const n=t.target.result;if(n){const t=n.value;let i=!0;if(r.kinds&&r.kinds.length>0&&!r.kinds.includes(t.kind)&&(i=!1),r.authors&&r.authors.length>0&&!r.authors.includes(t.pubkey)&&(i=!1),r.since&&t.created_atr.until&&(i=!1),r.ids&&r.ids.length>0&&!r.ids.includes(t.id)&&(i=!1),i&&o.push(t),r.limit&&o.length>=r.limit)return console.log(`QueryEventsFromDB: Reached limit of ${r.limit}, found ${o.length} matching events`),void e(o);n.continue()}else console.log(`QueryEventsFromDB: Cursor exhausted, found ${o.length} matching events`),e(o)},s.onerror=()=>{console.error("QueryEventsFromDB: Cursor error:",s.error),n(s.error)}});console.log(`QueryEventsFromDB: Found ${e.length} events for this filter`),n.push(...e)}return n.sort((e,t)=>t.created_at-e.created_at),console.log(`QueryEventsFromDB: Returning ${n.length} total events`),n}catch(e){return console.error("QueryEventsFromDB failed:",e),[]}}function Cp(e){try{const t=JSON.parse(e.content||"{}");return{name:t.name||t.display_name||"",picture:t.picture||"",banner:t.banner||"",about:t.about||"",nip05:t.nip05||"",lud16:t.lud16||t.lud06||""}}catch(e){return{name:"",picture:"",banner:"",about:"",nip05:"",lud16:""}}}async function Ep(e){console.log(`Starting profile fetch for pubkey: ${e}`);try{const t=await async function(e){try{const t=await Ap();return await new Promise((n,r)=>{const i=t.transaction(vp,"readonly").objectStore(vp).index("byKindAuthorCreated"),o=IDBKeyRange.bound([0,e,-1/0],[0,e,1/0]),s=i.openCursor(o,"prev");s.onsuccess=()=>{const e=s.result;n(e?e.value:null)},s.onerror=()=>r(s.error)})}catch(e){return console.warn("IDB getLatestProfileEvent failed",e),null}}(e);if(t){console.log("Using cached profile event");return Cp(t)}}catch(e){console.warn("Failed to load cached profile",e)}try{const t=[{kinds:[0],authors:[e],limit:1}],n=await Bp(t,{timeout:1e4});if(n.length>0){const t=n[0];console.log("Profile fetched:",t),await bp(t);try{console.log("Publishing profile event to local relay:",t.id),await mp.publish(t),console.log("Profile event successfully saved to local relay")}catch(e){console.warn("Failed to publish profile to local relay:",e)}const r=Cp(t);try{"undefined"!=typeof window&&window.dispatchEvent&&window.dispatchEvent(new CustomEvent("profile-updated",{detail:{pubkey:e,profile:r,event:t}}))}catch(e){console.warn("Failed to dispatch profile-updated event",e)}return r}return console.log("No profile found for pubkey, creating default:",e),await xp(e)}catch(t){console.error("Failed to fetch profile:",t);try{return await xp(e)}catch(e){return console.error("Failed to create default profile:",e),null}}}async function xp(e){const t=`testuser${e.slice(0,6)}`,n=`${window.location.origin}/orly.png`,r={name:t,display_name:t,picture:n,about:"New ORLY user"},i={name:t,displayName:t,picture:n,about:"New ORLY user",pubkey:e};if(mp.signer)try{const e={kind:0,content:JSON.stringify(r),tags:[],created_at:Math.floor(Date.now()/1e3)},t=await mp.signer.signEvent(e);await mp.publish(t),console.log("Default profile published:",t.id)}catch(e){console.warn("Failed to publish default profile:",e)}return i}async function Bp(e,t={}){console.log("Starting event fetch with filters:",JSON.stringify(e,null,2)),console.log("Current relays:",mp.relays),mp.isConnected&&0!==mp.relays.length||(console.warn("Client not connected, initializing..."),await Fp());const{timeout:n=3e4,useCache:r=!0}=t;if(r)try{const t=await kp(e);t.length>0&&console.log(`Found ${t.length} cached events in IndexedDB`)}catch(e){console.warn("Failed to query cached events",e)}return new Promise((t,r)=>{const i=[],o=setTimeout(()=>{console.log(`Timeout reached after ${n}ms, returning ${i.length} events`),sub.close(),i.length>0&&Ip(i).catch(e=>console.warn("Failed to cache events",e)),t(i)},n);try{const n=Math.random().toString(36).substring(7);console.log(`📤 REQ [${n}]:`,JSON.stringify(["REQ",n,...e],null,2));const r=mp.pool.subscribeMany(mp.relays,e,{onevent(e){console.log(`📥 EVENT received for REQ [${n}]:`,{id:e.id?.substring(0,8)+"...",kind:e.kind,pubkey:e.pubkey?.substring(0,8)+"...",created_at:e.created_at,content_preview:e.content?.substring(0,50)}),i.push(e),bp(e).catch(e=>console.warn("Failed to cache event",e))},oneose(){console.log(`✅ EOSE received for REQ [${n}], got ${i.length} events`),clearTimeout(o),r.close(),i.length>0&&Ip(i).catch(e=>console.warn("Failed to cache events",e)),t(i)}})}catch(e){clearTimeout(o),console.error("Failed to fetch events:",e),r(e)}})}async function Sp(e,t={}){const{timeout:n=1e4}=t;console.log(`Fetching event by ID: ${e}`);try{const t=[{ids:[e]}];console.log("Fetching event with filters:",t);const r=await Bp(t,{timeout:n});return console.log(`Fetched ${r.length} events`),r.length>0?r[0]:null}catch(e){throw console.error("Failed to fetch event by ID:",e),e}}async function Qp(e,t={}){const{timeout:n=1e4}=t;console.log(`Fetching delete events for target: ${e}`);try{const t=[{kinds:[5],"#e":[e]}];console.log("Fetching delete events with filters:",t);const r=await Bp(t,{timeout:n});return console.log(`Fetched ${r.length} delete events`),r}catch(e){throw console.error("Failed to fetch delete events:",e),e}}async function Fp(){await mp.connect()}async function Dp(e,t={}){const{timeout:n=3e4,cacheFirst:r=!0,cacheOnly:i=!1}=t;let o=[];if(r||i)try{if(o=await kp(e),console.log(`Found ${o.length} events in cache`),i||o.length>0)return o}catch(e){console.warn("Failed to query cache",e)}if(!i){const t=await Bp(e,{timeout:n,useCache:!1});return console.log(`Fetched ${t.length} events from relay`),t}return o}async function $p(){try{const e=await Ap(),t=e.transaction(vp,"readonly").objectStore(vp),n=await new Promise((e,n)=>{const r=t.getAll();r.onsuccess=()=>e(r.result),r.onerror=()=>n(r.error)}),r=n.reduce((e,t)=>(e[t.kind]=(e[t.kind]||0)+1,e),{});return console.log("===== IndexedDB Contents ====="),console.log(`Total events: ${n.length}`),console.log("Events by kind:",r),console.log("Kind 0 events:",n.filter(e=>0===e.kind)),console.log("All event IDs:",n.map(e=>({id:e.id.substring(0,8),kind:e.kind,pubkey:e.pubkey.substring(0,8)}))),console.log("=============================="),{total:n.length,byKind:r,events:n}}catch(e){return console.error("Failed to debug IndexedDB:",e),null}} +Object.defineProperty(e,"__esModule",{value:!0}),e.bytes=e.stringToBytes=e.str=e.bytesToString=e.hex=e.utf8=e.bech32m=e.bech32=e.base58check=e.base58xmr=e.base58xrp=e.base58flickr=e.base58=e.base64url=e.base64=e.base32crockford=e.base32hex=e.base32=e.base16=e.utils=e.assertNumber=void 0,e.assertNumber=t;const l=(e,t)=>t?l(t,e%t):e,c=(e,t)=>e+(t-l(e,t));function u(e,n,r,i){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(n<=0||n>32)throw new Error(`convertRadix2: wrong from=${n}`);if(r<=0||r>32)throw new Error(`convertRadix2: wrong to=${r}`);if(c(n,r)>32)throw new Error(`convertRadix2: carry overflow from=${n} to=${r} carryBits=${c(n,r)}`);let o=0,s=0;const a=2**r-1,l=[];for(const i of e){if(t(i),i>=2**n)throw new Error(`convertRadix2: invalid data word=${i} from=${n}`);if(o=o<32)throw new Error(`convertRadix2: carry overflow pos=${s} from=${n}`);for(s+=n;s>=r;s-=r)l.push((o>>s-r&a)>>>0);o&=2**s-1}if(o=o<=n)throw new Error("Excess padding");if(!i&&o)throw new Error(`Non-zero padding: ${o}`);return i&&s>0&&l.push(o>>>0),l}function d(e){return t(e),{encode:t=>{if(!(t instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return a(Array.from(t),256,e)},decode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(a(t,e,256))}}}function f(e,n=!1){if(t(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(c(8,e)>32||c(e,8)>32)throw new Error("radix2: carry overflow");return{encode:t=>{if(!(t instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return u(Array.from(t),8,e,!n)},decode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(u(t,e,8,n))}}}function h(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}function p(e,n){if(t(e),"function"!=typeof n)throw new Error("checksum fn should be function");return{encode(t){if(!(t instanceof Uint8Array))throw new Error("checksum.encode: input should be Uint8Array");const r=n(t).slice(0,e),i=new Uint8Array(t.length+e);return i.set(t),i.set(r,t.length),i},decode(t){if(!(t instanceof Uint8Array))throw new Error("checksum.decode: input should be Uint8Array");const r=t.slice(0,-e),i=n(r).slice(0,e),o=t.slice(-e);for(let t=0;te.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1"))),e.base64=n(f(6),r("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),o(6),i("")),e.base64url=n(f(6),r("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),o(6),i(""));const g=e=>n(d(58),r(e),i(""));e.base58=g("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),e.base58flickr=g("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),e.base58xrp=g("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz");const m=[0,2,3,5,6,7,9,10,11];e.base58xmr={encode(t){let n="";for(let r=0;rn(p(4,e=>t(t(e))),e.base58);const y=n(r("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),i("")),w=[996825010,642813549,513874426,1027748829,705979059];function v(e){const t=e>>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=w[e]);return n}function A(e,t,n=1){const r=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=v(i)^n>>5}i=v(i);for(let t=0;tn)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const r=e.toLowerCase();if(e!==r&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const i=(e=r).lastIndexOf("1");if(0===i||-1===i)throw new Error('Letter "1" must be present between prefix and data only');const o=e.slice(0,i),s=e.slice(i+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const a=y.decode(s).slice(0,-6),l=A(o,a,t);if(!s.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:o,words:a}}return{encode:function(e,n,r=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const i=e.length+7+n.length;if(!1!==r&&i>r)throw new TypeError(`Length ${i} exceeds limit ${r}`);return`${e=e.toLowerCase()}1${y.encode(n)}${A(e,n,t)}`},decode:s,decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:r(n)}},decodeUnsafe:h(s),fromWords:r,fromWordsUnsafe:o,toWords:i}}e.bech32=b("bech32"),e.bech32m=b("bech32m"),e.utf8={encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},e.hex=n(f(4),r("0123456789abcdef"),i(""),s(e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()}));const k={utf8:e.utf8,hex:e.hex,base16:e.base16,base32:e.base32,base64:e.base64,base64url:e.base64url,base58:e.base58,base58xmr:e.base58xmr},I=`Invalid encoding type. Available types: ${Object.keys(k).join(", ")}`;e.bytesToString=(e,t)=>{if("string"!=typeof e||!k.hasOwnProperty(e))throw new TypeError(I);if(!(t instanceof Uint8Array))throw new TypeError("bytesToString() expects Uint8Array");return k[e].encode(t)},e.str=e.bytesToString;e.stringToBytes=(e,t)=>{if(!k.hasOwnProperty(e))throw new TypeError(I);if("string"!=typeof t)throw new TypeError("stringToBytes() expects string");return k[e].decode(t)},e.bytes=e.stringToBytes}({}),BigInt(1e3),BigInt(1e6),BigInt(1e9),BigInt(1e12),BigInt("2100000000000000000"),BigInt(1e11);const Id={payment_hash:1,payment_secret:16,description:13,payee:19,description_hash:23,expiry:6,min_final_cltv_expiry:24,fallback_address:9,route_hint:3,feature_bits:5,metadata:27};for(let e=0,t=Object.keys(Id);eKc(e.tags,e=>Hc(e)?e:void 0,Nu))}(e),function(e){if(function(e){return Zu(e)&&Reflect.has(e,Ed)}(e))return e[Ed];const t=Xu(e);if(!t)return;const n=Kc(t,e=>Hc(e)?e:void 0,Nu);return Reflect.set(e,Ed,n),n}(e))}dd.extend("EncryptedContentCache"),dd.extend("event-cache"),new TextDecoder;const Bd=Symbol.for("mailboxes-inboxes"),Sd=Symbol.for("mailboxes-outboxes");function Qd(e){return eu(e,Bd,()=>{const t=[];for(const n of e.tags)if(jc(n))try{const[,e,r]=n;!e||!Eu(e)||t.includes(e)||"read"!==r&&void 0!==r||t.push(bu(e))}catch{}return t})}function Fd(e){return eu(e,Sd,()=>{const t=[];for(const n of e.tags)if(jc(n))try{const[e,r,i]=n;"r"!==e||!Eu(r)||t.includes(r)||"write"!==i&&void 0!==i||t.push(bu(r))}catch{}return t})}const Dd=Symbol.for("mute-public"),$d=Symbol.for("mute-hidden");function Rd(e){return{pubkeys:new Set(e.filter(Hc).map(e=>e[1])),threads:new Set(e.filter(Oc).map(e=>e[1])),hashtags:new Set(e.filter(Jc).map(e=>e[1].toLocaleLowerCase())),words:new Set(e.filter(e=>"word"===e[0]&&e[1]).map(e=>e[1].toLocaleLowerCase()))}}function Pd(e){const t=function(e){if(function(e){return Zu(e)&&Reflect.has(e,$d)}(e))return e[$d];const t=Xu(e);if(!t)return;const n=Rd(t);return Reflect.set(e,$d,n),n}(e),n=function(e){return eu(e,Dd,()=>Rd(e.tags))}(e);return t?function(...e){const t={pubkeys:new Set,threads:new Set,hashtags:new Set,words:new Set};for(const n of e){for(const e of n.pubkeys)t.pubkeys.add(e);for(const e of n.threads)t.threads.add(e);for(const e of n.hashtags)t.hashtags.add(e);for(const e of n.words)t.words.add(e)}return t}(t,n):n}var Td;!function(e){e.nudity="nudity",e.malware="malware",e.profanity="profanity",e.illegal="illegal",e.spam="spam",e.impersonation="impersonation",e.other="other"}(Td||(Td={}));const Ud=Symbol.for("nip10-thread-refs");function Nd(e){if(!e[1])throw new Error("Missing event id in tag");let t={id:e[1]};return e[2]&&Eu(e[2])&&(t.relays=[e[2]]),"e"!==e[0]||"root"!==e[3]&&"reply"!==e[3]&&"mention"!==e[3]||!e[4]||64!==e[4].length||(t.author=e[4]),t}function Ld(e){return t=>{const n=new Set;return t.pipe(Mc(t=>{if(void 0!==t)if(Array.isArray(t))for(const r of t)n.has(r)||(n.add(r),e.claim(r));else n.has(t)||(n.add(t),e.claim(t))}),Rc(()=>{for(const t of n)e.removeClaim(t)}))}}function Md(e){return t=>{let n;return t.pipe(Mc(t=>{n!==t&&(n&&e.removeClaim(n),t&&e.claim(t),n=t)}),Rc(()=>{n&&e.removeClaim(n)}))}}function _d(){return e=>e.pipe(Sc(e=>null!=e))}function Od(e){return t=>new Bl(n=>{let r=!1;const i=t.subscribe({next:e=>{r=!0,n.next(e)},error:e=>n.error(e),complete:()=>n.complete()});return r||n.next(e),i})}function Hd(e){return"string"==typeof e&&(e={id:e}),t=>Bc(Ec(()=>function(e,t){const n=e.getEvent(t.id);return n instanceof Promise?uc(n):dc(n)}(t,e)).pipe(function(e,t){return Lc(n=>n?dc(n):e.eventLoader?uc(e.eventLoader(t)):jl)}(t,e),_d()),t.insert$.pipe(Sc(t=>t.id===e.id)),t.remove$.pipe(Sc(t=>t.id===e.id),Qc(1),Ql(function(e,t){e.subscribe(Fl(t,ml))}),$c(void 0))).pipe(Md(t),Fc((e,t)=>e?.id===t?.id),Od(void 0))}function jd(e){return t=>{let n;return Bc(Ec(()=>function(e,t){const n=e.getReplaceable(t.kind,t.pubkey,t.identifier);return n instanceof Promise?uc(n):dc(n)}(t,e)).pipe(function(e,t){return Lc(n=>n?dc(n):void 0!==t.identifier?e.addressableLoader?uc(e.addressableLoader(t)).pipe(Sc(e=>!!e)):jl:e.replaceableLoader?uc(e.replaceableLoader(t)).pipe(Sc(e=>!!e)):jl)}(t,e),_d()),t.insert$.pipe(Sc(t=>t.pubkey==e.pubkey&&t.kind===e.kind&&(void 0===e.identifier||fu(t)===e.identifier)))).pipe(Fc((e,t)=>e.created_at>=t.created_at),Mc(e=>n=e),(r=t.remove$.pipe(Sc(e=>e.id===n?.id)),Ql(function(e,t){rc(r).subscribe(Fl(t,function(){return t.complete()},ml)),!t.closed&&e.subscribe(t)})),$c(void 0),function(e){var t,n,r=1/0;return null!=e&&("object"==typeof e?(t=e.count,r=void 0===t?1/0:t,n=e.delay):r=e),r<=0?function(){return jl}:Ql(function(e,t){var i,o=0,s=function(){if(null==i||i.unsubscribe(),i=null,null!=n){var e="number"==typeof n?xc(n):rc(n(o)),r=Fl(t,function(){r.unsubscribe(),a()});e.subscribe(r)}else a()},a=function(){var n=!1;i=e.subscribe(Fl(t,void 0,function(){++o{const r=new Map;return Ec(()=>{const t=n.getTimeline(e);return t instanceof Promise?uc(t):dc(t)}).pipe(Ld(n),Tc(n.insert$.pipe(Sc(t=>wd(e,t)),Ld(n))),Tc(n.remove$.pipe(Sc(t=>wd(e,t)),fc(e=>e.id))),Uc((e,n)=>{if("string"==typeof n)return e.filter(e=>e.id!==n);if(Array.isArray(n)){if(!t)for(const e of n)lu(e.kind)&&r.set(cu(e),e);return n}let i=[...e];if(!t&&lu(n.kind)){const t=cu(n),o=r.get(t);if(o&&n.created_atr.clear()))}}function Jd(e){return t=>Ac(Object.fromEntries(e.map(e=>[e,t.model(Hd,{id:e})])))}function Kd(e){return t=>Ac(Object.fromEntries(e.map(e=>[du(e.kind,e.pubkey,e.identifier),t.model(jd,e)])))}function Vd(e){return t=>{let n;return Bc(t.pipe(Mc(e=>n=e)),e.update$.pipe(Sc(e=>e.id===n?.id)))}}function zd(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:hi.Contacts,pubkey:e.pubkey,relays:e.relays}).pipe(Vd(t),fc(e=>e?xd(e):[]))}function qd(e){return t=>{const n=[{kinds:[1111],"#e":[e.id]}];return za(e.kind)&&n.push({kinds:[1111],"#a":[uu(e)]}),t.timeline(n)}}function Yd(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:hi.RelayList,pubkey:e.pubkey,relays:e.relays}).pipe(fc(e=>e&&{inboxes:Qd(e),outboxes:Fd(e)}))}function Wd(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:hi.Mutelist,pubkey:e.pubkey,relays:e.relays}).pipe(Vd(t),fc(e=>e&&Pd(e)))}function Zd(e){return"string"==typeof e&&(e={pubkey:e}),t=>t.replaceable({kind:hi.Metadata,pubkey:e.pubkey,relays:e.relays}).pipe(Sc(kd),fc(e=>e&&bd(e)),Od(void 0))}function Xd(e){return t=>t.timeline(lu(e.kind)?[{kinds:[hi.Reaction],"#e":[e.id]},{kinds:[hi.Reaction],"#a":[cu(e)]}]:[{kinds:[hi.Reaction],"#e":[e.id]}])}const ef={kinds:[hi.ShortTextNote]};function tf(e,t){const n=new Map,r=new Map,{kinds:i}={...ef,...t};let o="";const s={},a={kinds:i};var l;return"string"!=typeof(l=e)&&Reflect.has(l,"identifier")&&Reflect.has(l,"pubkey")&&Reflect.has(l,"kind")?(o=Lu(e),s.kinds=[e.kind],s.authors=[e.pubkey],s["#d"]=[e.identifier],a["#a"]=[o]):"string"==typeof e?(o=e,s.ids=[e],a["#e"]=[e]):(o=e.id,s.ids=[e.id],a["#e"]=[e.id]),e=>e.filters([s,a]).pipe(fc(e=>{if(!r.has(cu(e))){const t=function(e){return eu(e,Ud,()=>{const t=function(e){const t=e.filter(e=>"e"===e[0]&&e[1]),n=e.filter(e=>"a"===e[0]&&e[1]);let r=t.find(e=>"root"===e[3]),i=t.find(e=>"reply"===e[3]),o=n.find(e=>"root"===e[3]),s=n.find(e=>"reply"===e[3]);if(r&&i||(r=i=r||i),o&&s||(o=s=o||s),!r&&!i){const e=t.filter(e=>!e[3]);e.length>=1&&(r=e[0],i=e[e.length-1]??r)}return{root:r||o?{e:r,a:o}:void 0,reply:i||s?{e:i,a:s}:void 0}}(e.tags);let n,r;if(t.root)try{n={e:t.root.e&&Nd(t.root.e),a:t.root.a&&Uu(t.root.a)}}catch(e){}if(t.reply)try{r={e:t.reply.e&&Nd(t.reply.e),a:t.reply.a&&Uu(t.reply.a)}}catch(e){}return{root:n,reply:r}})}(e),i=n.get(cu(e))||new Set,o={event:e,refs:t,replies:i};for(const e of i)e.parent=o;if(t.reply?.e||t.reply?.a){let e=t.reply.e?t.reply.e.id:Lu(t.reply.a);if(o.parent=r.get(e),o.parent)o.parent.replies.add(o);else{let t=n.get(e);t||(t=new Set,n.set(e,t)),t.add(o)}}r.set(cu(e),o)}return{root:r.get(o),all:r}}))}function nf(e){return class extends e{models=new Map;modelKeepWarm=6e4;model(e,...t){let n=this.models.get(e);n||(n=new Map,this.models.set(e,n));const r=e.getKey?e.getKey(...t):md(t);let i=n.get(r);if(!i){const o=()=>{n.get(r)===i&&n.delete(r)};i=e(...t)(this).pipe(Rc(o),function(e){void 0===e&&(e={});var t=e.connector,n=void 0===t?function(){return new Rl}:t,r=e.resetOnError,i=void 0===r||r,o=e.resetOnComplete,s=void 0===o||o,a=e.resetOnRefCountZero,l=void 0===a||a;return function(e){var t,r,o,a=0,c=!1,u=!1,d=function(){null==r||r.unsubscribe(),r=void 0},f=function(){d(),t=o=void 0,c=u=!1},h=function(){var e=t;f(),null==e||e.unsubscribe()};return Ql(function(e,p){a++,u||c||d();var g=o=null!=o?o:n();p.add(function(){0!==--a||u||c||(r=Nc(h,l))}),g.subscribe(p),!t&&a>0&&(t=new kl({next:function(e){return g.next(e)},error:function(e){u=!0,d(),r=Nc(f,i,e),g.error(e)},complete:function(){c=!0,d(),r=Nc(f,s),g.complete()}}),rc(e).subscribe(t))})(e)}}({connector:()=>new Ul(1),resetOnComplete:()=>xc(this.modelKeepWarm),resetOnRefCountZero:()=>xc(this.modelKeepWarm)})),n.set(r,i)}return i}filters(e,t=!1){e=Array.isArray(e)?e:[e];const n=this.getByFilters(e);return Bc(t?jl:n&&"function"==typeof n.then?uc(n).pipe(kc(e=>uc(Array.from(e)))):uc(Array.from(n)),this.insert$.pipe(Sc(t=>wd(e,t))))}event(e){return"string"==typeof e&&(e={id:e}),this.model(Hd,e)}replaceable(...e){let t;if(1===e.length)t=e[0];else if(3===e.length||2===e.length){let[n,r,i]=e;t={kind:n,pubkey:r,identifier:i}}if(!t)throw new Error("Invalid arguments, expected address pointer or kind, pubkey, identifier");return this.model(jd,t)}addressable(e){return this.model(jd,e)}timeline(e,t=!1){return this.model(Gd,e,t)}profile(e){return this.model(Zd,e)}contacts(e){return"string"==typeof e&&(e={pubkey:e}),this.model(zd,e)}mutes(e){return"string"==typeof e&&(e={pubkey:e}),this.model(Wd,e)}mailboxes(e){return"string"==typeof e&&(e={pubkey:e}),this.model(Yd,e)}blossomServers(e){return"string"==typeof e&&(e={pubkey:e}),this.model(vd,e)}reactions(e){return this.model(Xd,e)}thread(e){return this.model(tf,e)}comments(e){return this.model(qd,e)}events(e){return this.model(Jd,e)}replaceableSet(e){return this.model(Kd,e)}}}class rf extends(nf(class{})){database;memory;keepOldVersions=!1;keepExpired=!1;verifyEvent;insert$=new Rl;update$=new Rl;remove$=new Rl;eventLoader;replaceableLoader;addressableLoader;constructor(e=new fd){super(),e?(this.database=e,this.memory=new fd):this.database=this.memory=new fd,this.insert$.subscribe(e=>{Reflect.set(e,ru,this)}),this.remove$.subscribe(e=>{Reflect.deleteProperty(e,ru)})}mapToMemory(e){if(void 0!==e)return this.memory?this.memory.add(e):e}deletedIds=new Set;deletedCoords=new Map;checkDeleted(e){if("string"==typeof e)return this.deletedIds.has(e);if(this.deletedIds.has(e.id))return!0;if(za(e.kind)){const t=e.tags.find(e=>"d"===e[0])?.[1],n=this.deletedCoords.get(du(e.kind,e.pubkey,t));if(n)return n>e.created_at}return!1}expirations=new Map;addExpiration(e){const t=gu(e);t&&Number.isFinite(t)&&this.expirations.set(e.id,t)}expirationTimeout=null;nextExpirationCheck=null;handleExpiringEvent(e){const t=gu(e);if(!t)return;if(this.expirations.set(e.id,t),this.expirationTimeout&&this.nextExpirationCheck&&this.nextExpirationChecke[1])}(e);for(const e of t)this.deletedIds.add(e),this.remove(e);const n=function(e){return e.tags.filter(Gc).map(e=>e[1])}(e);for(const t of n){this.deletedCoords.set(t,Math.max(this.deletedCoords.get(t)??0,e.created_at));const n=Tu(t);if(!n)continue;const r=this.database.getReplaceableHistory(n.kind,n.pubkey,n.identifier)??[];for(const t of r)t.created_at"d"===e[0])?.[1]:void 0;if(!this.keepOldVersions&&lu(e.kind)){const t=this.database.getReplaceableHistory(e.kind,e.pubkey,r);if(t&&t.length>0&&t[0].created_at>=e.created_at)return rf.mergeDuplicateEvent(e,t[0]),t[0]}if(this.verifyEvent&&!1===this.verifyEvent(e))return null;const i=this.memory?.add(e);if(i&&i!==e)return rf.mergeDuplicateEvent(e,i),t&&Iu(i,t),i;const o=this.mapToMemory(this.database.add(e));if(e!==o&&rf.mergeDuplicateEvent(e,o),t&&Iu(o,t),o===e&&this.insert$.next(o),!this.keepOldVersions&&lu(e.kind)){const t=this.database.getReplaceableHistory(e.kind,e.pubkey,r);if(t&&t.length>0){const n=Array.from(t).filter(t=>t.created_atthis.mapToMemory(e)??e)}getByFilters(e){const t=this.database.getByFilters(e);return this.memory?t.map(e=>this.mapToMemory(e)):t}getTimeline(e){const t=this.database.getTimeline(e);return this.memory?t.map(e=>this.mapToMemory(e)):t}touch(e){return this.memory?.touch(e)}claim(e){return this.memory?.claim(e)}isClaimed(e){return this.memory?.isClaimed(e)??!1}removeClaim(e){return this.memory?.removeClaim(e)}clearClaim(e){return this.memory?.clearClaim(e)}unclaimed(){return this.memory?.unclaimed()||function*(){}()}prune(e){return this.memory?.prune(e)??0}removed(e){return this.checkDeleted(e)?jl:this.remove$.pipe(Sc(t=>t.id===e),Qc(1),kc(()=>jl))}updated(e){return this.update$.pipe(Sc(t=>t.id===e||t===e))}}function of(){let e,t;const n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n}"navigator"in globalThis&&navigator.userAgent.includes("Android")&&navigator.clipboard&&navigator.clipboard.readText;var sf,af;Ju(hi.NostrConnect,"nip44"),function(e){e.GetPublicKey="get_pubic_key",e.SignEvent="sign_event",e.Nip04Encrypt="nip04_encrypt",e.Nip04Decrypt="nip04_decrypt",e.Nip44Encrypt="nip44_encrypt",e.Nip44Decrypt="nip44_decrypt"}(sf||(sf={})),function(e){e.Connect="connect",e.CreateAccount="create_account",e.GetPublicKey="get_public_key",e.SignEvent="sign_event",e.Nip04Encrypt="nip04_encrypt",e.Nip04Decrypt="nip04_decrypt",e.Nip44Encrypt="nip44_encrypt",e.Nip44Decrypt="nip44_decrypt"}(af||(af={}));class lf{key;constructor(e){this.key=e||ci()}async getPublicKey(){return ui(this.key)}async signEvent(e){return di(e,this.key)}nip04={encrypt:async(e,t)=>hs.encrypt(this.key,e,t),decrypt:async(e,t)=>hs.decrypt(this.key,e,t)};nip44={encrypt:async(e,t)=>Fs.v2.encrypt(t,Fs.v2.utils.getConversationKey(this.key,e)),decrypt:async(e,t)=>Fs.v2.decrypt(t,Fs.v2.utils.getConversationKey(this.key,e))};static fromKey(e){return new lf(Mu(e))}}const cf="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0; +/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function uf(e,...t){if(!((n=e)instanceof Uint8Array||ArrayBuffer.isView(n)&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error("Uint8Array expected of length "+t+", got length="+e.length)}const df=(()=>"function"==typeof Uint8Array.from([]).toHex&&"function"==typeof Uint8Array.fromHex)(),ff=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function hf(e){if(uf(e),df)return e.toHex();let t="";for(let n=0;n=pf&&e<=gf?e-pf:e>=mf&&e<=yf?e-(mf-10):e>=wf&&e<=vf?e-(wf-10):void 0}function bf(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);if(df)return Uint8Array.fromHex(e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;t(e+t/Cf)/t,Qf={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar(e){const{n:t}=Bf,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-If*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),i=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),o=n,s=BigInt("0x100000000000000000000000000000000"),a=Sf(o*e,t),l=Sf(-r*e,t);let c=eh(e-a*n-l*i,t),u=eh(-a*r-l*o,t);const d=c>s,f=u>s;if(d&&(c=t-c),f&&(u=t-u),c>s||u>s)throw new Error("splitScalarEndo: Endomorphism failed, k="+e);return{k1neg:d,k1:c,k2neg:f,k2:u}}},Ff=32;function Df(e){const{a:t,b:n}=Bf,r=eh(e*e),i=eh(r*e);return eh(i+t*e+n)}const $f=Bf.a===kf;function Rf(e){if(!(e instanceof Pf))throw new TypeError("JacobianPoint expected")}class Pf{constructor(e,t,n){this.x=e,this.y=t,this.z=n}static fromAffine(e){if(!(e instanceof Nf))throw new TypeError("JacobianPoint#fromAffine: expected Point");return e.equals(Nf.ZERO)?Pf.ZERO:new Pf(e.x,e.y,If)}static toAffineBatch(e){const t=function(e,t=Bf.P){const n=new Array(e.length),r=e.reduce((e,r,i)=>r===kf?e:(n[i]=e,eh(e*r,t)),If),i=nh(r,t);return e.reduceRight((e,r,i)=>r===kf?e:(n[i]=eh(e*n[i],t),eh(e*r,t)),i),n}(e.map(e=>e.z));return e.map((e,n)=>e.toAffine(t[n]))}static normalizeZ(e){return Pf.toAffineBatch(e).map(Pf.fromAffine)}equals(e){Rf(e);const{x:t,y:n,z:r}=this,{x:i,y:o,z:s}=e,a=eh(r*r),l=eh(s*s),c=eh(t*l),u=eh(i*a),d=eh(eh(n*s)*l),f=eh(eh(o*r)*a);return c===u&&d===f}negate(){return new Pf(this.x,eh(-this.y),this.z)}double(){const{x:e,y:t,z:n}=this,r=eh(e*e),i=eh(t*t),o=eh(i*i),s=e+i,a=eh(Cf*(eh(s*s)-r-o)),l=eh(Ef*r),c=eh(l*l),u=eh(c-Cf*a),d=eh(l*(a-u)-xf*o),f=eh(Cf*t*n);return new Pf(u,d,f)}add(e){Rf(e);const{x:t,y:n,z:r}=this,{x:i,y:o,z:s}=e;if(i===kf||o===kf)return this;if(t===kf||n===kf)return e;const a=eh(r*r),l=eh(s*s),c=eh(t*l),u=eh(i*a),d=eh(eh(n*s)*l),f=eh(eh(o*r)*a),h=eh(u-c),p=eh(f-d);if(h===kf)return p===kf?this.double():Pf.ZERO;const g=eh(h*h),m=eh(h*g),y=eh(c*g),w=eh(p*p-m-Cf*y),v=eh(p*(y-w)-d*m),A=eh(r*s*h);return new Pf(w,v,A)}subtract(e){return this.add(e.negate())}multiplyUnsafe(e){const t=Pf.ZERO;if("bigint"==typeof e&&e===kf)return t;let n=Xf(e);if(n===If)return this;if(!$f){let e=t,r=this;for(;n>kf;)n&If&&(e=e.add(r)),r=r.double(),n>>=If;return e}let{k1neg:r,k1:i,k2neg:o,k2:s}=Qf.splitScalar(n),a=t,l=t,c=this;for(;i>kf||s>kf;)i&If&&(a=a.add(c)),s&If&&(l=l.add(c)),c=c.double(),i>>=If,s>>=If;return r&&(a=a.negate()),o&&(l=l.negate()),l=new Pf(eh(l.x*Qf.beta),l.y,l.z),a.add(l)}precomputeWindow(e){const t=$f?128/e+1:256/e+1,n=[];let r=this,i=r;for(let o=0;o>=u,s>a&&(s-=c,e+=If);const d=n,f=n+Math.abs(s)-1,h=t%2!=0,p=s<0;0===s?o=o.add(Tf(h,r[d])):i=i.add(Tf(p,r[f]))}return{p:i,f:o}}multiply(e,t){let n,r,i=Xf(e);if($f){const{k1neg:e,k1:o,k2neg:s,k2:a}=Qf.splitScalar(i);let{p:l,f:c}=this.wNAF(o,t),{p:u,f:d}=this.wNAF(a,t);l=Tf(e,l),u=Tf(s,u),u=new Pf(eh(u.x*Qf.beta),u.y,u.z),n=l.add(u),r=c.add(d)}else{const{p:e,f:o}=this.wNAF(i,t);n=e,r=o}return Pf.normalizeZ([n,r])[0]}toAffine(e){const{x:t,y:n,z:r}=this,i=this.equals(Pf.ZERO);null==e&&(e=i?xf:nh(r));const o=e,s=eh(o*o),a=eh(s*o),l=eh(t*s),c=eh(n*a),u=eh(r*o);if(i)return Nf.ZERO;if(u!==If)throw new Error("invZ was invalid");return new Nf(l,c)}}function Tf(e,t){const n=t.negate();return e?n:t}Pf.BASE=new Pf(Bf.Gx,Bf.Gy,If),Pf.ZERO=new Pf(kf,If,kf);const Uf=new WeakMap;class Nf{constructor(e,t){this.x=e,this.y=t}_setWindowSize(e){this._WINDOW_SIZE=e,Uf.delete(this)}hasEvenY(){return this.y%Cf===kf}static fromCompressedHex(e){const t=32===e.length,n=Wf(t?e:e.subarray(1));if(!ih(n))throw new Error("Point is not on curve");let r=function(e){const{P:t}=Bf,n=BigInt(6),r=BigInt(11),i=BigInt(22),o=BigInt(23),s=BigInt(44),a=BigInt(88),l=e*e*e%t,c=l*l*e%t,u=th(c,Ef)*c%t,d=th(u,Ef)*c%t,f=th(d,Cf)*l%t,h=th(f,r)*f%t,p=th(h,i)*h%t,g=th(p,s)*p%t,m=th(g,a)*g%t,y=th(m,s)*p%t,w=th(y,Ef)*c%t,v=th(w,o)*h%t,A=th(v,n)*l%t,b=th(A,Cf);if(b*b%t!==e)throw new Error("Cannot find square root");return b}(Df(n));const i=(r&If)===If;if(t)i&&(r=eh(-r));else{!(1&~e[0])!==i&&(r=eh(-r))}const o=new Nf(n,r);return o.assertValidity(),o}static fromUncompressedHex(e){const t=Wf(e.subarray(1,33)),n=Wf(e.subarray(33,65)),r=new Nf(t,n);return r.assertValidity(),r}static fromHex(e){const t=Zf(e),n=t.length,r=t[0];if(n===Ff)return this.fromCompressedHex(t);if(33===n&&(2===r||3===r))return this.fromCompressedHex(t);if(65===n&&4===r)return this.fromUncompressedHex(t);throw new Error(`Point.fromHex: received invalid point. Expected 32-33 compressed bytes or 65 uncompressed bytes, not ${n}`)}static fromPrivateKey(e){return Nf.BASE.multiply(function(e){let t;if("bigint"==typeof e)t=e;else if("number"==typeof e&&Number.isSafeInteger(e)&&e>0)t=BigInt(e);else if("string"==typeof e){if(64!==e.length)throw new Error("Expected 32 bytes of private key");t=Yf(e)}else{if(!Of(e))throw new TypeError("Expected valid private key");if(32!==e.length)throw new Error("Expected 32 bytes of private key");t=Wf(e)}if(!rh(t))throw new Error("Expected private key: 0 < key < n");return t}(e))}static fromSignature(e,t,n){const{r:r,s:i}=function(e){if(e instanceof _f)return e.assertValidity(),e;try{return _f.fromDER(e)}catch(t){return _f.fromCompact(e)}}(t);if(![0,1,2,3].includes(n))throw new Error("Cannot recover: invalid recovery bit");const o=function(e,t=!1){const n=function(e){const t=8*e.length-256,n=Wf(e);return t>0?n>>BigInt(t):n}(e);if(t)return n;const{n:r}=Bf;return n>=r?n-r:n}(Zf(e)),{n:s}=Bf,a=2===n||3===n?r+s:r,l=nh(a,s),c=eh(-o*l,s),u=eh(i*l,s),d=1&n?"03":"02",f=Nf.fromHex(d+zf(a)),h=Nf.BASE.multiplyAndAddUnsafe(f,c,u);if(!h)throw new Error("Cannot recover signature: point at infinify");return h.assertValidity(),h}toRawBytes(e=!1){return Kf(this.toHex(e))}toHex(e=!1){const t=zf(this.x);if(e){return`${this.hasEvenY()?"02":"03"}${t}`}return`04${t}${zf(this.y)}`}toHexX(){return this.toHex(!0).slice(2)}toRawX(){return this.toRawBytes(!0).slice(1)}assertValidity(){const e="Point is not on elliptic curve",{x:t,y:n}=this;if(!ih(t)||!ih(n))throw new Error(e);const r=eh(n*n);if(eh(r-Df(t))!==kf)throw new Error(e)}equals(e){return this.x===e.x&&this.y===e.y}negate(){return new Nf(this.x,eh(-this.y))}double(){return Pf.fromAffine(this).double().toAffine()}add(e){return Pf.fromAffine(this).add(Pf.fromAffine(e)).toAffine()}subtract(e){return this.add(e.negate())}multiply(e){return Pf.fromAffine(this).multiply(e,this).toAffine()}multiplyAndAddUnsafe(e,t,n){const r=Pf.fromAffine(this),i=t===kf||t===If||this!==Nf.BASE?r.multiplyUnsafe(t):r.multiply(t),o=Pf.fromAffine(e).multiplyUnsafe(n),s=i.add(o);return s.equals(Pf.ZERO)?void 0:s.toAffine()}}function Lf(e){return Number.parseInt(e[0],16)>=8?"00"+e:e}function Mf(e){if(e.length<2||2!==e[0])throw new Error(`Invalid signature integer tag: ${jf(e)}`);const t=e[1],n=e.subarray(2,t+2);if(!t||n.length!==t)throw new Error("Invalid signature integer: wrong length");if(0===n[0]&&n[1]<=127)throw new Error("Invalid signature integer: trailing length");return{data:Wf(n),left:e.subarray(t+2)}}Nf.BASE=new Nf(Bf.Gx,Bf.Gy),Nf.ZERO=new Nf(kf,kf);class _f{constructor(e,t){this.r=e,this.s=t,this.assertValidity()}static fromCompact(e){const t=Of(e),n="Signature.fromCompact";if("string"!=typeof e&&!t)throw new TypeError(`${n}: Expected string or Uint8Array`);const r=t?jf(e):e;if(128!==r.length)throw new Error(`${n}: Expected 64-byte hex`);return new _f(Yf(r.slice(0,64)),Yf(r.slice(64,128)))}static fromDER(e){const t=Of(e);if("string"!=typeof e&&!t)throw new TypeError("Signature.fromDER: Expected string or Uint8Array");const{r:n,s:r}=function(e){if(e.length<2||48!=e[0])throw new Error(`Invalid signature tag: ${jf(e)}`);if(e[1]!==e.length-2)throw new Error("Invalid signature: incorrect length");const{data:t,left:n}=Mf(e.subarray(2)),{data:r,left:i}=Mf(n);if(i.length)throw new Error(`Invalid signature: left bytes after parsing: ${jf(i)}`);return{r:t,s:r}}(t?e:Kf(e));return new _f(n,r)}static fromHex(e){return this.fromDER(e)}assertValidity(){const{r:e,s:t}=this;if(!rh(e))throw new Error("Invalid Signature: r must be 0 < r < n");if(!rh(t))throw new Error("Invalid Signature: s must be 0 < s < n")}hasHighS(){const e=Bf.n>>If;return this.s>e}normalizeS(){return this.hasHighS()?new _f(this.r,eh(-this.s,Bf.n)):this}toDERRawBytes(){return Kf(this.toDERHex())}toDERHex(){const e=Lf(qf(this.s)),t=Lf(qf(this.r)),n=e.length/2,r=t.length/2,i=qf(n),o=qf(r);return`30${qf(r+n+4)}02${o}${t}02${i}${e}`}toRawBytes(){return this.toDERRawBytes()}toHex(){return this.toDERHex()}toCompactRawBytes(){return Kf(this.toCompactHex())}toCompactHex(){return zf(this.r)+zf(this.s)}}function Of(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&"Uint8Array"===e.constructor.name}const Hf=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function jf(e){!function(e){if(!Of(e))throw new Error("Uint8Array expected")}(e);let t="";for(let n=0;n=Gf._0&&e<=Gf._9?e-Gf._0:e>=Gf.A&&e<=Gf.F?e-(Gf.A-10):e>=Gf.a&&e<=Gf.f?e-(Gf.a-10):void 0}function Kf(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;t0)return BigInt(e);if("bigint"==typeof e&&rh(e))return e;throw new TypeError("Expected valid private scalar: 0 < scalar < curve.n")}function eh(e,t=Bf.P){const n=e%t;return n>=kf?n:t+n}function th(e,t){const{P:n}=Bf;let r=e;for(;t-- >kf;)r*=r,r%=n;return r}function nh(e,t=Bf.P){if(e===kf||t<=kf)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=eh(e,t),r=t,i=kf,o=If;for(;n!==kf;){const e=r%n,t=i-o*(r/n);r=n,n=e,i=o,o=t}if(r!==If)throw new Error("invert: does not exist");return eh(i,t)}function rh(e){return kf"string"==typeof e):t.every(e=>Number.isSafeInteger(e))))}function ah(e,t){if("string"!=typeof t)throw new Error(`${e}: string expected`);return!0}function lh(e){if(!Number.isSafeInteger(e))throw new Error(`invalid integer: ${e}`)}function ch(e){if(!Array.isArray(e))throw new Error("array expected")}function uh(e,t){if(!sh(!0,t))throw new Error(`${e}: array of strings expected`)}Nf.BASE._setWindowSize(8);const dh=(e,t)=>0===t?e:dh(t,e%t),fh=(e,t)=>e+(t-dh(e,t)),hh=(()=>{let e=[];for(let t=0;t<40;t++)e.push(2**t);return e})();function ph(e,t,n,r){if(ch(e),t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(fh(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${fh(t,n)}`);let i=0,o=0;const s=hh[t],a=hh[n]-1,l=[];for(const r of e){if(lh(r),r>=s)throw new Error(`convertRadix2: invalid data word=${r} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${o} from=${t}`);for(o+=t;o>=n;o-=n)l.push((i>>o-n&a)>>>0);const e=hh[o];if(void 0===e)throw new Error("invalid carry");i&=e-1}if(i=i<=t)throw new Error("Excess padding");if(!r&&i>0)throw new Error(`Non-zero padding: ${i}`);return r&&o>0&&l.push(i>>>0),l}const gh=(()=>"function"==typeof Uint8Array.from([]).toBase64&&"function"==typeof Uint8Array.fromBase64)()?{encode:e=>(function(e,...t){if(!oh(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error("Uint8Array expected of length "+t+", got length="+e.length)}(e),e.toBase64()),decode:e=>((e,t)=>{ah("base64",e);const n=t?/^[A-Za-z0-9=_-]+$/:/^[A-Za-z0-9=+/]+$/,r=t?"base64url":"base64";if(e.length>0&&!n.test(e))throw new Error("invalid base64");return Uint8Array.fromBase64(e,{alphabet:r,lastChunkHandling:"strict"})})(e,!1)}:function(...e){const t=e=>e,n=(e,t)=>n=>e(t(n));return{encode:e.map(e=>e.encode).reduceRight(n,t),decode:e.map(e=>e.decode).reduce(n,t)}}(function(e,t=!1){if(lh(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(fh(8,e)>32||fh(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!oh(n))throw new Error("radix2.encode input should be Uint8Array");return ph(Array.from(n),8,e,!t)},decode:n=>(function(e,t){if(!sh(!1,t))throw new Error(`${e}: array of numbers expected`)}("radix2.decode",n),Uint8Array.from(ph(n,e,8,t)))}}(6),function(e){const t="string"==typeof e?e.split(""):e,n=t.length;uh("alphabet",t);const r=new Map(t.map((e,t)=>[e,t]));return{encode:r=>(ch(r),r.map(r=>{if(!Number.isSafeInteger(r)||r<0||r>=n)throw new Error(`alphabet.encode: digit index outside alphabet "${r}". Allowed: ${e}`);return t[r]})),decode:t=>(ch(t),t.map(t=>{ah("alphabet.decode",t);const n=r.get(t);if(void 0===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),function(e,t="="){return lh(e),ah("padding",t),{encode(n){for(uh("padding.encode",n);n.length*e%8;)n.push(t);return n},decode(n){uh("padding.decode",n);let r=n.length;if(r*e%8)throw new Error("padding: invalid, string should have whole number of bytes");for(;r>0&&n[r-1]===t;r--){if((r-1)*e%8==0)throw new Error("padding: invalid, string has too much padding")}return n.slice(0,r)}}}(6),function(e=""){return ah("join",e),{encode:t=>(uh("join.decode",t),t.join(e)),decode:t=>(ah("join.decode",t),t.split(e))}}(""));function mh(e){return Nf.fromHex(e).toHex().substring(2)}const yh=new TextDecoder("utf-8"),wh=new TextEncoder;class vh{log=dd.extend("SerialPortSigner");writer=null;pubkey;get isConnected(){return!!this.writer}verifyEvent=fi;nip04;constructor(){this.nip04={encrypt:this.nip04Encrypt.bind(this),decrypt:this.nip04Decrypt.bind(this)}}lastCommand=null;async callMethodOnDevice(e,t,n={}){if(!vh.SUPPORTED)throw new Error("Serial devices are not supported");if(this.writer||await this.connectToDevice(n),this.lastCommand)throw new Error("Previous command to device still pending!");const r=of();return this.lastCommand=r,this.sendCommand(e,t),setTimeout(()=>{r.reject(new Error("Device timeout")),this.lastCommand===r&&(this.lastCommand=null)},6e3),this.lastCommand}async connectToDevice({onConnect:e,onDisconnect:t,onError:n,onDone:r}){let i,o=await window.navigator.serial.requestPort();await o.open({baudRate:9600}),await(e=>new Promise(t=>setTimeout(t,e)))(1e3),(async()=>{for(;o&&o.readable;){const e=new window.TextDecoderStream;o.readable.pipeTo(e.writable),i=e.readable.getReader();const t=this.readFromSerialPort(i);try{for(;;){const{value:e,done:n}=await t("\n");if(e){const{method:t,data:n}=this.parseResponse(e);if("/ping"===t&&this.log("Pong"),-1===vh.PUBLIC_METHODS.indexOf(t))continue;this.log("Received: ",t,n),this.lastCommand&&(this.lastCommand.resolve(n),this.lastCommand=null)}if(n)return this.lastCommand=null,this.writer=null,void(r&&r())}}catch(e){if(e instanceof Error)throw this.writer=null,n&&n(e),this.lastCommand&&(this.lastCommand.reject(e),this.lastCommand=null),e}}})();const s=new window.TextEncoderStream;s.readable.pipeTo(o.writable),this.writer=s.writable.getWriter(),await this.sendCommand(vh.METHOD_PING),await this.sendCommand(vh.METHOD_PING,[window.location.host]),e&&e(),o.addEventListener("disconnect",()=>{this.log("Disconnected"),this.lastCommand=null,this.writer=null,t&&t()})}async sendCommand(e,t=[]){if(!this.writer)return;this.log("Send command",e,t);const n=[e].concat(t).join(" ");await this.writer.write(n+"\n")}readFromSerialPort(e){let t,n=[];return async(r="\n")=>{if(n.length)return{value:n.shift().trim(),done:!1};const i=[];for(t&&(i.push(t),t=void 0);;){const{value:o,done:s}=await e.read();if(o){const e=o.split(r);if(e.length>1)return i.push(e.shift()),t=e.pop(),n=e,{value:i.join("").trim(),done:!1};i.push(o)}if(s)return{value:i.join("").trim(),done:!0}}}}parseResponse(e){const t=e.split(" ")[0];return{method:t,data:e.substring(t.length).trim()}}async nip04Encrypt(e,t){const n=bf(await this.callMethodOnDevice(vh.METHOD_SHARED_SECRET,[mh(e)]));let r=Uint8Array.from(function(e=32){if(cf&&"function"==typeof cf.getRandomValues)return cf.getRandomValues(new Uint8Array(e));if(cf&&"function"==typeof cf.randomBytes)return Uint8Array.from(cf.randomBytes(e));throw new Error("crypto.getRandomValues must be defined")}(16)),i=wh.encode(t),o=await crypto.subtle.importKey("raw",n,{name:"AES-CBC"},!1,["encrypt"]),s=await crypto.subtle.encrypt({name:"AES-CBC",iv:r},o,i);return`${gh.encode(new Uint8Array(s))}?iv=${gh.encode(new Uint8Array(r.buffer))}`}async nip04Decrypt(e,t){let[n,r]=t.split("?iv=");const i=bf(await this.callMethodOnDevice(vh.METHOD_SHARED_SECRET,[mh(e)]));let o=await crypto.subtle.importKey("raw",i,{name:"AES-CBC"},!1,["decrypt"]),s=gh.decode(n),a=gh.decode(r),l=await crypto.subtle.decrypt({name:"AES-CBC",iv:a},o,s);return yh.decode(l)}async getPublicKey(){const e=await this.callMethodOnDevice(vh.METHOD_PUBLIC_KEY,[]);return this.pubkey=e,e}async restore(e){await this.callMethodOnDevice(vh.METHOD_RESTORE,[hf(e)])}async signEvent(e){const t=e.pubkey||this.pubkey;if(!t)throw new Error("Unknown signer pubkey");const n={...e,id:ai({...e,pubkey:t})},r=await this.callMethodOnDevice(vh.METHOD_SIGN_MESSAGE,[n.id]),i={...n,sig:r,pubkey:t};if(!this.verifyEvent(i))throw new Error("Invalid signature");return i}ping(){this.sendCommand(vh.METHOD_PING,[window.location.host])}static SUPPORTED="navigator"in globalThis&&!!navigator.serial;static METHOD_PING="/ping";static METHOD_LOG="/log";static METHOD_SIGN_MESSAGE="/sign-message";static METHOD_SHARED_SECRET="/shared-secret";static METHOD_PUBLIC_KEY="/public-key";static METHOD_RESTORE="/restore";static PUBLIC_METHODS=[vh.METHOD_PUBLIC_KEY,vh.METHOD_SIGN_MESSAGE,vh.METHOD_SHARED_SECRET,vh.METHOD_RESTORE]}const Ah=[`${window.location.protocol.startsWith("https")?"wss:":"ws:"}//${window.location.host}/`],bh=[{value:0,label:"User Metadata (0)"},{value:3,label:"Follows (3)"},{value:1e4,label:"Mute list (10000)"},{value:10001,label:"Pin list (10001)"},{value:10002,label:"Relay List Metadata (10002)"},{value:10003,label:"Bookmark list (10003)"},{value:10004,label:"Communities list (10004)"},{value:10005,label:"Public chats list (10005)"},{value:10006,label:"Blocked relays list (10006)"},{value:10007,label:"Search relays list (10007)"},{value:10009,label:"User groups (10009)"},{value:10012,label:"Favorite relays list (10012)"},{value:10013,label:"Private event relay list (10013)"},{value:10015,label:"Interests list (10015)"},{value:10019,label:"Nutzap Mint Recommendation (10019)"},{value:10020,label:"Media follows (10020)"},{value:10030,label:"User emoji list (10030)"},{value:10050,label:"Relay list to receive DMs (10050)"},{value:10051,label:"KeyPackage Relays List (10051)"},{value:10063,label:"User server list (10063)"},{value:10096,label:"File storage server list (10096)"},{value:10166,label:"Relay Monitor Announcement (10166)"},{value:10312,label:"Room Presence (10312)"},{value:10377,label:"Proxy Announcement (10377)"},{value:11111,label:"Transport Method Announcement (11111)"},{value:13194,label:"Wallet Info (13194)"},{value:17375,label:"Cashu Wallet Event (17375)"},{value:3e4,label:"Follow sets (30000)"},{value:30001,label:"Generic lists (30001)"},{value:30002,label:"Relay sets (30002)"},{value:30003,label:"Bookmark sets (30003)"},{value:30004,label:"Curation sets (30004)"},{value:30005,label:"Video sets (30005)"},{value:30007,label:"Kind mute sets (30007)"},{value:30008,label:"Profile Badges (30008)"},{value:30009,label:"Badge Definition (30009)"},{value:30015,label:"Interest sets (30015)"},{value:30017,label:"Create or update a stall (30017)"},{value:30018,label:"Create or update a product (30018)"},{value:30019,label:"Marketplace UI/UX (30019)"},{value:30020,label:"Product sold as an auction (30020)"},{value:30023,label:"Long-form Content (30023)"},{value:30024,label:"Draft Long-form Content (30024)"},{value:30030,label:"Emoji sets (30030)"},{value:30040,label:"Curated Publication Index (30040)"},{value:30041,label:"Curated Publication Content (30041)"},{value:30063,label:"Release artifact sets (30063)"},{value:30078,label:"Application-specific Data (30078)"},{value:30166,label:"Relay Discovery (30166)"},{value:30267,label:"App curation sets (30267)"},{value:30311,label:"Live Event (30311)"},{value:30312,label:"Interactive Room (30312)"},{value:30313,label:"Conference Event (30313)"},{value:30315,label:"User Statuses (30315)"},{value:30388,label:"Slide Set (30388)"},{value:30402,label:"Classified Listing (30402)"},{value:30403,label:"Draft Classified Listing (30403)"},{value:30617,label:"Repository announcements (30617)"},{value:30618,label:"Repository state announcements (30618)"},{value:30818,label:"Wiki article (30818)"},{value:30819,label:"Redirects (30819)"},{value:31234,label:"Draft Event (31234)"},{value:31388,label:"Link Set (31388)"},{value:31890,label:"Feed (31890)"},{value:31922,label:"Date-Based Calendar Event (31922)"},{value:31923,label:"Time-Based Calendar Event (31923)"},{value:31924,label:"Calendar (31924)"},{value:31925,label:"Calendar Event RSVP (31925)"},{value:31989,label:"Handler recommendation (31989)"},{value:31990,label:"Handler information (31990)"},{value:32267,label:"Software Application (32267)"},{value:34550,label:"Community Definition (34550)"},{value:37516,label:"Geocache listing (37516)"},{value:38172,label:"Cashu Mint Announcement (38172)"},{value:38173,label:"Fedimint Announcement (38173)"},{value:38383,label:"Peer-to-peer Order events (38383)"},{value:39089,label:"Starter packs (39089)"},{value:39092,label:"Media starter packs (39092)"},{value:39701,label:"Web bookmarks (39701)"}],kh={0:"User Metadata",1:"Short Text Note",2:"Recommend Relay",3:"Follows",4:"Encrypted Direct Messages",5:"Event Deletion Request",6:"Repost",7:"Reaction",8:"Badge Award",9:"Chat Message",10:"Group Chat Threaded Reply",11:"Thread",12:"Group Thread Reply",13:"Seal",14:"Direct Message",15:"File Message",16:"Generic Repost",17:"Reaction to a website",20:"Picture",40:"Channel Creation",41:"Channel Metadata",42:"Channel Message",43:"Channel Hide Message",44:"Channel Mute User",1021:"Bid",1022:"Bid Confirmation",1040:"OpenTimestamps",1063:"File Metadata",1311:"Live Chat Message",1971:"Problem Tracker",1984:"Reporting",1985:"Label",4550:"Community Post Approval",5e3:"Job Request",5999:"Job Request",6e3:"Job Result",6999:"Job Result",7e3:"Job Feedback",9041:"Zap Goal",9734:"Zap Request",9735:"Zap",9882:"Highlights",1e4:"Mute list",10001:"Pin list",10002:"Relay List Metadata",10003:"Bookmarks list",10004:"Communities list",10005:"Public Chats list",10006:"Blocked Relays list",10007:"Search Relays list",10015:"Interests",10030:"User Emoji list",10050:"DM relays",10096:"File Storage Server List",13194:"Wallet Service Info",21e3:"Lightning pub RPC",22242:"Client Authentication",23194:"Wallet Request",23195:"Wallet Response",23196:"Wallet Notification",23197:"Wallet Notification",24133:"Nostr Connect",27235:"HTTP Auth",3e4:"Follow sets",30001:"Generic lists",30002:"Relay sets",30003:"Bookmark sets",30004:"Curation sets",30008:"Profile Badges",30009:"Badge Definition",30015:"Interest sets",30017:"Stall Definition",30018:"Product Definition",30019:"Marketplace UI/UX",30020:"Product sold as an auction",30023:"Long-form Content",30024:"Draft Long-form Content",30030:"Emoji sets",30078:"Application-specific Data",30311:"Live Event",30315:"User Statuses",30402:"Classified Listing",30403:"Draft Classified Listing",31922:"Date-Based Calendar Event",31923:"Time-Based Calendar Event",31924:"Calendar",31925:"Calendar Event RSVP",31989:"Handler recommendation",31990:"Handler information",34235:"Video Event Horizontal",34236:"Video Event Vertical",34550:"Community Definition"},Ih=3e5;class Ch{constructor(){this.pool=new Tn,this.eventStore=new rf,this.isConnected=!1,this.signer=null,this.relays=[...Ah]}async connect(){console.log("Starting connection to",this.relays.length,"relays...");try{this.isConnected=!0,console.log("✓ Successfully initialized relay pool"),await new Promise(e=>setTimeout(e,1e3))}catch(e){throw console.error("✗ Connection failed:",e),e}}async connectToRelay(e){console.log(`Adding relay: ${e}`);try{return this.relays.includes(e)||this.relays.push(e),console.log(`✓ Successfully added relay ${e}`),!0}catch(t){return console.error(`✗ Failed to add relay ${e}:`,t),!1}}subscribe(e,t){console.log("Creating subscription with filters:",e);const n=this.pool.subscribeMany(this.relays,e,{onevent(e){console.log("Event received:",e),t(e)},oneose(){console.log("EOSE received"),window.dispatchEvent(new CustomEvent("nostr-eose",{detail:{subscriptionId:n.id}}))}});return n}unsubscribe(e){console.log("Closing subscription"),e&&e.close&&e.close()}disconnect(){console.log("Disconnecting relay pool"),this.pool&&this.pool.close(this.relays),this.isConnected=!1}async publish(e,t=null){this.isConnected||(console.warn("Not connected to any relays, attempting to connect first"),await this.connect());try{const n=t||this.relays,r=this.pool.publish(n,e);return await Promise.allSettled(r),console.log("✓ Event published successfully"),await Dh([e]),console.log("Event stored in IndexedDB"),{success:!0,okCount:1,errorCount:0}}catch(e){throw console.error("✗ Failed to publish event:",e),e}}getPool(){return this.pool}getEventStore(){return this.eventStore}getSigner(){return this.signer}setSigner(e){this.signer=e}}const Eh=new Ch,xh="nostrCache",Bh=2,Sh="events";function Qh(){return new Promise((e,t)=>{try{const n=indexedDB.open(xh,Bh);n.onupgradeneeded=e=>{const t=n.result;e.oldVersion;let r;r=t.objectStoreNames.contains(Sh)?n.transaction.objectStore(Sh):t.createObjectStore(Sh,{keyPath:"id"}),r.indexNames.contains("byKindAuthor")||r.createIndex("byKindAuthor",["kind","pubkey"],{unique:!1}),r.indexNames.contains("byKindAuthorCreated")||r.createIndex("byKindAuthorCreated",["kind","pubkey","created_at"],{unique:!1}),r.indexNames.contains("byKind")||r.createIndex("byKind","kind",{unique:!1}),r.indexNames.contains("byAuthor")||r.createIndex("byAuthor","pubkey",{unique:!1}),r.indexNames.contains("byCreatedAt")||r.createIndex("byCreatedAt","created_at",{unique:!1})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)}catch(e){console.error("Failed to open IndexedDB",e),t(e)}})}async function Fh(e){try{const t=await Qh();await new Promise((n,r)=>{const i=t.transaction(Sh,"readwrite");i.oncomplete=()=>n(),i.onerror=()=>r(i.error),i.objectStore(Sh).put(e)})}catch(e){console.warn("IDB putEvent failed",e)}}async function Dh(e){if(e&&0!==e.length)try{const t=await Qh();await new Promise((n,r)=>{const i=t.transaction(Sh,"readwrite");i.oncomplete=()=>n(),i.onerror=()=>r(i.error);const o=i.objectStore(Sh);for(const t of e)o.put(t)}),console.log(`Stored ${e.length} events in IndexedDB`)}catch(e){console.warn("IDB putEvents failed",e)}}async function $h(e){try{const t=await Qh(),n=[];console.log("QueryEventsFromDB: Starting query with filters:",e);for(const r of e){console.log("QueryEventsFromDB: Processing filter:",r);const e=await new Promise((e,n)=>{const i=t.transaction(Sh,"readonly").objectStore(Sh),o=[];let s;if(r.kinds&&r.kinds.length>0&&r.authors&&r.authors.length>0){const e=r.kinds[0],t=r.authors[0];console.log(`QueryEventsFromDB: Using byKindAuthorCreated index for kind=${e}, author=${t.substring(0,8)}...`);const n=i.index("byKindAuthorCreated"),o=IDBKeyRange.bound([e,t,-1/0],[e,t,1/0]);s=n.openCursor(o,"prev")}else if(r.kinds&&r.kinds.length>0){console.log(`QueryEventsFromDB: Using byKind index for kind=${r.kinds[0]}`);const e=i.index("byKind");s=e.openCursor(IDBKeyRange.only(r.kinds[0]))}else if(r.authors&&r.authors.length>0){console.log(`QueryEventsFromDB: Using byAuthor index for author=${r.authors[0].substring(0,8)}...`);const e=i.index("byAuthor");s=e.openCursor(IDBKeyRange.only(r.authors[0]))}else console.log("QueryEventsFromDB: Scanning all events (no specific index)"),s=i.openCursor();s.onsuccess=t=>{const n=t.target.result;if(n){const t=n.value;let i=!0;if(r.kinds&&r.kinds.length>0&&!r.kinds.includes(t.kind)&&(i=!1),r.authors&&r.authors.length>0&&!r.authors.includes(t.pubkey)&&(i=!1),r.since&&t.created_atr.until&&(i=!1),r.ids&&r.ids.length>0&&!r.ids.includes(t.id)&&(i=!1),i&&o.push(t),r.limit&&o.length>=r.limit)return console.log(`QueryEventsFromDB: Reached limit of ${r.limit}, found ${o.length} matching events`),void e(o);n.continue()}else console.log(`QueryEventsFromDB: Cursor exhausted, found ${o.length} matching events`),e(o)},s.onerror=()=>{console.error("QueryEventsFromDB: Cursor error:",s.error),n(s.error)}});console.log(`QueryEventsFromDB: Found ${e.length} events for this filter`),n.push(...e)}return n.sort((e,t)=>t.created_at-e.created_at),console.log(`QueryEventsFromDB: Returning ${n.length} total events`),n}catch(e){return console.error("QueryEventsFromDB failed:",e),[]}}function Rh(e){try{const t=JSON.parse(e.content||"{}");return{name:t.name||t.display_name||"",picture:t.picture||"",banner:t.banner||"",about:t.about||"",nip05:t.nip05||"",lud16:t.lud16||t.lud06||""}}catch(e){return{name:"",picture:"",banner:"",about:"",nip05:"",lud16:""}}}async function Ph(e){console.log(`Starting profile fetch for pubkey: ${e}`);try{const t=await async function(e){try{const t=await Qh();return await new Promise((n,r)=>{const i=t.transaction(Sh,"readonly").objectStore(Sh).index("byKindAuthorCreated"),o=IDBKeyRange.bound([0,e,-1/0],[0,e,1/0]),s=i.openCursor(o,"prev");s.onsuccess=()=>{const e=s.result;n(e?e.value:null)},s.onerror=()=>r(s.error)})}catch(e){return console.warn("IDB getLatestProfileEvent failed",e),null}}(e);if(t){console.log("Using cached profile event");return Rh(t)}}catch(e){console.warn("Failed to load cached profile",e)}try{const t=[{kinds:[0],authors:[e],limit:1}],n=await Uh(t,{timeout:1e4});if(n.length>0){const t=n[0];console.log("Profile fetched:",t),await Fh(t);try{console.log("Publishing profile event to local relay:",t.id),await Eh.publish(t),console.log("Profile event successfully saved to local relay")}catch(e){console.warn("Failed to publish profile to local relay:",e)}const r=Rh(t);try{"undefined"!=typeof window&&window.dispatchEvent&&window.dispatchEvent(new CustomEvent("profile-updated",{detail:{pubkey:e,profile:r,event:t}}))}catch(e){console.warn("Failed to dispatch profile-updated event",e)}return r}return console.log("No profile found for pubkey, creating default:",e),await Th(e)}catch(t){console.error("Failed to fetch profile:",t);try{return await Th(e)}catch(e){return console.error("Failed to create default profile:",e),null}}}async function Th(e){const t=`testuser${e.slice(0,6)}`,n=`${window.location.origin}/orly.png`,r={name:t,display_name:t,picture:n,about:"New ORLY user"},i={name:t,displayName:t,picture:n,about:"New ORLY user",pubkey:e};if(Eh.signer)try{const e={kind:0,content:JSON.stringify(r),tags:[],created_at:Math.floor(Date.now()/1e3)},t=await Eh.signer.signEvent(e);await Eh.publish(t),console.log("Default profile published:",t.id)}catch(e){console.warn("Failed to publish default profile:",e)}return i}async function Uh(e,t={}){console.log("Starting event fetch with filters:",JSON.stringify(e,null,2)),console.log("Current relays:",Eh.relays),Eh.isConnected&&0!==Eh.relays.length||(console.warn("Client not connected, initializing..."),await Mh());const{timeout:n=3e4,useCache:r=!0}=t;if(r)try{const t=await $h(e);t.length>0&&console.log(`Found ${t.length} cached events in IndexedDB`)}catch(e){console.warn("Failed to query cached events",e)}return new Promise((t,r)=>{const i=[],o=setTimeout(()=>{console.log(`Timeout reached after ${n}ms, returning ${i.length} events`),sub.close(),i.length>0&&Dh(i).catch(e=>console.warn("Failed to cache events",e)),t(i)},n);try{const n=Math.random().toString(36).substring(7);console.log(`📤 REQ [${n}]:`,JSON.stringify(["REQ",n,...e],null,2));const r=Eh.pool.subscribeMany(Eh.relays,e,{onevent(e){console.log(`📥 EVENT received for REQ [${n}]:`,{id:e.id?.substring(0,8)+"...",kind:e.kind,pubkey:e.pubkey?.substring(0,8)+"...",created_at:e.created_at,content_preview:e.content?.substring(0,50)}),i.push(e),Fh(e).catch(e=>console.warn("Failed to cache event",e))},oneose(){console.log(`✅ EOSE received for REQ [${n}], got ${i.length} events`),clearTimeout(o),r.close(),i.length>0&&Dh(i).catch(e=>console.warn("Failed to cache events",e)),t(i)}})}catch(e){clearTimeout(o),console.error("Failed to fetch events:",e),r(e)}})}async function Nh(e,t={}){const{timeout:n=1e4}=t;console.log(`Fetching event by ID: ${e}`);try{const t=[{ids:[e]}];console.log("Fetching event with filters:",t);const r=await Uh(t,{timeout:n});return console.log(`Fetched ${r.length} events`),r.length>0?r[0]:null}catch(e){throw console.error("Failed to fetch event by ID:",e),e}}async function Lh(e,t={}){const{timeout:n=1e4}=t;console.log(`Fetching delete events for target: ${e}`);try{const t=[{kinds:[5],"#e":[e]}];console.log("Fetching delete events with filters:",t);const r=await Uh(t,{timeout:n});return console.log(`Fetched ${r.length} delete events`),r}catch(e){throw console.error("Failed to fetch delete events:",e),e}}async function Mh(){await Eh.connect()}async function _h(e,t={}){const{timeout:n=3e4,cacheFirst:r=!0,cacheOnly:i=!1}=t;let o=[];if(r||i)try{if(o=await $h(e),console.log(`Found ${o.length} events in cache`),i||o.length>0)return o}catch(e){console.warn("Failed to query cache",e)}if(!i){const t=await Uh(e,{timeout:n,useCache:!1});return console.log(`Fetched ${t.length} events from relay`),t}return o}async function Oh(){try{const e=await Qh(),t=e.transaction(Sh,"readonly").objectStore(Sh),n=await new Promise((e,n)=>{const r=t.getAll();r.onsuccess=()=>e(r.result),r.onerror=()=>n(r.error)}),r=n.reduce((e,t)=>(e[t.kind]=(e[t.kind]||0)+1,e),{});return console.log("===== IndexedDB Contents ====="),console.log(`Total events: ${n.length}`),console.log("Events by kind:",r),console.log("Kind 0 events:",n.filter(e=>0===e.kind)),console.log("All event IDs:",n.map(e=>({id:e.id.substring(0,8),kind:e.kind,pubkey:e.pubkey.substring(0,8)}))),console.log("=============================="),{total:n.length,byKind:r,events:n}}catch(e){return console.error("Failed to debug IndexedDB:",e),null}} /*! * hash-wasm (https://www.npmjs.com/package/hash-wasm) * (c) Dani Biro * @license MIT - */function Up(e,t,n,r){return new(n||(n=Promise))(function(i,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(s,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class Rp{constructor(){this.mutex=Promise.resolve()}lock(){let e=()=>{};return this.mutex=this.mutex.then(()=>new Promise(e)),new Promise(t=>{e=t})}dispatch(e){return Up(this,void 0,void 0,function*(){const t=yield this.lock();try{return yield Promise.resolve(e())}finally{t()}})}}var Tp;const Pp="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Np=null!==(Tp=Pp.Buffer)&&void 0!==Tp?Tp:null,Op=Pp.TextEncoder?new Pp.TextEncoder:null;function Lp(e,t){return(15&e)+(e>>6|e>>3&8)<<4|(15&t)+(t>>6|t>>3&8)}function Mp(e,t){const n=t.length>>1;for(let r=0;r>>4;e[r++]=n>9?n+_p:n+jp,n=15&t[i],e[r++]=n>9?n+_p:n+jp}return String.fromCharCode.apply(null,e)}const Gp=null!==Np?e=>{if("string"==typeof e){const t=Np.from(e,"utf8");return new Uint8Array(t.buffer,t.byteOffset,t.length)}if(Np.isBuffer(e))return new Uint8Array(e.buffer,e.byteOffset,e.length);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Invalid data type!")}:e=>{if("string"==typeof e)return Op.encode(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Invalid data type!")},Jp="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Kp=new Uint8Array(256);for(let e=0;e<64;e++)Kp[Jp.charCodeAt(e)]=e;function Vp(e,t=!0){const n=e.length,r=n%3,i=[],o=n-r;for(let t=0;t>18&63)+Jp.charAt(n>>12&63)+Jp.charAt(n>>6&63)+Jp.charAt(63&n);i.push(r)}if(1===r){const r=e[n-1],o=Jp.charAt(r>>2),s=Jp.charAt(r<<4&63);i.push(`${o}${s}`),t&&i.push("==")}else if(2===r){const r=(e[n-2]<<8)+e[n-1],o=Jp.charAt(r>>10),s=Jp.charAt(r>>4&63),a=Jp.charAt(r<<2&63);i.push(`${o}${s}${a}`),t&&i.push("=")}return i.join("")}function qp(e){const t=function(e){let t=Math.floor(.75*e.length);const n=e.length;return"="===e[n-1]&&(t-=1,"="===e[n-2]&&(t-=1)),t}(e),n=e.length,r=new Uint8Array(t);let i=0;for(let t=0;t>4,i+=1,r[i]=(15&o)<<4|s>>2,i+=1,r[i]=(3&s)<<6|63&a,i+=1}return r}const Yp=16384,Wp=new Rp,zp=new Map;function Zp(e,t){return Up(this,void 0,void 0,function*(){let n=null,r=null,i=!1;if("undefined"==typeof WebAssembly)throw new Error("WebAssembly is not supported in this environment!");const o=()=>new DataView(n.exports.memory.buffer).getUint32(n.exports.STATE_SIZE,!0),s=Wp.dispatch(()=>Up(this,void 0,void 0,function*(){if(!zp.has(e.name)){const t=qp(e.data),n=WebAssembly.compile(t);zp.set(e.name,n)}const t=yield zp.get(e.name);n=yield WebAssembly.instantiate(t,{})})),a=(e=null)=>{i=!0,n.exports.Hash_Init(e)},l=e=>{if(!i)throw new Error("update() called before init()");(e=>{let t=0;for(;t{if(!i)throw new Error("digest() called before init()");return i=!1,n.exports.Hash_Final(o),"binary"===e?r.slice(0,t):Hp(c,r,t)},d=e=>"string"==typeof e?e.length<4096:e.byteLength!0;break;case"blake2b":case"blake2s":f=(e,t)=>t<=512&&d(e);break;case"blake3":f=(e,t)=>0===t&&d(e);break;case"xxhash64":case"xxhash3":case"xxhash128":case"crc64":f=()=>!1}return yield(()=>Up(this,void 0,void 0,function*(){n||(yield s);const e=n.exports.Hash_GetBuffer(),t=n.exports.memory.buffer;r=new Uint8Array(t,e,Yp)}))(),{getMemory:()=>r,writeMemory:(e,t=0)=>{r.set(e,t)},getExports:()=>n.exports,setMemorySize:e=>{n.exports.Hash_SetMemorySize(e);const t=n.exports.Hash_GetBuffer(),i=n.exports.memory.buffer;r=new Uint8Array(i,t,e)},init:a,update:l,digest:u,save:()=>{if(!i)throw new Error("save() can only be called after init() and before digest()");const t=n.exports.Hash_GetState(),r=o(),s=n.exports.memory.buffer,a=new Uint8Array(s,t,r),l=new Uint8Array(4+r);return Mp(l,e.hash),l.set(a,4),l},load:t=>{if(!(t instanceof Uint8Array))throw new Error("load() expects an Uint8Array generated by save()");const r=n.exports.Hash_GetState(),s=o(),a=4+s,l=n.exports.memory.buffer;if(t.length!==a)throw new Error(`Bad state length (expected ${a} bytes, got ${t.length})`);if(!function(e,t){if(e.length!==2*t.length)return!1;for(let n=0;n{if(!f(e,i))return a(i),l(e),u("hex",o);const s=Gp(e);return r.set(s),n.exports.Hash_Calculate(s.length,i,o),Hp(c,r,t)},hashLength:t}})}new Rp;var Xp={name:"argon2",data:"AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkDyAGFNwPYCUEAIAIpA9ABIAEpA9ABhTcD4AlBACACKQPYASABKQPYAYU3A+gJQQAgAikD4AEgASkD4AGFNwPwCUEAIAIpA+gBIAEpA+gBhTcD+AlBACACKQPwASABKQPwAYU3A4AKQQAgAikD+AEgASkD+AGFNwOICkEAIAIpA4ACIAEpA4AChTcDkApBACACKQOIAiABKQOIAoU3A5gKQQAgAikDkAIgASkDkAKFNwOgCkEAIAIpA5gCIAEpA5gChTcDqApBACACKQOgAiABKQOgAoU3A7AKQQAgAikDqAIgASkDqAKFNwO4CkEAIAIpA7ACIAEpA7AChTcDwApBACACKQO4AiABKQO4AoU3A8gKQQAgAikDwAIgASkDwAKFNwPQCkEAIAIpA8gCIAEpA8gChTcD2ApBACACKQPQAiABKQPQAoU3A+AKQQAgAikD2AIgASkD2AKFNwPoCkEAIAIpA+ACIAEpA+AChTcD8ApBACACKQPoAiABKQPoAoU3A/gKQQAgAikD8AIgASkD8AKFNwOAC0EAIAIpA/gCIAEpA/gChTcDiAtBACACKQOAAyABKQOAA4U3A5ALQQAgAikDiAMgASkDiAOFNwOYC0EAIAIpA5ADIAEpA5ADhTcDoAtBACACKQOYAyABKQOYA4U3A6gLQQAgAikDoAMgASkDoAOFNwOwC0EAIAIpA6gDIAEpA6gDhTcDuAtBACACKQOwAyABKQOwA4U3A8ALQQAgAikDuAMgASkDuAOFNwPIC0EAIAIpA8ADIAEpA8ADhTcD0AtBACACKQPIAyABKQPIA4U3A9gLQQAgAikD0AMgASkD0AOFNwPgC0EAIAIpA9gDIAEpA9gDhTcD6AtBACACKQPgAyABKQPgA4U3A/ALQQAgAikD6AMgASkD6AOFNwP4C0EAIAIpA/ADIAEpA/ADhTcDgAxBACACKQP4AyABKQP4A4U3A4gMQQAgAikDgAQgASkDgASFNwOQDEEAIAIpA4gEIAEpA4gEhTcDmAxBACACKQOQBCABKQOQBIU3A6AMQQAgAikDmAQgASkDmASFNwOoDEEAIAIpA6AEIAEpA6AEhTcDsAxBACACKQOoBCABKQOoBIU3A7gMQQAgAikDsAQgASkDsASFNwPADEEAIAIpA7gEIAEpA7gEhTcDyAxBACACKQPABCABKQPABIU3A9AMQQAgAikDyAQgASkDyASFNwPYDEEAIAIpA9AEIAEpA9AEhTcD4AxBACACKQPYBCABKQPYBIU3A+gMQQAgAikD4AQgASkD4ASFNwPwDEEAIAIpA+gEIAEpA+gEhTcD+AxBACACKQPwBCABKQPwBIU3A4ANQQAgAikD+AQgASkD+ASFNwOIDUEAIAIpA4AFIAEpA4AFhTcDkA1BACACKQOIBSABKQOIBYU3A5gNQQAgAikDkAUgASkDkAWFNwOgDUEAIAIpA5gFIAEpA5gFhTcDqA1BACACKQOgBSABKQOgBYU3A7ANQQAgAikDqAUgASkDqAWFNwO4DUEAIAIpA7AFIAEpA7AFhTcDwA1BACACKQO4BSABKQO4BYU3A8gNQQAgAikDwAUgASkDwAWFNwPQDUEAIAIpA8gFIAEpA8gFhTcD2A1BACACKQPQBSABKQPQBYU3A+ANQQAgAikD2AUgASkD2AWFNwPoDUEAIAIpA+AFIAEpA+AFhTcD8A1BACACKQPoBSABKQPoBYU3A/gNQQAgAikD8AUgASkD8AWFNwOADkEAIAIpA/gFIAEpA/gFhTcDiA5BACACKQOABiABKQOABoU3A5AOQQAgAikDiAYgASkDiAaFNwOYDkEAIAIpA5AGIAEpA5AGhTcDoA5BACACKQOYBiABKQOYBoU3A6gOQQAgAikDoAYgASkDoAaFNwOwDkEAIAIpA6gGIAEpA6gGhTcDuA5BACACKQOwBiABKQOwBoU3A8AOQQAgAikDuAYgASkDuAaFNwPIDkEAIAIpA8AGIAEpA8AGhTcD0A5BACACKQPIBiABKQPIBoU3A9gOQQAgAikD0AYgASkD0AaFNwPgDkEAIAIpA9gGIAEpA9gGhTcD6A5BACACKQPgBiABKQPgBoU3A/AOQQAgAikD6AYgASkD6AaFNwP4DkEAIAIpA/AGIAEpA/AGhTcDgA9BACACKQP4BiABKQP4BoU3A4gPQQAgAikDgAcgASkDgAeFNwOQD0EAIAIpA4gHIAEpA4gHhTcDmA9BACACKQOQByABKQOQB4U3A6APQQAgAikDmAcgASkDmAeFNwOoD0EAIAIpA6AHIAEpA6AHhTcDsA9BACACKQOoByABKQOoB4U3A7gPQQAgAikDsAcgASkDsAeFNwPAD0EAIAIpA7gHIAEpA7gHhTcDyA9BACACKQPAByABKQPAB4U3A9APQQAgAikDyAcgASkDyAeFNwPYD0EAIAIpA9AHIAEpA9AHhTcD4A9BACACKQPYByABKQPYB4U3A+gPQQAgAikD4AcgASkD4AeFNwPwD0EAIAIpA+gHIAEpA+gHhTcD+A9BACACKQPwByABKQPwB4U3A4AQQQAgAikD+AcgASkD+AeFNwOIEEGQCEGYCEGgCEGoCEGwCEG4CEHACEHICEHQCEHYCEHgCEHoCEHwCEH4CEGACUGICRACQZAJQZgJQaAJQagJQbAJQbgJQcAJQcgJQdAJQdgJQeAJQegJQfAJQfgJQYAKQYgKEAJBkApBmApBoApBqApBsApBuApBwApByApB0ApB2ApB4ApB6ApB8ApB+ApBgAtBiAsQAkGQC0GYC0GgC0GoC0GwC0G4C0HAC0HIC0HQC0HYC0HgC0HoC0HwC0H4C0GADEGIDBACQZAMQZgMQaAMQagMQbAMQbgMQcAMQcgMQdAMQdgMQeAMQegMQfAMQfgMQYANQYgNEAJBkA1BmA1BoA1BqA1BsA1BuA1BwA1ByA1B0A1B2A1B4A1B6A1B8A1B+A1BgA5BiA4QAkGQDkGYDkGgDkGoDkGwDkG4DkHADkHIDkHQDkHYDkHgDkHoDkHwDkH4DkGAD0GIDxACQZAPQZgPQaAPQagPQbAPQbgPQcAPQcgPQdAPQdgPQeAPQegPQfAPQfgPQYAQQYgQEAJBkAhBmAhBkAlBmAlBkApBmApBkAtBmAtBkAxBmAxBkA1BmA1BkA5BmA5BkA9BmA8QAkGgCEGoCEGgCUGoCUGgCkGoCkGgC0GoC0GgDEGoDEGgDUGoDUGgDkGoDkGgD0GoDxACQbAIQbgIQbAJQbgJQbAKQbgKQbALQbgLQbAMQbgMQbANQbgNQbAOQbgOQbAPQbgPEAJBwAhByAhBwAlByAlBwApByApBwAtByAtBwAxByAxBwA1ByA1BwA5ByA5BwA9ByA8QAkHQCEHYCEHQCUHYCUHQCkHYCkHQC0HYC0HQDEHYDEHQDUHYDUHQDkHYDkHQD0HYDxACQeAIQegIQeAJQegJQeAKQegKQeALQegLQeAMQegMQeANQegNQeAOQegOQeAPQegPEAJB8AhB+AhB8AlB+AlB8ApB+ApB8AtB+AtB8AxB+AxB8A1B+A1B8A5B+A5B8A9B+A8QAkGACUGICUGACkGICkGAC0GIC0GADEGIDEGADUGIDUGADkGIDkGAD0GID0GAEEGIEBACAkACQCADRQ0AA0AgACAEaiIDIAIgBGoiBSkDACABIARqIgYpAwCFIARBkAhqKQMAhSADKQMAhTcDACADQQhqIgMgBUEIaikDACAGQQhqKQMAhSAEQZgIaikDAIUgAykDAIU3AwAgBEEQaiIEQYAIRw0ADAILC0EAIQQDQCAAIARqIgMgAiAEaiIFKQMAIAEgBGoiBikDAIUgBEGQCGopAwCFNwMAIANBCGogBUEIaikDACAGQQhqKQMAhSAEQZgIaikDAIU3AwAgBEEQaiIEQYAIRw0ACwsL5QcMBX8BfgR/An4BfwF+AX8Bfgd/AX4DfwF+AkBBACgCgAgiAiABQQp0aiIDKAIIIAFHDQAgAygCDCEEIAMoAgAhBUEAIAMoAhQiBq03A7gQQQAgBK0iBzcDsBBBACAFIAEgBUECdG4iCGwiCUECdK03A6gQAkACQAJAAkAgBEUNAEF/IQogBUUNASAIQQNsIQsgCEECdCIErSEMIAWtIQ0gBkF/akECSSEOQgAhDwNAQQAgDzcDkBAgD6chEEIAIRFBACEBA0BBACARNwOgECAPIBGEUCIDIA5xIRIgBkEBRiAPUCITIAZBAkYgEUICVHFxciEUQX8gAUEBakEDcSAIbEF/aiATGyEVIAEgEHIhFiABIAhsIRcgA0EBdCEYQgAhGQNAQQBCADcDwBBBACAZNwOYECAYIQECQCASRQ0AQQBCATcDwBBBkBhBkBBBkCBBABADQZAYQZAYQZAgQQAQA0ECIQELAkAgASAITw0AIAQgGaciGmwgF2ogAWohAwNAIANBACAEIAEbQQAgEVAiGxtqQX9qIRwCQAJAIBQNAEEAKAKACCICIBxBCnQiHGohCgwBCwJAIAFB/wBxIgINAEEAQQApA8AQQgF8NwPAEEGQGEGQEEGQIEEAEANBkBhBkBhBkCBBABADCyAcQQp0IRwgAkEDdEGQGGohCkEAKAKACCECCyACIANBCnRqIAIgHGogAiAKKQMAIh1CIIinIAVwIBogFhsiHCAEbCABIAFBACAZIBytUSIcGyIKIBsbIBdqIAogC2ogExsgAUUgHHJrIhsgFWqtIB1C/////w+DIh0gHX5CIIggG61+QiCIfSAMgqdqQQp0akEBEAMgA0EBaiEDIAggAUEBaiIBRw0ACwsgGUIBfCIZIA1SDQALIBFCAXwiEachASARQgRSDQALIA9CAXwiDyAHUg0AC0EAKAKACCECCyAJQQx0QYB4aiEXIAVBf2oiCkUNAgwBC0EAQgM3A6AQQQAgBEF/aq03A5AQQYB4IRcLIAIgF2ohGyAIQQx0IQhBACEcA0AgCCAcQQFqIhxsQYB4aiEEQQAhAQNAIBsgAWoiAyADKQMAIAIgBCABamopAwCFNwMAIANBCGoiAyADKQMAIAIgBCABQQhyamopAwCFNwMAIAFBCGohAyABQRBqIQEgA0H4B0kNAAsgHCAKRw0ACwsgAiAXaiEbQXghAQNAIAIgAWoiA0EIaiAbIAFqIgRBCGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBGGogBEEYaikDADcDACADQSBqIARBIGopAwA3AwAgAUEgaiIBQfgHSQ0ACwsL",hash:"e4cdc523"},eh={name:"blake2b",data:"AGFzbQEAAAABEQRgAAF/YAJ/fwBgAX8AYAAAAwoJAAECAwECAgABBQQBAQICBg4CfwFBsIsFC38AQYAICwdwCAZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACkhhc2hfRmluYWwAAwlIYXNoX0luaXQABQtIYXNoX1VwZGF0ZQAGDUhhc2hfR2V0U3RhdGUABw5IYXNoX0NhbGN1bGF0ZQAIClNUQVRFX1NJWkUDAQrTOAkFAEGACQvrAgIFfwF+AkAgAUEBSA0AAkACQAJAIAFBgAFBACgC4IoBIgJrIgNKDQAgASEEDAELQQBBADYC4IoBAkAgAkH/AEoNACACQeCJAWohBSAAIQRBACEGA0AgBSAELQAAOgAAIARBAWohBCAFQQFqIQUgAyAGQQFqIgZB/wFxSg0ACwtBAEEAKQPAiQEiB0KAAXw3A8CJAUEAQQApA8iJASAHQv9+Vq18NwPIiQFB4IkBEAIgACADaiEAAkAgASADayIEQYEBSA0AIAIgAWohBQNAQQBBACkDwIkBIgdCgAF8NwPAiQFBAEEAKQPIiQEgB0L/flatfDcDyIkBIAAQAiAAQYABaiEAIAVBgH9qIgVBgAJLDQALIAVBgH9qIQQMAQsgBEEATA0BC0EAIQUDQCAFQQAoAuCKAWpB4IkBaiAAIAVqLQAAOgAAIAQgBUEBaiIFQf8BcUoNAAsLQQBBACgC4IoBIARqNgLgigELC78uASR+QQBBACkD0IkBQQApA7CJASIBQQApA5CJAXwgACkDICICfCIDhULr+obav7X2wR+FQiCJIgRCq/DT9K/uvLc8fCIFIAGFQiiJIgYgA3wgACkDKCIBfCIHIASFQjCJIgggBXwiCSAGhUIBiSIKQQApA8iJAUEAKQOoiQEiBEEAKQOIiQF8IAApAxAiA3wiBYVCn9j52cKR2oKbf4VCIIkiC0K7zqqm2NDrs7t/fCIMIASFQiiJIg0gBXwgACkDGCIEfCIOfCAAKQNQIgV8Ig9BACkDwIkBQQApA6CJASIQQQApA4CJASIRfCAAKQMAIgZ8IhKFQtGFmu/6z5SH0QCFQiCJIhNCiJLznf/M+YTqAHwiFCAQhUIoiSIVIBJ8IAApAwgiEHwiFiAThUIwiSIXhUIgiSIYQQApA9iJAUEAKQO4iQEiE0EAKQOYiQF8IAApAzAiEnwiGYVC+cL4m5Gjs/DbAIVCIIkiGkLx7fT4paf9p6V/fCIbIBOFQiiJIhwgGXwgACkDOCITfCIZIBqFQjCJIhogG3wiG3wiHSAKhUIoiSIeIA98IAApA1giCnwiDyAYhUIwiSIYIB18Ih0gDiALhUIwiSIOIAx8Ih8gDYVCAYkiDCAWfCAAKQNAIgt8Ig0gGoVCIIkiFiAJfCIaIAyFQiiJIiAgDXwgACkDSCIJfCIhIBaFQjCJIhYgGyAchUIBiSIMIAd8IAApA2AiB3wiDSAOhUIgiSIOIBcgFHwiFHwiFyAMhUIoiSIbIA18IAApA2giDHwiHCAOhUIwiSIOIBd8IhcgG4VCAYkiGyAZIBQgFYVCAYkiFHwgACkDcCINfCIVIAiFQiCJIhkgH3wiHyAUhUIoiSIUIBV8IAApA3giCHwiFXwgDHwiIoVCIIkiI3wiJCAbhUIoiSIbICJ8IBJ8IiIgFyAYIBUgGYVCMIkiFSAffCIZIBSFQgGJIhQgIXwgDXwiH4VCIIkiGHwiFyAUhUIoiSIUIB98IAV8Ih8gGIVCMIkiGCAXfCIXIBSFQgGJIhR8IAF8IiEgFiAafCIWIBUgHSAehUIBiSIaIBx8IAl8IhyFQiCJIhV8Ih0gGoVCKIkiGiAcfCAIfCIcIBWFQjCJIhWFQiCJIh4gGSAOIBYgIIVCAYkiFiAPfCACfCIPhUIgiSIOfCIZIBaFQiiJIhYgD3wgC3wiDyAOhUIwiSIOIBl8Ihl8IiAgFIVCKIkiFCAhfCAEfCIhIB6FQjCJIh4gIHwiICAiICOFQjCJIiIgJHwiIyAbhUIBiSIbIBx8IAp8IhwgDoVCIIkiDiAXfCIXIBuFQiiJIhsgHHwgE3wiHCAOhUIwiSIOIBkgFoVCAYkiFiAffCAQfCIZICKFQiCJIh8gFSAdfCIVfCIdIBaFQiiJIhYgGXwgB3wiGSAfhUIwiSIfIB18Ih0gFoVCAYkiFiAVIBqFQgGJIhUgD3wgBnwiDyAYhUIgiSIYICN8IhogFYVCKIkiFSAPfCADfCIPfCAHfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgBnwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAOIBd8Ig4gDyAYhUIwiSIPICAgFIVCAYkiFCAZfCAKfCIXhUIgiSIYfCIZIBSFQiiJIhQgF3wgC3wiF3wgBXwiICAPIBp8Ig8gHyAOIBuFQgGJIg4gIXwgCHwiGoVCIIkiG3wiHyAOhUIoiSIOIBp8IAx8IhogG4VCMIkiG4VCIIkiISAdIB4gDyAVhUIBiSIPIBx8IAF8IhWFQiCJIhx8Ih0gD4VCKIkiDyAVfCADfCIVIByFQjCJIhwgHXwiHXwiHiAWhUIoiSIWICB8IA18IiAgIYVCMIkiISAefCIeIBogFyAYhUIwiSIXIBl8IhggFIVCAYkiFHwgCXwiGSAchUIgiSIaICR8IhwgFIVCKIkiFCAZfCACfCIZIBqFQjCJIhogHSAPhUIBiSIPICJ8IAR8Ih0gF4VCIIkiFyAbIB98Iht8Ih8gD4VCKIkiDyAdfCASfCIdIBeFQjCJIhcgH3wiHyAPhUIBiSIPIBsgDoVCAYkiDiAVfCATfCIVICOFQiCJIhsgGHwiGCAOhUIoiSIOIBV8IBB8IhV8IAx8IiKFQiCJIiN8IiQgD4VCKIkiDyAifCAHfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBogHHwiGiAVIBuFQjCJIhUgHiAWhUIBiSIWIB18IAR8IhuFQiCJIhx8Ih0gFoVCKIkiFiAbfCAQfCIbfCABfCIeIBUgGHwiFSAXIBogFIVCAYkiFCAgfCATfCIYhUIgiSIXfCIaIBSFQiiJIhQgGHwgCXwiGCAXhUIwiSIXhUIgiSIgIB8gISAVIA6FQgGJIg4gGXwgCnwiFYVCIIkiGXwiHyAOhUIoiSIOIBV8IA18IhUgGYVCMIkiGSAffCIffCIhIA+FQiiJIg8gHnwgBXwiHiAghUIwiSIgICF8IiEgGyAchUIwiSIbIB18IhwgFoVCAYkiFiAYfCADfCIYIBmFQiCJIhkgJHwiHSAWhUIoiSIWIBh8IBJ8IhggGYVCMIkiGSAfIA6FQgGJIg4gInwgAnwiHyAbhUIgiSIbIBcgGnwiF3wiGiAOhUIoiSIOIB98IAZ8Ih8gG4VCMIkiGyAafCIaIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAh8IhUgI4VCIIkiFyAcfCIcIBSFQiiJIhQgFXwgC3wiFXwgBXwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IAh8IiIgGiAgIBUgF4VCMIkiFSAcfCIXIBSFQgGJIhQgGHwgCXwiGIVCIIkiHHwiGiAUhUIoiSIUIBh8IAZ8IhggHIVCMIkiHCAafCIaIBSFQgGJIhR8IAR8IiAgGSAdfCIZIBUgISAPhUIBiSIPIB98IAN8Ih2FQiCJIhV8Ih8gD4VCKIkiDyAdfCACfCIdIBWFQjCJIhWFQiCJIiEgFyAbIBkgFoVCAYkiFiAefCABfCIZhUIgiSIbfCIXIBaFQiiJIhYgGXwgE3wiGSAbhUIwiSIbIBd8Ihd8Ih4gFIVCKIkiFCAgfCAMfCIgICGFQjCJIiEgHnwiHiAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIB18IBJ8Ih0gG4VCIIkiGyAafCIaIA6FQiiJIg4gHXwgC3wiHSAbhUIwiSIbIBcgFoVCAYkiFiAYfCANfCIXICKFQiCJIhggFSAffCIVfCIfIBaFQiiJIhYgF3wgEHwiFyAYhUIwiSIYIB98Ih8gFoVCAYkiFiAVIA+FQgGJIg8gGXwgCnwiFSAchUIgiSIZICN8IhwgD4VCKIkiDyAVfCAHfCIVfCASfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgBXwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAbIBp8IhogFSAZhUIwiSIVIB4gFIVCAYkiFCAXfCADfCIXhUIgiSIZfCIbIBSFQiiJIhQgF3wgB3wiF3wgAnwiHiAVIBx8IhUgGCAaIA6FQgGJIg4gIHwgC3wiGoVCIIkiGHwiHCAOhUIoiSIOIBp8IAR8IhogGIVCMIkiGIVCIIkiICAfICEgFSAPhUIBiSIPIB18IAZ8IhWFQiCJIh18Ih8gD4VCKIkiDyAVfCAKfCIVIB2FQjCJIh0gH3wiH3wiISAWhUIoiSIWIB58IAx8Ih4gIIVCMIkiICAhfCIhIBogFyAZhUIwiSIXIBt8IhkgFIVCAYkiFHwgEHwiGiAdhUIgiSIbICR8Ih0gFIVCKIkiFCAafCAJfCIaIBuFQjCJIhsgHyAPhUIBiSIPICJ8IBN8Ih8gF4VCIIkiFyAYIBx8Ihh8IhwgD4VCKIkiDyAffCABfCIfIBeFQjCJIhcgHHwiHCAPhUIBiSIPIBggDoVCAYkiDiAVfCAIfCIVICOFQiCJIhggGXwiGSAOhUIoiSIOIBV8IA18IhV8IA18IiKFQiCJIiN8IiQgD4VCKIkiDyAifCAMfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBsgHXwiGyAVIBiFQjCJIhUgISAWhUIBiSIWIB98IBB8IhiFQiCJIh18Ih8gFoVCKIkiFiAYfCAIfCIYfCASfCIhIBUgGXwiFSAXIBsgFIVCAYkiFCAefCAHfCIZhUIgiSIXfCIbIBSFQiiJIhQgGXwgAXwiGSAXhUIwiSIXhUIgiSIeIBwgICAVIA6FQgGJIg4gGnwgAnwiFYVCIIkiGnwiHCAOhUIoiSIOIBV8IAV8IhUgGoVCMIkiGiAcfCIcfCIgIA+FQiiJIg8gIXwgBHwiISAehUIwiSIeICB8IiAgGCAdhUIwiSIYIB98Ih0gFoVCAYkiFiAZfCAGfCIZIBqFQiCJIhogJHwiHyAWhUIoiSIWIBl8IBN8IhkgGoVCMIkiGiAcIA6FQgGJIg4gInwgCXwiHCAYhUIgiSIYIBcgG3wiF3wiGyAOhUIoiSIOIBx8IAN8IhwgGIVCMIkiGCAbfCIbIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAt8IhUgI4VCIIkiFyAdfCIdIBSFQiiJIhQgFXwgCnwiFXwgBHwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IAl8IiIgGyAeIBUgF4VCMIkiFSAdfCIXIBSFQgGJIhQgGXwgDHwiGYVCIIkiHXwiGyAUhUIoiSIUIBl8IAp8IhkgHYVCMIkiHSAbfCIbIBSFQgGJIhR8IAN8Ih4gGiAffCIaIBUgICAPhUIBiSIPIBx8IAd8IhyFQiCJIhV8Ih8gD4VCKIkiDyAcfCAQfCIcIBWFQjCJIhWFQiCJIiAgFyAYIBogFoVCAYkiFiAhfCATfCIahUIgiSIYfCIXIBaFQiiJIhYgGnwgDXwiGiAYhUIwiSIYIBd8Ihd8IiEgFIVCKIkiFCAefCAFfCIeICCFQjCJIiAgIXwiISAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIBx8IAt8IhwgGIVCIIkiGCAbfCIbIA6FQiiJIg4gHHwgEnwiHCAYhUIwiSIYIBcgFoVCAYkiFiAZfCABfCIXICKFQiCJIhkgFSAffCIVfCIfIBaFQiiJIhYgF3wgBnwiFyAZhUIwiSIZIB98Ih8gFoVCAYkiFiAVIA+FQgGJIg8gGnwgCHwiFSAdhUIgiSIaICN8Ih0gD4VCKIkiDyAVfCACfCIVfCANfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgCXwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAYIBt8IhggFSAahUIwiSIVICEgFIVCAYkiFCAXfCASfCIXhUIgiSIafCIbIBSFQiiJIhQgF3wgCHwiF3wgB3wiISAVIB18IhUgGSAYIA6FQgGJIg4gHnwgBnwiGIVCIIkiGXwiHSAOhUIoiSIOIBh8IAt8IhggGYVCMIkiGYVCIIkiHiAfICAgFSAPhUIBiSIPIBx8IAp8IhWFQiCJIhx8Ih8gD4VCKIkiDyAVfCAEfCIVIByFQjCJIhwgH3wiH3wiICAWhUIoiSIWICF8IAN8IiEgHoVCMIkiHiAgfCIgIBggFyAahUIwiSIXIBt8IhogFIVCAYkiFHwgBXwiGCAchUIgiSIbICR8IhwgFIVCKIkiFCAYfCABfCIYIBuFQjCJIhsgHyAPhUIBiSIPICJ8IAx8Ih8gF4VCIIkiFyAZIB18Ihl8Ih0gD4VCKIkiDyAffCATfCIfIBeFQjCJIhcgHXwiHSAPhUIBiSIPIBkgDoVCAYkiDiAVfCAQfCIVICOFQiCJIhkgGnwiGiAOhUIoiSIOIBV8IAJ8IhV8IBN8IiKFQiCJIiN8IiQgD4VCKIkiDyAifCASfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBsgHHwiGyAVIBmFQjCJIhUgICAWhUIBiSIWIB98IAt8IhmFQiCJIhx8Ih8gFoVCKIkiFiAZfCACfCIZfCAJfCIgIBUgGnwiFSAXIBsgFIVCAYkiFCAhfCAFfCIahUIgiSIXfCIbIBSFQiiJIhQgGnwgA3wiGiAXhUIwiSIXhUIgiSIhIB0gHiAVIA6FQgGJIg4gGHwgEHwiFYVCIIkiGHwiHSAOhUIoiSIOIBV8IAF8IhUgGIVCMIkiGCAdfCIdfCIeIA+FQiiJIg8gIHwgDXwiICAhhUIwiSIhIB58Ih4gGSAchUIwiSIZIB98IhwgFoVCAYkiFiAafCAIfCIaIBiFQiCJIhggJHwiHyAWhUIoiSIWIBp8IAp8IhogGIVCMIkiGCAdIA6FQgGJIg4gInwgBHwiHSAZhUIgiSIZIBcgG3wiF3wiGyAOhUIoiSIOIB18IAd8Ih0gGYVCMIkiGSAbfCIbIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAx8IhUgI4VCIIkiFyAcfCIcIBSFQiiJIhQgFXwgBnwiFXwgEnwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IBN8IiIgGyAhIBUgF4VCMIkiFSAcfCIXIBSFQgGJIhQgGnwgBnwiGoVCIIkiHHwiGyAUhUIoiSIUIBp8IBB8IhogHIVCMIkiHCAbfCIbIBSFQgGJIhR8IA18IiEgGCAffCIYIBUgHiAPhUIBiSIPIB18IAJ8Ih2FQiCJIhV8Ih4gD4VCKIkiDyAdfCABfCIdIBWFQjCJIhWFQiCJIh8gFyAZIBggFoVCAYkiFiAgfCADfCIYhUIgiSIZfCIXIBaFQiiJIhYgGHwgBHwiGCAZhUIwiSIZIBd8Ihd8IiAgFIVCKIkiFCAhfCAIfCIhIB+FQjCJIh8gIHwiICAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIB18IAd8Ih0gGYVCIIkiGSAbfCIbIA6FQiiJIg4gHXwgDHwiHSAZhUIwiSIZIBcgFoVCAYkiFiAafCALfCIXICKFQiCJIhogFSAefCIVfCIeIBaFQiiJIhYgF3wgCXwiFyAahUIwiSIaIB58Ih4gFoVCAYkiFiAVIA+FQgGJIg8gGHwgBXwiFSAchUIgiSIYICN8IhwgD4VCKIkiDyAVfCAKfCIVfCACfCIChUIgiSIifCIjIBaFQiiJIhYgAnwgC3wiAiAihUIwiSILICN8IiIgFoVCAYkiFiAZIBt8IhkgFSAYhUIwiSIVICAgFIVCAYkiFCAXfCANfCINhUIgiSIXfCIYIBSFQiiJIhQgDXwgBXwiBXwgEHwiECAVIBx8Ig0gGiAZIA6FQgGJIg4gIXwgDHwiDIVCIIkiFXwiGSAOhUIoiSIOIAx8IBJ8IhIgFYVCMIkiDIVCIIkiFSAeIB8gDSAPhUIBiSINIB18IAl8IgmFQiCJIg98IhogDYVCKIkiDSAJfCAIfCIJIA+FQjCJIgggGnwiD3wiGiAWhUIoiSIWIBB8IAd8IhAgEYUgDCAZfCIHIA6FQgGJIgwgCXwgCnwiCiALhUIgiSILIAUgF4VCMIkiBSAYfCIJfCIOIAyFQiiJIgwgCnwgE3wiEyALhUIwiSIKIA58IguFNwOAiQFBACADIAYgDyANhUIBiSINIAJ8fCICIAWFQiCJIgUgB3wiBiANhUIoiSIHIAJ8fCICQQApA4iJAYUgBCABIBIgCSAUhUIBiSIDfHwiASAIhUIgiSISICJ8IgkgA4VCKIkiAyABfHwiASAShUIwiSIEIAl8IhKFNwOIiQFBACATQQApA5CJAYUgECAVhUIwiSIQIBp8IhOFNwOQiQFBACABQQApA5iJAYUgAiAFhUIwiSICIAZ8IgGFNwOYiQFBACASIAOFQgGJQQApA6CJAYUgAoU3A6CJAUEAIBMgFoVCAYlBACkDqIkBhSAKhTcDqIkBQQAgASAHhUIBiUEAKQOwiQGFIASFNwOwiQFBACALIAyFQgGJQQApA7iJAYUgEIU3A7iJAQvdAgUBfwF+AX8BfgJ/IwBBwABrIgAkAAJAQQApA9CJAUIAUg0AQQBBACkDwIkBIgFBACgC4IoBIgKsfCIDNwPAiQFBAEEAKQPIiQEgAyABVK18NwPIiQECQEEALQDoigFFDQBBAEJ/NwPYiQELQQBCfzcD0IkBAkAgAkH/AEoNAEEAIQQDQCACIARqQeCJAWpBADoAACAEQQFqIgRBgAFBACgC4IoBIgJrSA0ACwtB4IkBEAIgAEEAKQOAiQE3AwAgAEEAKQOIiQE3AwggAEEAKQOQiQE3AxAgAEEAKQOYiQE3AxggAEEAKQOgiQE3AyAgAEEAKQOoiQE3AyggAEEAKQOwiQE3AzAgAEEAKQO4iQE3AzhBACgC5IoBIgVBAUgNAEEAIQRBACECA0AgBEGACWogACAEai0AADoAACAEQQFqIQQgBSACQQFqIgJB/wFxSg0ACwsgAEHAAGokAAv9AwMBfwF+AX8jAEGAAWsiAiQAQQBBgQI7AfKKAUEAIAE6APGKAUEAIAA6APCKAUGQfiEAA0AgAEGAiwFqQgA3AAAgAEH4igFqQgA3AAAgAEHwigFqQgA3AAAgAEEYaiIADQALQQAhAEEAQQApA/CKASIDQoiS853/zPmE6gCFNwOAiQFBAEEAKQP4igFCu86qptjQ67O7f4U3A4iJAUEAQQApA4CLAUKr8NP0r+68tzyFNwOQiQFBAEEAKQOIiwFC8e30+KWn/aelf4U3A5iJAUEAQQApA5CLAULRhZrv+s+Uh9EAhTcDoIkBQQBBACkDmIsBQp/Y+dnCkdqCm3+FNwOoiQFBAEEAKQOgiwFC6/qG2r+19sEfhTcDsIkBQQBBACkDqIsBQvnC+JuRo7Pw2wCFNwO4iQFBACADp0H/AXE2AuSKAQJAIAFBAUgNACACQgA3A3ggAkIANwNwIAJCADcDaCACQgA3A2AgAkIANwNYIAJCADcDUCACQgA3A0ggAkIANwNAIAJCADcDOCACQgA3AzAgAkIANwMoIAJCADcDICACQgA3AxggAkIANwMQIAJCADcDCCACQgA3AwBBACEEA0AgAiAAaiAAQYAJai0AADoAACAAQQFqIQAgBEEBaiIEQf8BcSABSA0ACyACQYABEAELIAJBgAFqJAALEgAgAEEDdkH/P3EgAEEQdhAECwkAQYAJIAAQAQsGAEGAiQELGwAgAUEDdkH/P3EgAUEQdhAEQYAJIAAQARADCwsLAQBBgAgLBPAAAAA=",hash:"c6f286e6"};function th(e){return!Number.isInteger(e)||e<8||e>512||e%8!=0?new Error("Invalid variant! Valid values: 8, 16, ..., 512"):null}function nh(e=512,t=null){if(th(e))return Promise.reject(th(e));let n=null,r=e;if(null!==t){if(n=Gp(t),n.length>64)return Promise.reject(new Error("Max key length is 64 bytes"));i=e,o=n.length,r=i|o<<16}var i,o;const s=e/8;return Zp(eh,s).then(e=>{r>512&&e.writeMemory(n),e.init(r);const t={init:r>512?()=>(e.writeMemory(n),e.init(r),t):()=>(e.init(r),t),update:n=>(e.update(n),t),digest:t=>e.digest(t),save:()=>e.save(),load:n=>(e.load(n),t),blockSize:128,digestSize:s};return t})}new Rp;const rh=new DataView(new ArrayBuffer(4));function ih(e){return rh.setInt32(0,e,!0),new Uint8Array(rh.buffer)}function oh(e,t,n){return Up(this,void 0,void 0,function*(){if(n<=64){const e=yield nh(8*n);return e.update(ih(n)),e.update(t),e.digest("binary")}const r=Math.ceil(n/32)-2,i=new Uint8Array(n);e.init(),e.update(ih(n)),e.update(t);let o=e.digest("binary");i.set(o.subarray(0,32),0);for(let t=1;t{var t;if(!e||"object"!=typeof e)throw new Error("Invalid options parameter. It requires an object.");if(!e.password)throw new Error("Password must be specified");if(e.password=Gp(e.password),e.password.length<1)throw new Error("Password must be specified");if(!e.salt)throw new Error("Salt must be specified");if(e.salt=Gp(e.salt),e.salt.length<8)throw new Error("Salt should be at least 8 bytes long");if(e.secret=Gp(null!==(t=e.secret)&&void 0!==t?t:""),!Number.isInteger(e.iterations)||e.iterations<1)throw new Error("Iterations should be a positive number");if(!Number.isInteger(e.parallelism)||e.parallelism<1)throw new Error("Parallelism should be a positive number");if(!Number.isInteger(e.hashLength)||e.hashLength<4)throw new Error("Hash length should be at least 4 bytes.");if(!Number.isInteger(e.memorySize))throw new Error("Memory size should be specified.");if(e.memorySize<8*e.parallelism)throw new Error("Memory size should be at least 8 * parallelism.");if(void 0===e.outputType&&(e.outputType="hex"),!["hex","binary","encoded"].includes(e.outputType))throw new Error(`Insupported output type ${e.outputType}. Valid values: ['hex', 'binary', 'encoded']`)})(e),sh(Object.assign(Object.assign({},e),{hashType:"id"}))})}new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp,new Rp;const lh={parallelism:4,iterations:8,memorySize:262144,hashLength:32,outputType:"binary"};let ch=null,uh=0;const dh=new Map;async function fh(e,t){try{const n=function(){if(ch)return ch;const e=new Blob(["\n importScripts('https://cdn.jsdelivr.net/npm/hash-wasm@4.11.0/dist/argon2.umd.min.js');\n\n const ARGON2_CONFIG = {\n parallelism: 4,\n iterations: 8,\n memorySize: 262144,\n hashLength: 32,\n outputType: \"binary\"\n };\n\n self.onmessage = async function(e) {\n const { password, salt, id } = e.data;\n\n try {\n const result = await hashwasm.argon2id({\n password: password,\n salt: new Uint8Array(salt),\n ...ARGON2_CONFIG\n });\n\n self.postMessage({\n id,\n success: true,\n result: Array.from(result)\n });\n } catch (error) {\n self.postMessage({\n id,\n success: false,\n error: error.message\n });\n }\n };\n "],{type:"application/javascript"});return ch=new Worker(URL.createObjectURL(e)),ch.onmessage=function(e){const{id:t,success:n,result:r,error:i}=e.data,o=dh.get(t);o&&(dh.delete(t),n?o.resolve(new Uint8Array(r)):o.reject(new Error(i)))},ch.onerror=function(e){console.error("Argon2 worker error:",e)},ch}(),r=++uh;return new Promise((i,o)=>{dh.set(r,{resolve:i,reject:o}),n.postMessage({id:r,password:e,salt:Array.from(t)})})}catch(n){console.warn("Worker failed, falling back to main thread:",n);return await ah({password:e,salt:t,...lh})}}const{window:ph}=l;function hh(e){let t,n,i,o,s,a,l,f,h,g,y,b,I,k,C,E,x,S;function Q(e,t){return"extension"===e[2]?mh:gh}let F=Q(e),D=F(e),$=e[10]&&Sh(e),U=e[11]&&Qh(e);return{c(){t=p("div"),n=p("div"),i=p("div"),o=p("h2"),o.textContent="Login to Nostr",s=m(),a=p("button"),a.textContent="×",l=m(),f=p("div"),h=p("div"),g=p("button"),g.textContent="Extension",y=m(),b=p("button"),b.textContent="Nsec",I=m(),k=p("div"),D.c(),C=m(),$&&$.c(),E=m(),U&&U.c(),A(o,"class","svelte-4xpfbi"),A(a,"class","close-btn svelte-4xpfbi"),A(i,"class","modal-header svelte-4xpfbi"),A(g,"class","tab-btn svelte-4xpfbi"),B(g,"active","extension"===e[2]),A(b,"class","tab-btn svelte-4xpfbi"),B(b,"active","nsec"===e[2]),A(h,"class","tabs svelte-4xpfbi"),A(k,"class","tab-content svelte-4xpfbi"),A(f,"class","tab-container svelte-4xpfbi"),A(n,"class","modal svelte-4xpfbi"),B(n,"dark-theme",e[1]),A(t,"class","modal-overlay svelte-4xpfbi"),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),c(f,h),c(h,g),c(h,y),c(h,b),c(f,I),c(f,k),D.m(k,null),c(k,C),$&&$.m(k,null),c(k,E),U&&U.m(k,null),x||(S=[w(a,"click",e[17]),w(g,"click",e[26]),w(b,"click",e[27]),w(n,"click",v(e[24])),w(n,"keydown",v(e[25])),w(t,"click",e[17]),w(t,"keydown",e[32])],x=!0)},p(e,t){4&t[0]&&B(g,"active","extension"===e[2]),4&t[0]&&B(b,"active","nsec"===e[2]),F===(F=Q(e))&&D?D.p(e,t):(D.d(1),D=F(e),D&&(D.c(),D.m(k,C))),e[10]?$?$.p(e,t):($=Sh(e),$.c(),$.m(k,E)):$&&($.d(1),$=null),e[11]?U?U.p(e,t):(U=Qh(e),U.c(),U.m(k,null)):U&&(U.d(1),U=null),2&t[0]&&B(n,"dark-theme",e[1])},d(e){e&&d(t),D.d(),$&&$.d(),U&&U.d(),x=!1,r(S)}}}function gh(e){let t;function n(e,t){return e[14]?wh:yh}let r=n(e),i=r(e);return{c(){t=p("div"),i.c(),A(t,"class","nsec-login svelte-4xpfbi")},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 mh(e){let t,n,r,i,o,s,a,l=e[7]?"Connecting...":"Log in using extension";return{c(){t=p("div"),n=p("p"),n.textContent="Login using a NIP-07 compatible browser\n extension like nos2x or Alby.",r=m(),i=p("button"),o=g(l),A(n,"class","svelte-4xpfbi"),A(i,"class","login-extension-btn svelte-4xpfbi"),i.disabled=e[7],A(t,"class","extension-login svelte-4xpfbi")},m(l,d){u(l,t,d),c(t,n),c(t,r),c(t,i),c(i,o),s||(a=w(i,"click",e[21]),s=!0)},p(e,t){128&t[0]&&l!==(l=e[7]?"Connecting...":"Log in using extension")&&I(o,l),128&t[0]&&(i.disabled=e[7])},d(e){e&&d(t),s=!1,a()}}}function yh(e){let t,n,i,o,s,a,l,f,h,y,v,b,C,E,x,B,S,Q,F,D,$,U,R,T=e[8]?"Generating...":"Generate New Key",P=e[12]&&vh(e),N=e[4]&&Ah(e);function O(e,t){return e[9]?kh:e[7]?Ih:bh}let L=O(e),M=L(e);return{c(){t=p("p"),t.textContent="Enter your nsec or generate a new one. Optionally\n set a password to encrypt it securely.",n=m(),i=p("button"),o=g(T),a=m(),P&&P.c(),l=m(),f=p("input"),y=m(),v=p("div"),b=p("label"),b.textContent="Encryption Password (optional but recommended):",C=m(),E=p("input"),B=m(),N&&N.c(),S=m(),Q=p("small"),Q.textContent="Password uses Argon2id with ~3 second derivation time for security.",F=m(),D=p("button"),M.c(),A(t,"class","svelte-4xpfbi"),A(i,"class","generate-btn svelte-4xpfbi"),i.disabled=s=e[7]||e[8],A(f,"type","password"),A(f,"placeholder","nsec1..."),f.disabled=h=e[7]||e[9],A(f,"class","nsec-input svelte-4xpfbi"),A(b,"class","svelte-4xpfbi"),A(E,"type","password"),A(E,"placeholder","Enter password (min 8 chars)"),E.disabled=x=e[7]||e[9],A(E,"class","password-input svelte-4xpfbi"),A(Q,"class","password-hint svelte-4xpfbi"),A(v,"class","password-section svelte-4xpfbi"),A(D,"class","login-nsec-btn svelte-4xpfbi"),D.disabled=$=e[7]||e[9]||!e[3].trim()},m(r,s){u(r,t,s),u(r,n,s),u(r,i,s),c(i,o),u(r,a,s),P&&P.m(r,s),u(r,l,s),u(r,f,s),k(f,e[3]),u(r,y,s),u(r,v,s),c(v,b),c(v,C),c(v,E),k(E,e[4]),c(v,B),N&&N.m(v,null),c(v,S),c(v,Q),u(r,F,s),u(r,D,s),M.m(D,null),U||(R=[w(i,"click",e[20]),w(f,"input",e[29]),w(E,"input",e[30]),w(D,"click",e[22])],U=!0)},p(e,t){256&t[0]&&T!==(T=e[8]?"Generating...":"Generate New Key")&&I(o,T),384&t[0]&&s!==(s=e[7]||e[8])&&(i.disabled=s),e[12]?P?P.p(e,t):(P=vh(e),P.c(),P.m(l.parentNode,l)):P&&(P.d(1),P=null),640&t[0]&&h!==(h=e[7]||e[9])&&(f.disabled=h),8&t[0]&&f.value!==e[3]&&k(f,e[3]),640&t[0]&&x!==(x=e[7]||e[9])&&(E.disabled=x),16&t[0]&&E.value!==e[4]&&k(E,e[4]),e[4]?N?N.p(e,t):(N=Ah(e),N.c(),N.m(v,S)):N&&(N.d(1),N=null),L!==(L=O(e))&&(M.d(1),M=L(e),M&&(M.c(),M.m(D,null))),648&t[0]&&$!==($=e[7]||e[9]||!e[3].trim())&&(D.disabled=$)},d(e){e&&d(t),e&&d(n),e&&d(i),e&&d(a),P&&P.d(e),e&&d(l),e&&d(f),e&&d(y),e&&d(v),N&&N.d(),e&&d(F),e&&d(D),M.d(),U=!1,r(R)}}}function wh(e){let t,n,i,o,s,a,l,f,h,y,v,b,I,C,E=e[15]&&Ch(e);function x(e,t){return e[9]?Bh:e[7]?xh:Eh}let B=x(e),S=B(e);return{c(){t=p("p"),t.textContent="You have a stored encrypted key. Enter your\n password to unlock it.",n=m(),E&&E.c(),i=m(),o=p("input"),a=m(),l=p("button"),S.c(),h=m(),y=p("button"),v=g("Clear stored key & start fresh"),A(t,"class","svelte-4xpfbi"),A(o,"type","password"),A(o,"placeholder","Enter your password"),o.disabled=s=e[7]||e[9],A(o,"class","password-input svelte-4xpfbi"),A(l,"class","login-nsec-btn svelte-4xpfbi"),l.disabled=f=e[7]||e[9]||!e[6],A(y,"class","clear-btn svelte-4xpfbi"),y.disabled=b=e[7]||e[9]},m(r,s){u(r,t,s),u(r,n,s),E&&E.m(r,s),u(r,i,s),u(r,o,s),k(o,e[6]),u(r,a,s),u(r,l,s),S.m(l,null),u(r,h,s),u(r,y,s),c(y,v),I||(C=[w(o,"input",e[28]),w(l,"click",e[18]),w(y,"click",e[16])],I=!0)},p(e,t){e[15]?E?E.p(e,t):(E=Ch(e),E.c(),E.m(i.parentNode,i)):E&&(E.d(1),E=null),640&t[0]&&s!==(s=e[7]||e[9])&&(o.disabled=s),64&t[0]&&o.value!==e[6]&&k(o,e[6]),B!==(B=x(e))&&(S.d(1),S=B(e),S&&(S.c(),S.m(l,null))),704&t[0]&&f!==(f=e[7]||e[9]||!e[6])&&(l.disabled=f),640&t[0]&&b!==(b=e[7]||e[9])&&(y.disabled=b)},d(e){e&&d(t),e&&d(n),E&&E.d(e),e&&d(i),e&&d(o),e&&d(a),e&&d(l),S.d(),e&&d(h),e&&d(y),I=!1,r(C)}}}function vh(e){let t,n,r,i,o;return{c(){t=p("div"),n=p("label"),n.textContent="Your new public key (npub):",r=m(),i=p("code"),o=g(e[12]),A(n,"class","svelte-4xpfbi"),A(i,"class","npub-display svelte-4xpfbi"),A(t,"class","generated-info svelte-4xpfbi")},m(e,s){u(e,t,s),c(t,n),c(t,r),c(t,i),c(i,o)},p(e,t){4096&t[0]&&I(o,e[12])},d(e){e&&d(t)}}}function Ah(e){let t,n,r,i;return{c(){t=p("input"),A(t,"type","password"),A(t,"placeholder","Confirm password"),t.disabled=n=e[7]||e[9],A(t,"class","password-input svelte-4xpfbi")},m(n,o){u(n,t,o),k(t,e[5]),r||(i=w(t,"input",e[31]),r=!0)},p(e,r){640&r[0]&&n!==(n=e[7]||e[9])&&(t.disabled=n),32&r[0]&&t.value!==e[5]&&k(t,e[5])},d(e){e&&d(t),r=!1,i()}}}function bh(e){let t;return{c(){t=g("Log in with nsec")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Ih(e){let t;return{c(){t=g("Logging in...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function kh(e){let t;return{c(){t=g("Deriving key...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Ch(e){let t,n,r,i,o,s,a,l=e[15].slice(0,16)+"",f=e[15].slice(-8)+"";return{c(){t=p("div"),n=p("label"),n.textContent="Stored public key:",r=m(),i=p("code"),o=g(l),s=g("..."),a=g(f),A(n,"class","svelte-4xpfbi"),A(i,"class","npub-display svelte-4xpfbi"),A(t,"class","stored-info svelte-4xpfbi")},m(e,l){u(e,t,l),c(t,n),c(t,r),c(t,i),c(i,o),c(i,s),c(i,a)},p(e,t){32768&t[0]&&l!==(l=e[15].slice(0,16)+"")&&I(o,l),32768&t[0]&&f!==(f=e[15].slice(-8)+"")&&I(a,f)},d(e){e&&d(t)}}}function Eh(e){let t;return{c(){t=g("Unlock")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function xh(e){let t;return{c(){t=g("Unlocking...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Bh(e){let t;return{c(){t=g("Deriving key...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Sh(e){let t,n;return{c(){t=p("div"),n=g(e[10]),A(t,"class","message error-message svelte-4xpfbi")},m(e,r){u(e,t,r),c(t,n)},p(e,t){1024&t[0]&&I(n,e[10])},d(e){e&&d(t)}}}function Qh(e){let t,n;return{c(){t=p("div"),n=g(e[11]),A(t,"class","message success-message svelte-4xpfbi")},m(e,r){u(e,t,r),c(t,n)},p(e,t){2048&t[0]&&I(n,e[11])},d(e){e&&d(t)}}}function Fh(e){let t,n,r,i,o,s,a,l,f,h,y,w=e[13].toFixed(1)+"";return{c(){t=p("div"),n=p("div"),r=p("div"),i=m(),o=p("h3"),o.textContent="Deriving encryption key",s=m(),a=p("div"),l=g(w),f=g("s"),h=m(),y=p("p"),y.textContent="This may take 3-6 seconds for security",A(r,"class","deriving-spinner svelte-4xpfbi"),A(o,"class","svelte-4xpfbi"),A(a,"class","deriving-timer svelte-4xpfbi"),A(y,"class","deriving-note svelte-4xpfbi"),A(n,"class","deriving-modal svelte-4xpfbi"),B(n,"dark-theme",e[1]),A(t,"class","deriving-overlay svelte-4xpfbi")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),c(a,l),c(a,f),c(n,h),c(n,y)},p(e,t){8192&t[0]&&w!==(w=e[13].toFixed(1)+"")&&I(l,w),2&t[0]&&B(n,"dark-theme",e[1])},d(e){e&&d(t)}}}function Dh(t){let n,r,i,o,s=t[0]&&hh(t),a=t[9]&&Fh(t);return{c(){s&&s.c(),n=m(),a&&a.c(),r=y()},m(e,l){s&&s.m(e,l),u(e,n,l),a&&a.m(e,l),u(e,r,l),i||(o=w(ph,"keydown",t[23]),i=!0)},p(e,t){e[0]?s?s.p(e,t):(s=hh(e),s.c(),s.m(n.parentNode,n)):s&&(s.d(1),s=null),e[9]?a?a.p(e,t):(a=Fh(e),a.c(),a.m(r.parentNode,r)):a&&(a.d(1),a=null)},i:e,o:e,d(e){s&&s.d(e),e&&d(n),a&&a.d(e),e&&d(r),i=!1,o()}}}function $h(e,t,n){const r=U();let{showModal:i=!1}=t,{isDarkTheme:o=!1}=t,s="extension",a="",l="",c="",u="",d=!1,f=!1,p=!1,h="",g="",m="",y="",w=0,v=null,A=null;function b(){n(13,w=0),v=performance.now(),I()}function I(){null!==v&&(n(13,w=(performance.now()-v)/1e3),A=requestAnimationFrame(I))}function k(){v=null,A&&(cancelAnimationFrame(A),A=null)}$(()=>{k()});let C=!1,E="";function x(){n(14,C=!!localStorage.getItem("nostr_privkey_encrypted")),n(15,E=localStorage.getItem("nostr_pubkey")||"")}function B(){n(0,i=!1),n(3,a=""),n(4,l=""),n(5,c=""),n(6,u=""),n(10,h=""),n(11,g=""),m="",n(12,y=""),r("close")}function S(e){n(2,s=e),n(10,h=""),n(11,g=""),m="",n(12,y="")}async function Q(){n(7,d=!0),n(10,h=""),n(11,g="");try{if(!a.trim())throw new Error("Please enter your nsec");if(!function(e){if(!e||!e.startsWith("nsec1"))return!1;try{return"nsec"===yu(e).type}catch{return!1}}(a.trim()))throw new Error("Invalid nsec format or checksum");if(l){if(l.length<8)throw new Error("Password must be at least 8 characters");if(l!==c)throw new Error("Passwords do not match")}const e=kf.fromKey(a.trim()),t=await e.getPublicKey();if(localStorage.setItem("nostr_auth_method","nsec"),localStorage.setItem("nostr_pubkey",t),l){n(9,p=!0),b();const e=await async function(e,t){if(!e.startsWith("nsec1"))throw new Error("Invalid nsec format - must start with nsec1");try{if("nsec"!==yu(e).type)throw new Error("Invalid nsec - wrong type")}catch(e){throw new Error("Invalid nsec - bech32 checksum failed")}const n=crypto.getRandomValues(new Uint8Array(32)),r=crypto.getRandomValues(new Uint8Array(12)),i=await fh(t,n),o=await crypto.subtle.importKey("raw",i,{name:"AES-GCM"},!1,["encrypt"]),s=new TextEncoder,a=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},o,s.encode(e)),l=new Uint8Array(n.length+r.length+a.byteLength);return l.set(n,0),l.set(r,n.length),l.set(new Uint8Array(a),n.length+r.length),btoa(String.fromCharCode(...l))}(a.trim(),l);k(),n(9,p=!1),localStorage.setItem("nostr_privkey_encrypted",e),localStorage.removeItem("nostr_privkey")}else localStorage.setItem("nostr_privkey",a.trim()),localStorage.removeItem("nostr_privkey_encrypted"),n(11,g="Successfully logged in with nsec!");r("login",{method:"nsec",pubkey:t,privateKey:a.trim(),signer:e}),setTimeout(()=>{B()},1500)}catch(e){n(10,h=e.message)}finally{n(7,d=!1)}}D(()=>{x()});return e.$$set=e=>{"showModal"in e&&n(0,i=e.showModal),"isDarkTheme"in e&&n(1,o=e.isDarkTheme)},e.$$.update=()=>{1&e.$$.dirty[0]&&i&&x()},[i,o,s,a,l,c,u,d,f,p,h,g,y,w,C,E,function(){localStorage.removeItem("nostr_privkey_encrypted"),localStorage.removeItem("nostr_privkey"),localStorage.removeItem("nostr_pubkey"),localStorage.removeItem("nostr_auth_method"),n(14,C=!1),n(15,E=""),n(6,u=""),n(10,h=""),n(11,g="")},B,async function(){n(7,d=!0),n(9,p=!0),b(),n(10,h=""),n(11,g="");try{if(!u)throw new Error("Please enter your password");const e=localStorage.getItem("nostr_privkey_encrypted");if(!e)throw new Error("No encrypted key found");const t=await async function(e,t){const n=new Uint8Array(atob(e).split("").map(e=>e.charCodeAt(0)));if(n.length<60)throw new Error("Invalid encrypted data - too short");const r=n.slice(0,32),i=n.slice(32,44),o=n.slice(44),s=await fh(t,r),a=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["decrypt"]);let l;try{l=await crypto.subtle.decrypt({name:"AES-GCM",iv:i},a,o)}catch(e){throw new Error("Decryption failed - invalid password or corrupted data")}const c=(new TextDecoder).decode(l);if(!c.startsWith("nsec1"))throw new Error("Decryption produced invalid data - not an nsec");try{if("nsec"!==yu(c).type)throw new Error("Decryption produced invalid nsec type")}catch(e){throw new Error("Decryption produced invalid nsec - bech32 checksum failed")}return c}(e,u);k(),n(9,p=!1);const i=kf.fromKey(t),o=await i.getPublicKey();r("login",{method:"nsec",pubkey:o,privateKey:t,signer:i}),B()}catch(e){k(),e.message.includes("decrypt")||e.message.includes("tag")?n(10,h="Invalid password"):n(10,h=e.message)}finally{n(7,d=!1),n(9,p=!1),k()}},S,async function(){n(8,f=!0),n(10,h=""),n(11,g="");try{const e=Zc(),t=Au("nsec",e),r=vu(Xc(e));m=t,n(12,y=r),n(3,a=t),n(11,g="New key generated! Set an encryption password below to secure it.")}catch(e){n(10,h="Failed to generate key: "+e.message)}finally{n(8,f=!1)}},async function(){n(7,d=!0),n(10,h=""),n(11,g="");try{if(!window.nostr)throw new Error("No Nostr extension found. Please install a NIP-07 compatible extension like nos2x or Alby.");const e=await window.nostr.getPublicKey();e&&(localStorage.setItem("nostr_auth_method","extension"),localStorage.setItem("nostr_pubkey",e),n(11,g="Successfully logged in with extension!"),r("login",{method:"extension",pubkey:e,signer:window.nostr}),setTimeout(()=>{B()},1500))}catch(e){n(10,h=e.message)}finally{n(7,d=!1)}},Q,function(e){"Escape"===e.key&&B(),"Enter"===e.key&&"nsec"===s&&Q()},function(t){R.call(this,e,t)},function(t){R.call(this,e,t)},()=>S("extension"),()=>S("nsec"),function(){u=this.value,n(6,u)},function(){a=this.value,n(3,a)},function(){l=this.value,n(4,l)},function(){c=this.value,n(5,c)},e=>"Escape"===e.key&&B()]}class Uh extends oe{constructor(e){super(),ie(this,e,$h,Dh,o,{showModal:0,isDarkTheme:1},null,[-1,-1])}}function Rh(e,t,n){const r=e.slice();return r[72]=t[n],r}function Th(e,t,n){const r=e.slice();return r[75]=t[n],r}function Ph(e,t,n){const r=e.slice();return r[72]=t[n],r}function Nh(e,t,n){const r=e.slice();return r[72]=t[n],r}function Oh(e,t,n){const r=e.slice();return r[72]=t[n],r}function Lh(e,t,n){const r=e.slice();return r[72]=t[n],r}function Mh(e,t,n){const r=e.slice();return r[72]=t[n],r}function _h(e){let t,n,r;return{c(){t=p("div"),n=g(e[3]),A(t,"class",r="message "+e[4]+" svelte-1y8wjwc")},m(e,r){u(e,t,r),c(t,n)},p(e,i){8&i[0]&&I(n,e[3]),16&i[0]&&r!==(r="message "+e[4]+" svelte-1y8wjwc")&&A(t,"class",r)},d(e){e&&d(t)}}}function jh(e){let t,n,i,o,s,a,l,f,h,y,v,b,I,C,E,x,B,S,Q,F,D,$,U,R,T,P,N,O;function L(e,t){return e[5]&&e[5].length>0?Gh:Hh}let M=L(e),_=M(e);function j(e,t){return e[8]&&e[8].length>0?qh:Vh}let H=j(e),G=H(e);return{c(){t=p("div"),n=p("div"),i=p("h3"),i.textContent="Banned Pubkeys",o=m(),s=p("div"),a=p("input"),l=m(),f=p("input"),h=m(),y=p("button"),v=g("Ban Pubkey"),b=m(),I=p("div"),_.c(),C=m(),E=p("div"),x=p("h3"),x.textContent="Allowed Pubkeys",B=m(),S=p("div"),Q=p("input"),F=m(),D=p("input"),$=m(),U=p("button"),R=g("Allow Pubkey"),T=m(),P=p("div"),G.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","text"),A(a,"placeholder","Pubkey (64 hex chars)"),A(a,"class","svelte-1y8wjwc"),A(f,"type","text"),A(f,"placeholder","Reason (optional)"),A(f,"class","svelte-1y8wjwc"),y.disabled=e[2],A(y,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(I,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(x,"class","svelte-1y8wjwc"),A(Q,"type","text"),A(Q,"placeholder","Pubkey (64 hex chars)"),A(Q,"class","svelte-1y8wjwc"),A(D,"type","text"),A(D,"placeholder","Reason (optional)"),A(D,"class","svelte-1y8wjwc"),U.disabled=e[2],A(U,"class","svelte-1y8wjwc"),A(S,"class","add-form svelte-1y8wjwc"),A(P,"class","list svelte-1y8wjwc"),A(E,"class","section svelte-1y8wjwc"),A(t,"class","pubkeys-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),k(a,e[6]),c(s,l),c(s,f),k(f,e[7]),c(s,h),c(s,y),c(y,v),c(n,b),c(n,I),_.m(I,null),c(t,C),c(t,E),c(E,x),c(E,B),c(E,S),c(S,Q),k(Q,e[9]),c(S,F),c(S,D),k(D,e[10]),c(S,$),c(S,U),c(U,R),c(E,T),c(E,P),G.m(P,null),N||(O=[w(a,"input",e[43]),w(f,"input",e[44]),w(y,"click",e[25]),w(Q,"input",e[45]),w(D,"input",e[46]),w(U,"click",e[26])],N=!0)},p(e,t){64&t[0]&&a.value!==e[6]&&k(a,e[6]),128&t[0]&&f.value!==e[7]&&k(f,e[7]),4&t[0]&&(y.disabled=e[2]),M===(M=L(e))&&_?_.p(e,t):(_.d(1),_=M(e),_&&(_.c(),_.m(I,null))),512&t[0]&&Q.value!==e[9]&&k(Q,e[9]),1024&t[0]&&D.value!==e[10]&&k(D,e[10]),4&t[0]&&(U.disabled=e[2]),H===(H=j(e))&&G?G.p(e,t):(G.d(1),G=H(e),G&&(G.c(),G.m(P,null)))},d(e){e&&d(t),_.d(),G.d(),N=!1,r(O)}}}function Hh(t){let n;return{c(){n=p("div"),n.innerHTML="

No banned pubkeys configured.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Gh(e){let t,n=e[5],r=[];for(let t=0;tNo allowed pubkeys configured.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function qh(e){let t,n=e[8],r=[];for(let t=0;t0?Xh:Zh}let M=L(e),_=M(e);let j=function(e){return e[22]&&e[22].length>0?rg:ng}(e),H=j(e);return{c(){t=p("div"),n=p("div"),i=p("h3"),i.textContent="Banned Events",o=m(),s=p("div"),a=p("input"),l=m(),f=p("input"),h=m(),y=p("button"),v=g("Ban Event"),b=m(),I=p("div"),_.c(),C=m(),E=p("div"),x=p("h3"),x.textContent="Allowed Events",B=m(),S=p("div"),Q=p("input"),F=m(),D=p("input"),$=m(),U=p("button"),R=g("Allow Event"),T=m(),P=p("div"),H.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","text"),A(a,"placeholder","Event ID (64 hex chars)"),A(a,"class","svelte-1y8wjwc"),A(f,"type","text"),A(f,"placeholder","Reason (optional)"),A(f,"class","svelte-1y8wjwc"),y.disabled=e[2],A(y,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(I,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(x,"class","svelte-1y8wjwc"),A(Q,"type","text"),A(Q,"placeholder","Event ID (64 hex chars)"),A(Q,"class","svelte-1y8wjwc"),A(D,"type","text"),A(D,"placeholder","Reason (optional)"),A(D,"class","svelte-1y8wjwc"),U.disabled=e[2],A(U,"class","svelte-1y8wjwc"),A(S,"class","add-form svelte-1y8wjwc"),A(P,"class","list svelte-1y8wjwc"),A(E,"class","section svelte-1y8wjwc"),A(t,"class","events-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),k(a,e[12]),c(s,l),c(s,f),k(f,e[13]),c(s,h),c(s,y),c(y,v),c(n,b),c(n,I),_.m(I,null),c(t,C),c(t,E),c(E,x),c(E,B),c(E,S),c(S,Q),k(Q,e[14]),c(S,F),c(S,D),k(D,e[15]),c(S,$),c(S,U),c(U,R),c(E,T),c(E,P),H.m(P,null),N||(O=[w(a,"input",e[47]),w(f,"input",e[48]),w(y,"click",e[27]),w(Q,"input",e[49]),w(D,"input",e[50]),w(U,"click",e[28])],N=!0)},p(e,t){4096&t[0]&&a.value!==e[12]&&k(a,e[12]),8192&t[0]&&f.value!==e[13]&&k(f,e[13]),4&t[0]&&(y.disabled=e[2]),M===(M=L(e))&&_?_.p(e,t):(_.d(1),_=M(e),_&&(_.c(),_.m(I,null))),16384&t[0]&&Q.value!==e[14]&&k(Q,e[14]),32768&t[0]&&D.value!==e[15]&&k(D,e[15]),4&t[0]&&(U.disabled=e[2]),H.p(e,t)},d(e){e&&d(t),_.d(),H.d(),N=!1,r(O)}}}function Zh(t){let n;return{c(){n=p("div"),n.innerHTML="

No banned events configured.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Xh(e){let t,n=e[11],r=[];for(let t=0;tNo allowed events configured.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function rg(e){let t,n=e[22],r=[];for(let t=0;t0?ag:sg}let B=x(e),S=B(e);return{c(){t=p("div"),n=p("div"),i=p("h3"),i.textContent="Blocked IPs",o=m(),s=p("div"),a=p("input"),l=m(),f=p("input"),h=m(),y=p("button"),v=g("Block IP"),b=m(),I=p("div"),S.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","text"),A(a,"placeholder","IP Address"),A(a,"class","svelte-1y8wjwc"),A(f,"type","text"),A(f,"placeholder","Reason (optional)"),A(f,"class","svelte-1y8wjwc"),y.disabled=e[2],A(y,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(I,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(t,"class","ips-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),k(a,e[17]),c(s,l),c(s,f),k(f,e[18]),c(s,h),c(s,y),c(y,v),c(n,b),c(n,I),S.m(I,null),C||(E=[w(a,"input",e[51]),w(f,"input",e[52]),w(y,"click",e[29])],C=!0)},p(e,t){131072&t[0]&&a.value!==e[17]&&k(a,e[17]),262144&t[0]&&f.value!==e[18]&&k(f,e[18]),4&t[0]&&(y.disabled=e[2]),B===(B=x(e))&&S?S.p(e,t):(S.d(1),S=B(e),S&&(S.c(),S.m(I,null)))},d(e){e&&d(t),S.d(),C=!1,r(E)}}}function sg(t){let n;return{c(){n=p("div"),n.innerHTML="

No blocked IPs configured.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function ag(e){let t,n=e[16],r=[];for(let t=0;t0?fg:dg}let x=E(e),B=x(e);return{c(){t=p("div"),n=p("div"),i=p("h3"),i.textContent="Allowed Event Kinds",o=m(),s=p("div"),a=p("input"),l=m(),f=p("button"),h=g("Allow Kind"),y=m(),v=p("div"),B.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","number"),A(a,"placeholder","Kind number"),A(a,"class","svelte-1y8wjwc"),f.disabled=e[2],A(f,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(v,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(t,"class","kinds-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),k(a,e[20]),c(s,l),c(s,f),c(f,h),c(n,y),c(n,v),B.m(v,null),I||(C=[w(a,"input",e[53]),w(f,"click",e[30])],I=!0)},p(e,t){1048576&t[0]&&b(a.value)!==e[20]&&k(a,e[20]),4&t[0]&&(f.disabled=e[2]),x===(x=E(e))&&B?B.p(e,t):(B.d(1),B=x(e),B&&(B.c(),B.m(v,null)))},d(e){e&&d(t),B.d(),I=!1,r(C)}}}function dg(t){let n;return{c(){n=p("div"),n.innerHTML="

No allowed kinds configured. All kinds are\n allowed by default.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function fg(e){let t,n=e[19],r=[];for(let t=0;t0?mg:gg}let v=y(e),b=v(e);return{c(){t=p("div"),n=p("div"),r=p("h3"),r.textContent="Events Needing Moderation",i=m(),o=p("button"),s=g("Refresh"),a=m(),l=p("div"),b.c(),A(r,"class","svelte-1y8wjwc"),o.disabled=e[2],A(l,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(t,"class","moderation-section")},m(d,p){u(d,t,p),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(n,a),c(n,l),b.m(l,null),f||(h=w(o,"click",e[24]),f=!0)},p(e,t){4&t[0]&&(o.disabled=e[2]),v===(v=y(e))&&b?b.p(e,t):(b.d(1),b=v(e),b&&(b.c(),b.m(l,null)))},d(e){e&&d(t),b.d(),f=!1,h()}}}function gg(t){let n;return{c(){n=p("div"),n.innerHTML="

No events need moderation at this time.

",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function mg(e){let t,n=e[21],r=[];for(let t=0;tManaged ACL Configuration \n

Configure access control using NIP-86 management API

\n
Owner Only: This interface is restricted to relay owners\n only.
',o=m(),q&&q.c(),s=m(),a=p("div"),l=p("button"),f=g("Pubkeys"),y=m(),v=p("button"),b=g("Events"),k=m(),C=p("button"),E=g("IPs"),B=m(),S=p("button"),Q=g("Kinds"),D=m(),$=p("button"),U=g("Moderation"),T=m(),P=p("button"),N=g("Relay Config"),L=m(),M=p("div"),Y&&Y.c(),_=m(),W&&W.c(),j=m(),z&&z.c(),H=m(),Z&&Z.c(),G=m(),X&&X.c(),J=m(),ee&&ee.c(),A(i,"class","header svelte-1y8wjwc"),A(l,"class",h="tab "+("pubkeys"===t[1]?"active":"")+" svelte-1y8wjwc"),A(v,"class",I="tab "+("events"===t[1]?"active":"")+" svelte-1y8wjwc"),A(C,"class",x="tab "+("ips"===t[1]?"active":"")+" svelte-1y8wjwc"),A(S,"class",F="tab "+("kinds"===t[1]?"active":"")+" svelte-1y8wjwc"),A($,"class",R="tab "+("moderation"===t[1]?"active":"")+" svelte-1y8wjwc"),A(P,"class",O="tab "+("relay"===t[1]?"active":"")+" svelte-1y8wjwc"),A(a,"class","tabs svelte-1y8wjwc"),A(M,"class","tab-content svelte-1y8wjwc")},m(e,r){u(e,n,r),c(n,i),c(n,o),q&&q.m(n,null),c(n,s),c(n,a),c(a,l),c(l,f),c(a,y),c(a,v),c(v,b),c(a,k),c(a,C),c(C,E),c(a,B),c(a,S),c(S,Q),c(a,D),c(a,$),c($,U),c(a,T),c(a,P),c(P,N),c(n,L),c(n,M),Y&&Y.m(M,null),c(M,_),W&&W.m(M,null),c(M,j),z&&z.m(M,null),c(M,H),Z&&Z.m(M,null),c(M,G),X&&X.m(M,null),c(M,J),ee&&ee.m(M,null),K||(V=[w(l,"click",t[37]),w(v,"click",t[38]),w(C,"click",t[39]),w(S,"click",t[40]),w($,"click",t[41]),w(P,"click",t[42])],K=!0)},p(e,t){e[3]?q?q.p(e,t):(q=_h(e),q.c(),q.m(n,s)):q&&(q.d(1),q=null),2&t[0]&&h!==(h="tab "+("pubkeys"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(l,"class",h),2&t[0]&&I!==(I="tab "+("events"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(v,"class",I),2&t[0]&&x!==(x="tab "+("ips"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(C,"class",x),2&t[0]&&F!==(F="tab "+("kinds"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(S,"class",F),2&t[0]&&R!==(R="tab "+("moderation"===e[1]?"active":"")+" svelte-1y8wjwc")&&A($,"class",R),2&t[0]&&O!==(O="tab "+("relay"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(P,"class",O),"pubkeys"===e[1]?Y?Y.p(e,t):(Y=jh(e),Y.c(),Y.m(M,_)):Y&&(Y.d(1),Y=null),"events"===e[1]?W?W.p(e,t):(W=zh(e),W.c(),W.m(M,j)):W&&(W.d(1),W=null),"ips"===e[1]?z?z.p(e,t):(z=og(e),z.c(),z.m(M,H)):z&&(z.d(1),z=null),"kinds"===e[1]?Z?Z.p(e,t):(Z=ug(e),Z.c(),Z.m(M,G)):Z&&(Z.d(1),Z=null),"moderation"===e[1]?X?X.p(e,t):(X=hg(e),X.c(),X.m(M,J)):X&&(X.d(1),X=null),"relay"===e[1]?ee?ee.p(e,t):(ee=vg(e),ee.c(),ee.m(M,null)):ee&&(ee.d(1),ee=null)},i:e,o:e,d(e){e&&d(n),q&&q.d(),Y&&Y.d(),W&&W.d(),z&&z.d(),Z&&Z.d(),X&&X.d(),ee&&ee.d(),K=!1,r(V)}}}function kg(e,t,n){let{userSigner:r}=t,{userPubkey:i}=t,o="pubkeys",s=!1,a="",l="info",c=[],u="",d="",f=[],p="",h="",g=[],m="",y="",w="",v="",A=[],I="",k="",C=[],E="",x=[],B={relay_name:"",relay_description:"",relay_icon:""};async function S(){try{n(2,s=!0),console.log("Fetching relay info from /");const e=await fetch(window.location.origin+"/",{headers:{Accept:"application/nostr+json"}});if(console.log("Response status:",e.status),console.log("Response headers:",e.headers),e.ok){const t=await e.json();console.log("Raw relay info:",t),n(0,B={relay_name:t.name||"",relay_description:t.description||"",relay_icon:t.icon||""}),console.log("Updated relayConfig:",B),console.log("Loaded relay info:",t),n(3,a="Relay configuration loaded successfully"),n(4,l="success")}else console.error("Failed to fetch relay info, status:",e.status),n(3,a=`Failed to fetch relay info: ${e.status}`),n(4,l="error")}catch(e){console.error("Failed to fetch relay info:",e),n(3,a=`Failed to fetch relay info: ${e.message}`),n(4,l="error")}finally{n(2,s=!1)}}async function Q(e,t=[]){try{n(2,s=!0),n(3,a="");const o={method:e,params:t},l=await async function(e,t){if(!r)throw new Error("No signer available for authentication. Please log in with a Nostr extension.");if(!i)throw new Error("No user pubkey available for authentication.");const n=window.location.origin+t,o={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",n],["method",e]],content:"",pubkey:i},s=await r.signEvent(o),a=JSON.stringify(s);return`Nostr ${btoa(a)}`}("POST","/api/nip86"),c=await fetch("/api/nip86",{method:"POST",headers:{"Content-Type":"application/nostr+json+rpc",Authorization:l},body:JSON.stringify(o)});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);const u=await c.json();if(u.error)throw new Error(u.error);return u.result}catch(e){throw console.error("NIP-86 API error:",e),n(3,a=e.message),n(4,l="error"),e}finally{n(2,s=!1)}}async function F(){try{n(5,c=await Q("listbannedpubkeys"))}catch(e){console.error("Failed to load banned pubkeys:",e)}}async function $(){try{n(8,f=await Q("listallowedpubkeys"))}catch(e){console.error("Failed to load allowed pubkeys:",e)}}async function U(){try{n(11,g=await Q("listbannedevents"))}catch(e){console.error("Failed to load banned events:",e)}}async function R(){try{n(16,A=await Q("listblockedips"))}catch(e){console.error("Failed to load blocked IPs:",e)}}async function T(){try{n(19,C=await Q("listallowedkinds"))}catch(e){console.error("Failed to load allowed kinds:",e)}}async function P(){try{n(2,s=!0),n(21,x=await Q("listeventsneedingmoderation")),console.log("Loaded events needing moderation:",x)}catch(e){console.error("Failed to load events needing moderation:",e),n(3,a=`Failed to load moderation events: ${e.message}`),n(4,l="error"),n(21,x=[])}finally{n(2,s=!1)}}async function N(e){try{await Q("disallowkind",[e]),n(3,a="Kind disallowed successfully"),n(4,l="success"),await T()}catch(e){console.error("Failed to disallow kind:",e)}}async function O(e){try{await Q("allowevent",[e,"Approved from moderation queue"]),n(3,a="Event allowed successfully"),n(4,l="success"),await P()}catch(e){console.error("Failed to allow event from moderation:",e)}}async function L(e){try{await Q("banevent",[e,"Banned from moderation queue"]),n(3,a="Event banned successfully"),n(4,l="success"),await P()}catch(e){console.error("Failed to ban event from moderation:",e)}}D(()=>{setTimeout(()=>{S()},100)}),async function(){await Promise.all([F(),$(),U(),R(),T()])}();return e.$$set=e=>{"userSigner"in e&&n(35,r=e.userSigner),"userPubkey"in e&&n(36,i=e.userPubkey)},e.$$.update=()=>{1&e.$$.dirty[0]&&console.log("relayConfig changed:",B)},[B,o,s,a,l,c,u,d,f,p,h,g,m,y,w,v,A,I,k,C,E,x,[],S,P,async function(){if(u)try{await Q("banpubkey",[u,d]),n(3,a="Pubkey banned successfully"),n(4,l="success"),n(6,u=""),n(7,d=""),await F()}catch(e){console.error("Failed to ban pubkey:",e)}},async function(){if(p)try{await Q("allowpubkey",[p,h]),n(3,a="Pubkey allowed successfully"),n(4,l="success"),n(9,p=""),n(10,h=""),await $()}catch(e){console.error("Failed to allow pubkey:",e)}},async function(){if(m)try{await Q("banevent",[m,y]),n(3,a="Event banned successfully"),n(4,l="success"),n(12,m=""),n(13,y=""),await U()}catch(e){console.error("Failed to ban event:",e)}},async function(){if(w)try{await Q("allowevent",[w,v]),n(3,a="Event allowed successfully"),n(4,l="success"),n(14,w=""),n(15,v="")}catch(e){console.error("Failed to allow event:",e)}},async function(){if(I)try{await Q("blockip",[I,k]),n(3,a="IP blocked successfully"),n(4,l="success"),n(17,I=""),n(18,k=""),await R()}catch(e){console.error("Failed to block IP:",e)}},async function(){if(!E)return;const e=parseInt(E);if(isNaN(e))return n(3,a="Invalid kind number"),void n(4,l="error");try{await Q("allowkind",[e]),n(3,a="Kind allowed successfully"),n(4,l="success"),n(20,E=""),await T()}catch(e){console.error("Failed to allow kind:",e)}},N,async function(){try{n(2,s=!0),n(3,a="");const e=[];if(B.relay_name&&e.push(Q("changerelayname",[B.relay_name])),B.relay_description&&e.push(Q("changerelaydescription",[B.relay_description])),B.relay_icon&&e.push(Q("changerelayicon",[B.relay_icon])),0===e.length)return n(3,a="No changes to update"),void n(4,l="info");await Promise.all(e),n(3,a="Relay configuration updated successfully"),n(4,l="success"),await S()}catch(e){console.error("Failed to update relay configuration:",e),n(3,a=`Failed to update relay configuration: ${e.message}`),n(4,l="error")}finally{n(2,s=!1)}},O,L,r,i,()=>n(1,o="pubkeys"),()=>n(1,o="events"),()=>n(1,o="ips"),()=>n(1,o="kinds"),()=>{n(1,o="moderation"),x&&0!==x.length||P()},()=>n(1,o="relay"),function(){u=this.value,n(6,u)},function(){d=this.value,n(7,d)},function(){p=this.value,n(9,p)},function(){h=this.value,n(10,h)},function(){m=this.value,n(12,m)},function(){y=this.value,n(13,y)},function(){w=this.value,n(14,w)},function(){v=this.value,n(15,v)},function(){I=this.value,n(17,I)},function(){k=this.value,n(18,k)},function(){E=b(this.value),n(20,E)},e=>N(e),e=>O(e.id),e=>L(e.id),function(){B.relay_name=this.value,n(0,B)},function(){B.relay_description=this.value,n(0,B)},function(){B.relay_icon=this.value,n(0,B)}]}class Cg extends oe{constructor(e){super(),ie(this,e,kg,Ig,o,{userSigner:35,userPubkey:36},null,[-1,-1,-1])}}function Eg(e){let t,n;return{c(){t=p("span"),n=g(e[3]),A(t,"class","permission-badge svelte-1qkhxam")},m(e,r){u(e,t,r),c(t,n)},p(e,t){8&t&&I(n,e[3])},d(e){e&&d(t)}}}function xg(t){let n,r,i;return{c(){n=p("button"),n.textContent="Log in",A(n,"class","login-btn svelte-1qkhxam")},m(e,o){u(e,n,o),r||(i=w(n,"click",t[7]),r=!0)},p:e,d(e){e&&d(n),r=!1,i()}}}function Bg(e){let t,n,r,i,o,s,a=(e[4]?.name||e[5])+"";function l(e,t){return e[4]?.picture?Qg:Sg}let f=l(e),h=f(e);return{c(){t=p("button"),h.c(),n=m(),r=p("span"),i=g(a),A(r,"class","user-name svelte-1qkhxam"),A(t,"class","user-profile-btn svelte-1qkhxam")},m(a,l){u(a,t,l),h.m(t,null),c(t,n),c(t,r),c(r,i),o||(s=w(t,"click",e[6]),o=!0)},p(e,r){f===(f=l(e))&&h?h.p(e,r):(h.d(1),h=f(e),h&&(h.c(),h.m(t,n))),48&r&&a!==(a=(e[4]?.name||e[5])+"")&&I(i,a)},d(e){e&&d(t),h.d(),o=!1,s()}}}function Sg(t){let n;return{c(){n=p("div"),n.textContent="👤",A(n,"class","user-avatar-placeholder svelte-1qkhxam")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Qg(e){let t,n;return{c(){t=p("img"),a(t.src,n=e[4].picture)||A(t,"src",n),A(t,"alt","User avatar"),A(t,"class","user-avatar svelte-1qkhxam")},m(e,n){u(e,t,n)},p(e,r){16&r&&!a(t.src,n=e[4].picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function Fg(t){let n,r,i,o,s,l,f,h,y,w,v=t[1]&&t[2]&&Eg(t);function b(e,t){return e[1]?Bg:xg}let I=b(t),k=I(t);return{c(){n=p("header"),r=p("div"),i=p("img"),s=m(),l=p("div"),f=p("span"),h=g("ORLY? dashboard\n "),v&&v.c(),y=m(),w=p("div"),k.c(),a(i.src,o="/orly.png")||A(i,"src","/orly.png"),A(i,"alt","ORLY Logo"),A(i,"class","logo svelte-1qkhxam"),A(f,"class","app-title svelte-1qkhxam"),A(l,"class","header-title svelte-1qkhxam"),A(w,"class","header-buttons svelte-1qkhxam"),A(r,"class","header-content svelte-1qkhxam"),A(n,"class","main-header svelte-1qkhxam"),B(n,"dark-theme",t[0])},m(e,t){u(e,n,t),c(n,r),c(r,i),c(r,s),c(r,l),c(l,f),c(f,h),v&&v.m(f,null),c(r,y),c(r,w),k.m(w,null)},p(e,[t]){e[1]&&e[2]?v?v.p(e,t):(v=Eg(e),v.c(),v.m(f,null)):v&&(v.d(1),v=null),I===(I=b(e))&&k?k.p(e,t):(k.d(1),k=I(e),k&&(k.c(),k.m(w,null))),1&t&&B(n,"dark-theme",e[0])},i:e,o:e,d(e){e&&d(n),v&&v.d(),k.d()}}}function Dg(e,t,n){let{isDarkTheme:r=!1}=t,{isLoggedIn:i=!1}=t,{userRole:o=""}=t,{currentEffectiveRole:s=""}=t,{userProfile:a=null}=t,{userPubkey:l=""}=t;const c=U();return e.$$set=e=>{"isDarkTheme"in e&&n(0,r=e.isDarkTheme),"isLoggedIn"in e&&n(1,i=e.isLoggedIn),"userRole"in e&&n(2,o=e.userRole),"currentEffectiveRole"in e&&n(3,s=e.currentEffectiveRole),"userProfile"in e&&n(4,a=e.userProfile),"userPubkey"in e&&n(5,l=e.userPubkey)},[r,i,o,s,a,l,function(){c("openSettingsDrawer")},function(){c("openLoginModal")}]}class $g extends oe{constructor(e){super(),ie(this,e,Dg,Fg,o,{isDarkTheme:0,isLoggedIn:1,userRole:2,currentEffectiveRole:3,userProfile:4,userPubkey:5})}}function Ug(e,t,n){const r=e.slice();return r[10]=t[n],r}function Rg(e){let t,n,i;function o(){return e[6](e[10])}function s(...t){return e[7](e[10],...t)}return{c(){t=p("span"),t.textContent="✕",A(t,"class","tab-close-icon svelte-wfmuj"),A(t,"role","button"),A(t,"tabindex","0")},m(e,r){u(e,t,r),n||(i=[w(t,"click",v(o)),w(t,"keydown",s)],n=!0)},p(t,n){e=t},d(e){e&&d(t),n=!1,r(i)}}}function Tg(e){let t,n,r,i,o,s,a,l,f,h,y=e[10].icon+"",v=e[10].label+"",b=e[10].isSearchTab&&Rg(e);function k(){return e[8](e[10])}return{c(){t=p("button"),n=p("span"),r=g(y),i=m(),o=p("span"),s=g(v),a=m(),b&&b.c(),l=m(),A(n,"class","tab-icon svelte-wfmuj"),A(o,"class","tab-label svelte-wfmuj"),A(t,"class","tab svelte-wfmuj"),B(t,"active",e[2]===e[10].id)},m(e,d){u(e,t,d),c(t,n),c(n,r),c(t,i),c(t,o),c(o,s),c(t,a),b&&b.m(t,null),c(t,l),f||(h=w(t,"click",k),f=!0)},p(n,i){e=n,2&i&&y!==(y=e[10].icon+"")&&I(r,y),2&i&&v!==(v=e[10].label+"")&&I(s,v),e[10].isSearchTab?b?b.p(e,i):(b=Rg(e),b.c(),b.m(t,l)):b&&(b.d(1),b=null),6&i&&B(t,"active",e[2]===e[10].id)},d(e){e&&d(t),b&&b.d(),f=!1,h()}}}function Pg(e){let t,n,r,i,o,s,a,l;return{c(){t=p("a"),n=h("svg"),r=h("path"),i=h("path"),o=m(),s=p("span"),a=g("v"),l=g(e[3]),A(r,"d","M5 6h12v2h1.5c1.38 0 2.5 1.12 2.5 2.5v1c0 1.38-1.12 2.5-2.5 2.5H17v1c0 1.66-1.34 3-3 3H8c-1.66 0-3-1.34-3-3V6zm12 6h1.5c.28 0 .5-.22.5-.5v-1c0-.28-.22-.5-.5-.5H17v2z"),A(i,"d","M9 9c1.5 0 3 .5 3 2.5S10.5 14 9 14c0-1.5.5-3.5 2-4.5"),A(i,"stroke","currentColor"),A(i,"stroke-width","1"),A(i,"fill","none"),A(n,"class","version-icon svelte-wfmuj"),A(n,"viewBox","0 0 24 24"),A(n,"fill","currentColor"),A(n,"xmlns","http://www.w3.org/2000/svg"),A(s,"class","version-text svelte-wfmuj"),A(t,"href","https://next.orly.dev"),A(t,"target","_blank"),A(t,"rel","noopener noreferrer"),A(t,"class","version-link svelte-wfmuj")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(n,i),c(t,o),c(t,s),c(s,a),c(s,l)},p(e,t){8&t&&I(l,e[3])},d(e){e&&d(t)}}}function Ng(t){let n,r,i,o,s=t[1],a=[];for(let e=0;e{"isDarkTheme"in e&&n(0,r=e.isDarkTheme),"tabs"in e&&n(1,i=e.tabs),"selectedTab"in e&&n(2,o=e.selectedTab),"version"in e&&n(3,s=e.version)},[r,i,o,s,l,c,e=>c(e.id),(e,t)=>"Enter"===t.key&&c(e.id),e=>l(e.id)]}class Lg extends oe{constructor(e){super(),ie(this,e,Og,Ng,o,{isDarkTheme:0,tabs:1,selectedTab:2,version:3})}}function Mg(t){let n,r,i,o,s,a;return{c(){n=p("div"),r=p("p"),r.textContent="Please log in to access export functionality.",i=m(),o=p("button"),o.textContent="Log In",A(r,"class","svelte-jzrdtj"),A(o,"class","login-btn svelte-jzrdtj"),A(n,"class","login-prompt svelte-jzrdtj")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[5]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function _g(e){let t,n,r=e[0]&&jg(e),i=e[1]&&Hg(e);return{c(){r&&r.c(),t=m(),i&&i.c(),n=y()},m(e,o){r&&r.m(e,o),u(e,t,o),i&&i.m(e,o),u(e,n,o)},p(e,o){e[0]?r?r.p(e,o):(r=jg(e),r.c(),r.m(t.parentNode,t)):r&&(r.d(1),r=null),e[1]?i?i.p(e,o):(i=Hg(e),i.c(),i.m(n.parentNode,n)):i&&(i.d(1),i=null)},d(e){r&&r.d(e),e&&d(t),i&&i.d(e),e&&d(n)}}}function jg(t){let n,r,i,o,s,a,l,f;return{c(){n=p("div"),r=p("h3"),r.textContent="Export My Events",i=m(),o=p("p"),o.textContent="Download your personal events as a JSONL file.",s=m(),a=p("button"),a.textContent="📤 Export My Events",A(r,"class","svelte-jzrdtj"),A(o,"class","svelte-jzrdtj"),A(a,"class","export-btn svelte-jzrdtj"),A(n,"class","export-section svelte-jzrdtj")},m(e,d){u(e,n,d),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),l||(f=w(a,"click",t[3]),l=!0)},p:e,d(e){e&&d(n),l=!1,f()}}}function Hg(t){let n,r,i,o,s,a,l,f;return{c(){n=p("div"),r=p("h3"),r.textContent="Export All Events",i=m(),o=p("p"),o.textContent="Download the complete database as a JSONL file. This includes\n all events from all users.",s=m(),a=p("button"),a.textContent="📤 Export All Events",A(r,"class","svelte-jzrdtj"),A(o,"class","svelte-jzrdtj"),A(a,"class","export-btn svelte-jzrdtj"),A(n,"class","export-section svelte-jzrdtj")},m(e,d){u(e,n,d),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),l||(f=w(a,"click",t[4]),l=!0)},p:e,d(e){e&&d(n),l=!1,f()}}}function Gg(t){let n;function r(e,t){return e[2]?_g:Mg}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 Jg(e,t,n){let r,i,{isLoggedIn:o=!1}=t,{currentEffectiveRole:s=""}=t,{aclMode:a=""}=t;const l=U();return e.$$set=e=>{"isLoggedIn"in e&&n(0,o=e.isLoggedIn),"currentEffectiveRole"in e&&n(6,s=e.currentEffectiveRole),"aclMode"in e&&n(7,a=e.aclMode)},e.$$.update=()=>{129&e.$$.dirty&&n(2,r="none"===a||o),192&e.$$.dirty&&n(1,i="none"===a||"admin"===s||"owner"===s)},[o,i,r,function(){l("exportMyEvents")},function(){l("exportAllEvents")},function(){l("openLoginModal")},s,a]}class Kg extends oe{constructor(e){super(),ie(this,e,Jg,Gg,o,{isLoggedIn:0,currentEffectiveRole:6,aclMode:7})}}function Vg(t){let n,r,i,o,s,a,l,f;return{c(){n=p("div"),r=p("h3"),r.textContent="Import Events",i=m(),o=p("p"),o.textContent="Please log in to access import functionality.",s=m(),a=p("button"),a.textContent="Log In",A(r,"class","recovery-header svelte-nonyqh"),A(o,"class","recovery-description svelte-nonyqh"),A(a,"class","login-btn svelte-nonyqh"),A(n,"class","login-prompt svelte-nonyqh")},m(e,d){u(e,n,d),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),l||(f=w(a,"click",t[6]),l=!0)},p:e,d(e){e&&d(n),l=!1,f()}}}function qg(t){let n;return{c(){n=p("div"),n.innerHTML='

Import Events

\n

Admin or owner permission required for import functionality.

',A(n,"class","permission-denied svelte-nonyqh")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Yg(e){let t,n,i,o,s,a,l,f,h,y,v,b,I,k,C=e[2]&&Wg(e);return{c(){t=p("h3"),t.textContent="Import Events",n=m(),i=p("p"),i.textContent="Upload a JSONL file to import events into the database.",o=m(),s=p("div"),a=p("input"),l=m(),f=p("div"),h=p("button"),y=g("Import Events"),b=m(),C&&C.c(),A(t,"class","svelte-nonyqh"),A(i,"class","svelte-nonyqh"),A(a,"type","file"),A(a,"id","import-file"),A(a,"accept",".jsonl,.txt"),A(a,"class","svelte-nonyqh"),A(h,"class","import-btn svelte-nonyqh"),h.disabled=v=!e[1]||"Uploading..."===e[2],A(f,"class","import-row svelte-nonyqh"),A(s,"class","recovery-controls-card svelte-nonyqh")},m(r,d){u(r,t,d),u(r,n,d),u(r,i,d),u(r,o,d),u(r,s,d),c(s,a),c(s,l),c(s,f),c(f,h),c(h,y),c(f,b),C&&C.m(f,null),I||(k=[w(a,"change",e[4]),w(h,"click",e[5])],I=!0)},p(e,t){6&t&&v!==(v=!e[1]||"Uploading..."===e[2])&&(h.disabled=v),e[2]?C?C.p(e,t):(C=Wg(e),C.c(),C.m(f,null)):C&&(C.d(1),C=null)},d(e){e&&d(t),e&&d(n),e&&d(i),e&&d(o),e&&d(s),C&&C.d(),I=!1,r(k)}}}function Wg(e){let t,n;return{c(){t=p("span"),n=g(e[2]),A(t,"class","import-message svelte-nonyqh"),B(t,"uploading","Uploading..."===e[2]),B(t,"success","Upload complete"===e[2]),B(t,"error",e[2].startsWith("Import failed")||e[2].startsWith("Admin")||e[2].startsWith("Please"))},m(e,r){u(e,t,r),c(t,n)},p(e,r){4&r&&I(n,e[2]),4&r&&B(t,"uploading","Uploading..."===e[2]),4&r&&B(t,"success","Upload complete"===e[2]),4&r&&B(t,"error",e[2].startsWith("Import failed")||e[2].startsWith("Admin")||e[2].startsWith("Please"))},d(e){e&&d(t)}}}function zg(t){let n;function r(e,t){return e[3]?Yg:e[0]?qg:Vg}let i=r(t),o=i(t);return{c(){n=p("div"),o.c(),A(n,"class","import-section svelte-nonyqh")},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 Zg(e,t,n){let r,{isLoggedIn:i=!1}=t,{currentEffectiveRole:o=""}=t,{selectedFile:s=null}=t,{aclMode:a=""}=t,{importMessage:l=""}=t;const c=U();return e.$$set=e=>{"isLoggedIn"in e&&n(0,i=e.isLoggedIn),"currentEffectiveRole"in e&&n(7,o=e.currentEffectiveRole),"selectedFile"in e&&n(1,s=e.selectedFile),"aclMode"in e&&n(8,a=e.aclMode),"importMessage"in e&&n(2,l=e.importMessage)},e.$$.update=()=>{385&e.$$.dirty&&n(3,r="none"===a||i&&("admin"===o||"owner"===o))},[i,s,l,r,function(e){c("fileSelect",e)},function(){c("importEvents")},function(){c("openLoginModal")},o,a]}class Xg extends oe{constructor(e){super(),ie(this,e,Zg,zg,o,{isLoggedIn:0,currentEffectiveRole:7,selectedFile:1,aclMode:8,importMessage:2})}}const em={0:"Profile Metadata",1:"Text Note",2:"Recommend Relay",3:"Contacts",4:"Encrypted DM",5:"Delete Request",6:"Repost",7:"Reaction",8:"Badge Award",16:"Generic Repost",40:"Channel Creation",41:"Channel Metadata",42:"Channel Message",43:"Channel Hide Message",44:"Channel Mute User",1063:"File Metadata",1311:"Live Chat Message",1984:"Reporting",1985:"Label",9734:"Zap Request",9735:"Zap Receipt",1e4:"Mute List",10001:"Pin List",10002:"Relay List Metadata",10003:"Bookmark List",10004:"Communities List",10005:"Public Chats List",10006:"Blocked Relays List",10007:"Search Relays List",10009:"User Groups",10015:"Interests List",10030:"User Emoji List",13194:"Wallet Info",22242:"Client Auth",23194:"Wallet Request",23195:"Wallet Response",24133:"Nostr Connect",27235:"HTTP Auth",3e4:"Categorized People List",30001:"Categorized Bookmarks",30002:"Categorized Relay List",30003:"Bookmark Sets",30004:"Curation Sets",30005:"Video Sets",30008:"Profile Badges",30009:"Badge Definition",30015:"Interest Sets",30017:"Create/Update Stall",30018:"Create/Update Product",30019:"Marketplace UI/UX",30020:"Product Sold As Auction",30023:"Long-form Content",30024:"Draft Long-form Content",30030:"Emoji Sets",30063:"Release Artifact Sets",30078:"Application-specific Data",30311:"Live Event",30315:"User Statuses",30388:"Slide Set",30402:"Classified Listing",30403:"Draft Classified Listing",30617:"Repository Announcement",30618:"Repository State Announcement",30818:"Wiki Article",30819:"Redirects",31922:"Date-Based Calendar Event",31923:"Time-Based Calendar Event",31924:"Calendar",31925:"Calendar Event RSVP",31989:"Handler Recommendation",31990:"Handler Information",34550:"Community Definition",34551:"Community Post Approval"};function tm(e,t=null){if(!e||"string"!=typeof e)return!1;return!!/^[0-9a-fA-F]+$/.test(e)&&(!t||e.length===t)}function nm(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}T${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function rm(e){return Math.floor(new Date(e).getTime()/1e3)}function im(e,t,n){const r=e.slice();return r[62]=t[n],r[64]=n,r}function om(e,t,n){const r=e.slice();return r[65]=t[n],r}function sm(e,t,n){const r=e.slice();return r[68]=t[n],r}function am(e,t,n){const r=e.slice();return r[71]=t[n],r}function lm(e,t,n){const r=e.slice();return r[71]=t[n].kind,r[74]=t[n].name,r}function cm(e){let t,n,r,i,o,s,a=e[20],l=[];for(let t=0;t0&&dm(t),Ge=t[17]&&pm(t),Je=t[2].length>0&&hm(t),Ke=t[18]&&mm(t),Ve=t[3].length>0&&ym(t),qe=t[19]&&vm(t),Ye=t[4].length>0&&Am(t),We=t[5]&&Im(t),ze=t[6]&&km(t),Ze=t[8]&&Cm(t);return{c(){n=p("div"),i=p("div"),o=p("div"),s=p("label"),s.textContent="Search Text (NIP-50)",a=m(),l=p("div"),f=p("input"),h=m(),y=p("label"),y.textContent="Event Kinds",v=m(),C=p("div"),E=p("button"),x=g(Me),S=g(" Select Kinds ("),Q=g(_e),F=g(" selected)"),D=m(),je&&je.c(),$=m(),He&&He.c(),U=m(),R=p("label"),R.textContent="Authors (Pubkeys)",T=m(),P=p("div"),N=p("div"),O=p("input"),L=m(),M=p("button"),M.textContent="Add",_=m(),Ge&&Ge.c(),j=m(),Je&&Je.c(),H=m(),G=p("label"),G.textContent="Event IDs",J=m(),K=p("div"),V=p("div"),q=p("input"),Y=m(),W=p("button"),W.textContent="Add",z=m(),Ke&&Ke.c(),Z=m(),Ve&&Ve.c(),X=m(),ee=p("label"),ee.textContent="Tags (#e, #p, #a)",te=m(),ne=p("div"),re=p("div"),ie=p("span"),ie.textContent="#",oe=m(),se=p("input"),ae=m(),le=p("input"),ce=m(),ue=p("button"),ue.textContent="Add",de=m(),qe&&qe.c(),fe=m(),Ye&&Ye.c(),pe=m(),he=p("label"),he.textContent="Since",ge=m(),me=p("div"),ye=p("input"),we=m(),We&&We.c(),ve=m(),Ae=p("label"),Ae.textContent="Until",be=m(),Ie=p("div"),ke=p("input"),Ce=m(),ze&&ze.c(),Ee=m(),xe=p("label"),xe.textContent="Limit",Be=m(),Se=p("div"),Qe=p("input"),Fe=m(),Ze&&Ze.c(),De=m(),$e=p("div"),Ue=p("button"),Ue.textContent="🧹",Re=m(),Te=p("div"),Pe=m(),Ne=p("button"),Ne.textContent="",A(s,"for","search-text"),A(s,"class","svelte-1a1v6k0"),A(f,"id","search-text"),A(f,"type","text"),A(f,"placeholder","Search events..."),A(f,"class","filter-input svelte-1a1v6k0"),A(l,"class","field-content svelte-1a1v6k0"),A(y,"class","svelte-1a1v6k0"),A(E,"class","picker-toggle-btn svelte-1a1v6k0"),A(C,"class","field-content svelte-1a1v6k0"),A(R,"class","svelte-1a1v6k0"),A(O,"type","text"),A(O,"placeholder","64 character hex pubkey..."),A(O,"class","filter-input svelte-1a1v6k0"),A(O,"maxlength","64"),A(M,"class","add-btn svelte-1a1v6k0"),A(N,"class","input-group svelte-1a1v6k0"),A(P,"class","field-content svelte-1a1v6k0"),A(G,"class","svelte-1a1v6k0"),A(q,"type","text"),A(q,"placeholder","64 character hex event ID..."),A(q,"class","filter-input svelte-1a1v6k0"),A(q,"maxlength","64"),A(W,"class","add-btn svelte-1a1v6k0"),A(V,"class","input-group svelte-1a1v6k0"),A(K,"class","field-content svelte-1a1v6k0"),A(ee,"class","svelte-1a1v6k0"),A(ie,"class","hash-prefix svelte-1a1v6k0"),A(se,"type","text"),A(se,"placeholder","Tag"),A(se,"class","filter-input tag-name-input svelte-1a1v6k0"),A(se,"maxlength","1"),A(le,"type","text"),A(le,"placeholder","Value..."),A(le,"class","filter-input tag-value-input svelte-1a1v6k0"),A(ue,"class","add-btn svelte-1a1v6k0"),A(re,"class","tag-input-group svelte-1a1v6k0"),A(ne,"class","field-content svelte-1a1v6k0"),A(he,"for","since-timestamp"),A(he,"class","svelte-1a1v6k0"),A(ye,"id","since-timestamp"),A(ye,"type","datetime-local"),ye.value=t[32](),A(ye,"class","filter-input svelte-1a1v6k0"),A(me,"class","field-content timestamp-field svelte-1a1v6k0"),A(Ae,"for","until-timestamp"),A(Ae,"class","svelte-1a1v6k0"),A(ke,"id","until-timestamp"),A(ke,"type","datetime-local"),ke.value=t[33](),A(ke,"class","filter-input svelte-1a1v6k0"),A(Ie,"class","field-content timestamp-field svelte-1a1v6k0"),A(xe,"for","limit"),A(xe,"class","svelte-1a1v6k0"),A(Qe,"id","limit"),A(Qe,"type","number"),A(Qe,"placeholder","Max events to return"),A(Qe,"class","filter-input svelte-1a1v6k0"),A(Qe,"min","1"),A(Se,"class","field-content svelte-1a1v6k0"),A(o,"class","filter-grid svelte-1a1v6k0"),A(i,"class","filter-content svelte-1a1v6k0"),A(Ue,"class","clear-all-btn svelte-1a1v6k0"),A(Ue,"title","Clear all filters"),A(Te,"class","spacer svelte-1a1v6k0"),A(Ne,"class","json-toggle-btn svelte-1a1v6k0"),A(Ne,"title","Edit filter JSON"),B(Ne,"active",t[8]),A($e,"class","clear-column svelte-1a1v6k0"),A(n,"class","filter-builder svelte-1a1v6k0")},m(e,r){u(e,n,r),c(n,i),c(i,o),c(o,s),c(o,a),c(o,l),c(l,f),k(f,t[0]),c(o,h),c(o,y),c(o,v),c(o,C),c(C,E),c(E,x),c(E,S),c(E,Q),c(E,F),c(C,D),je&&je.m(C,null),c(C,$),He&&He.m(C,null),c(o,U),c(o,R),c(o,T),c(o,P),c(P,N),c(N,O),k(O,t[13]),c(N,L),c(N,M),c(P,_),Ge&&Ge.m(P,null),c(P,j),Je&&Je.m(P,null),c(o,H),c(o,G),c(o,J),c(o,K),c(K,V),c(V,q),k(q,t[14]),c(V,Y),c(V,W),c(K,z),Ke&&Ke.m(K,null),c(K,Z),Ve&&Ve.m(K,null),c(o,X),c(o,ee),c(o,te),c(o,ne),c(ne,re),c(re,ie),c(re,oe),c(re,se),k(se,t[15]),c(re,ae),c(re,le),k(le,t[16]),c(re,ce),c(re,ue),c(ne,de),qe&&qe.m(ne,null),c(ne,fe),Ye&&Ye.m(ne,null),c(o,pe),c(o,he),c(o,ge),c(o,me),c(me,ye),c(me,we),We&&We.m(me,null),c(o,ve),c(o,Ae),c(o,be),c(o,Ie),c(Ie,ke),c(Ie,Ce),ze&&ze.m(Ie,null),c(o,Ee),c(o,xe),c(o,Be),c(o,Se),c(Se,Qe),k(Qe,t[7]),c(o,Fe),Ze&&Ze.m(o,null),c(n,De),c(n,$e),c($e,Ue),c($e,Re),c($e,Te),c($e,Pe),c($e,Ne),Oe||(Le=[w(f,"input",t[38]),w(E,"click",t[39]),w(O,"input",t[43]),w(O,"keydown",t[44]),w(M,"click",t[25]),w(q,"input",t[46]),w(q,"keydown",t[47]),w(W,"click",t[27]),w(se,"input",t[49]),w(le,"input",t[50]),w(le,"keydown",t[51]),w(ue,"click",t[29]),w(ye,"change",t[34]),w(ke,"change",t[35]),w(Qe,"input",t[55]),w(Ue,"click",t[31]),w(Ne,"click",t[57])],Oe=!0)},p(e,t){1&t[0]&&f.value!==e[0]&&k(f,e[0]),4096&t[0]&&Me!==(Me=e[12]?"▼":"▶")&&I(x,Me),2&t[0]&&_e!==(_e=e[1].length+"")&&I(Q,_e),e[12]?je?je.p(e,t):(je=cm(e),je.c(),je.m(C,$)):je&&(je.d(1),je=null),e[1].length>0?He?He.p(e,t):(He=dm(e),He.c(),He.m(C,null)):He&&(He.d(1),He=null),8192&t[0]&&O.value!==e[13]&&k(O,e[13]),e[17]?Ge?Ge.p(e,t):(Ge=pm(e),Ge.c(),Ge.m(P,j)):Ge&&(Ge.d(1),Ge=null),e[2].length>0?Je?Je.p(e,t):(Je=hm(e),Je.c(),Je.m(P,null)):Je&&(Je.d(1),Je=null),16384&t[0]&&q.value!==e[14]&&k(q,e[14]),e[18]?Ke?Ke.p(e,t):(Ke=mm(e),Ke.c(),Ke.m(K,Z)):Ke&&(Ke.d(1),Ke=null),e[3].length>0?Ve?Ve.p(e,t):(Ve=ym(e),Ve.c(),Ve.m(K,null)):Ve&&(Ve.d(1),Ve=null),32768&t[0]&&se.value!==e[15]&&k(se,e[15]),65536&t[0]&&le.value!==e[16]&&k(le,e[16]),e[19]?qe?qe.p(e,t):(qe=vm(e),qe.c(),qe.m(ne,fe)):qe&&(qe.d(1),qe=null),e[4].length>0?Ye?Ye.p(e,t):(Ye=Am(e),Ye.c(),Ye.m(ne,null)):Ye&&(Ye.d(1),Ye=null),e[5]?We?We.p(e,t):(We=Im(e),We.c(),We.m(me,null)):We&&(We.d(1),We=null),e[6]?ze?ze.p(e,t):(ze=km(e),ze.c(),ze.m(Ie,null)):ze&&(ze.d(1),ze=null),128&t[0]&&b(Qe.value)!==e[7]&&k(Qe,e[7]),e[8]?Ze?Ze.p(e,t):(Ze=Cm(e),Ze.c(),Ze.m(o,null)):Ze&&(Ze.d(1),Ze=null),256&t[0]&&B(Ne,"active",e[8])},i:e,o:e,d(e){e&&d(n),je&&je.d(),He&&He.d(),Ge&&Ge.d(),Je&&Je.d(),Ke&&Ke.d(),Ve&&Ve.d(),qe&&qe.d(),Ye&&Ye.d(),We&&We.d(),ze&&ze.d(),Ze&&Ze.d(),Oe=!1,r(Le)}}}function Bm(e,t,n){let r,i;const o=U();let{searchText:s=""}=t,{selectedKinds:a=[]}=t,{pubkeys:l=[]}=t,{eventIds:c=[]}=t,{tags:u=[]}=t,{sinceTimestamp:d=null}=t,{untilTimestamp:f=null}=t,{limit:p=null}=t,{showJsonEditor:h=!1}=t,g="",m="",y=!1,w="",v="",A="",I="",k="",C="",E="",x="",B=null,S=!1;function Q(e){a.includes(e)?n(1,a=a.filter(t=>t!==e)):n(1,a=[...a,e].sort((e,t)=>e-t))}function F(e){n(1,a=a.filter(t=>t!==e))}function D(){const e=v.trim();e&&(tm(e,64)?l.includes(e)?n(17,C="Pubkey already added"):(n(2,l=[...l,e]),n(13,v=""),n(17,C="")):n(17,C="Invalid pubkey: must be 64 character hex string"))}function R(e){n(2,l=l.filter(t=>t!==e))}function T(){const e=A.trim();e&&(tm(e,64)?c.includes(e)?n(18,E="Event ID already added"):(n(3,c=[...c,e]),n(14,A=""),n(18,E="")):n(18,E="Invalid event ID: must be 64 character hex string"))}function P(e){n(3,c=c.filter(t=>t!==e))}function N(){const e=I.trim(),t=k.trim();e&&t&&(/^[a-zA-Z]$/.test(e)?u.some(n=>n.name===e&&n.value===t)?n(19,x="Tag already added"):(n(4,u=[...u,{name:e,value:t}]),n(15,I=""),n(16,k=""),n(19,x="")):n(19,x="Invalid tag name: must be single letter a-z or A-Z"))}function O(e){n(4,u=u.filter((t,n)=>n!==e))}function L(){o("apply",{searchText:s,selectedKinds:a,pubkeys:l,eventIds:c,tags:u,sinceTimestamp:d,untilTimestamp:f,limit:p})}$(()=>{B&&clearTimeout(B)});return e.$$set=e=>{"searchText"in e&&n(0,s=e.searchText),"selectedKinds"in e&&n(1,a=e.selectedKinds),"pubkeys"in e&&n(2,l=e.pubkeys),"eventIds"in e&&n(3,c=e.eventIds),"tags"in e&&n(4,u=e.tags),"sinceTimestamp"in e&&n(5,d=e.sinceTimestamp),"untilTimestamp"in e&&n(6,f=e.untilTimestamp),"limit"in e&&n(7,p=e.limit),"showJsonEditor"in e&&n(8,h=e.showJsonEditor)},e.$$.update=()=>{if(256&e.$$.dirty[0]&&h){const e=function(){const e={};return a.length>0&&(e.kinds=a),l.length>0&&(e.authors=l),c.length>0&&(e.ids=c),d&&(e.since=d),f&&(e.until=f),p&&(e.limit=p),s&&(e.search=s),u.forEach(t=>{const n=`#${t.name}`;e[n]||(e[n]=[]),e[n].push(t.value)}),e}();n(10,g=JSON.stringify(e,null,2))}255&e.$$.dirty[0]|32&e.$$.dirty[1]&&(S?(B&&clearTimeout(B),B=setTimeout(()=>{L()},1e3)):n(36,S=!0)),512&e.$$.dirty[0]|64&e.$$.dirty[1]&&n(20,i=r.filter(e=>e.kind.toString().includes(w)||e.name.toLowerCase().includes(w.toLowerCase())))},n(37,r=Object.entries(em).map(([e,t])=>({kind:parseInt(e),name:t})).sort((e,t)=>e.kind-t.kind)),[s,a,l,c,u,d,f,p,h,w,g,m,y,v,A,I,k,C,E,x,i,o,function(){try{const e=JSON.parse(g);n(11,m=""),n(1,a=e.kinds||[]),n(2,l=e.authors||[]),n(3,c=e.ids||[]),n(5,d=e.since||null),n(6,f=e.until||null),n(7,p=e.limit||null),n(0,s=e.search||""),n(4,u=[]),Object.keys(e).forEach(t=>{if(t.startsWith("#")&&2===t.length){const n=t.slice(1);(Array.isArray(e[t])?e[t]:[e[t]]).forEach(e=>{u.push({name:n,value:String(e)})})}}),n(4,u),B&&clearTimeout(B),L()}catch(e){n(11,m="Invalid JSON: "+e.message)}},Q,F,D,R,T,P,N,O,function(){n(0,s=""),n(1,a=[]),n(2,l=[]),n(3,c=[]),n(4,u=[]),n(5,d=null),n(6,f=null),n(7,p=null),o("clear")},function(){return d?nm(d):""},function(){return f?nm(f):""},function(e){const t=e.target.value;n(5,d=t?rm(t):null)},function(e){const t=e.target.value;n(6,f=t?rm(t):null)},S,r,function(){s=this.value,n(0,s)},()=>n(12,y=!y),function(){w=this.value,n(9,w)},e=>Q(e),e=>F(e),function(){v=this.value,n(13,v)},e=>"Enter"===e.key&&D(),e=>R(e),function(){A=this.value,n(14,A)},e=>"Enter"===e.key&&T(),e=>P(e),function(){I=this.value,n(15,I)},function(){k=this.value,n(16,k)},e=>"Enter"===e.key&&N(),e=>O(e),()=>n(5,d=null),()=>n(6,f=null),function(){p=b(this.value),n(7,p)},function(){g=this.value,n(10,g),n(8,h)},()=>o("toggleJson")]}class Sm extends oe{constructor(e){super(),ie(this,e,Bm,xm,o,{searchText:0,selectedKinds:1,pubkeys:2,eventIds:3,tags:4,sinceTimestamp:5,untilTimestamp:6,limit:7,showJsonEditor:8},null,[-1,-1,-1])}}function Qm(e,t,n){const r=e.slice();return r[28]=t[n],r}function Fm(e,t,n){const r=e.slice();return r[31]=t[n],r}function Dm(t){let n;return{c(){n=p("div"),n.innerHTML="

❌ Read, write, admin, or owner permission required to view all\n events.

",A(n,"class","permission-denied svelte-5kb1ec")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function $m(e){let t,n,r,i;function o(e,t){return e[4].length>0?Rm:e[6]?void 0:Um}let s=o(e),a=s&&s(e),l=e[6]&&jm();return{c(){t=p("div"),a&&a.c(),n=m(),l&&l.c(),A(t,"class","events-view-content svelte-5kb1ec")},m(o,s){u(o,t,s),a&&a.m(t,null),c(t,n),l&&l.m(t,null),r||(i=w(t,"scroll",e[9]),r=!0)},p(e,r){s===(s=o(e))&&a?a.p(e,r):(a&&a.d(1),a=s&&s(e),a&&(a.c(),a.m(t,n))),e[6]?l||(l=jm(),l.c(),l.m(t,null)):l&&(l.d(1),l=null)},d(e){e&&d(t),a&&a.d(),l&&l.d(),r=!1,i()}}}function Um(t){let n;return{c(){n=p("div"),n.innerHTML="

No events found.

",A(n,"class","no-events svelte-5kb1ec")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Rm(e){let t,n=e[4],r=[];for(let t=0;t0&&Nm(e);return{c(){t=p("div"),n=p("span"),n.textContent="🗑️ Delete Event",r=m(),i&&i.c(),A(n,"class","delete-event-label svelte-5kb1ec"),A(t,"class","delete-event-info svelte-5kb1ec")},m(e,o){u(e,t,o),c(t,n),c(t,r),i&&i.m(t,null)},p(e,n){e[28].tags&&e[28].tags.length>0?i?i.p(e,n):(i=Nm(e),i.c(),i.m(t,null)):i&&(i.d(1),i=null)},d(e){e&&d(t),i&&i.d()}}}function Nm(e){let t,n=e[28].tags.filter(zm),r=[];for(let t=0;t👤',o=m(),s=p("div"),a=p("div"),l=g(P),f=m(),h=p("div"),y=p("span"),v=g(N),b=m(),k=p("span"),C=g(O),E=m(),x=p("div"),S=p("div"),Q=g(L),F=m(),H.c(),D=m(),G&&G.c(),$=m(),V&&V.c(),U=m(),A(i,"class","events-view-avatar svelte-5kb1ec"),A(a,"class","events-view-author svelte-5kb1ec"),A(y,"class","kind-number svelte-5kb1ec"),B(y,"delete-event",5===e[28].kind),A(k,"class","kind-name svelte-5kb1ec"),A(h,"class","events-view-kind svelte-5kb1ec"),A(s,"class","events-view-info svelte-5kb1ec"),A(S,"class","event-timestamp svelte-5kb1ec"),A(x,"class","events-view-content svelte-5kb1ec"),A(n,"class","events-view-row svelte-5kb1ec"),A(n,"role","button"),A(n,"tabindex","0"),A(t,"class","events-view-item svelte-5kb1ec"),B(t,"expanded",e[5].has(e[28].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,h),c(h,y),c(y,v),c(h,b),c(h,k),c(k,C),c(n,E),c(n,x),c(x,S),c(S,Q),c(x,F),H.m(x,null),c(n,D),G&&G.m(n,null),c(t,$),V&&V.m(t,null),c(t,U),R||(T=[w(n,"click",J),w(n,"keydown",K)],R=!0)},p(r,i){e=r,16&i[0]&&P!==(P=Vm(e[28].pubkey)+"")&&I(l,P),16&i[0]&&N!==(N=e[28].kind+"")&&I(v,N),16&i[0]&&B(y,"delete-event",5===e[28].kind),16&i[0]&&O!==(O=qm(e[28].kind)+"")&&I(C,O),16&i[0]&&L!==(L=Ym(e[28].created_at)+"")&&I(Q,L),j===(j=_(e))&&H?H.p(e,i):(H.d(1),H=j(e),H&&(H.c(),H.m(x,null))),5!==e[28].kind&&("admin"===e[2]||"owner"===e[2]||"write"===e[2]&&e[28].pubkey&&e[28].pubkey===e[3])?G?G.p(e,i):(G=Lm(e),G.c(),G.m(n,null)):G&&(G.d(1),G=null),48&i[0]&&(M=e[5].has(e[28].id)),M?V?V.p(e,i):(V=Mm(e),V.c(),V.m(t,U)):V&&(V.d(1),V=null),48&i[0]&&B(t,"expanded",e[5].has(e[28].id))},d(e){e&&d(t),H.d(),G&&G.d(),V&&V.d(),R=!1,r(T)}}}function jm(e){let t;return{c(){t=p("div"),t.innerHTML='
\n

Loading events...

',A(t,"class","loading-events svelte-5kb1ec")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Hm(e){let t,n,i,o,s,a,l,f,h,y,v,b,I,k,C,E,x,S,Q,F,D,$,U,R;function T(e,t){return e[6]?Jm:Gm}i=new Sm({props:{showJsonEditor:e[8]}}),i.$on("apply",e[17]),i.$on("clear",e[18]),i.$on("toggleJson",e[16]);let P=T(e),N=P(e);return{c(){t=p("div"),n=p("div"),ee(i.$$.fragment),o=m(),s=p("div"),a=p("div"),l=p("button"),l.innerHTML='',f=m(),h=p("div"),y=p("label"),v=p("input"),b=m(),I=p("span"),k=m(),C=p("span"),C.textContent="Only show my events",E=m(),x=p("div"),S=p("button"),Q=g("🔄 Load More"),F=m(),D=p("button"),N.c(),A(n,"class","filter-panel svelte-5kb1ec"),B(n,"open",e[7]),A(l,"class","filter-btn svelte-5kb1ec"),A(l,"title","Filter events"),B(l,"active",e[7]),A(v,"type","checkbox"),A(v,"class","svelte-5kb1ec"),A(I,"class","toggle-slider svelte-5kb1ec"),A(C,"class","toggle-label svelte-5kb1ec"),A(y,"class","toggle-container svelte-5kb1ec"),A(h,"class","events-view-toggle svelte-5kb1ec"),A(a,"class","events-view-left svelte-5kb1ec"),A(S,"class","refresh-btn svelte-5kb1ec"),S.disabled=e[6],A(D,"class","reload-btn svelte-5kb1ec"),D.disabled=e[6],A(x,"class","events-view-buttons svelte-5kb1ec"),A(s,"class","events-view-header svelte-5kb1ec"),A(t,"class","events-view-footer svelte-5kb1ec")},m(r,d){u(r,t,d),c(t,n),te(i,n,null),c(t,o),c(t,s),c(s,a),c(a,l),c(a,f),c(a,h),c(h,y),c(y,v),v.checked=e[0],c(y,b),c(y,I),c(y,k),c(y,C),c(s,E),c(s,x),c(x,S),c(S,Q),c(x,F),c(x,D),N.m(D,null),$=!0,U||(R=[w(l,"click",e[15]),w(v,"change",e[23]),w(v,"change",e[24]),w(S,"click",e[25]),w(D,"click",e[26])],U=!0)},p(e,t){const r={};256&t[0]&&(r.showJsonEditor=e[8]),i.$set(r),(!$||128&t[0])&&B(n,"open",e[7]),(!$||128&t[0])&&B(l,"active",e[7]),1&t[0]&&(v.checked=e[0]),(!$||64&t[0])&&(S.disabled=e[6]),P!==(P=T(e))&&(N.d(1),N=P(e),N&&(N.c(),N.m(D,null))),(!$||64&t[0])&&(D.disabled=e[6])},i(e){$||(z(i.$$.fragment,e),$=!0)},o(e){Z(i.$$.fragment,e),$=!1},d(e){e&&d(t),ne(i),N.d(),U=!1,r(R)}}}function Gm(e){let t;return{c(){t=g("🔄")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Jm(e){let t;return{c(){t=p("div"),A(t,"class","spinner svelte-5kb1ec")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Km(e){let t,n,r;function i(e,t){return!e[1]||"read"!==e[2]&&"write"!==e[2]&&"admin"!==e[2]&&"owner"!==e[2]?Dm:$m}let o=i(e),s=o(e),a=e[1]&&("read"===e[2]||"write"===e[2]||"admin"===e[2]||"owner"===e[2])&&Hm(e);return{c(){t=p("div"),s.c(),n=m(),a&&a.c(),A(t,"class","events-view-container svelte-5kb1ec")},m(e,i){u(e,t,i),s.m(t,null),c(t,n),a&&a.m(t,null),r=!0},p(e,r){o===(o=i(e))&&s?s.p(e,r):(s.d(1),s=o(e),s&&(s.c(),s.m(t,n))),!e[1]||"read"!==e[2]&&"write"!==e[2]&&"admin"!==e[2]&&"owner"!==e[2]?a&&(Y(),Z(a,1,1,()=>{a=null}),W()):a?(a.p(e,r),6&r[0]&&z(a,1)):(a=Hm(e),a.c(),z(a,1),a.m(t,null))},i(e){r||(z(a),r=!0)},o(e){Z(a),r=!1},d(e){e&&d(t),s.d(),a&&a.d()}}}function Vm(e){return e?e.slice(0,8)+"..."+e.slice(-8):""}function qm(e){return{0:"Profile",1:"Text Note",2:"Recommend Relay",3:"Contacts",4:"Encrypted DM",5:"Delete",6:"Repost",7:"Reaction",8:"Badge Award",16:"Generic Repost",40:"Channel Creation",41:"Channel Metadata",42:"Channel Message",43:"Channel Hide Message",44:"Channel Mute User",1984:"Reporting",9734:"Zap Request",9735:"Zap",1e4:"Mute List",10001:"Pin List",10002:"Relay List",22242:"Client Auth",24133:"Nostr Connect",27235:"HTTP Auth",3e4:"Categorized People",30001:"Categorized Bookmarks",30008:"Profile Badges",30009:"Badge Definition",30017:"Create or update a stall",30018:"Create or update a product",30023:"Long-form Content",30024:"Draft Long-form Content",30078:"Application-specific Data",30311:"Live Event",30315:"User Statuses",30402:"Classified Listing",30403:"Draft Classified Listing",31922:"Date-Based Calendar Event",31923:"Time-Based Calendar Event",31924:"Calendar",31925:"Calendar Event RSVP",31989:"Handler recommendation",31990:"Handler information",34550:"Community Definition"}[e]||`Kind ${e}`}function Ym(e){return new Date(1e3*e).toLocaleString()}function Wm(e){return e?e.length>100?e.slice(0,100)+"...":e:""}const zm=e=>"e"===e[0];function Zm(e,t,n){let{isLoggedIn:r=!1}=t,{userRole:i=""}=t,{userPubkey:o=""}=t,{filteredEvents:s=[]}=t,{expandedEvents:a=new Set}=t,{isLoadingEvents:l=!1}=t,{showOnlyMyEvents:c=!1}=t,{showFilterBuilder:u=!1}=t;const d=U();let f=!1;function p(e){d("toggleEventExpansion",e)}function h(e){d("deleteEvent",e)}function g(e,t){d("copyEventToClipboard",{event:e,e:t})}function m(){d("toggleChange")}function y(e,t){d("loadAllEvents",{refresh:e,authors:t})}return e.$$set=e=>{"isLoggedIn"in e&&n(1,r=e.isLoggedIn),"userRole"in e&&n(2,i=e.userRole),"userPubkey"in e&&n(3,o=e.userPubkey),"filteredEvents"in e&&n(4,s=e.filteredEvents),"expandedEvents"in e&&n(5,a=e.expandedEvents),"isLoadingEvents"in e&&n(6,l=e.isLoadingEvents),"showOnlyMyEvents"in e&&n(0,c=e.showOnlyMyEvents),"showFilterBuilder"in e&&n(7,u=e.showFilterBuilder)},[c,r,i,o,s,a,l,u,f,function(e){d("scroll",e)},p,h,g,m,y,function(){d("toggleFilterBuilder")},function(){n(8,f=!f)},function(e){d("filterApply",e.detail)},function(){d("filterClear")},e=>h(e.id),e=>p(e.id),(e,t)=>"Enter"===t.key&&p(e.id),(e,t)=>g(e,t),function(){c=this.checked,n(0,c)},()=>m(),()=>{y(!1,c&&o?[o]:null)},()=>{y(!0,c&&o?[o]:null)}]}class Xm extends oe{constructor(e){super(),ie(this,e,Zm,Km,o,{isLoggedIn:1,userRole:2,userPubkey:3,filteredEvents:4,expandedEvents:5,isLoadingEvents:6,showOnlyMyEvents:0,showFilterBuilder:7},null,[-1,-1])}}const ey=[{kind:0,name:"Metadata",description:"User profile information (name, about, picture, nip05, etc.)",nip:"01",isReplaceable:!0,template:{kind:0,content:"",tags:[]}},{kind:1,name:"Short Text Note",description:"Short-form text post (like a tweet)",nip:"01",template:{kind:1,content:"",tags:[]}},{kind:2,name:"Recommend Relay",description:"Relay recommendation",nip:"01",deprecated:!0,template:{kind:2,content:"",tags:[]}},{kind:3,name:"Follows",description:"Following list with optional relay hints",nip:"02",isReplaceable:!0,template:{kind:3,content:"",tags:[]}},{kind:4,name:"Encrypted Direct Message",description:"Private message using NIP-04 encryption",nip:"04",deprecated:!0,template:{kind:4,content:"",tags:[]}},{kind:5,name:"Event Deletion Request",description:"Request to delete events",nip:"09",template:{kind:5,content:"",tags:[]}},{kind:6,name:"Repost",description:"Share/repost another text note",nip:"18",template:{kind:6,content:"",tags:[]}},{kind:7,name:"Reaction",description:"Like, emoji reaction to an event",nip:"25",template:{kind:7,content:"",tags:[]}},{kind:8,name:"Badge Award",description:"Award a badge to someone",nip:"58",template:{kind:8,content:"",tags:[]}},{kind:9,name:"Chat Message",description:"Chat message",nip:"C7",template:{kind:9,content:"",tags:[]}},{kind:10,name:"Group Chat Threaded Reply",description:"Threaded reply in group chat",nip:"29",deprecated:!0,template:{kind:10,content:"",tags:[]}},{kind:11,name:"Thread",description:"Thread event",nip:"7D",template:{kind:11,content:"",tags:[]}},{kind:12,name:"Group Thread Reply",description:"Reply in group thread",nip:"29",deprecated:!0,template:{kind:12,content:"",tags:[]}},{kind:13,name:"Seal",description:"Sealed/encrypted event wrapper",nip:"59",template:{kind:13,content:"",tags:[]}},{kind:14,name:"Direct Message",description:"Private direct message using NIP-17",nip:"17",template:{kind:14,content:"",tags:[]}},{kind:15,name:"File Message",description:"File message in DMs",nip:"17",template:{kind:15,content:"",tags:[]}},{kind:16,name:"Generic Repost",description:"Repost any event kind",nip:"18",template:{kind:16,content:"",tags:[]}},{kind:17,name:"Reaction to Website",description:"Reaction to a website URL",nip:"25",template:{kind:17,content:"",tags:[]}},{kind:20,name:"Picture",description:"Picture-first feed post",nip:"68",template:{kind:20,content:"",tags:[]}},{kind:21,name:"Video Event",description:"Horizontal video event",nip:"71",template:{kind:21,content:"",tags:[]}},{kind:22,name:"Short-form Video",description:"Short-form portrait video (like TikTok)",nip:"71",template:{kind:22,content:"",tags:[]}},{kind:40,name:"Channel Creation",description:"Create a public chat channel",nip:"28",template:{kind:40,content:"",tags:[]}},{kind:41,name:"Channel Metadata",description:"Set channel name, about, picture",nip:"28",template:{kind:41,content:"",tags:[]}},{kind:42,name:"Channel Message",description:"Post message in channel",nip:"28",template:{kind:42,content:"",tags:[]}},{kind:43,name:"Channel Hide Message",description:"Hide a message in channel",nip:"28",template:{kind:43,content:"",tags:[]}},{kind:44,name:"Channel Mute User",description:"Mute a user in channel",nip:"28",template:{kind:44,content:"",tags:[]}},{kind:62,name:"Request to Vanish",description:"Request permanent deletion of all user data",nip:"62",template:{kind:62,content:"",tags:[]}},{kind:64,name:"Chess (PGN)",description:"Chess game in PGN format",nip:"64",template:{kind:64,content:"",tags:[]}},{kind:443,name:"KeyPackage",description:"Marmot protocol key package",nip:null,spec:"Marmot",template:{kind:443,content:"",tags:[]}},{kind:444,name:"Welcome Message",description:"Marmot protocol welcome message",nip:null,spec:"Marmot",template:{kind:444,content:"",tags:[]}},{kind:445,name:"Group Event",description:"Marmot protocol group event",nip:null,spec:"Marmot",template:{kind:445,content:"",tags:[]}},{kind:818,name:"Merge Requests",description:"Git merge request",nip:"54",template:{kind:818,content:"",tags:[]}},{kind:1018,name:"Poll Response",description:"Response to a poll",nip:"88",template:{kind:1018,content:"",tags:[]}},{kind:1021,name:"Bid",description:"Auction bid",nip:"15",template:{kind:1021,content:"",tags:[]}},{kind:1022,name:"Bid Confirmation",description:"Confirmation of auction bid",nip:"15",template:{kind:1022,content:"",tags:[]}},{kind:1040,name:"OpenTimestamps",description:"OpenTimestamps attestation",nip:"03",template:{kind:1040,content:"",tags:[]}},{kind:1059,name:"Gift Wrap",description:"Encrypted gift-wrapped event",nip:"59",template:{kind:1059,content:"",tags:[]}},{kind:1060,name:"Gift Wrap (Kind 4)",description:"Gift wrap variant for NIP-04 compatibility",nip:"59",template:{kind:1060,content:"",tags:[]}},{kind:1063,name:"File Metadata",description:"Metadata for shared files",nip:"94",template:{kind:1063,content:"",tags:[]}},{kind:1068,name:"Poll",description:"Create a poll",nip:"88",template:{kind:1068,content:"",tags:[]}},{kind:1111,name:"Comment",description:"Comment on events or external content",nip:"22",template:{kind:1111,content:"",tags:[]}},{kind:1222,name:"Voice Message",description:"Voice message",nip:"A0",template:{kind:1222,content:"",tags:[]}},{kind:1244,name:"Voice Message Comment",description:"Comment on voice message",nip:"A0",template:{kind:1244,content:"",tags:[]}},{kind:1311,name:"Live Chat Message",description:"Message in live stream chat",nip:"53",template:{kind:1311,content:"",tags:[]}},{kind:1337,name:"Code Snippet",description:"Code snippet post",nip:"C0",template:{kind:1337,content:"",tags:[]}},{kind:1517,name:"Bitcoin Block",description:"Bitcoin block data",nip:null,spec:"Nostrocket",template:{kind:1517,content:"",tags:[]}},{kind:1617,name:"Patches",description:"Git patches",nip:"34",template:{kind:1617,content:"",tags:[]}},{kind:1618,name:"Pull Requests",description:"Git pull request",nip:"34",template:{kind:1618,content:"",tags:[]}},{kind:1619,name:"Pull Request Updates",description:"Updates to git pull request",nip:"34",template:{kind:1619,content:"",tags:[]}},{kind:1621,name:"Issues",description:"Git issues",nip:"34",template:{kind:1621,content:"",tags:[]}},{kind:1622,name:"Git Replies",description:"Replies on git objects",nip:"34",deprecated:!0,template:{kind:1622,content:"",tags:[]}},{kind:1630,name:"Status",description:"Git status",nip:"34",template:{kind:1630,content:"",tags:[]}},{kind:1631,name:"Status",description:"Git status",nip:"34",template:{kind:1631,content:"",tags:[]}},{kind:1632,name:"Status",description:"Git status",nip:"34",template:{kind:1632,content:"",tags:[]}},{kind:1633,name:"Status",description:"Git status",nip:"34",template:{kind:1633,content:"",tags:[]}},{kind:1808,name:"Live Stream",description:"Live streaming event",nip:null,spec:"zap.stream",template:{kind:1808,content:"",tags:[]}},{kind:1971,name:"Problem Tracker",description:"Problem tracking",nip:null,spec:"Nostrocket",template:{kind:1971,content:"",tags:[]}},{kind:1984,name:"Reporting",description:"Report content or users",nip:"56",template:{kind:1984,content:"",tags:[]}},{kind:1985,name:"Label",description:"Label/tag content with namespace",nip:"32",template:{kind:1985,content:"",tags:[]}},{kind:1986,name:"Relay Reviews",description:"Reviews of relays",nip:null,template:{kind:1986,content:"",tags:[]}},{kind:1987,name:"AI Embeddings",description:"AI embeddings/vector lists",nip:null,spec:"NKBIP-02",template:{kind:1987,content:"",tags:[]}},{kind:2003,name:"Torrent",description:"Torrent magnet link",nip:"35",template:{kind:2003,content:"",tags:[]}},{kind:2004,name:"Torrent Comment",description:"Comment on torrent",nip:"35",template:{kind:2004,content:"",tags:[]}},{kind:2022,name:"Coinjoin Pool",description:"Coinjoin coordination",nip:null,spec:"joinstr",template:{kind:2022,content:"",tags:[]}},{kind:4550,name:"Community Post Approval",description:"Approve post in community",nip:"72",template:{kind:4550,content:"",tags:[]}},{kind:5e3,name:"Job Request",description:"Data vending machine job request (start of range)",nip:"90",template:{kind:5e3,content:"",tags:[]}},{kind:6e3,name:"Job Result",description:"Data vending machine job result (start of range)",nip:"90",template:{kind:6e3,content:"",tags:[]}},{kind:7e3,name:"Job Feedback",description:"Feedback on job request/result",nip:"90",template:{kind:7e3,content:"",tags:[]}},{kind:7374,name:"Reserved Cashu Wallet Tokens",description:"Reserved Cashu wallet tokens",nip:"60",template:{kind:7374,content:"",tags:[]}},{kind:7375,name:"Cashu Wallet Tokens",description:"Cashu wallet tokens",nip:"60",template:{kind:7375,content:"",tags:[]}},{kind:7376,name:"Cashu Wallet History",description:"Cashu wallet transaction history",nip:"60",template:{kind:7376,content:"",tags:[]}},{kind:7516,name:"Geocache Log",description:"Geocaching log entry",nip:null,spec:"geocaching",template:{kind:7516,content:"",tags:[]}},{kind:7517,name:"Geocache Proof of Find",description:"Proof of geocache find",nip:null,spec:"geocaching",template:{kind:7517,content:"",tags:[]}},{kind:8e3,name:"Add User",description:"Add user to group",nip:"43",template:{kind:8e3,content:"",tags:[]}},{kind:8001,name:"Remove User",description:"Remove user from group",nip:"43",template:{kind:8001,content:"",tags:[]}},{kind:9e3,name:"Group Control Events",description:"Group control events (start of range)",nip:"29",template:{kind:9e3,content:"",tags:[]}},{kind:9041,name:"Zap Goal",description:"Fundraising goal for zaps",nip:"75",template:{kind:9041,content:"",tags:[]}},{kind:9321,name:"Nutzap",description:"Cashu nutzap",nip:"61",template:{kind:9321,content:"",tags:[]}},{kind:9467,name:"Tidal Login",description:"Tidal streaming login",nip:null,spec:"Tidal-nostr",template:{kind:9467,content:"",tags:[]}},{kind:9734,name:"Zap Request",description:"Request Lightning payment",nip:"57",template:{kind:9734,content:"",tags:[]}},{kind:9735,name:"Zap",description:"Lightning payment receipt",nip:"57",template:{kind:9735,content:"",tags:[]}},{kind:9802,name:"Highlights",description:"Highlighted text selection",nip:"84",template:{kind:9802,content:"",tags:[]}},{kind:1e4,name:"Mute List",description:"List of muted users/content",nip:"51",isReplaceable:!0,template:{kind:1e4,content:"",tags:[]}},{kind:10001,name:"Pin List",description:"Pinned events",nip:"51",isReplaceable:!0,template:{kind:10001,content:"",tags:[]}},{kind:10002,name:"Relay List Metadata",description:"User's preferred relays for read/write",nip:"65",isReplaceable:!0,template:{kind:10002,content:"",tags:[]}},{kind:10003,name:"Bookmark List",description:"Bookmarked events",nip:"51",isReplaceable:!0,template:{kind:10003,content:"",tags:[]}},{kind:10004,name:"Communities List",description:"Communities user belongs to",nip:"51",isReplaceable:!0,template:{kind:10004,content:"",tags:[]}},{kind:10005,name:"Public Chats List",description:"Public chats user is in",nip:"51",isReplaceable:!0,template:{kind:10005,content:"",tags:[]}},{kind:10006,name:"Blocked Relays List",description:"Relays user has blocked",nip:"51",isReplaceable:!0,template:{kind:10006,content:"",tags:[]}},{kind:10007,name:"Search Relays List",description:"Preferred search relays",nip:"51",isReplaceable:!0,template:{kind:10007,content:"",tags:[]}},{kind:10008,name:"Relay Group Configuration",description:"Relay group configuration",nip:null,isReplaceable:!0,template:{kind:10008,content:"",tags:[]}},{kind:10009,name:"User Groups",description:"Groups user belongs to",nip:"29",isReplaceable:!0,template:{kind:10009,content:"",tags:[]}},{kind:10012,name:"Favorite Relays List",description:"User's favorite relays",nip:"51",isReplaceable:!0,template:{kind:10012,content:"",tags:[]}},{kind:10013,name:"Private Event Relay List",description:"Relays for private events",nip:"37",isReplaceable:!0,template:{kind:10013,content:"",tags:[]}},{kind:10015,name:"Interests List",description:"User interests/topics",nip:"51",isReplaceable:!0,template:{kind:10015,content:"",tags:[]}},{kind:10019,name:"Nutzap Mint Recommendation",description:"Recommended Cashu mints for nutzaps",nip:"61",isReplaceable:!0,template:{kind:10019,content:"",tags:[]}},{kind:10020,name:"Media Follows",description:"Followed media accounts",nip:"51",isReplaceable:!0,template:{kind:10020,content:"",tags:[]}},{kind:10030,name:"User Emoji List",description:"Custom emoji list",nip:"51",isReplaceable:!0,template:{kind:10030,content:"",tags:[]}},{kind:10050,name:"DM Relays List",description:"Relays to receive DMs on",nip:"17",isReplaceable:!0,template:{kind:10050,content:"",tags:[]}},{kind:10051,name:"KeyPackage Relays List",description:"Marmot key package relays",nip:null,isReplaceable:!0,spec:"Marmot",template:{kind:10051,content:"",tags:[]}},{kind:10063,name:"User Server List",description:"Blossom server list",nip:null,isReplaceable:!0,spec:"Blossom",template:{kind:10063,content:"",tags:[]}},{kind:10096,name:"File Storage Server List",description:"File storage servers",nip:"96",isReplaceable:!0,deprecated:!0,template:{kind:10096,content:"",tags:[]}},{kind:10166,name:"Relay Monitor Announcement",description:"Relay monitoring announcement",nip:"66",isReplaceable:!0,template:{kind:10166,content:"",tags:[]}},{kind:10312,name:"Room Presence",description:"Presence in live room",nip:"53",isReplaceable:!0,template:{kind:10312,content:"",tags:[]}},{kind:10377,name:"Proxy Announcement",description:"Nostr proxy announcement",nip:null,isReplaceable:!0,spec:"Nostr Epoxy",template:{kind:10377,content:"",tags:[]}},{kind:11111,name:"Transport Method Announcement",description:"Transport method announcement",nip:null,isReplaceable:!0,spec:"Nostr Epoxy",template:{kind:11111,content:"",tags:[]}},{kind:12345,name:"Relay Policy Configuration",description:"Relay-internal policy configuration (admin only)",nip:null,isReplaceable:!0,spec:"orly",template:{kind:12345,content:"",tags:[]}},{kind:13004,name:"JWT Binding",description:"Link between JWT certificate and pubkey",nip:null,isReplaceable:!0,template:{kind:13004,content:"",tags:[]}},{kind:13194,name:"Wallet Service Info",description:"NWC wallet service information",nip:"47",isReplaceable:!0,template:{kind:13194,content:"",tags:[]}},{kind:13534,name:"Membership Lists",description:"Group membership lists",nip:"43",isReplaceable:!0,template:{kind:13534,content:"",tags:[]}},{kind:14388,name:"User Sound Effect Lists",description:"Sound effect lists",nip:null,isReplaceable:!0,spec:"Corny Chat",template:{kind:14388,content:"",tags:[]}},{kind:17375,name:"Cashu Wallet Event",description:"Cashu wallet event",nip:"60",isReplaceable:!0,template:{kind:17375,content:"",tags:[]}},{kind:21e3,name:"Lightning Pub RPC",description:"Lightning.Pub RPC",nip:null,isEphemeral:!0,spec:"Lightning.Pub",template:{kind:21e3,content:"",tags:[]}},{kind:22242,name:"Client Authentication",description:"Authenticate to relay",nip:"42",isEphemeral:!0,template:{kind:22242,content:"",tags:[]}},{kind:23194,name:"Wallet Request",description:"NWC wallet request",nip:"47",isEphemeral:!0,template:{kind:23194,content:"",tags:[]}},{kind:23195,name:"Wallet Response",description:"NWC wallet response",nip:"47",isEphemeral:!0,template:{kind:23195,content:"",tags:[]}},{kind:23196,name:"Wallet Notification (NIP-04)",description:"NWC wallet notification (NIP-04 encrypted)",nip:"47",isEphemeral:!0,template:{kind:23196,content:"",tags:[]}},{kind:23197,name:"Wallet Notification",description:"NWC wallet notification",nip:"47",isEphemeral:!0,template:{kind:23197,content:"",tags:[]}},{kind:24133,name:"Nostr Connect",description:"Remote signer connection",nip:"46",isEphemeral:!0,template:{kind:24133,content:"",tags:[]}},{kind:24242,name:"Blobs Stored on Mediaservers",description:"Blossom blob storage",nip:null,isEphemeral:!0,spec:"Blossom",template:{kind:24242,content:"",tags:[]}},{kind:27235,name:"HTTP Auth",description:"Authenticate HTTP requests",nip:"98",isEphemeral:!0,template:{kind:27235,content:"",tags:[]}},{kind:28934,name:"Join Request",description:"Request to join group",nip:"43",isEphemeral:!0,template:{kind:28934,content:"",tags:[]}},{kind:28935,name:"Invite Request",description:"Invite to group",nip:"43",isEphemeral:!0,template:{kind:28935,content:"",tags:[]}},{kind:28936,name:"Leave Request",description:"Leave group request",nip:"43",isEphemeral:!0,template:{kind:28936,content:"",tags:[]}},{kind:3e4,name:"Follow Sets",description:"Categorized people lists",nip:"51",isAddressable:!0,template:{kind:3e4,content:"",tags:[["d","identifier"]]}},{kind:30001,name:"Generic Lists",description:"Generic categorized lists",nip:"51",isAddressable:!0,deprecated:!0,template:{kind:30001,content:"",tags:[["d","identifier"]]}},{kind:30002,name:"Relay Sets",description:"Categorized relay lists",nip:"51",isAddressable:!0,template:{kind:30002,content:"",tags:[["d","identifier"]]}},{kind:30003,name:"Bookmark Sets",description:"Categorized bookmark lists",nip:"51",isAddressable:!0,template:{kind:30003,content:"",tags:[["d","identifier"]]}},{kind:30004,name:"Curation Sets",description:"Curated content sets",nip:"51",isAddressable:!0,template:{kind:30004,content:"",tags:[["d","identifier"]]}},{kind:30005,name:"Video Sets",description:"Video playlists",nip:"51",isAddressable:!0,template:{kind:30005,content:"",tags:[["d","identifier"]]}},{kind:30007,name:"Kind Mute Sets",description:"Muted event kinds",nip:"51",isAddressable:!0,template:{kind:30007,content:"",tags:[["d","identifier"]]}},{kind:30008,name:"Profile Badges",description:"Badges displayed on profile",nip:"58",isAddressable:!0,template:{kind:30008,content:"",tags:[["d","identifier"]]}},{kind:30009,name:"Badge Definition",description:"Define a badge/achievement",nip:"58",isAddressable:!0,template:{kind:30009,content:"",tags:[["d","identifier"]]}},{kind:30015,name:"Interest Sets",description:"Interest/topic sets",nip:"51",isAddressable:!0,template:{kind:30015,content:"",tags:[["d","identifier"]]}},{kind:30017,name:"Stall",description:"Marketplace stall definition",nip:"15",isAddressable:!0,template:{kind:30017,content:"",tags:[["d","identifier"]]}},{kind:30018,name:"Product",description:"Marketplace product listing",nip:"15",isAddressable:!0,template:{kind:30018,content:"",tags:[["d","identifier"]]}},{kind:30019,name:"Marketplace UI/UX",description:"Marketplace interface settings",nip:"15",isAddressable:!0,template:{kind:30019,content:"",tags:[["d","identifier"]]}},{kind:30020,name:"Product Sold as Auction",description:"Auction product listing",nip:"15",isAddressable:!0,template:{kind:30020,content:"",tags:[["d","identifier"]]}},{kind:30023,name:"Long-form Content",description:"Blog post, article in markdown",nip:"23",isAddressable:!0,template:{kind:30023,content:"",tags:[["d","identifier"]]}},{kind:30024,name:"Draft Long-form Content",description:"Draft article",nip:"23",isAddressable:!0,template:{kind:30024,content:"",tags:[["d","identifier"]]}},{kind:30030,name:"Emoji Sets",description:"Custom emoji sets",nip:"51",isAddressable:!0,template:{kind:30030,content:"",tags:[["d","identifier"]]}},{kind:30040,name:"Curated Publication Index",description:"Publication index",nip:null,isAddressable:!0,spec:"NKBIP-01",template:{kind:30040,content:"",tags:[["d","identifier"]]}},{kind:30041,name:"Curated Publication Content",description:"Publication content",nip:null,isAddressable:!0,spec:"NKBIP-01",template:{kind:30041,content:"",tags:[["d","identifier"]]}},{kind:30063,name:"Release Artifact Sets",description:"Software release artifacts",nip:"51",isAddressable:!0,template:{kind:30063,content:"",tags:[["d","identifier"]]}},{kind:30078,name:"Application-specific Data",description:"App-specific key-value storage",nip:"78",isAddressable:!0,template:{kind:30078,content:"",tags:[["d","identifier"]]}},{kind:30166,name:"Relay Discovery",description:"Relay discovery/monitoring",nip:"66",isAddressable:!0,template:{kind:30166,content:"",tags:[["d","identifier"]]}},{kind:30267,name:"App Curation Sets",description:"Curated app sets",nip:"51",isAddressable:!0,template:{kind:30267,content:"",tags:[["d","identifier"]]}},{kind:30311,name:"Live Event",description:"Live streaming event",nip:"53",isAddressable:!0,template:{kind:30311,content:"",tags:[["d","identifier"]]}},{kind:30312,name:"Interactive Room",description:"Interactive live room",nip:"53",isAddressable:!0,template:{kind:30312,content:"",tags:[["d","identifier"]]}},{kind:30313,name:"Conference Event",description:"Conference/meetup event",nip:"53",isAddressable:!0,template:{kind:30313,content:"",tags:[["d","identifier"]]}},{kind:30315,name:"User Statuses",description:"User status updates",nip:"38",isAddressable:!0,template:{kind:30315,content:"",tags:[["d","identifier"]]}},{kind:30388,name:"Slide Set",description:"Presentation slides",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:30388,content:"",tags:[["d","identifier"]]}},{kind:30402,name:"Classified Listing",description:"Classified ad listing",nip:"99",isAddressable:!0,template:{kind:30402,content:"",tags:[["d","identifier"]]}},{kind:30403,name:"Draft Classified Listing",description:"Draft classified ad",nip:"99",isAddressable:!0,template:{kind:30403,content:"",tags:[["d","identifier"]]}},{kind:30617,name:"Repository Announcements",description:"Git repository announcement",nip:"34",isAddressable:!0,template:{kind:30617,content:"",tags:[["d","identifier"]]}},{kind:30618,name:"Repository State Announcements",description:"Git repository state",nip:"34",isAddressable:!0,template:{kind:30618,content:"",tags:[["d","identifier"]]}},{kind:30818,name:"Wiki Article",description:"Wiki article",nip:"54",isAddressable:!0,template:{kind:30818,content:"",tags:[["d","identifier"]]}},{kind:30819,name:"Redirects",description:"URL redirects",nip:"54",isAddressable:!0,template:{kind:30819,content:"",tags:[["d","identifier"]]}},{kind:31234,name:"Draft Event",description:"Draft of any event",nip:"37",isAddressable:!0,template:{kind:31234,content:"",tags:[["d","identifier"]]}},{kind:31388,name:"Link Set",description:"Link collection",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:31388,content:"",tags:[["d","identifier"]]}},{kind:31890,name:"Feed",description:"Custom feed definition",nip:null,isAddressable:!0,spec:"NUD: Custom Feeds",template:{kind:31890,content:"",tags:[["d","identifier"]]}},{kind:31922,name:"Date-Based Calendar Event",description:"All-day calendar event",nip:"52",isAddressable:!0,template:{kind:31922,content:"",tags:[["d","identifier"]]}},{kind:31923,name:"Time-Based Calendar Event",description:"Calendar event with time",nip:"52",isAddressable:!0,template:{kind:31923,content:"",tags:[["d","identifier"]]}},{kind:31924,name:"Calendar",description:"Calendar definition",nip:"52",isAddressable:!0,template:{kind:31924,content:"",tags:[["d","identifier"]]}},{kind:31925,name:"Calendar Event RSVP",description:"RSVP to calendar event",nip:"52",isAddressable:!0,template:{kind:31925,content:"",tags:[["d","identifier"]]}},{kind:31989,name:"Handler Recommendation",description:"Recommended app for event kind",nip:"89",isAddressable:!0,template:{kind:31989,content:"",tags:[["d","identifier"]]}},{kind:31990,name:"Handler Information",description:"App handler declaration",nip:"89",isAddressable:!0,template:{kind:31990,content:"",tags:[["d","identifier"]]}},{kind:32123,name:"WaveLake Track",description:"WaveLake music track",nip:null,isAddressable:!0,spec:"WaveLake",template:{kind:32123,content:"",tags:[["d","identifier"]]}},{kind:32267,name:"Software Application",description:"Software application listing",nip:null,isAddressable:!0,template:{kind:32267,content:"",tags:[["d","identifier"]]}},{kind:32388,name:"User Room Favorites",description:"Favorite rooms",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:32388,content:"",tags:[["d","identifier"]]}},{kind:33388,name:"High Scores",description:"Game high scores",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:33388,content:"",tags:[["d","identifier"]]}},{kind:34235,name:"Video Event Horizontal",description:"Horizontal video event",nip:"71",isAddressable:!0,template:{kind:34235,content:"",tags:[["d","identifier"]]}},{kind:34236,name:"Video Event Vertical",description:"Vertical video event",nip:"71",isAddressable:!0,template:{kind:34236,content:"",tags:[["d","identifier"]]}},{kind:34388,name:"Sound Effects",description:"Sound effect definitions",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:34388,content:"",tags:[["d","identifier"]]}},{kind:34550,name:"Community Definition",description:"Define a community",nip:"72",isAddressable:!0,template:{kind:34550,content:"",tags:[["d","identifier"]]}},{kind:37516,name:"Geocache Listing",description:"Geocache location listing",nip:null,isAddressable:!0,spec:"geocaching",template:{kind:37516,content:"",tags:[["d","identifier"]]}},{kind:38172,name:"Cashu Mint Announcement",description:"Cashu mint announcement",nip:"87",isAddressable:!0,template:{kind:38172,content:"",tags:[["d","identifier"]]}},{kind:38173,name:"Fedimint Announcement",description:"Fedimint announcement",nip:"87",isAddressable:!0,template:{kind:38173,content:"",tags:[["d","identifier"]]}},{kind:38383,name:"Peer-to-peer Order Events",description:"P2P trading orders",nip:"69",isAddressable:!0,template:{kind:38383,content:"",tags:[["d","identifier"]]}},{kind:39e3,name:"Group Metadata Events",description:"Group metadata (start of range)",nip:"29",isAddressable:!0,template:{kind:39e3,content:"",tags:[["d","identifier"]]}},{kind:39089,name:"Starter Packs",description:"Starter pack lists",nip:"51",isAddressable:!0,template:{kind:39089,content:"",tags:[["d","identifier"]]}},{kind:39092,name:"Media Starter Packs",description:"Media starter packs",nip:"51",isAddressable:!0,template:{kind:39092,content:"",tags:[["d","identifier"]]}},{kind:39701,name:"Web Bookmarks",description:"Web URL bookmarks",nip:"B0",isAddressable:!0,template:{kind:39701,content:"",tags:[["d","identifier"]]}},{kind:39998,name:"ACL Event",description:"Access control list event",nip:null,isAddressable:!0,template:{kind:39998,content:"",tags:[["d","identifier"]]}}];function ty(e,t=null){const n=function(e){return ey.find(t=>t.kind===e)}(e);return n?{...n.template,created_at:Math.floor(Date.now()/1e3),pubkey:t||""}:{kind:e,content:"",tags:[],created_at:Math.floor(Date.now()/1e3),pubkey:t||""}}const ny=[{id:"all",name:"All Kinds",filter:()=>!0},{id:"regular",name:"Regular Events (0-9999)",filter:e=>e.kind<1e4&&!e.isReplaceable},{id:"replaceable",name:"Replaceable (10000-19999)",filter:e=>e.isReplaceable},{id:"ephemeral",name:"Ephemeral (20000-29999)",filter:e=>e.isEphemeral},{id:"addressable",name:"Addressable (30000-39999)",filter:e=>e.isAddressable},{id:"social",name:"Social",filter:e=>[0,1,3,6,7].includes(e.kind)},{id:"messaging",name:"Messaging",filter:e=>[4,9,10,11,12,14,15,40,41,42].includes(e.kind)},{id:"lists",name:"Lists",filter:e=>e.name.toLowerCase().includes("list")||e.name.toLowerCase().includes("set")},{id:"marketplace",name:"Marketplace",filter:e=>[30017,30018,30019,30020,1021,1022,30402,30403].includes(e.kind)},{id:"lightning",name:"Lightning/Zaps",filter:e=>[9734,9735,9041,9321,7374,7375,7376].includes(e.kind)},{id:"media",name:"Media",filter:e=>[20,21,22,1063,1222,1244].includes(e.kind)},{id:"git",name:"Git/Code",filter:e=>[818,1337,1617,1618,1619,1621,1622,30617,30618].includes(e.kind)},{id:"calendar",name:"Calendar",filter:e=>[31922,31923,31924,31925].includes(e.kind)},{id:"groups",name:"Groups",filter:e=>e.kind>=9e3&&e.kind<=9030||e.kind>=39e3&&e.kind<=39009}];function ry(e,t,n){const r=e.slice();return r[13]=t[n],r}function iy(e,t,n){const r=e.slice();return r[16]=t[n],r}function oy(e){let t,n,i,o,s,a,l,h,y,v,b,C,E,x,B,S,Q,F,D,$,U,R,T,P,N,O=e[3].length+"",L=1!==e[3].length?"s":"",M=ny,_=[];for(let t=0;t=2e4&&e.kind<3e4?"badge-ephemeral":"badge-regular"}function py(e){return e.isAddressable?"Addressable":e.isReplaceable?"Replaceable":e.kind>=2e4&&e.kind<3e4?"Ephemeral":"Regular"}function hy(e,t,n){let{isOpen:r=!1}=t,{userPubkey:i=""}=t;const o=U();let s="",a="all",l=ey;function c(e){const t=ty(e.kind,i);o("select",{kind:e,template:t}),u()}function u(){n(0,r=!1),n(1,s=""),n(2,a="all"),o("close")}return e.$$set=e=>{"isOpen"in e&&n(0,r=e.isOpen),"userPubkey"in e&&n(8,i=e.userPubkey)},e.$$.update=()=>{if(6&e.$$.dirty){let e=ey;const t=ny.find(e=>e.id===a);if(t&&(e=e.filter(t.filter)),s.trim()){const t=s.toLowerCase();e=e.filter(e=>e.name.toLowerCase().includes(t)||e.description.toLowerCase().includes(t)||e.kind.toString().includes(t)||e.nip&&e.nip.includes(t))}n(3,l=e)}},[r,s,a,l,c,u,function(e){"Escape"===e.key&&u()},function(e){e.target===e.currentTarget&&u()},i,function(){s=this.value,n(1,s)},e=>n(2,a=e.id),e=>c(e)]}class gy extends oe{constructor(e){super(),ie(this,e,hy,dy,o,{isOpen:0,userPubkey:8})}}function my(e){let t,n,r,i,o,s,a,l,f,h;return{c(){t=p("div"),n=p("div"),r=p("span"),r.textContent="⚠",i=m(),o=p("span"),s=g(e[1]),a=m(),l=p("button"),l.textContent="×",A(r,"class","error-icon svelte-46pmgb"),A(o,"class","error-message svelte-46pmgb"),A(n,"class","error-content svelte-46pmgb"),A(l,"class","error-dismiss svelte-46pmgb"),A(t,"class","error-banner svelte-46pmgb")},m(d,p){u(d,t,p),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(t,a),c(t,l),f||(h=w(l,"click",e[10]),f=!0)},p(e,t){2&t&&I(s,e[1])},d(e){e&&d(t),f=!1,h()}}}function yy(e){let t,n,i,o,s,a,l,f,h,g,y,v,b,I,C,E,x,B,S,Q=e[1]&&my(e);function F(t){e[14](t)}let D={userPubkey:e[2]};return void 0!==e[3]&&(D.isOpen=e[3]),C=new gy({props:D}),P.push(()=>X(C,"isOpen",F)),C.$on("select",e[8]),C.$on("close",e[9]),{c(){t=p("div"),n=p("div"),i=p("button"),i.textContent="Generate Template",o=m(),s=p("button"),s.textContent="Reformat",a=m(),l=p("button"),l.textContent="Sign",f=m(),h=p("button"),h.textContent="Publish",g=m(),Q&&Q.c(),y=m(),v=p("div"),b=p("textarea"),I=m(),ee(C.$$.fragment),A(i,"class","compose-btn template-btn svelte-46pmgb"),A(s,"class","compose-btn reformat-btn svelte-46pmgb"),A(l,"class","compose-btn sign-btn svelte-46pmgb"),A(h,"class","compose-btn publish-btn svelte-46pmgb"),A(n,"class","compose-header svelte-46pmgb"),A(b,"class","compose-textarea svelte-46pmgb"),A(b,"placeholder","Enter your Nostr event JSON here, or click 'Generate Template' to start with a template..."),A(b,"spellcheck","false"),A(v,"class","compose-editor svelte-46pmgb"),A(t,"class","compose-view svelte-46pmgb")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(n,a),c(n,l),c(n,f),c(n,h),c(t,g),Q&&Q.m(t,null),c(t,y),c(t,v),c(v,b),k(b,e[0]),u(r,I,d),te(C,r,d),x=!0,B||(S=[w(i,"click",e[7]),w(s,"click",e[4]),w(l,"click",e[5]),w(h,"click",e[6]),w(b,"input",e[13])],B=!0)},p(e,[n]){e[1]?Q?Q.p(e,n):(Q=my(e),Q.c(),Q.m(t,y)):Q&&(Q.d(1),Q=null),1&n&&k(b,e[0]);const r={};4&n&&(r.userPubkey=e[2]),!E&&8&n&&(E=!0,r.isOpen=e[3],j(()=>E=!1)),C.$set(r)},i(e){x||(z(C.$$.fragment,e),x=!0)},o(e){Z(C.$$.fragment,e),x=!1},d(e){e&&d(t),Q&&Q.d(),e&&d(I),ne(C,e),B=!1,r(S)}}}function wy(e,t,n){let{composeEventJson:r=""}=t,{userPubkey:i=""}=t,{userRole:o=""}=t,{policyEnabled:s=!1}=t,{publishError:a=""}=t;const l=U();let c=!1;return e.$$set=e=>{"composeEventJson"in e&&n(0,r=e.composeEventJson),"userPubkey"in e&&n(2,i=e.userPubkey),"userRole"in e&&n(11,o=e.userRole),"policyEnabled"in e&&n(12,s=e.policyEnabled),"publishError"in e&&n(1,a=e.publishError)},[r,a,i,c,function(){l("reformatJson")},function(){l("signEvent")},function(){l("publishEvent")},function(){n(3,c=!0)},function(e){const{kind:t,template:i}=e.detail;n(0,r=JSON.stringify(i,null,2)),l("templateSelected",{kind:t,template:i})},function(){n(3,c=!1)},function(){n(1,a=""),l("clearError")},o,s,function(){r=this.value,n(0,r)},function(e){c=e,n(3,c)}]}class vy extends oe{constructor(e){super(),ie(this,e,wy,yy,o,{composeEventJson:0,userPubkey:2,userRole:11,policyEnabled:12,publishError:1})}}function Ay(e,t,n){const r=e.slice();return r[23]=t[n],r}function by(t){let n,r,i,o,s,a;return{c(){n=p("div"),r=p("p"),r.textContent="Please log in to access sprocket management.",i=m(),o=p("button"),o.textContent="Log In",A(r,"class","svelte-fiaj1r"),A(o,"class","login-btn svelte-fiaj1r"),A(n,"class","login-prompt svelte-fiaj1r")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[18]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Iy(e){let t,n,r,i,o,s,a,l,f,h=(e[2]||"none")+"";return{c(){t=p("div"),n=p("p"),n.textContent="❌ Owner permission required for sprocket management.",r=m(),i=p("p"),i.innerHTML='To enable sprocket functionality, set the ORLY_OWNERS environment variable with your npub when starting the relay.',o=m(),s=p("p"),a=g("Current user role: "),l=p("strong"),f=g(h),A(n,"class","svelte-fiaj1r"),A(i,"class","svelte-fiaj1r"),A(s,"class","svelte-fiaj1r"),A(t,"class","permission-denied svelte-fiaj1r")},m(e,d){u(e,t,d),c(t,n),c(t,r),c(t,i),c(t,o),c(t,s),c(s,a),c(s,l),c(l,f)},p(e,t){4&t&&h!==(h=(e[2]||"none")+"")&&I(f,h)},d(e){e&&d(t)}}}function ky(e){let t,n,i,o,s,a,l,h,y,v,b,C,E,x,S,Q,F,D,$,U,R,T,P,N,O,L,M,_,j,H,G,J,K,V,q,Y,W,z,Z,X,ee,te,ne,re,ie,oe,se,ae,le,ce,ue,de,fe,pe,he,ge,me=e[3]?.is_running?"🟢 Running":"🔴 Stopped",ye=e[3]?.script_exists?"✅ Exists":"❌ Not found",we=e[3]?.pid&&Cy(e),ve=e[6]&&Ey(e),Ae=e[8],be=[];for(let t=0;t{"isLoggedIn"in e&&n(1,r=e.isLoggedIn),"userRole"in e&&n(2,i=e.userRole),"sprocketStatus"in e&&n(3,o=e.sprocketStatus),"isLoadingSprocket"in e&&n(4,s=e.isLoadingSprocket),"sprocketUploadFile"in e&&n(5,a=e.sprocketUploadFile),"sprocketScript"in e&&n(0,l=e.sprocketScript),"sprocketMessage"in e&&n(6,c=e.sprocketMessage),"sprocketMessageType"in e&&n(7,u=e.sprocketMessageType),"sprocketVersions"in e&&n(8,d=e.sprocketVersions)},[l,r,i,o,s,a,c,u,d,function(){f("restartSprocket")},function(){f("deleteSprocket")},function(e){f("sprocketFileSelect",e)},function(){f("uploadSprocketScript")},function(){f("saveSprocket")},function(){f("loadSprocket")},function(){f("loadVersions")},p,h,function(){f("openLoginModal")},function(){l=this.value,n(0,l)},e=>p(e),e=>h(e.name)]}class Dy extends oe{constructor(e){super(),ie(this,e,Fy,Qy,o,{isLoggedIn:1,userRole:2,sprocketStatus:3,isLoadingSprocket:4,sprocketUploadFile:5,sprocketScript:0,sprocketMessage:6,sprocketMessageType:7,sprocketVersions:8})}}function $y(e,t,n){const r=e.slice();return r[26]=t[n],r}function Uy(e,t,n){const r=e.slice();return r[29]=t[n],r}function Ry(e,t,n){const r=e.slice();return r[32]=t[n],r}function Ty(t){let n,r,i,o,s,a;return{c(){n=p("div"),r=p("p"),r.textContent="Please log in to access policy configuration.",i=m(),o=p("button"),o.textContent="Log In",A(r,"class","svelte-gkxvxc"),A(o,"class","login-btn svelte-gkxvxc"),A(n,"class","login-prompt svelte-gkxvxc")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[16]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Py(e){let t,n,r,i,o,s,a,l,f,h=(e[3]||"none")+"";return{c(){t=p("div"),n=p("p"),n.textContent="Policy configuration requires owner or policy admin permissions.",r=m(),i=p("p"),i.innerHTML='To become a policy admin, ask an existing policy admin to add your pubkey\n to the policy_admins list.',o=m(),s=p("p"),a=g("Current user role: "),l=p("strong"),f=g(h),A(n,"class","svelte-gkxvxc"),A(i,"class","svelte-gkxvxc"),A(s,"class","svelte-gkxvxc"),A(t,"class","permission-denied svelte-gkxvxc")},m(e,d){u(e,t,d),c(t,n),c(t,r),c(t,i),c(t,o),c(t,s),c(s,a),c(s,l),c(l,f)},p(e,t){8&t[0]&&h!==(h=(e[3]||"none")+"")&&I(f,h)},d(e){e&&d(t)}}}function Ny(e){let t,n,i,o,s,a,l,f,h,y,v,b,C,E,x,S,Q,F,D,$,U,R,T,P,N,O,L,M,_,j,H,G,J,K,V,q,Y,W,z,Z,X,ee,te,ne,re,ie,oe,se,ae,le,ce,ue,de,fe,pe,he,ge,me,ye,we,ve,Ae,be,Ie,ke,Ce,Ee,xe,Be,Se,Qe,Fe,De,$e,Ue,Re=e[5]?"Policy Enabled":"Policy Disabled",Te=e[10].length+"",Pe=e[4]&&Oy(),Ne=e[9].length>0&&Ly(e),Oe=e[7]&&_y(e);function Le(e,t){return 0===e[1].length?Hy:jy}let Me=Le(e),_e=Me(e);function je(e,t){return 0===e[10].length?Ky:Jy}let He=je(e),Ge=He(e);return{c(){t=p("div"),n=p("div"),i=p("h3"),i.textContent="Policy Editor",o=m(),s=p("div"),a=p("span"),l=g(Re),f=m(),Pe&&Pe.c(),h=m(),y=p("div"),y.innerHTML='

Edit the policy JSON below and click "Save & Publish" to update the relay's policy configuration.\n Changes are applied immediately after validation.

\n

Policy updates are published as kind 12345 events and require policy admin permissions.

',v=m(),b=p("div"),C=p("textarea"),E=m(),Ne&&Ne.c(),x=m(),S=p("div"),Q=p("button"),F=g("Load Current"),D=m(),$=p("button"),U=g("Format JSON"),R=m(),T=p("button"),P=g("Validate"),N=m(),O=p("button"),L=g("Save & Publish"),M=m(),Oe&&Oe.c(),_=m(),j=p("div"),H=p("h3"),H.textContent="Policy Administrators",G=m(),J=p("div"),J.innerHTML='

Policy admins can update the relay's policy configuration via kind 12345 events.\n Their follows get whitelisted if policy_follow_whitelist_enabled is true in the policy.

\n

Note: Policy admins are separate from relay admins (ORLY_ADMINS).\n Changes here update the JSON editor - click "Save & Publish" to apply.

',K=m(),V=p("div"),_e.c(),q=m(),Y=p("div"),W=p("input"),z=m(),Z=p("button"),X=g("+ Add Admin"),te=m(),ne=p("div"),re=p("h3"),re.textContent="Policy Follow Whitelist",ie=m(),oe=p("div"),oe.innerHTML='

Pubkeys followed by policy admins (kind 3 events).\n These get automatic read+write access when rules have write_allow_follows: true.

',se=m(),ae=p("div"),le=p("span"),ce=g(Te),ue=g(" pubkey(s) in whitelist"),de=m(),fe=p("button"),pe=g("🔄 Refresh Follows"),he=m(),ge=p("div"),Ge.c(),me=m(),ye=p("div"),we=p("h3"),we.textContent="Policy Reference",ve=m(),Ae=p("div"),be=p("h4"),be.textContent="Structure Overview",Ie=m(),ke=p("ul"),ke.innerHTML='
  • kind.whitelist - Only allow these event kinds (takes precedence)
  • \n
  • kind.blacklist - Deny these event kinds (if no whitelist)
  • \n
  • global - Rules applied to all events
  • \n
  • rules - Per-kind rules (keyed by kind number as string)
  • \n
  • default_policy - "allow" or "deny" when no rules match
  • \n
  • policy_admins - Hex pubkeys that can update policy
  • \n
  • policy_follow_whitelist_enabled - Enable follow-based access
  • ',Ce=m(),Ee=p("h4"),Ee.textContent="Rule Fields",xe=m(),Be=p("ul"),Be.innerHTML='
  • description - Human-readable rule description
  • \n
  • write_allow / write_deny - Pubkey lists for write access
  • \n
  • read_allow / read_deny - Pubkey lists for read access
  • \n
  • write_allow_follows - Grant access to policy admin follows
  • \n
  • size_limit - Max total event size in bytes
  • \n
  • content_limit - Max content field size in bytes
  • \n
  • max_expiry - Max expiry offset in seconds
  • \n
  • max_age_of_event - Max age of created_at in seconds
  • \n
  • max_age_event_in_future - Max future offset in seconds
  • \n
  • must_have_tags - Required tag letters (e.g., ["d", "t"])
  • \n
  • tag_validation - Regex patterns for tag values
  • \n
  • script - Path to external validation script
  • ',Se=m(),Qe=p("h4"),Qe.textContent="Example Policy",Fe=m(),De=p("pre"),De.textContent=`${e[20]}`,A(i,"class","svelte-gkxvxc"),A(a,"class","status-badge svelte-gkxvxc"),B(a,"enabled",e[5]),A(s,"class","policy-status svelte-gkxvxc"),A(n,"class","policy-header svelte-gkxvxc"),A(y,"class","policy-info svelte-gkxvxc"),A(C,"class","policy-editor svelte-gkxvxc"),A(C,"placeholder","Loading policy configuration..."),C.disabled=e[6],A(C,"spellcheck","false"),A(b,"class","editor-container svelte-gkxvxc"),A(Q,"class","policy-btn load-btn svelte-gkxvxc"),Q.disabled=e[6],A($,"class","policy-btn format-btn svelte-gkxvxc"),$.disabled=e[6],A(T,"class","policy-btn validate-btn svelte-gkxvxc"),T.disabled=e[6],A(O,"class","policy-btn save-btn svelte-gkxvxc"),O.disabled=e[6],A(S,"class","policy-actions svelte-gkxvxc"),A(t,"class","policy-section svelte-gkxvxc"),A(J,"class","policy-info svelte-gkxvxc"),A(V,"class","admin-list svelte-gkxvxc"),A(W,"type","text"),A(W,"placeholder","npub or hex pubkey"),W.disabled=e[6],A(W,"class","svelte-gkxvxc"),A(Z,"class","policy-btn add-btn svelte-gkxvxc"),Z.disabled=ee=e[6]||!e[11].trim(),A(Y,"class","add-admin svelte-gkxvxc"),A(j,"class","policy-section svelte-gkxvxc"),A(oe,"class","policy-info svelte-gkxvxc"),A(le,"class","follows-count svelte-gkxvxc"),A(fe,"class","policy-btn refresh-btn svelte-gkxvxc"),fe.disabled=e[6],A(ae,"class","follows-header svelte-gkxvxc"),A(ge,"class","follows-list svelte-gkxvxc"),A(ne,"class","policy-section svelte-gkxvxc"),A(be,"class","svelte-gkxvxc"),A(ke,"class","field-list svelte-gkxvxc"),A(Ee,"class","svelte-gkxvxc"),A(Be,"class","field-list svelte-gkxvxc"),A(Qe,"class","svelte-gkxvxc"),A(De,"class","example-json svelte-gkxvxc"),A(Ae,"class","reference-content svelte-gkxvxc"),A(ye,"class","policy-section svelte-gkxvxc")},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(s,f),Pe&&Pe.m(s,null),c(t,h),c(t,y),c(t,v),c(t,b),c(b,C),k(C,e[0]),c(t,E),Ne&&Ne.m(t,null),c(t,x),c(t,S),c(S,Q),c(Q,F),c(S,D),c(S,$),c($,U),c(S,R),c(S,T),c(T,P),c(S,N),c(S,O),c(O,L),c(t,M),Oe&&Oe.m(t,null),u(r,_,d),u(r,j,d),c(j,H),c(j,G),c(j,J),c(j,K),c(j,V),_e.m(V,null),c(j,q),c(j,Y),c(Y,W),k(W,e[11]),c(Y,z),c(Y,Z),c(Z,X),u(r,te,d),u(r,ne,d),c(ne,re),c(ne,ie),c(ne,oe),c(ne,se),c(ne,ae),c(ae,le),c(le,ce),c(le,ue),c(ae,de),c(ae,fe),c(fe,pe),c(ne,he),c(ne,ge),Ge.m(ge,null),u(r,me,d),u(r,ye,d),c(ye,we),c(ye,ve),c(ye,Ae),c(Ae,be),c(Ae,Ie),c(Ae,ke),c(Ae,Ce),c(Ae,Ee),c(Ae,xe),c(Ae,Be),c(Ae,Se),c(Ae,Qe),c(Ae,Fe),c(Ae,De),$e||(Ue=[w(C,"input",e[21]),w(Q,"click",e[12]),w($,"click",e[15]),w(T,"click",e[13]),w(O,"click",e[14]),w(W,"input",e[23]),w(W,"keydown",e[24]),w(Z,"click",e[18]),w(fe,"click",e[17])],$e=!0)},p(e,n){32&n[0]&&Re!==(Re=e[5]?"Policy Enabled":"Policy Disabled")&&I(l,Re),32&n[0]&&B(a,"enabled",e[5]),e[4]?Pe||(Pe=Oy(),Pe.c(),Pe.m(s,null)):Pe&&(Pe.d(1),Pe=null),64&n[0]&&(C.disabled=e[6]),1&n[0]&&k(C,e[0]),e[9].length>0?Ne?Ne.p(e,n):(Ne=Ly(e),Ne.c(),Ne.m(t,x)):Ne&&(Ne.d(1),Ne=null),64&n[0]&&(Q.disabled=e[6]),64&n[0]&&($.disabled=e[6]),64&n[0]&&(T.disabled=e[6]),64&n[0]&&(O.disabled=e[6]),e[7]?Oe?Oe.p(e,n):(Oe=_y(e),Oe.c(),Oe.m(t,null)):Oe&&(Oe.d(1),Oe=null),Me===(Me=Le(e))&&_e?_e.p(e,n):(_e.d(1),_e=Me(e),_e&&(_e.c(),_e.m(V,null))),64&n[0]&&(W.disabled=e[6]),2048&n[0]&&W.value!==e[11]&&k(W,e[11]),2112&n[0]&&ee!==(ee=e[6]||!e[11].trim())&&(Z.disabled=ee),1024&n[0]&&Te!==(Te=e[10].length+"")&&I(ce,Te),64&n[0]&&(fe.disabled=e[6]),He===(He=je(e))&&Ge?Ge.p(e,n):(Ge.d(1),Ge=He(e),Ge&&(Ge.c(),Ge.m(ge,null)))},d(e){e&&d(t),Pe&&Pe.d(),Ne&&Ne.d(),Oe&&Oe.d(),e&&d(_),e&&d(j),_e.d(),e&&d(te),e&&d(ne),Ge.d(),e&&d(me),e&&d(ye),$e=!1,r(Ue)}}}function Oy(e){let t;return{c(){t=p("span"),t.textContent="Policy Admin",A(t,"class","admin-badge svelte-gkxvxc")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Ly(e){let t,n,r,i,o=e[9],s=[];for(let t=0;t{"isLoggedIn"in e&&n(2,r=e.isLoggedIn),"userRole"in e&&n(3,i=e.userRole),"isPolicyAdmin"in e&&n(4,o=e.isPolicyAdmin),"policyEnabled"in e&&n(5,s=e.policyEnabled),"policyJson"in e&&n(0,a=e.policyJson),"isLoadingPolicy"in e&&n(6,l=e.isLoadingPolicy),"policyMessage"in e&&n(7,c=e.policyMessage),"policyMessageType"in e&&n(8,u=e.policyMessageType),"validationErrors"in e&&n(9,d=e.validationErrors),"policyAdmins"in e&&n(1,f=e.policyAdmins),"policyFollows"in e&&n(10,p=e.policyFollows)},e.$$.update=()=>{if(1&e.$$.dirty[0])try{if(a){const e=JSON.parse(a);n(1,f=e.policy_admins||[])}}catch(e){}},[a,f,r,i,o,s,l,c,u,d,p,g,function(){h("loadPolicy")},function(){h("validatePolicy")},function(){h("savePolicy")},function(){h("formatJson")},function(){h("openLoginModal")},function(){h("refreshFollows")},m,y,'{\n "kind": {\n "whitelist": [0, 1, 3, 6, 7, 10002],\n "blacklist": []\n },\n "global": {\n "description": "Global rules applied to all events",\n "size_limit": 65536,\n "max_age_of_event": 86400,\n "max_age_event_in_future": 300\n },\n "rules": {\n "1": {\n "description": "Kind 1 (short text notes)",\n "content_limit": 8192,\n "write_allow_follows": true\n },\n "30023": {\n "description": "Long-form articles",\n "content_limit": 100000,\n "tag_validation": {\n "d": "^[a-z0-9-]{1,64}$",\n "t": "^[a-z0-9-]{1,32}$"\n }\n }\n },\n "default_policy": "allow",\n "policy_admins": [""],\n "policy_follow_whitelist_enabled": true\n}',function(){a=this.value,n(0,a)},e=>y(e),function(){g=this.value,n(11,g)},e=>"Enter"===e.key&&m()]}class Wy extends oe{constructor(e){super(),ie(this,e,Yy,qy,o,{isLoggedIn:2,userRole:3,isPolicyAdmin:4,policyEnabled:5,policyJson:0,isLoadingPolicy:6,policyMessage:7,policyMessageType:8,validationErrors:9,policyAdmins:1,policyFollows:10},null,[-1,-1])}}const{window:zy}=l;function Zy(e,t,n){const r=e.slice();return r[57]=t[n],r}function Xy(e,t,n){const r=e.slice();return r[54]=t[n],r}function ew(t){let n,r,i,o,s,a;return{c(){n=p("div"),r=p("p"),r.textContent="Please log in to view your Blossom storage.",i=m(),o=p("button"),o.textContent="Log In",A(r,"class","svelte-on0yal"),A(o,"class","login-btn svelte-on0yal"),A(n,"class","login-prompt svelte-on0yal")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[20]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function tw(e){let t,n,r,i,o,s,a,l,f,h,y,v,b,k,C=e[0]||e[12]?"Loading...":"Refresh";function E(e,t){return e[13]?iw:e[10]?rw:nw}let x=E(e),B=x(e),S=e[14]&&!e[10]&&!e[13]&&sw(e),Q=!e[10]&&!e[13]&&aw(e),F=e[2]&&cw(e);function D(e,t){return e[10]&&!e[13]?dw:uw}let $=D(e),U=$(e);return{c(){t=p("div"),n=p("div"),B.c(),r=m(),i=p("div"),S&&S.c(),o=m(),s=p("button"),a=g("🔄 "),l=g(C),h=m(),Q&&Q.c(),y=m(),F&&F.c(),v=m(),U.c(),A(s,"class","refresh-btn svelte-on0yal"),s.disabled=f=e[0]||e[12],A(i,"class","header-buttons svelte-on0yal"),A(n,"class","header-section svelte-on0yal"),A(t,"class","blossom-view svelte-on0yal")},m(d,f){u(d,t,f),c(t,n),B.m(n,null),c(n,r),c(n,i),S&&S.m(i,null),c(i,o),c(i,s),c(s,a),c(s,l),c(t,h),Q&&Q.m(t,null),c(t,y),F&&F.m(t,null),c(t,v),U.m(t,null),b||(k=w(s,"click",e[30]),b=!0)},p(e,a){x===(x=E(e))&&B?B.p(e,a):(B.d(1),B=x(e),B&&(B.c(),B.m(n,r))),!e[14]||e[10]||e[13]?S&&(S.d(1),S=null):S?S.p(e,a):(S=sw(e),S.c(),S.m(i,o)),4097&a[0]&&C!==(C=e[0]||e[12]?"Loading...":"Refresh")&&I(l,C),4097&a[0]&&f!==(f=e[0]||e[12])&&(s.disabled=f),e[10]||e[13]?Q&&(Q.d(1),Q=null):Q?Q.p(e,a):(Q=aw(e),Q.c(),Q.m(t,y)),e[2]?F?F.p(e,a):(F=cw(e),F.c(),F.m(t,v)):F&&(F.d(1),F=null),$===($=D(e))&&U?U.p(e,a):(U.d(1),U=$(e),U&&(U.c(),U.m(t,null)))},d(e){e&&d(t),B.d(),S&&S.d(),Q&&Q.d(),F&&F.d(),U.d(),b=!1,k()}}}function nw(t){let n;return{c(){n=p("h3"),n.textContent="Blossom Media Storage",A(n,"class","svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function rw(t){let n,r,i,o,s;return{c(){n=p("button"),n.textContent="← Back",r=m(),i=p("h3"),i.textContent="All Users Storage",A(n,"class","back-btn svelte-on0yal"),A(i,"class","svelte-on0yal")},m(e,a){u(e,n,a),u(e,r,a),u(e,i,a),o||(s=w(n,"click",t[27]),o=!0)},p:e,d(e){e&&d(n),e&&d(r),e&&d(i),o=!1,s()}}}function iw(e){let t,n,r,i,o,s,a,l=(e[13].profile?.name||_w(e[25](e[13].pubkey)))+"",f=e[13].profile?.picture&&ow(e);return{c(){t=p("button"),t.textContent="← Back",n=m(),r=p("h3"),f&&f.c(),i=m(),o=g(l),A(t,"class","back-btn svelte-on0yal"),A(r,"class","user-header svelte-on0yal")},m(l,d){u(l,t,d),u(l,n,d),u(l,r,d),f&&f.m(r,null),c(r,i),c(r,o),s||(a=w(t,"click",e[29]),s=!0)},p(e,t){e[13].profile?.picture?f?f.p(e,t):(f=ow(e),f.c(),f.m(r,i)):f&&(f.d(1),f=null),8192&t[0]&&l!==(l=(e[13].profile?.name||_w(e[25](e[13].pubkey)))+"")&&I(o,l)},d(e){e&&d(t),e&&d(n),e&&d(r),f&&f.d(),s=!1,a()}}}function ow(e){let t,n;return{c(){t=p("img"),a(t.src,n=e[13].profile.picture)||A(t,"src",n),A(t,"alt",""),A(t,"class","header-avatar svelte-on0yal")},m(e,n){u(e,t,n)},p(e,r){8192&r[0]&&!a(t.src,n=e[13].profile.picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function sw(e){let t,n,r,i;return{c(){t=p("button"),n=g("Admin"),A(t,"class","admin-btn svelte-on0yal"),t.disabled=e[0]},m(o,s){u(o,t,s),c(t,n),r||(i=w(t,"click",e[26]),r=!0)},p(e,n){1&n[0]&&(t.disabled=e[0])},d(e){e&&d(t),r=!1,i()}}}function aw(e){let t,n,i,o,s,a,l,f,h,y,v=e[3].length>0&&lw(e);return{c(){t=p("div"),n=p("span"),n.textContent="Upload new files",i=m(),o=p("input"),s=m(),v&&v.c(),a=m(),l=p("button"),f=g("Select Files"),A(n,"class","upload-label svelte-on0yal"),A(o,"type","file"),o.multiple=!0,A(o,"class","file-input-hidden svelte-on0yal"),A(l,"class","select-btn svelte-on0yal"),l.disabled=e[4],A(t,"class","upload-section svelte-on0yal")},m(r,d){u(r,t,d),c(t,n),c(t,i),c(t,o),e[39](o),c(t,s),v&&v.m(t,null),c(t,a),c(t,l),c(l,f),h||(y=[w(o,"change",e[22]),w(l,"click",e[23])],h=!0)},p(e,n){e[3].length>0?v?v.p(e,n):(v=lw(e),v.c(),v.m(t,a)):v&&(v.d(1),v=null),16&n[0]&&(l.disabled=e[4])},d(n){n&&d(t),e[39](null),v&&v.d(),h=!1,r(y)}}}function lw(e){let t,n,r,i,o,s,a,l,f=e[3].length+"",h=(e[4]?e[5]:"Upload")+"";return{c(){t=p("span"),n=g(f),r=g(" file(s) selected"),i=m(),o=p("button"),s=g(h),A(t,"class","selected-count svelte-on0yal"),A(o,"class","upload-btn svelte-on0yal"),o.disabled=e[4]},m(d,f){u(d,t,f),c(t,n),c(t,r),u(d,i,f),u(d,o,f),c(o,s),a||(l=w(o,"click",e[24]),a=!0)},p(e,t){8&t[0]&&f!==(f=e[3].length+"")&&I(n,f),48&t[0]&&h!==(h=(e[4]?e[5]:"Upload")+"")&&I(s,h),16&t[0]&&(o.disabled=e[4])},d(e){e&&d(t),e&&d(i),e&&d(o),a=!1,l()}}}function cw(e){let t,n;return{c(){t=p("div"),n=g(e[2]),A(t,"class","error-message svelte-on0yal")},m(e,r){u(e,t,r),c(t,n)},p(e,t){4&t[0]&&I(n,e[2])},d(e){e&&d(t)}}}function uw(e){let t,n,r;function i(e,r){return 1&r[0]&&(t=null),null==t&&(t=!(!e[0]||0!==e[31]().length)),t?hw:(null==n&&(n=!(0!==e[31]().length)),n?pw:fw)}let o=i(e,[-1,-1]),s=o(e);return{c(){s.c(),r=y()},m(e,t){s.m(e,t),u(e,r,t)},p(e,t){o===(o=i(e,t))&&s?s.p(e,t):(s.d(1),s=o(e),s&&(s.c(),s.m(r.parentNode,r)))},d(e){s.d(e),e&&d(r)}}}function dw(e){let t;function n(e,t){return e[12]?bw:0===e[11].length?Aw:vw}let r=n(e),i=r(e);return{c(){i.c(),t=y()},m(e,n){i.m(e,n),u(e,t,n)},p(e,o){r===(r=n(e))&&i?i.p(e,o):(i.d(1),i=r(e),i&&(i.c(),i.m(t.parentNode,t)))},d(e){i.d(e),e&&d(t)}}}function fw(e){let t,n=e[31](),r=[];for(let t=0;tNo users have uploaded files yet.

    ",A(n,"class","empty-state svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function bw(t){let n;return{c(){n=p("div"),n.textContent="Loading user statistics...",A(n,"class","loading svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Iw(t){let n;return{c(){n=p("div"),A(n,"class","user-avatar-placeholder svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function kw(e){let t,n;return{c(){t=p("img"),a(t.src,n=e[54].profile.picture)||A(t,"src",n),A(t,"alt",""),A(t,"class","user-avatar svelte-on0yal")},m(e,n){u(e,t,n)},p(e,r){2048&r[0]&&!a(t.src,n=e[54].profile.picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function Cw(e){let t,n,i,o,s,a,l,f,h,y,v,b,k,C,E,x,B,S,Q,F,D,$,U,R,T,P=(e[54].profile?.name||_w(e[25](e[54].pubkey)))+"",N=e[25](e[54].pubkey)+"",O=_w(e[25](e[54].pubkey))+"",L=e[54].blob_count+"",M=Tw(e[54].total_size_bytes)+"";function _(e,t){return e[54].profile?.picture?kw:Iw}let j=_(e),H=j(e);function G(){return e[40](e[54])}function J(...t){return e[41](e[54],...t)}return{c(){t=p("div"),n=p("div"),H.c(),i=m(),o=p("div"),s=p("div"),a=g(P),l=m(),f=p("div"),h=p("span"),y=g(N),v=m(),b=p("span"),k=g(O),E=m(),x=p("div"),B=p("span"),S=g(L),Q=g(" files"),F=m(),D=p("span"),$=g(M),U=m(),A(n,"class","user-avatar-container svelte-on0yal"),A(s,"class","user-name svelte-on0yal"),A(h,"class","npub-full svelte-on0yal"),A(b,"class","npub-truncated svelte-on0yal"),A(f,"class","user-npub svelte-on0yal"),A(f,"title",C=e[54].pubkey),A(o,"class","user-info svelte-on0yal"),A(B,"class","blob-count svelte-on0yal"),A(D,"class","total-size svelte-on0yal"),A(x,"class","user-stats svelte-on0yal"),A(t,"class","user-stat-item svelte-on0yal"),A(t,"role","button"),A(t,"tabindex","0")},m(e,r){u(e,t,r),c(t,n),H.m(n,null),c(t,i),c(t,o),c(o,s),c(s,a),c(o,l),c(o,f),c(f,h),c(h,y),c(f,v),c(f,b),c(b,k),c(t,E),c(t,x),c(x,B),c(B,S),c(B,Q),c(x,F),c(x,D),c(D,$),c(t,U),R||(T=[w(t,"click",G),w(t,"keypress",J)],R=!0)},p(t,r){j===(j=_(e=t))&&H?H.p(e,r):(H.d(1),H=j(e),H&&(H.c(),H.m(n,null))),2048&r[0]&&P!==(P=(e[54].profile?.name||_w(e[25](e[54].pubkey)))+"")&&I(a,P),2048&r[0]&&N!==(N=e[25](e[54].pubkey)+"")&&I(y,N),2048&r[0]&&O!==(O=_w(e[25](e[54].pubkey))+"")&&I(k,O),2048&r[0]&&C!==(C=e[54].pubkey)&&A(f,"title",C),2048&r[0]&&L!==(L=e[54].blob_count+"")&&I(S,L),2048&r[0]&&M!==(M=Tw(e[54].total_size_bytes)+"")&&I($,M)},d(e){e&&d(t),H.d(),R=!1,r(T)}}}function Ew(e){let t,n,i,o,s,a,l,f,h,y,b,k,C,E,x,B,S,Q,F,D,$,U,R,T,P,N,O,L,M,_,j,H,G,J,K,V,q,Y,W,z,Z,X,ee,te=Nw(e[8].sha256)+"",ne=(e[8].type||"unknown")+"",re="image"===Ow(e[8].type),ie=Tw(e[8].size)+"",oe=Pw(e[8].uploaded)+"",se=re&&xw(e);function ae(e,t){return 256&t[0]&&(B=null),256&t[0]&&(S=null),256&t[0]&&(Q=null),null==B&&(B=!("image"!==Ow(e[8].type))),B?Fw:(null==S&&(S=!("video"!==Ow(e[8].type))),S?Qw:(null==Q&&(Q=!("audio"!==Ow(e[8].type))),Q?Sw:Bw))}let le=ae(e,[-1,-1]),ce=le(e);return{c(){t=p("div"),n=p("div"),i=p("div"),o=p("div"),s=p("span"),a=g(te),l=m(),f=p("span"),h=g(ne),y=m(),b=p("div"),se&&se.c(),k=m(),C=p("button"),C.textContent="X",E=m(),x=p("div"),ce.c(),F=m(),D=p("div"),$=p("div"),U=p("span"),R=g("Size: "),T=g(ie),P=m(),N=p("span"),O=g("Uploaded: "),L=g(oe),M=m(),_=p("div"),j=p("input"),G=m(),J=p("button"),J.textContent="Copy",K=m(),V=p("div"),q=p("a"),Y=g("Open in New Tab"),z=m(),Z=p("button"),Z.textContent="Delete",A(s,"class","modal-hash svelte-on0yal"),A(f,"class","modal-type svelte-on0yal"),A(o,"class","modal-title svelte-on0yal"),A(C,"class","close-btn svelte-on0yal"),A(b,"class","modal-controls svelte-on0yal"),A(i,"class","modal-header svelte-on0yal"),A(x,"class","modal-body svelte-on0yal"),A($,"class","blob-details svelte-on0yal"),A(j,"type","text"),j.readOnly=!0,j.value=H=Mw(e[8]),A(j,"class","blob-url-input svelte-on0yal"),A(J,"class","copy-btn svelte-on0yal"),A(_,"class","blob-url-section svelte-on0yal"),A(q,"href",W=Mw(e[8])),A(q,"target","_blank"),A(q,"rel","noopener noreferrer"),A(q,"class","action-btn svelte-on0yal"),A(Z,"class","action-btn danger svelte-on0yal"),A(V,"class","modal-actions svelte-on0yal"),A(D,"class","modal-footer svelte-on0yal"),A(n,"class","modal-content svelte-on0yal"),A(n,"role","dialog"),A(t,"class","modal-overlay svelte-on0yal"),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(o,s),c(s,a),c(o,l),c(o,f),c(f,h),c(i,y),c(i,b),se&&se.m(b,null),c(b,k),c(b,C),c(n,E),c(n,x),ce.m(x,null),c(n,F),c(n,D),c(D,$),c($,U),c(U,R),c(U,T),c($,P),c($,N),c(N,O),c(N,L),c(D,M),c(D,_),c(_,j),c(_,G),c(_,J),c(D,K),c(D,V),c(V,q),c(q,Y),c(V,z),c(V,Z),X||(ee=[w(C,"click",e[16]),w(j,"click",jw),w(J,"click",e[45]),w(Z,"click",e[46]),w(n,"click",v(e[37])),w(n,"keypress",v(e[38])),w(t,"click",e[16]),w(t,"keypress",e[47])],X=!0)},p(e,t){256&t[0]&&te!==(te=Nw(e[8].sha256)+"")&&I(a,te),256&t[0]&&ne!==(ne=(e[8].type||"unknown")+"")&&I(h,ne),256&t[0]&&(re="image"===Ow(e[8].type)),re?se?se.p(e,t):(se=xw(e),se.c(),se.m(b,k)):se&&(se.d(1),se=null),le===(le=ae(e,t))&&ce?ce.p(e,t):(ce.d(1),ce=le(e),ce&&(ce.c(),ce.m(x,null))),256&t[0]&&ie!==(ie=Tw(e[8].size)+"")&&I(T,ie),256&t[0]&&oe!==(oe=Pw(e[8].uploaded)+"")&&I(L,oe),256&t[0]&&H!==(H=Mw(e[8]))&&j.value!==H&&(j.value=H),256&t[0]&&W!==(W=Mw(e[8]))&&A(q,"href",W)},d(e){e&&d(t),se&&se.d(),ce.d(),X=!1,r(ee)}}}function xw(e){let t,n,i,o,s,a,l,f,h,y,v,b,k,C=Math.round(100*e[9])+"";return{c(){t=p("button"),n=g("-"),o=m(),s=p("span"),a=g(C),l=g("%"),f=m(),h=p("button"),y=g("+"),A(t,"class","zoom-btn svelte-on0yal"),t.disabled=i=e[9]<=$w,A(s,"class","zoom-level svelte-on0yal"),A(h,"class","zoom-btn svelte-on0yal"),h.disabled=v=e[9]>=Uw},m(r,i){u(r,t,i),c(t,n),u(r,o,i),u(r,s,i),c(s,a),c(s,l),u(r,f,i),u(r,h,i),c(h,y),b||(k=[w(t,"click",e[18]),w(h,"click",e[17])],b=!0)},p(e,n){512&n[0]&&i!==(i=e[9]<=$w)&&(t.disabled=i),512&n[0]&&C!==(C=Math.round(100*e[9])+"")&&I(a,C),512&n[0]&&v!==(v=e[9]>=Uw)&&(h.disabled=v)},d(e){e&&d(t),e&&d(o),e&&d(s),e&&d(f),e&&d(h),b=!1,r(k)}}}function Bw(e){let t,n,r,i,o,s,a,l,f,h=Lw(e[8].type)+"";return{c(){t=p("div"),n=p("div"),r=g(h),i=m(),o=p("p"),o.textContent="Preview not available for this file type.",s=m(),a=p("a"),l=g("Download File"),A(n,"class","file-icon svelte-on0yal"),A(a,"href",f=Mw(e[8])),A(a,"target","_blank"),A(a,"rel","noopener noreferrer"),A(a,"class","download-link svelte-on0yal"),A(t,"class","file-preview svelte-on0yal")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(t,i),c(t,o),c(t,s),c(t,a),c(a,l)},p(e,t){256&t[0]&&h!==(h=Lw(e[8].type)+"")&&I(r,h),256&t[0]&&f!==(f=Mw(e[8]))&&A(a,"href",f)},d(e){e&&d(t)}}}function Sw(e){let t,n,r;return{c(){t=p("div"),n=p("audio"),n.controls=!0,a(n.src,r=Mw(e[8]))||A(n,"src",r),A(n,"class","svelte-on0yal"),A(t,"class","media-container audio svelte-on0yal")},m(e,r){u(e,t,r),c(t,n)},p(e,t){256&t[0]&&!a(n.src,r=Mw(e[8]))&&A(n,"src",r)},d(e){e&&d(t)}}}function Qw(e){let t,n,r,i;return{c(){t=p("div"),n=p("video"),r=p("track"),A(r,"kind","captions"),n.controls=!0,a(n.src,i=Mw(e[8]))||A(n,"src",i),A(n,"class","svelte-on0yal"),A(t,"class","media-container svelte-on0yal")},m(e,i){u(e,t,i),c(t,n),c(n,r)},p(e,t){256&t[0]&&!a(n.src,i=Mw(e[8]))&&A(n,"src",i)},d(e){e&&d(t)}}}function Fw(e){let t,n,r;return{c(){t=p("div"),n=p("img"),a(n.src,r=Mw(e[8]))||A(n,"src",r),A(n,"alt","Blob content"),A(n,"class","svelte-on0yal"),A(t,"class","media-container svelte-on0yal"),C(t,"transform","scale("+e[9]+")")},m(e,r){u(e,t,r),c(t,n)},p(e,i){256&i[0]&&!a(n.src,r=Mw(e[8]))&&A(n,"src",r),512&i[0]&&C(t,"transform","scale("+e[9]+")")},d(e){e&&d(t)}}}function Dw(t){let n,r,i,o;function s(e,t){return e[1]?tw:ew}let a=s(t),l=a(t),c=t[7]&&t[8]&&Ew(t);return{c(){l.c(),n=m(),c&&c.c(),r=y()},m(e,s){l.m(e,s),u(e,n,s),c&&c.m(e,s),u(e,r,s),i||(o=w(zy,"keydown",t[19]),i=!0)},p(e,t){a===(a=s(e))&&l?l.p(e,t):(l.d(1),l=a(e),l&&(l.c(),l.m(n.parentNode,n))),e[7]&&e[8]?c?c.p(e,t):(c=Ew(e),c.c(),c.m(r.parentNode,r)):c&&(c.d(1),c=null)},i:e,o:e,d(e){l.d(e),e&&d(n),c&&c.d(e),e&&d(r),i=!1,o()}}}const $w=.25,Uw=4;async function Rw(e,t,n=null){if(!e)return console.log("No signer available for Blossom auth"),null;try{const r=Math.floor(Date.now()/1e3),i=[["t",t],["expiration",(r+60).toString()]];n&&i.push(["x",n]);const o={kind:24242,created_at:r,tags:i,content:`Blossom ${t} operation`},s=await e.signEvent(o);return btoa(JSON.stringify(s)).replace(/\+/g,"-").replace(/\//g,"_")}catch(e){return console.error("Error creating Blossom auth:",e),null}}function Tw(e){if(!e)return"0 B";const t=["B","KB","MB","GB"];let n=0,r=e;for(;r>=1024&&ne.target.select();function Hw(e,t,n){let r,i,{isLoggedIn:o=!1}=t,{userPubkey:s=""}=t,{userSigner:a=null}=t,{currentEffectiveRole:l=""}=t;const c=U();let u,d=[],f=!1,p="",h=[],g=!1,m="",y=!1,w=null,v=1,A=!1,b=[],I=!1,k=null,C=[],E=!1;async function x(){if(s){n(0,f=!0),n(2,p="");try{const e=`${window.location.origin}/blossom/list/${s}`,t=await Rw(a,"list"),n=await fetch(e,{headers:t?{Authorization:`Nostr ${t}`}:{}});if(!n.ok)throw new Error(`Failed to load blobs: ${n.statusText}`);const r=await n.json();d=Array.isArray(r)?r:[],d.sort((e,t)=>(t.uploaded||0)-(e.uploaded||0)),console.log("Loaded blobs:",d)}catch(e){console.error("Error loading blobs:",e),n(2,p=e.message||"Failed to load blobs")}finally{n(0,f=!1)}}}function B(e){n(8,w=e),n(9,v=1),n(7,y=!0)}function S(){n(7,y=!1),n(8,w=null),n(9,v=1)}function Q(){v$w&&n(9,v=Math.max($w,v-.25))}async function $(e){if(confirm(`Delete blob ${Nw(e.sha256)}?`))try{const t=`${window.location.origin}/blossom/${e.sha256}`,n=await Rw(a,"delete",e.sha256),r=await fetch(t,{method:"DELETE",headers:n?{Authorization:`Nostr ${n}`}:{}});if(!r.ok)throw new Error(`Failed to delete: ${r.statusText}`);d=d.filter(t=>t.sha256!==e.sha256),w?.sha256===e.sha256&&S()}catch(e){console.error("Error deleting blob:",e),alert(`Failed to delete blob: ${e.message}`)}}async function T(){n(12,I=!0),n(2,p="");try{const e=`${window.location.origin}/blossom/admin/users`,t=await Rw(a,"admin"),r=await fetch(e,{headers:t?{Authorization:`Nostr ${t}`}:{}});if(!r.ok)throw new Error(`Failed to load user stats: ${r.statusText}`);n(11,b=await r.json());for(const e of b)Ep(e.pubkey).then(t=>{e.profile=t||{name:"",picture:""},n(11,b)}).catch(()=>{e.profile={name:"",picture:""}})}catch(e){console.error("Error fetching admin user stats:",e),n(2,p=e.message||"Failed to load user stats")}finally{n(12,I=!1)}}async function N(e){n(0,f=!0),n(2,p="");try{const t=`${window.location.origin}/blossom/list/${e}`,n=await Rw(a,"list"),r=await fetch(t,{headers:n?{Authorization:`Nostr ${n}`}:{}});if(!r.ok)throw new Error(`Failed to load user blobs: ${r.statusText}`);C=await r.json(),C.sort((e,t)=>(t.uploaded||0)-(e.uploaded||0))}catch(e){console.error("Error loading user blobs:",e),n(2,p=e.message||"Failed to load user blobs")}finally{n(0,f=!1)}}async function O(e){n(13,k={pubkey:e.pubkey,profile:e.profile}),await N(e.pubkey)}D(()=>{r&&!E&&(n(36,E=!0),x())});return e.$$set=e=>{"isLoggedIn"in e&&n(32,o=e.isLoggedIn),"userPubkey"in e&&n(33,s=e.userPubkey),"userSigner"in e&&n(34,a=e.userSigner),"currentEffectiveRole"in e&&n(35,l=e.currentEffectiveRole)},e.$$.update=()=>{6&e.$$.dirty[1]&&n(1,r=o&&s),16&e.$$.dirty[1]&&n(14,i="admin"===l||"owner"===l),3&e.$$.dirty[0]|32&e.$$.dirty[1]&&(!r||E||f||(n(36,E=!0),x()))},[f,r,p,h,g,m,u,y,w,v,A,b,I,k,i,B,S,Q,F,function(e){y&&("Escape"===e.key?S():"+"===e.key||"="===e.key?Q():"-"===e.key&&F())},function(){c("openLoginModal")},$,function(e){n(3,h=Array.from(e.target.files))},function(){u?.click()},async function(){if(0===h.length)return;n(4,g=!0),n(2,p="");const e=[],t=[];for(let r=0;r0&&await x(),t.length>0&&n(2,p=`Failed to upload: ${t.map(e=>e.name).join(", ")}`)},function(e){try{return vu(e)}catch(t){return Nw(e)}},function(){n(10,A=!0),T()},function(){n(10,A=!1),n(11,b=[]),n(13,k=null),C=[]},O,function(){n(13,k=null),C=[]},function(){k?N(k.pubkey):A?T():x()},function(){return k?C:d},o,s,a,l,E,function(t){R.call(this,e,t)},function(t){R.call(this,e,t)},function(e){P[e?"unshift":"push"](()=>{u=e,n(6,u)})},e=>O(e),(e,t)=>"Enter"===t.key&&O(e),e=>$(e),e=>B(e),(e,t)=>"Enter"===t.key&&B(e),()=>{navigator.clipboard.writeText(Mw(w))},()=>$(w),e=>"Enter"===e.key&&S()]}class Gw extends oe{constructor(e){super(),ie(this,e,Hw,Dw,o,{isLoggedIn:32,userPubkey:33,userSigner:34,currentEffectiveRole:35},null,[-1,-1])}}function Jw(e,t,n){const r=e.slice();return r[29]=t[n],r}function Kw(e,t,n){const r=e.slice();return r[32]=t[n],r}function Vw(e){let t,n,r;function i(e,t){return e[0]?Yw:Ww}let o=i(e),s=o(e);return{c(){t=p("div"),n=p("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 qw(e){let t,n,i,o,s,a,l,h,y,v,b,k,C,x,B,S,Q,F,D,$,U,R,T,P,N,O,L,M,j,H,G,J=e[3]?"Loading...":"Refresh",K=e[2].length+"",V=e[12],q=[];for(let t=0;te[18].call(y)),A(a,"class","level-selector svelte-w6h7aj"),A(b,"class","clear-btn svelte-w6h7aj"),b.disabled=C=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($,"class","log-info svelte-w6h7aj"),A(j,"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,h),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 tv(e){let t,n,r,i,o=e[29].file+"",s=e[29].line+"";return{c(){t=p("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+"")&&I(n,o),4&t[0]&&s!==(s=e[29].line+"")&&I(i,s)},d(e){e&&d(t)}}}function nv(e){let t,n,r,i,o,s,a,l,f,h,y,w=av(e[29].timestamp)+"",v=e[29].level+"",b=e[29].message+"",k=e[29].file&&tv(e);return{c(){t=p("div"),n=p("span"),r=g(w),i=m(),o=p("span"),s=g(v),l=m(),k&&k.c(),f=m(),h=p("span"),y=g(b),A(n,"class","log-timestamp svelte-w6h7aj"),A(o,"class",a="log-level "+lv(e[29].level)+" svelte-w6h7aj"),A(h,"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),k&&k.m(t,null),c(t,f),c(t,h),c(h,y)},p(e,n){4&n[0]&&w!==(w=av(e[29].timestamp)+"")&&I(r,w),4&n[0]&&v!==(v=e[29].level+"")&&I(s,v),4&n[0]&&a!==(a="log-level "+lv(e[29].level)+" svelte-w6h7aj")&&A(o,"class",a),e[29].file?k?k.p(e,n):(k=tv(e),k.c(),k.m(t,f)):k&&(k.d(1),k=null),4&n[0]&&b!==(b=e[29].message+"")&&I(y,b)},d(e){e&&d(t),k&&k.d()}}}function rv(e){let t;return{c(){t=p("span"),t.textContent="End of logs"},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function iv(e){let t;return{c(){t=p("span"),t.textContent="Scroll for more"},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function ov(e){let t;return{c(){t=p("span"),t.textContent="Loading more..."},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function sv(t){let n;function r(e,t){return e[4]?qw:Vw}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 av(e){if(!e)return"";return new Date(e).toLocaleString()}function lv(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 cv(e,t,n){let r,{isLoggedIn:i=!1}=t,{userRole:o=""}=t,{userSigner:s=null}=t;const a=U();let l=[],c=!1,u=!0,d=0,f=0,p="",h="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,p=""),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,p=e.message||"Failed to load logs")}finally{n(3,c=!1)}}}async function I(){try{const e=await fetch(`${window.location.origin}/api/logs/level`);if(e.ok){const t=await e.json();n(8,h=t.level||"info"),n(9,g=h)}}catch(e){console.error("Error loading log level:",e)}}D(()=>{r&&(b(!0),I(),function(){if(!w)return;v=new IntersectionObserver(e=>{e[0].isIntersecting&&u&&!c&&u&&!c&&b(!1)},{threshold:.1}),v.observe(w)}())}),$(()=>{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),I())},[i,o,l,c,r,u,f,p,h,g,y,w,m,b,async function(){if(g!==h)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,h=r.level),n(9,g=h)}catch(e){console.error("Error setting log level:",e),n(7,p=e.message||"Failed to set log level"),n(9,g=h)}},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,p=e.message||"Failed to clear logs")}},function(){a("openLoginModal")},s,function(){g=x(this),n(9,g),n(12,m)},()=>b(!0),function(e){P[e?"unshift":"push"](()=>{w=e,n(11,w)})},function(e){P[e?"unshift":"push"](()=>{y=e,n(10,y)})}]}class uv extends oe{constructor(e){super(),ie(this,e,cv,sv,o,{isLoggedIn:0,userRole:1,userSigner:17},null,[-1,-1])}}function dv(e){let t,n,r,i,o,s,a,l,f,h,y;return{c(){t=p("div"),n=p("div"),r=p("h3"),r.textContent="Active Filter",i=m(),o=p("button"),o.textContent="🧹 Sweep",s=m(),a=p("div"),l=p("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,p){u(d,t,p),c(t,n),c(n,r),c(n,i),c(n,o),c(t,s),c(t,a),c(a,l),c(l,f),h||(y=w(o,"click",e[3]),h=!0)},p(e,t){4&t&&I(f,e[2])},d(e){e&&d(t),h=!1,y()}}}function fv(t){let n,r=t[0]&&t[1]&&dv(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=dv(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 pv(e,t,n){let r,i;const o=U();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 hv extends oe{constructor(e){super(),ie(this,e,pv,fv,o,{filter:4,showFilter:0})}}function gv(e){return pp[e]||`Kind ${e}`}function mv(e){return e?e.slice(0,8)+"..."+e.slice(-8):"unknown"}function yv(e,t=100){return e?e.length>t?e.slice(0,t)+"...":e:""}function wv(e){return e?new Date(1e3*e).toLocaleString():""}class vv{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 Av(e,t,n,r){const i=new vv(e,n,r);try{await i.connect();return await i.publishEvent(t)}finally{i.close()}}function bv(e,t,n){const r=e.slice();return r[169]=t[n],r}function Iv(e,t,n){const r=e.slice();return r[179]=t[n],r}function kv(e,t,n){const r=e.slice();return r[172]=t[n],r}function Cv(e,t,n){const r=e.slice();r[172]=t[n];const i=r[52](r[172]);return r[173]=i,r}function Ev(e,t,n){const r=e.slice();return r[176]=t[n],r}function xv(t){let n;function r(e,t){return e[1]?Lv:Ov}let i=r(t),o=i(t);return{c(){n=p("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 Bv(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[36]&&parseInt(t[36])>=0,U=fp,R=[];for(let e=0;eEvent Recovery \n

    Search and recover old versions of replaceable events

    ',o=m(),s=p("div"),a=p("div"),l=p("div"),h=p("label"),h.textContent="Select Event Kind:",g=m(),y=p("select"),v=p("option"),v.textContent="Choose a replaceable kind...";for(let e=0;et[115].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(C,"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,h),c(l,g),c(l,y),c(y,v);for(let e=0;e=0||""!==e[36]&&parseInt(e[36])>=0),$?T?T.p(e,t):(T=Wv(e),T.c(),T.m(n,null)):T&&(T.d(1),T=null)},i:e,o:e,d(e){e&&d(n),f(R,e),T&&T.d(),F=!1,r(D)}}}function Qv(e){let t,n;return t=new uv({props:{isLoggedIn:e[1],userRole:e[4],userSigner:e[13]}}),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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||(z(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function Fv(e){let t,n,r;function i(t){e[114](t)}let o={isLoggedIn:e[1],userRole:e[4],isPolicyAdmin:AA,policyEnabled:e[8],isLoadingPolicy:e[27],policyMessage:e[28],policyMessageType:e[29],validationErrors:e[30],policyFollows:e[31]};return void 0!==e[26]&&(o.policyJson=e[26]),t=new Wy({props:o}),P.push(()=>X(t,"policyJson",i)),t.$on("loadPolicy",e[60]),t.$on("validatePolicy",e[61]),t.$on("savePolicy",e[62]),t.$on("formatJson",e[63]),t.$on("addPolicyAdmin",e[64]),t.$on("removePolicyAdmin",e[65]),t.$on("refreshFollows",e[66]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,n){te(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]),134217728&r[0]&&(i.isLoadingPolicy=e[27]),268435456&r[0]&&(i.policyMessage=e[28]),536870912&r[0]&&(i.policyMessageType=e[29]),1073741824&r[0]&&(i.validationErrors=e[30]),1&r[1]&&(i.policyFollows=e[31]),!n&&67108864&r[0]&&(n=!0,i.policyJson=e[26],j(()=>n=!1)),t.$set(i)},i(e){r||(z(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ne(t,e)}}}function Dv(e){let t,n,r;function i(t){e[111](t)}let o={isLoggedIn:e[1],userRole:e[4],sprocketStatus:e[20],isLoadingSprocket:e[22],sprocketUploadFile:e[25],sprocketMessage:e[23],sprocketMessageType:e[24],sprocketVersions:e[21]};return void 0!==e[19]&&(o.sprocketScript=e[19]),t=new Dy({props:o}),P.push(()=>X(t,"sprocketScript",i)),t.$on("restartSprocket",e[55]),t.$on("deleteSprocket",e[56]),t.$on("sprocketFileSelect",e[67]),t.$on("uploadSprocketScript",e[68]),t.$on("saveSprocket",e[54]),t.$on("loadSprocket",e[53]),t.$on("loadVersions",e[57]),t.$on("loadVersion",e[112]),t.$on("deleteVersion",e[113]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,n){te(t,e,n),r=!0},p(e,r){const i={};2&r[0]&&(i.isLoggedIn=e[1]),16&r[0]&&(i.userRole=e[4]),1048576&r[0]&&(i.sprocketStatus=e[20]),4194304&r[0]&&(i.isLoadingSprocket=e[22]),33554432&r[0]&&(i.sprocketUploadFile=e[25]),8388608&r[0]&&(i.sprocketMessage=e[23]),16777216&r[0]&&(i.sprocketMessageType=e[24]),2097152&r[0]&&(i.sprocketVersions=e[21]),!n&&524288&r[0]&&(n=!0,i.sprocketScript=e[19],j(()=>n=!1)),t.$set(i)},i(e){r||(z(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ne(t,e)}}}function $v(e){let t,n,r,i;const o=[aA,sA,oA],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=p("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}),W(),r=s[n],r?r.p(e,i):(r=s[n]=o[n](e),r.c()),z(r,1),r.m(t,null))},i(e){i||(z(r),i=!0)},o(e){Z(r),i=!1},d(e){e&&d(t),s[n].d()}}}function Uv(e){let t,n,r;function i(t){e[110](t)}let o={userPubkey:e[2],userRole:e[4],policyEnabled:e[8],publishError:e[34]};return void 0!==e[33]&&(o.composeEventJson=e[33]),t=new vy({props:o}),P.push(()=>X(t,"composeEventJson",i)),t.$on("reformatJson",e[90]),t.$on("signEvent",e[91]),t.$on("publishEvent",e[92]),t.$on("clearError",e[93]),{c(){ee(t.$$.fragment)},m(e,n){te(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]),8&r[1]&&(i.publishError=e[34]),!n&&4&r[1]&&(n=!0,i.composeEventJson=e[33],j(()=>n=!1)),t.$set(i)},i(e){r||(z(t.$$.fragment,e),r=!0)},o(e){Z(t.$$.fragment,e),r=!1},d(e){ne(t,e)}}}function Rv(e){let t,n;return t=new Gw({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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||(z(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function Tv(e){let t,n;return t=new Xm({props:{isLoggedIn:e[1],userRole:e[4],userPubkey:e[2],filteredEvents:e[41],expandedEvents:e[18],isLoadingEvents:e[7],showOnlyMyEvents:vA,showFilterBuilder:e[15]}}),t.$on("scroll",e[89]),t.$on("toggleEventExpansion",e[106]),t.$on("deleteEvent",e[107]),t.$on("copyEventToClipboard",e[108]),t.$on("toggleChange",e[45]),t.$on("loadAllEvents",e[109]),t.$on("toggleFilterBuilder",e[76]),t.$on("filterApply",e[77]),t.$on("filterClear",e[78]),{c(){ee(t.$$.fragment)},m(e,r){te(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]),1024&n[1]&&(r.filteredEvents=e[41]),262144&n[0]&&(r.expandedEvents=e[18]),128&n[0]&&(r.isLoadingEvents=e[7]),32768&n[0]&&(r.showFilterBuilder=e[15]),t.$set(r)},i(e){n||(z(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function Pv(e){let t,n;return t=new Xg({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],selectedFile:e[16],aclMode:e[9],importMessage:e[17]}}),t.$on("fileSelect",e[86]),t.$on("importEvents",e[87]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),1024&n[0]&&(r.currentEffectiveRole=e[10]),65536&n[0]&&(r.selectedFile=e[16]),512&n[0]&&(r.aclMode=e[9]),131072&n[0]&&(r.importMessage=e[17]),t.$set(r)},i(e){n||(z(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function Nv(e){let t,n;return t=new Kg({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],aclMode:e[9]}}),t.$on("exportMyEvents",e[85]),t.$on("exportAllEvents",e[84]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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||(z(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function Ov(t){let n;return{c(){n=p("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 Lv(e){let t,n,r,i=(e[3]?.name||e[2].slice(0,8)+"...")+"";return{c(){t=p("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)+"...")+"")&&I(r,i)},d(e){e&&d(t)}}}function Mv(e){let t,n,i,o,s,a,l,f,h,y,v,b,k,C,E,x,B,S,Q,F,D,$=e[179].label+"",U=e[42].get(e[179].id)?.isLoading,R=!e[42].get(e[179].id)?.hasMore&&e[42].get(e[179].id)?.events?.length>0;function T(){return e[120](e[179])}function P(e,t){return 64&t[0]&&(C=null),64&t[0]&&(E=null),null==C&&(C=!!(e[42].get(e[179].id)?.events?.length>0)),C?jv:(null==E&&(E=!e[42].get(e[179].id)?.isLoading),E?_v:void 0)}v=new hv({props:{filter:e[42].get(e[179].id)?.filter||{}}}),v.$on("sweep",function(){return e[121](e[179])});let N=P(e,[-1,-1,-1,-1,-1,-1]),O=N&&N(e),L=U&&Kv(),M=R&&Vv();function _(...t){return e[126](e[179],...t)}return{c(){t=p("div"),n=p("div"),i=p("h2"),o=g("🔍 "),s=g($),a=m(),l=p("button"),f=g("🔄 Refresh"),y=m(),ee(v.$$.fragment),b=m(),k=p("div"),O&&O.c(),x=m(),L&&L.c(),B=m(),M&&M.c(),S=m(),A(i,"class","svelte-u3u5mw"),A(l,"class","refresh-btn svelte-u3u5mw"),l.disabled=h=e[42].get(e[179].id)?.isLoading,A(n,"class","search-results-header svelte-u3u5mw"),A(k,"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),te(v,t,null),c(t,b),c(t,k),O&&O.m(k,null),c(k,x),L&&L.m(k,null),c(k,B),M&&M.m(k,null),c(t,S),Q=!0,F||(D=[w(l,"click",T),w(k,"scroll",_)],F=!0)},p(t,n){e=t,(!Q||64&n[0])&&$!==($=e[179].label+"")&&I(s,$),(!Q||64&n[0]&&h!==(h=e[42].get(e[179].id)?.isLoading))&&(l.disabled=h);const r={};64&n[0]&&(r.filter=e[42].get(e[179].id)?.filter||{}),v.$set(r),N===(N=P(e,n))&&O?O.p(e,n):(O&&O.d(1),O=N&&N(e),O&&(O.c(),O.m(k,x))),64&n[0]&&(U=e[42].get(e[179].id)?.isLoading),U?L||(L=Kv(),L.c(),L.m(k,B)):L&&(L.d(1),L=null),64&n[0]&&(R=!e[42].get(e[179].id)?.hasMore&&e[42].get(e[179].id)?.events?.length>0),R?M||(M=Vv(),M.c(),M.m(k,null)):M&&(M.d(1),M=null)},i(e){Q||(z(v.$$.fragment,e),Q=!0)},o(e){Z(v.$$.fragment,e),Q=!1},d(e){e&&d(t),ne(v),O&&O.d(),L&&L.d(),M&&M.d(),F=!1,r(D)}}}function _v(t){let n;return{c(){n=p("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 jv(e){let t,n=e[42].get(e[179].id).events,r=[];for(let t=0;t👤',o=m(),s=p("div"),a=p("div"),l=g(O),f=m(),h=p("div"),y=p("span"),v=g(L),b=m(),k=p("span"),C=g(M),E=m(),x=p("div"),S=p("div"),Q=g(_),F=m(),D=p("div"),$=g(j),U=m(),G&&G.c(),R=m(),V&&V.c(),T=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(k,"class","kind-name svelte-u3u5mw"),A(h,"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[18].has(e[172].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,h),c(h,y),c(y,v),c(h,b),c(h,k),c(k,C),c(n,E),c(n,x),c(x,S),c(S,Q),c(x,F),c(x,D),c(D,$),c(n,U),G&&G.m(n,null),c(t,R),V&&V.m(t,null),c(t,T),P||(N=[w(n,"click",J),w(n,"keydown",K)],P=!0)},p(r,i){e=r,64&i[0]&&O!==(O=mv(e[172].pubkey)+"")&&I(l,O),64&i[0]&&L!==(L=e[172].kind+"")&&I(v,L),64&i[0]&&M!==(M=gv(e[172].kind)+"")&&I(C,M),64&i[0]&&_!==(_=wv(e[172].created_at)+"")&&I(Q,_),64&i[0]&&j!==(j=yv(e[172].content)+"")&&I($,j),5!==e[172].kind&&("admin"===e[4]||"owner"===e[4]||"write"===e[4]&&e[172].pubkey&&e[172].pubkey===e[2])?G?G.p(e,i):(G=Hv(e),G.c(),G.m(n,null)):G&&(G.d(1),G=null),262208&i[0]&&(H=e[18].has(e[172].id)),H?V?V.p(e,i):(V=Gv(e),V.c(),V.m(t,T)):V&&(V.d(1),V=null),262208&i[0]|2048&i[1]&&B(t,"expanded",e[18].has(e[172].id))},d(e){e&&d(t),G&&G.d(),V&&V.d(),P=!1,r(N)}}}function Kv(e){let t;return{c(){t=p("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 Vv(e){let t;return{c(){t=p("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 qv(e){let t,n,r=e[179].id===e[5]&&Mv(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[179].id===e[5]?r?(r.p(e,n),96&n[0]&&z(r,1)):(r=Mv(e),r.c(),z(r,1),r.m(t.parentNode,t)):r&&(Y(),Z(r,1,1,()=>{r=null}),W())},i(e){n||(z(r),n=!0)},o(e){Z(r),n=!1},d(e){r&&r.d(e),e&&d(t)}}}function Yv(t){let n,r,i=t[176].label+"";return{c(){n=p("option"),r=g(i),n.__value=t[176].value,n.value=n.__value},m(e,t){u(e,n,t),c(n,r)},p:e,d(e){e&&d(n)}}}function Wv(e){let t;function n(e,t){return e[38]?Xv:0===e[37].length?Zv:zv}let r=n(e),i=r(e);return{c(){t=p("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 zv(e){let t,n,r,i=e[37],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,h),c(n,y),c(n,w)},p(e,t){512&t[0]&&v!==(v=(e[9]||"unknown")+"")&&I(h,v)},i:e,o:e,d(e){e&&d(n)}}}function lA(e){let t,n,i,o,s,a,l,f,h,g;function y(e,t){return e[3]?uA:e[1]&&e[2]?cA:void 0}let b=y(e),I=b&&b(e);return{c(){t=p("div"),n=p("div"),i=p("div"),o=p("h2"),o.textContent="Settings",s=m(),a=p("button"),a.textContent="✕",l=m(),f=p("div"),I&&I.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),I&&I.m(f,null),h||(g=[w(a,"click",e[75]),w(n,"click",v(e[101])),w(n,"keydown",v(e[102])),w(t,"click",e[75]),w(t,"keydown",e[128])],h=!0)},p(e,t){b===(b=y(e))&&I?I.p(e,t):(I&&I.d(1),I=b&&b(e),I&&(I.c(),I.m(f,null))),1&t[0]&&B(n,"dark-theme",e[0])},d(e){e&&d(t),I&&I.d(),h=!1,r(g)}}}function cA(e){let t,n,i,o,s,a,l,f,h,y,v,b,k,C,E,x,B,S=e[2].slice(0,16)+"",Q=e[2].slice(-8)+"";return{c(){t=p("div"),n=p("button"),n.textContent="Log out",i=m(),o=p("h3"),o.textContent="Profile Loading",s=m(),a=p("p"),a.textContent="Your profile metadata is being loaded...",l=m(),f=p("button"),f.textContent="Retry Loading Profile",h=m(),y=p("div"),v=p("strong"),v.textContent="Public Key:",b=m(),k=g(S),C=g("..."),E=g(Q),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,h),c(t,y),c(y,v),c(y,b),c(y,k),c(y,C),c(y,E),x||(B=[w(n,"click",e[72]),w(f,"click",e[83])],x=!0)},p(e,t){4&t[0]&&S!==(S=e[2].slice(0,16)+"")&&I(k,S),4&t[0]&&Q!==(Q=e[2].slice(-8)+"")&&I(E,Q)},d(e){e&&d(t),x=!1,r(B)}}}function uA(e){let t,n,r,i,o,s,a,l,f,h,v,b,k,C,E,x=(e[3].name||"Unknown User")+"",B=e[3].banner&&dA(e);function S(e,t){return e[3].picture?pA:fA}let Q=S(e),F=Q(e),D=e[3].nip05&&hA(e),$=e[3].about&&gA(e),U=e[4]&&"read"!==e[4]&&mA(e);return{c(){t=p("div"),n=p("div"),B&&B.c(),r=m(),i=p("button"),i.textContent="Log out",o=m(),F.c(),s=m(),a=p("div"),l=p("h3"),f=g(x),h=m(),D&&D.c(),v=m(),$&&$.c(),b=m(),U&&U.c(),k=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,p){u(d,t,p),c(t,n),B&&B.m(n,null),c(n,r),c(n,i),c(n,o),F.m(n,null),c(n,s),c(n,a),c(a,l),c(l,f),c(a,h),D&&D.m(a,null),c(t,v),$&&$.m(t,null),u(d,b,p),U&&U.m(d,p),u(d,k,p),C||(E=w(i,"click",e[72]),C=!0)},p(e,i){e[3].banner?B?B.p(e,i):(B=dA(e),B.c(),B.m(n,r)):B&&(B.d(1),B=null),Q===(Q=S(e))&&F?F.p(e,i):(F.d(1),F=Q(e),F&&(F.c(),F.m(n,s))),8&i[0]&&x!==(x=(e[3].name||"Unknown User")+"")&&I(f,x),e[3].nip05?D?D.p(e,i):(D=hA(e),D.c(),D.m(a,null)):D&&(D.d(1),D=null),e[3].about?$?$.p(e,i):($=gA(e),$.c(),$.m(t,null)):$&&($.d(1),$=null),e[4]&&"read"!==e[4]?U?U.p(e,i):(U=mA(e),U.c(),U.m(k.parentNode,k)):U&&(U.d(1),U=null)},d(e){e&&d(t),B&&B.d(),F.d(),D&&D.d(),$&&$.d(),e&&d(b),U&&U.d(e),e&&d(k),C=!1,E()}}}function dA(e){let t,n;return{c(){t=p("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 fA(t){let n;return{c(){n=p("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 pA(e){let t,n;return{c(){t=p("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 hA(e){let t,n,r=e[3].nip05+"";return{c(){t=p("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+"")&&I(n,r)},d(e){e&&d(t)}}}function gA(e){let t,n;return{c(){t=p("div"),n=p("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[40]},p(e,t){512&t[1]&&(n.innerHTML=e[40])},d(e){e&&d(t)}}}function mA(e){let t,n,r,i,o,s,a=e[95](),l=[];for(let t=0;tX(y,"showModal",E)),y.$on("login",e[71]),y.$on("close",e[73]),{c(){ee(t.$$.fragment),n=m(),r=p("div"),ee(i.$$.fragment),o=m(),s=p("main"),f.c(),h=m(),C&&C.c(),g=m(),ee(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){te(t,e,a),u(e,n,a),u(e,r,a),te(i,r,null),c(r,o),c(r,s),I[l].m(s,null),u(e,h,a),C&&C.m(e,a),u(e,g,a),te(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]),2&n[1]&&(a.version=e[32]),i.$set(a);let c=l;l=k(e,n),l===c?I[l].p(e,n):(Y(),Z(I[c],1,1,()=>{I[c]=null}),W(),f=I[l],f?f.p(e,n):(f=I[l]=b[l](e),f.c()),z(f,1),f.m(s,null)),(!v||1&n[0])&&B(r,"dark-theme",e[0]),e[14]?C?C.p(e,n):(C=lA(e),C.c(),C.m(g.parentNode,g)):C&&(C.d(1),C=null);const u={};1&n[0]&&(u.isDarkTheme=e[0]),!w&&4096&n[0]&&(w=!0,u.showModal=e[12],j(()=>w=!1)),y.$set(u)},i(e){v||(z(t.$$.fragment,e),z(i.$$.fragment,e),z(f),z(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){ne(t,e),e&&d(n),e&&d(r),ne(i),I[l].d(),e&&d(h),C&&C.d(e),e&&d(g),ne(y,e)}}}let vA=!1,AA=!1;function bA(e,t,n){let r,i,o,s,a;"undefined"!=typeof window&&(window.debugIndexedDB=$p);let l=!1,c=!1,u=!1,d="",f="",p=null,h="",g=null,m=!1,y=localStorage.getItem("selectedTab")||"export",w=!1,v={},A=[],I=[],k=null,C="",E=new Set,B=!1,S=!0,Q=null,F="",D=new Map,$=[],U=0,T=[],P=!0,N=null,O="",L=null,M=[],_=!1,j="",H="info",G=!1,J=null,K="",V=!1,q=!1,Y="",W="info",z=[],Z=[],X="",ee="",te="",ne="",re=null,ie="",oe=[],se=!1,ae=!0,le=null;function ce(e){E.has(e)?E.delete(e):E.add(e),n(18,E)}async function ue(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 de(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"===h||"owner"===h||"write"===h&&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 Av(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 mp.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 Sp(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 Qp(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(96,I=I.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),$=$.filter(t=>t.id!==e);for(const[t,n]of D)n.events&&(n.events=n.events.filter(t=>t.id!==e),D.set(t,n));ge(),console.log("Reloading events to show delete event...");const r=vA&&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 gp;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 Sp(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 Qp(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(96,I=I.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),$=$.filter(t=>t.id!==e);for(const[t,n]of D)n.events&&(n.events=n.events.filter(t=>t.id!==e),D.set(t,n));ge(),console.log("Reloading events to show delete event...");const t=vA&&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 fe(){const e=ie?parseInt(ie):re;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(38,se=!0);try{const t=[{kinds:[e],authors:[d],limit:100}];le&&(t[0].until=le),console.log("Recovery filters:",t);const r=await Dp(t,{timeout:3e4,cacheFirst:!0});console.log("Recovery events received:",r.length),console.log("Recovery events kinds:",r.map(e=>e.kind)),n(37,oe=le?[...oe,...r]:r),r.length>0?(le=Math.min(...r.map(e=>e.created_at)),n(39,ae=100===r.length)):n(39,ae=!1)}catch(e){console.error("Failed to load recovery events:",e)}finally{n(38,se=!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 mp.publish(e,[t]);console.log("Repost publish result:",i),i.success&&i.okCount>0?(alert("Event reposted successfully!"),n(39,ae=!1),await fe()):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 he(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 kp([{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 mp.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(39,ae=!1),await fe()):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),$e(),Ue()),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,y=r.selectedTab),r.expandedEvents&&n(18,E=new Set(r.expandedEvents)),r.globalEventsCache&&($=r.globalEventsCache),r.globalCacheTimestamp&&(U=r.globalCacheTimestamp),void 0!==r.hasMoreEvents&&(S=r.hasMoreEvents),r.oldestEventTimestamp&&(Q=r.oldestEventTimestamp),void 0!==r.hasMoreMyEvents&&(P=r.hasMoreMyEvents),r.oldestMyEventTimestamp&&(N=r.oldestMyEventTimestamp),$.length>0&&((e=U)&&Date.now()-et.created_at-e.created_at),U=Date.now(),ge()}async function ye(){if(u&&"owner"===h&&G)try{n(22,_=!0);const e=await fetch("/api/sprocket/status",{method:"GET",headers:{Authorization:`Nostr ${await Le("GET","/api/sprocket/status")}`,"Content-Type":"application/json"}});e.ok?n(20,L=await e.json()):be("Failed to load sprocket status","error")}catch(e){be(`Error loading sprocket status: ${e.message}`,"error")}finally{n(22,_=!1)}}async function we(){if(u&&"owner"===h)try{n(22,_=!0);const e=await fetch("/api/sprocket/versions",{method:"GET",headers:{Authorization:`Nostr ${await Le("GET","/api/sprocket/versions")}`,"Content-Type":"application/json"}});e.ok?n(21,M=await e.json()):be("Failed to load versions","error")}catch(e){be(`Error loading versions: ${e.message}`,"error")}finally{n(22,_=!1)}}async function ve(e){u&&"owner"===h&&(n(19,O=e.content),be(`Loaded version: ${e.name}`,"success"))}async function Ae(e){if(u&&"owner"===h&&confirm(`Are you sure you want to delete version ${e}?`))try{n(22,_=!0);const t=await fetch("/api/sprocket/delete-version",{method:"POST",headers:{Authorization:`Nostr ${await Le("POST","/api/sprocket/delete-version")}`,"Content-Type":"application/json"},body:JSON.stringify({filename:e})});if(t.ok)be(`Version ${e} deleted successfully`,"success"),await we();else{be(`Failed to delete version: ${await t.text()}`,"error")}}catch(e){be(`Error deleting version: ${e.message}`,"error")}finally{n(22,_=!1)}}function be(e,t="info"){n(23,j=e),n(24,H=t),setTimeout(()=>{n(23,j="")},5e3)}function Ie(e,t="info"){n(28,Y=e),n(29,W=t),"error"!==t&&setTimeout(()=>{n(28,Y="")},5e3)}async function ke(){if(n(30,z=[]),!K.trim())return n(30,z=["Policy JSON is empty"]),Ie("Validation failed","error"),!1;try{const e=JSON.parse(K);if("object"!=typeof e||null===e)return n(30,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(30,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:"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 Ee(e){n(5,y=e),"sprocket"===e&&u&&"owner"===h&&G&&(ye(),we()),ge()}function xe(){n(14,m=!1)}function Be(e){Se(e)}function Se(e){n(6,A=A.filter(t=>t.id!==e)),D.delete(e),y===e&&n(5,y="export")}async function Qe(e,t=!0){const n=D.get(e);if(n&&!n.isLoading){n.isLoading=!0,D.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 Bp([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(96,I=o.sort((e,t)=>t.created_at-e.created_at)),me(o)):(n(96,I=[...I,...o].sort((e,t)=>t.created_at-e.created_at)),me(I)),o.length>0){const e=Math.min(...o.map(e=>e.created_at));(!Q||e{if("events"===y){const e=document.querySelectorAll(".events-view-content")[0];e&&e.scrollHeight<=e.clientHeight&&Pe()}},100)}catch(e){console.error("Failed to load events:",e),alert("Failed to load events: "+e.message)}finally{n(7,B=!1)}}}async function Pe(){await Te(!1)}let Ne=!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 Le(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 Me(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: ${h||"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 _e(e){n(97,F=e),localStorage.setItem("viewAsRole",e),console.log("View as role changed to:",e,"Current effective role:",a)}F=localStorage.getItem("viewAsRole")||"";return e.$$.update=()=>{var t;if(6&e.$$.dirty[0]|8&e.$$.dirty[3]&&n(41,r=I.sort((e,t)=>t.created_at-e.created_at)),8&e.$$.dirty[0]&&n(40,i=p?.about?(t=p.about,t?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):"").replace(/\n{2,}/g,"
    "):""),16&e.$$.dirty[0]|16&e.$$.dirty[3]&&n(10,a=F&&""!==F?F:h),1810&e.$$.dirty[0]|48&e.$$.dirty[3]&&n(100,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&&!G)&&(!("policy"===e.id&&!V)&&(("managed-acl"!==e.id||"managed"===X)&&(console.log(`Tab ${e.id} filter check:`,{isLoggedIn:u,userRole:h,viewAsRole:F,currentRole:t,requiresAdmin:e.requiresAdmin,requiresOwner:e.requiresOwner,requiresWrite:e.requiresWrite,visible:!0}),!0))))))})),64&e.$$.dirty[0]|128&e.$$.dirty[3]&&n(11,s=[...o,...A]),2578&e.$$.dirty[0]|128&e.$$.dirty[3]&&console.log("Tabs debug:",{isLoggedIn:u,userRole:h,aclMode:X,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&&!p&&De(),182&e.$$.dirty[0]|72&e.$$.dirty[3]&&"events"===y&&u&&("read"===h||"write"===h||"admin"===h||"owner"===h)&&0===I.length&&!Ne&&!B){n(99,Ne=!0);Te(!0,null)}32&e.$$.dirty[0]|8&e.$$.dirty[3]&&("events"!==y||"events"===y&&I.length>0)&&n(99,Ne=!1),32&e.$$.dirty[0]&&localStorage.setItem("selectedTab",y)},[l,u,d,p,h,y,A,B,V,X,a,s,c,g,m,w,k,C,E,O,L,M,_,j,H,J,K,q,Y,W,z,Z,ee,te,ne,re,ie,oe,se,ae,i,r,D,ce,ue,async function(){console.log("Toggle changed, showOnlyMyEvents:",vA),n(99,Ne=!1),await Te(!0,null)},de,fe,pe,he,function(){console.log("selectRecoveryKind called, recoverySelectedKind:",re),null!=re?(n(36,ie=""),n(37,oe=[]),le=null,n(39,ae=!0),fe()):console.log("No kind selected, skipping load")},function(){console.log("handleCustomKindInput called, recoveryCustomKind:",ie);const e=parseInt(ie);""!==ie&&!isNaN(e)&&e>=0&&(n(35,re=null),n(37,oe=[]),le=null,n(39,ae=!0),fe())},function(e){const t=oe.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"===h)try{n(22,_=!0);const e=await fetch("/api/sprocket/status",{method:"GET",headers:{Authorization:`Nostr ${await Le("GET","/api/sprocket/status")}`,"Content-Type":"application/json"}});if(e.ok){const t=await e.json();n(19,O=t.script_content||""),n(20,L=t),be("Script loaded successfully","success")}else be("Failed to load script","error")}catch(e){be(`Error loading script: ${e.message}`,"error")}finally{n(22,_=!1)}},async function(){if(u&&"owner"===h)try{n(22,_=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Le("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:O});if(e.ok)be("Script saved and updated successfully","success"),await ye(),await we();else{be(`Failed to save script: ${await e.text()}`,"error")}}catch(e){be(`Error saving script: ${e.message}`,"error")}finally{n(22,_=!1)}},async function(){if(u&&"owner"===h)try{n(22,_=!0);const e=await fetch("/api/sprocket/restart",{method:"POST",headers:{Authorization:`Nostr ${await Le("POST","/api/sprocket/restart")}`,"Content-Type":"application/json"}});if(e.ok)be("Sprocket restarted successfully","success"),await ye();else{be(`Failed to restart sprocket: ${await e.text()}`,"error")}}catch(e){be(`Error restarting sprocket: ${e.message}`,"error")}finally{n(22,_=!1)}},async function(){if(u&&"owner"===h&&confirm("Are you sure you want to delete the sprocket script? This will stop the current process."))try{n(22,_=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Le("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:""});if(e.ok)n(19,O=""),be("Sprocket script deleted successfully","success"),await ye(),await we();else{be(`Failed to delete script: ${await e.text()}`,"error")}}catch(e){be(`Error deleting script: ${e.message}`,"error")}finally{n(22,_=!1)}},we,ve,Ae,async function(){if(u&&("owner"===h||AA))try{n(27,q=!0),n(30,z=[]);const e={kinds:[12345],limit:1},t=await Dp(e);if(t&&t.length>0){n(26,K=t[0].content);try{n(26,K=JSON.stringify(JSON.parse(K),null,2))}catch(e){}Ie("Policy loaded successfully","success")}else{const e=await fetch("/api/policy",{method:"GET",headers:{Authorization:`Nostr ${await Le("GET","/api/policy")}`,"Content-Type":"application/json"}});if(e.ok){const t=await e.json();n(26,K=JSON.stringify(t,null,2)),Ie("Policy loaded from file","success")}else Ie("No policy configuration found","info"),n(26,K="")}}catch(e){Ie(`Error loading policy: ${e.message}`,"error")}finally{n(27,q=!1)}},ke,async function(){if(!u||"owner"!==h&&!AA)return;if(await ke())try{n(27,q=!0);const e={kind:12345,created_at:Math.floor(Date.now()/1e3),tags:[],content:K},t=await Av(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(27,q=!1)}},function(){try{const e=JSON.parse(K);n(26,K=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(K||"{}");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(26,K=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(K||"{}");e.policy_admins&&(e.policy_admins=e.policy_admins.filter(e=>e!==t),n(26,K=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"===h||AA))try{n(27,q=!0),n(31,Z=[]);let e=[];try{e=JSON.parse(K||"{}").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 Dp(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(31,Z=Array.from(i)),Ie(`Loaded ${Z.length} follows from ${r.length} admin(s)`,"success")}catch(e){Ie(`Error loading follows: ${e.message}`,"error")}finally{n(27,q=!1)}},function(e){n(25,J=e.target.files[0])},async function(){if(u&&"owner"===h&&J)try{n(22,_=!0);const e=await J.text(),t=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Le("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:e});if(t.ok)n(19,O=e),be("Script uploaded and updated successfully","success"),await ye(),await we();else{be(`Failed to upload script: ${await t.text()}`,"error")}}catch(e){be(`Error uploading script: ${e.message}`,"error")}finally{n(22,_=!1),n(25,J=null);const e=document.getElementById("sprocket-upload-file");e&&(e.value="")}},Ee,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);try{if(await Fp(),"extension"===t&&o)mp.setSigner(o);else if("nsec"===t&&i){const e=new kf(i);mp.setSigner(e)}n(3,p=await Ep(r)),console.log("Profile loaded:",p)}catch(e){console.error("Failed to load profile:",e)}await $e(),await Ue()},function(){n(1,u=!1),n(2,d=""),f="",n(3,p=null),n(4,h=""),n(13,g=null),n(14,m=!1),T=[],n(96,I=[]),$=[],U=0,ge(),"undefined"!=typeof localStorage&&(localStorage.removeItem("nostr_auth_method"),localStorage.removeItem("nostr_pubkey"),localStorage.removeItem("nostr_privkey"))},function(){n(12,c=!1)},function(){n(14,m=!0)},xe,function(){n(15,w=!w)},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});v=c,Te(!0,null)},function(){v={},Te(!0,null)},Be,Se,Qe,Fe,De,async function(){await Re([])},async function(){await Re([d])},function(e){n(16,k=e.detail.target.files[0])},async function(){if("none"!==X&&(!u||"admin"!==h&&"owner"!==h))return n(17,C="Admin or owner permission required"),void setTimeout(()=>{n(17,C="")},5e3);if(!k)return n(17,C="Please select a file"),void setTimeout(()=>{n(17,C="")},5e3);try{n(17,C="Uploading...");const e={};"none"!==X&&u&&(e.Authorization=await Oe("/api/import","POST"));const t=new FormData;t.append("file",k);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(17,C="Upload complete"),n(16,k=null),document.getElementById("import-file").value="",setTimeout(()=>{n(17,C="")},5e3)}catch(e){console.error("Import failed:",e),n(17,C="Import failed: "+e.message),setTimeout(()=>{n(17,C="")},5e3)}},Te,function(e){const{scrollTop:t,scrollHeight:n,clientHeight:r}=e.target;n-t-r<100&&Pe()},function(){try{if(!te.trim())return void alert("Please enter some JSON to reformat");const e=JSON.parse(te);n(33,te=JSON.stringify(e,null,2))}catch(e){alert("Invalid JSON: "+e.message)}},async function(){try{if(!te.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(te);e.pubkey=d,e.created_at=Math.floor(Date.now()/1e3),delete e.id,delete e.sig;const t=await g.signEvent(e);n(33,te=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(34,ne="");try{if(!te.trim())return void n(34,ne="Please enter an event to publish");if(!u)return void n(34,ne="Please log in to publish events");if(!g)return void n(34,ne="No signer available. Please log in with a valid authentication method.");let e;try{e=JSON.parse(te)}catch(e){return void n(34,ne=`Invalid JSON: ${e.message}`)}if(!e.id||!e.sig)return void n(34,ne='Event must be signed before publishing. Please click "Sign" first.');if("read"===h)return void n(34,ne=`Permission denied: Your current role is "${h}" 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 Av(t,e,g,d);if(r.success)n(34,ne=""),alert("Event published successfully to ORLY relay!");else{const t=r.reason||"Unknown error";n(34,ne=Me(t,e.kind))}}catch(e){console.error("Error publishing event:",e);const t=e.message||"Unknown error";n(34,ne=Me(t,null))}},function(){n(34,ne="")},_e,function(){const e=["owner","admin","write","read"],t=e.indexOf(h);return-1===t?["read"]:e.slice(t)},I,F,G,Ne,o,function(t){R.call(this,e,t)},function(t){R.call(this,e,t)},e=>e.id===y,e=>Ee(e.detail),e=>Se(e.detail),e=>ce(e.detail),e=>de(e.detail),e=>ue(e.detail.event,e.detail.e),e=>Te(e.detail.refresh,e.detail.authors),function(e){te=e,n(33,te)},function(e){O=e,n(19,O)},e=>ve(e.detail),e=>Ae(e.detail),function(e){K=e,n(26,K)},function(){re=x(this),n(35,re)},function(){ie=b(this.value),n(36,ie)},e=>he(e),e=>pe(e),(e,t)=>ue(e,t),e=>Qe(e.id,!0),e=>Be(e.id),e=>de(e.id),e=>ce(e.id),(e,t)=>"Enter"===t.key&&ce(e.id),(e,t)=>ue(e,t),(e,t)=>Fe(t,e.id),e=>_e(e===h?"":e),e=>"Escape"===e.key&&xe(),function(e){c=e,n(12,c)}]}return new class extends oe{constructor(e){super(),ie(this,e,bA,wA,o,{},null,[-1,-1,-1,-1,-1,-1])}}({target:document.body,props:{name:"world"}})}(); + */function Hh(e,t,n,r){return new(n||(n=Promise))(function(i,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(s,a)}l((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class jh{constructor(){this.mutex=Promise.resolve()}lock(){let e=()=>{};return this.mutex=this.mutex.then(()=>new Promise(e)),new Promise(t=>{e=t})}dispatch(e){return Hh(this,void 0,void 0,function*(){const t=yield this.lock();try{return yield Promise.resolve(e())}finally{t()}})}}var Gh;const Jh="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Kh=null!==(Gh=Jh.Buffer)&&void 0!==Gh?Gh:null,Vh=Jh.TextEncoder?new Jh.TextEncoder:null;function zh(e,t){return(15&e)+(e>>6|e>>3&8)<<4|(15&t)+(t>>6|t>>3&8)}function qh(e,t){const n=t.length>>1;for(let r=0;r>>4;e[r++]=n>9?n+Yh:n+Wh,n=15&t[i],e[r++]=n>9?n+Yh:n+Wh}return String.fromCharCode.apply(null,e)}const Xh=null!==Kh?e=>{if("string"==typeof e){const t=Kh.from(e,"utf8");return new Uint8Array(t.buffer,t.byteOffset,t.length)}if(Kh.isBuffer(e))return new Uint8Array(e.buffer,e.byteOffset,e.length);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Invalid data type!")}:e=>{if("string"==typeof e)return Vh.encode(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Invalid data type!")},ep="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",tp=new Uint8Array(256);for(let e=0;e<64;e++)tp[ep.charCodeAt(e)]=e;function np(e,t=!0){const n=e.length,r=n%3,i=[],o=n-r;for(let t=0;t>18&63)+ep.charAt(n>>12&63)+ep.charAt(n>>6&63)+ep.charAt(63&n);i.push(r)}if(1===r){const r=e[n-1],o=ep.charAt(r>>2),s=ep.charAt(r<<4&63);i.push(`${o}${s}`),t&&i.push("==")}else if(2===r){const r=(e[n-2]<<8)+e[n-1],o=ep.charAt(r>>10),s=ep.charAt(r>>4&63),a=ep.charAt(r<<2&63);i.push(`${o}${s}${a}`),t&&i.push("=")}return i.join("")}function rp(e){const t=function(e){let t=Math.floor(.75*e.length);const n=e.length;return"="===e[n-1]&&(t-=1,"="===e[n-2]&&(t-=1)),t}(e),n=e.length,r=new Uint8Array(t);let i=0;for(let t=0;t>4,i+=1,r[i]=(15&o)<<4|s>>2,i+=1,r[i]=(3&s)<<6|63&a,i+=1}return r}const ip=16384,op=new jh,sp=new Map;function ap(e,t){return Hh(this,void 0,void 0,function*(){let n=null,r=null,i=!1;if("undefined"==typeof WebAssembly)throw new Error("WebAssembly is not supported in this environment!");const o=()=>new DataView(n.exports.memory.buffer).getUint32(n.exports.STATE_SIZE,!0),s=op.dispatch(()=>Hh(this,void 0,void 0,function*(){if(!sp.has(e.name)){const t=rp(e.data),n=WebAssembly.compile(t);sp.set(e.name,n)}const t=yield sp.get(e.name);n=yield WebAssembly.instantiate(t,{})})),a=(e=null)=>{i=!0,n.exports.Hash_Init(e)},l=e=>{if(!i)throw new Error("update() called before init()");(e=>{let t=0;for(;t{if(!i)throw new Error("digest() called before init()");return i=!1,n.exports.Hash_Final(o),"binary"===e?r.slice(0,t):Zh(c,r,t)},d=e=>"string"==typeof e?e.length<4096:e.byteLength!0;break;case"blake2b":case"blake2s":f=(e,t)=>t<=512&&d(e);break;case"blake3":f=(e,t)=>0===t&&d(e);break;case"xxhash64":case"xxhash3":case"xxhash128":case"crc64":f=()=>!1}return yield(()=>Hh(this,void 0,void 0,function*(){n||(yield s);const e=n.exports.Hash_GetBuffer(),t=n.exports.memory.buffer;r=new Uint8Array(t,e,ip)}))(),{getMemory:()=>r,writeMemory:(e,t=0)=>{r.set(e,t)},getExports:()=>n.exports,setMemorySize:e=>{n.exports.Hash_SetMemorySize(e);const t=n.exports.Hash_GetBuffer(),i=n.exports.memory.buffer;r=new Uint8Array(i,t,e)},init:a,update:l,digest:u,save:()=>{if(!i)throw new Error("save() can only be called after init() and before digest()");const t=n.exports.Hash_GetState(),r=o(),s=n.exports.memory.buffer,a=new Uint8Array(s,t,r),l=new Uint8Array(4+r);return qh(l,e.hash),l.set(a,4),l},load:t=>{if(!(t instanceof Uint8Array))throw new Error("load() expects an Uint8Array generated by save()");const r=n.exports.Hash_GetState(),s=o(),a=4+s,l=n.exports.memory.buffer;if(t.length!==a)throw new Error(`Bad state length (expected ${a} bytes, got ${t.length})`);if(!function(e,t){if(e.length!==2*t.length)return!1;for(let n=0;n{if(!f(e,i))return a(i),l(e),u("hex",o);const s=Xh(e);return r.set(s),n.exports.Hash_Calculate(s.length,i,o),Zh(c,r,t)},hashLength:t}})}new jh;var lp={name:"argon2",data:"AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkDyAGFNwPYCUEAIAIpA9ABIAEpA9ABhTcD4AlBACACKQPYASABKQPYAYU3A+gJQQAgAikD4AEgASkD4AGFNwPwCUEAIAIpA+gBIAEpA+gBhTcD+AlBACACKQPwASABKQPwAYU3A4AKQQAgAikD+AEgASkD+AGFNwOICkEAIAIpA4ACIAEpA4AChTcDkApBACACKQOIAiABKQOIAoU3A5gKQQAgAikDkAIgASkDkAKFNwOgCkEAIAIpA5gCIAEpA5gChTcDqApBACACKQOgAiABKQOgAoU3A7AKQQAgAikDqAIgASkDqAKFNwO4CkEAIAIpA7ACIAEpA7AChTcDwApBACACKQO4AiABKQO4AoU3A8gKQQAgAikDwAIgASkDwAKFNwPQCkEAIAIpA8gCIAEpA8gChTcD2ApBACACKQPQAiABKQPQAoU3A+AKQQAgAikD2AIgASkD2AKFNwPoCkEAIAIpA+ACIAEpA+AChTcD8ApBACACKQPoAiABKQPoAoU3A/gKQQAgAikD8AIgASkD8AKFNwOAC0EAIAIpA/gCIAEpA/gChTcDiAtBACACKQOAAyABKQOAA4U3A5ALQQAgAikDiAMgASkDiAOFNwOYC0EAIAIpA5ADIAEpA5ADhTcDoAtBACACKQOYAyABKQOYA4U3A6gLQQAgAikDoAMgASkDoAOFNwOwC0EAIAIpA6gDIAEpA6gDhTcDuAtBACACKQOwAyABKQOwA4U3A8ALQQAgAikDuAMgASkDuAOFNwPIC0EAIAIpA8ADIAEpA8ADhTcD0AtBACACKQPIAyABKQPIA4U3A9gLQQAgAikD0AMgASkD0AOFNwPgC0EAIAIpA9gDIAEpA9gDhTcD6AtBACACKQPgAyABKQPgA4U3A/ALQQAgAikD6AMgASkD6AOFNwP4C0EAIAIpA/ADIAEpA/ADhTcDgAxBACACKQP4AyABKQP4A4U3A4gMQQAgAikDgAQgASkDgASFNwOQDEEAIAIpA4gEIAEpA4gEhTcDmAxBACACKQOQBCABKQOQBIU3A6AMQQAgAikDmAQgASkDmASFNwOoDEEAIAIpA6AEIAEpA6AEhTcDsAxBACACKQOoBCABKQOoBIU3A7gMQQAgAikDsAQgASkDsASFNwPADEEAIAIpA7gEIAEpA7gEhTcDyAxBACACKQPABCABKQPABIU3A9AMQQAgAikDyAQgASkDyASFNwPYDEEAIAIpA9AEIAEpA9AEhTcD4AxBACACKQPYBCABKQPYBIU3A+gMQQAgAikD4AQgASkD4ASFNwPwDEEAIAIpA+gEIAEpA+gEhTcD+AxBACACKQPwBCABKQPwBIU3A4ANQQAgAikD+AQgASkD+ASFNwOIDUEAIAIpA4AFIAEpA4AFhTcDkA1BACACKQOIBSABKQOIBYU3A5gNQQAgAikDkAUgASkDkAWFNwOgDUEAIAIpA5gFIAEpA5gFhTcDqA1BACACKQOgBSABKQOgBYU3A7ANQQAgAikDqAUgASkDqAWFNwO4DUEAIAIpA7AFIAEpA7AFhTcDwA1BACACKQO4BSABKQO4BYU3A8gNQQAgAikDwAUgASkDwAWFNwPQDUEAIAIpA8gFIAEpA8gFhTcD2A1BACACKQPQBSABKQPQBYU3A+ANQQAgAikD2AUgASkD2AWFNwPoDUEAIAIpA+AFIAEpA+AFhTcD8A1BACACKQPoBSABKQPoBYU3A/gNQQAgAikD8AUgASkD8AWFNwOADkEAIAIpA/gFIAEpA/gFhTcDiA5BACACKQOABiABKQOABoU3A5AOQQAgAikDiAYgASkDiAaFNwOYDkEAIAIpA5AGIAEpA5AGhTcDoA5BACACKQOYBiABKQOYBoU3A6gOQQAgAikDoAYgASkDoAaFNwOwDkEAIAIpA6gGIAEpA6gGhTcDuA5BACACKQOwBiABKQOwBoU3A8AOQQAgAikDuAYgASkDuAaFNwPIDkEAIAIpA8AGIAEpA8AGhTcD0A5BACACKQPIBiABKQPIBoU3A9gOQQAgAikD0AYgASkD0AaFNwPgDkEAIAIpA9gGIAEpA9gGhTcD6A5BACACKQPgBiABKQPgBoU3A/AOQQAgAikD6AYgASkD6AaFNwP4DkEAIAIpA/AGIAEpA/AGhTcDgA9BACACKQP4BiABKQP4BoU3A4gPQQAgAikDgAcgASkDgAeFNwOQD0EAIAIpA4gHIAEpA4gHhTcDmA9BACACKQOQByABKQOQB4U3A6APQQAgAikDmAcgASkDmAeFNwOoD0EAIAIpA6AHIAEpA6AHhTcDsA9BACACKQOoByABKQOoB4U3A7gPQQAgAikDsAcgASkDsAeFNwPAD0EAIAIpA7gHIAEpA7gHhTcDyA9BACACKQPAByABKQPAB4U3A9APQQAgAikDyAcgASkDyAeFNwPYD0EAIAIpA9AHIAEpA9AHhTcD4A9BACACKQPYByABKQPYB4U3A+gPQQAgAikD4AcgASkD4AeFNwPwD0EAIAIpA+gHIAEpA+gHhTcD+A9BACACKQPwByABKQPwB4U3A4AQQQAgAikD+AcgASkD+AeFNwOIEEGQCEGYCEGgCEGoCEGwCEG4CEHACEHICEHQCEHYCEHgCEHoCEHwCEH4CEGACUGICRACQZAJQZgJQaAJQagJQbAJQbgJQcAJQcgJQdAJQdgJQeAJQegJQfAJQfgJQYAKQYgKEAJBkApBmApBoApBqApBsApBuApBwApByApB0ApB2ApB4ApB6ApB8ApB+ApBgAtBiAsQAkGQC0GYC0GgC0GoC0GwC0G4C0HAC0HIC0HQC0HYC0HgC0HoC0HwC0H4C0GADEGIDBACQZAMQZgMQaAMQagMQbAMQbgMQcAMQcgMQdAMQdgMQeAMQegMQfAMQfgMQYANQYgNEAJBkA1BmA1BoA1BqA1BsA1BuA1BwA1ByA1B0A1B2A1B4A1B6A1B8A1B+A1BgA5BiA4QAkGQDkGYDkGgDkGoDkGwDkG4DkHADkHIDkHQDkHYDkHgDkHoDkHwDkH4DkGAD0GIDxACQZAPQZgPQaAPQagPQbAPQbgPQcAPQcgPQdAPQdgPQeAPQegPQfAPQfgPQYAQQYgQEAJBkAhBmAhBkAlBmAlBkApBmApBkAtBmAtBkAxBmAxBkA1BmA1BkA5BmA5BkA9BmA8QAkGgCEGoCEGgCUGoCUGgCkGoCkGgC0GoC0GgDEGoDEGgDUGoDUGgDkGoDkGgD0GoDxACQbAIQbgIQbAJQbgJQbAKQbgKQbALQbgLQbAMQbgMQbANQbgNQbAOQbgOQbAPQbgPEAJBwAhByAhBwAlByAlBwApByApBwAtByAtBwAxByAxBwA1ByA1BwA5ByA5BwA9ByA8QAkHQCEHYCEHQCUHYCUHQCkHYCkHQC0HYC0HQDEHYDEHQDUHYDUHQDkHYDkHQD0HYDxACQeAIQegIQeAJQegJQeAKQegKQeALQegLQeAMQegMQeANQegNQeAOQegOQeAPQegPEAJB8AhB+AhB8AlB+AlB8ApB+ApB8AtB+AtB8AxB+AxB8A1B+A1B8A5B+A5B8A9B+A8QAkGACUGICUGACkGICkGAC0GIC0GADEGIDEGADUGIDUGADkGIDkGAD0GID0GAEEGIEBACAkACQCADRQ0AA0AgACAEaiIDIAIgBGoiBSkDACABIARqIgYpAwCFIARBkAhqKQMAhSADKQMAhTcDACADQQhqIgMgBUEIaikDACAGQQhqKQMAhSAEQZgIaikDAIUgAykDAIU3AwAgBEEQaiIEQYAIRw0ADAILC0EAIQQDQCAAIARqIgMgAiAEaiIFKQMAIAEgBGoiBikDAIUgBEGQCGopAwCFNwMAIANBCGogBUEIaikDACAGQQhqKQMAhSAEQZgIaikDAIU3AwAgBEEQaiIEQYAIRw0ACwsL5QcMBX8BfgR/An4BfwF+AX8Bfgd/AX4DfwF+AkBBACgCgAgiAiABQQp0aiIDKAIIIAFHDQAgAygCDCEEIAMoAgAhBUEAIAMoAhQiBq03A7gQQQAgBK0iBzcDsBBBACAFIAEgBUECdG4iCGwiCUECdK03A6gQAkACQAJAAkAgBEUNAEF/IQogBUUNASAIQQNsIQsgCEECdCIErSEMIAWtIQ0gBkF/akECSSEOQgAhDwNAQQAgDzcDkBAgD6chEEIAIRFBACEBA0BBACARNwOgECAPIBGEUCIDIA5xIRIgBkEBRiAPUCITIAZBAkYgEUICVHFxciEUQX8gAUEBakEDcSAIbEF/aiATGyEVIAEgEHIhFiABIAhsIRcgA0EBdCEYQgAhGQNAQQBCADcDwBBBACAZNwOYECAYIQECQCASRQ0AQQBCATcDwBBBkBhBkBBBkCBBABADQZAYQZAYQZAgQQAQA0ECIQELAkAgASAITw0AIAQgGaciGmwgF2ogAWohAwNAIANBACAEIAEbQQAgEVAiGxtqQX9qIRwCQAJAIBQNAEEAKAKACCICIBxBCnQiHGohCgwBCwJAIAFB/wBxIgINAEEAQQApA8AQQgF8NwPAEEGQGEGQEEGQIEEAEANBkBhBkBhBkCBBABADCyAcQQp0IRwgAkEDdEGQGGohCkEAKAKACCECCyACIANBCnRqIAIgHGogAiAKKQMAIh1CIIinIAVwIBogFhsiHCAEbCABIAFBACAZIBytUSIcGyIKIBsbIBdqIAogC2ogExsgAUUgHHJrIhsgFWqtIB1C/////w+DIh0gHX5CIIggG61+QiCIfSAMgqdqQQp0akEBEAMgA0EBaiEDIAggAUEBaiIBRw0ACwsgGUIBfCIZIA1SDQALIBFCAXwiEachASARQgRSDQALIA9CAXwiDyAHUg0AC0EAKAKACCECCyAJQQx0QYB4aiEXIAVBf2oiCkUNAgwBC0EAQgM3A6AQQQAgBEF/aq03A5AQQYB4IRcLIAIgF2ohGyAIQQx0IQhBACEcA0AgCCAcQQFqIhxsQYB4aiEEQQAhAQNAIBsgAWoiAyADKQMAIAIgBCABamopAwCFNwMAIANBCGoiAyADKQMAIAIgBCABQQhyamopAwCFNwMAIAFBCGohAyABQRBqIQEgA0H4B0kNAAsgHCAKRw0ACwsgAiAXaiEbQXghAQNAIAIgAWoiA0EIaiAbIAFqIgRBCGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBGGogBEEYaikDADcDACADQSBqIARBIGopAwA3AwAgAUEgaiIBQfgHSQ0ACwsL",hash:"e4cdc523"},cp={name:"blake2b",data:"AGFzbQEAAAABEQRgAAF/YAJ/fwBgAX8AYAAAAwoJAAECAwECAgABBQQBAQICBg4CfwFBsIsFC38AQYAICwdwCAZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACkhhc2hfRmluYWwAAwlIYXNoX0luaXQABQtIYXNoX1VwZGF0ZQAGDUhhc2hfR2V0U3RhdGUABw5IYXNoX0NhbGN1bGF0ZQAIClNUQVRFX1NJWkUDAQrTOAkFAEGACQvrAgIFfwF+AkAgAUEBSA0AAkACQAJAIAFBgAFBACgC4IoBIgJrIgNKDQAgASEEDAELQQBBADYC4IoBAkAgAkH/AEoNACACQeCJAWohBSAAIQRBACEGA0AgBSAELQAAOgAAIARBAWohBCAFQQFqIQUgAyAGQQFqIgZB/wFxSg0ACwtBAEEAKQPAiQEiB0KAAXw3A8CJAUEAQQApA8iJASAHQv9+Vq18NwPIiQFB4IkBEAIgACADaiEAAkAgASADayIEQYEBSA0AIAIgAWohBQNAQQBBACkDwIkBIgdCgAF8NwPAiQFBAEEAKQPIiQEgB0L/flatfDcDyIkBIAAQAiAAQYABaiEAIAVBgH9qIgVBgAJLDQALIAVBgH9qIQQMAQsgBEEATA0BC0EAIQUDQCAFQQAoAuCKAWpB4IkBaiAAIAVqLQAAOgAAIAQgBUEBaiIFQf8BcUoNAAsLQQBBACgC4IoBIARqNgLgigELC78uASR+QQBBACkD0IkBQQApA7CJASIBQQApA5CJAXwgACkDICICfCIDhULr+obav7X2wR+FQiCJIgRCq/DT9K/uvLc8fCIFIAGFQiiJIgYgA3wgACkDKCIBfCIHIASFQjCJIgggBXwiCSAGhUIBiSIKQQApA8iJAUEAKQOoiQEiBEEAKQOIiQF8IAApAxAiA3wiBYVCn9j52cKR2oKbf4VCIIkiC0K7zqqm2NDrs7t/fCIMIASFQiiJIg0gBXwgACkDGCIEfCIOfCAAKQNQIgV8Ig9BACkDwIkBQQApA6CJASIQQQApA4CJASIRfCAAKQMAIgZ8IhKFQtGFmu/6z5SH0QCFQiCJIhNCiJLznf/M+YTqAHwiFCAQhUIoiSIVIBJ8IAApAwgiEHwiFiAThUIwiSIXhUIgiSIYQQApA9iJAUEAKQO4iQEiE0EAKQOYiQF8IAApAzAiEnwiGYVC+cL4m5Gjs/DbAIVCIIkiGkLx7fT4paf9p6V/fCIbIBOFQiiJIhwgGXwgACkDOCITfCIZIBqFQjCJIhogG3wiG3wiHSAKhUIoiSIeIA98IAApA1giCnwiDyAYhUIwiSIYIB18Ih0gDiALhUIwiSIOIAx8Ih8gDYVCAYkiDCAWfCAAKQNAIgt8Ig0gGoVCIIkiFiAJfCIaIAyFQiiJIiAgDXwgACkDSCIJfCIhIBaFQjCJIhYgGyAchUIBiSIMIAd8IAApA2AiB3wiDSAOhUIgiSIOIBcgFHwiFHwiFyAMhUIoiSIbIA18IAApA2giDHwiHCAOhUIwiSIOIBd8IhcgG4VCAYkiGyAZIBQgFYVCAYkiFHwgACkDcCINfCIVIAiFQiCJIhkgH3wiHyAUhUIoiSIUIBV8IAApA3giCHwiFXwgDHwiIoVCIIkiI3wiJCAbhUIoiSIbICJ8IBJ8IiIgFyAYIBUgGYVCMIkiFSAffCIZIBSFQgGJIhQgIXwgDXwiH4VCIIkiGHwiFyAUhUIoiSIUIB98IAV8Ih8gGIVCMIkiGCAXfCIXIBSFQgGJIhR8IAF8IiEgFiAafCIWIBUgHSAehUIBiSIaIBx8IAl8IhyFQiCJIhV8Ih0gGoVCKIkiGiAcfCAIfCIcIBWFQjCJIhWFQiCJIh4gGSAOIBYgIIVCAYkiFiAPfCACfCIPhUIgiSIOfCIZIBaFQiiJIhYgD3wgC3wiDyAOhUIwiSIOIBl8Ihl8IiAgFIVCKIkiFCAhfCAEfCIhIB6FQjCJIh4gIHwiICAiICOFQjCJIiIgJHwiIyAbhUIBiSIbIBx8IAp8IhwgDoVCIIkiDiAXfCIXIBuFQiiJIhsgHHwgE3wiHCAOhUIwiSIOIBkgFoVCAYkiFiAffCAQfCIZICKFQiCJIh8gFSAdfCIVfCIdIBaFQiiJIhYgGXwgB3wiGSAfhUIwiSIfIB18Ih0gFoVCAYkiFiAVIBqFQgGJIhUgD3wgBnwiDyAYhUIgiSIYICN8IhogFYVCKIkiFSAPfCADfCIPfCAHfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgBnwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAOIBd8Ig4gDyAYhUIwiSIPICAgFIVCAYkiFCAZfCAKfCIXhUIgiSIYfCIZIBSFQiiJIhQgF3wgC3wiF3wgBXwiICAPIBp8Ig8gHyAOIBuFQgGJIg4gIXwgCHwiGoVCIIkiG3wiHyAOhUIoiSIOIBp8IAx8IhogG4VCMIkiG4VCIIkiISAdIB4gDyAVhUIBiSIPIBx8IAF8IhWFQiCJIhx8Ih0gD4VCKIkiDyAVfCADfCIVIByFQjCJIhwgHXwiHXwiHiAWhUIoiSIWICB8IA18IiAgIYVCMIkiISAefCIeIBogFyAYhUIwiSIXIBl8IhggFIVCAYkiFHwgCXwiGSAchUIgiSIaICR8IhwgFIVCKIkiFCAZfCACfCIZIBqFQjCJIhogHSAPhUIBiSIPICJ8IAR8Ih0gF4VCIIkiFyAbIB98Iht8Ih8gD4VCKIkiDyAdfCASfCIdIBeFQjCJIhcgH3wiHyAPhUIBiSIPIBsgDoVCAYkiDiAVfCATfCIVICOFQiCJIhsgGHwiGCAOhUIoiSIOIBV8IBB8IhV8IAx8IiKFQiCJIiN8IiQgD4VCKIkiDyAifCAHfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBogHHwiGiAVIBuFQjCJIhUgHiAWhUIBiSIWIB18IAR8IhuFQiCJIhx8Ih0gFoVCKIkiFiAbfCAQfCIbfCABfCIeIBUgGHwiFSAXIBogFIVCAYkiFCAgfCATfCIYhUIgiSIXfCIaIBSFQiiJIhQgGHwgCXwiGCAXhUIwiSIXhUIgiSIgIB8gISAVIA6FQgGJIg4gGXwgCnwiFYVCIIkiGXwiHyAOhUIoiSIOIBV8IA18IhUgGYVCMIkiGSAffCIffCIhIA+FQiiJIg8gHnwgBXwiHiAghUIwiSIgICF8IiEgGyAchUIwiSIbIB18IhwgFoVCAYkiFiAYfCADfCIYIBmFQiCJIhkgJHwiHSAWhUIoiSIWIBh8IBJ8IhggGYVCMIkiGSAfIA6FQgGJIg4gInwgAnwiHyAbhUIgiSIbIBcgGnwiF3wiGiAOhUIoiSIOIB98IAZ8Ih8gG4VCMIkiGyAafCIaIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAh8IhUgI4VCIIkiFyAcfCIcIBSFQiiJIhQgFXwgC3wiFXwgBXwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IAh8IiIgGiAgIBUgF4VCMIkiFSAcfCIXIBSFQgGJIhQgGHwgCXwiGIVCIIkiHHwiGiAUhUIoiSIUIBh8IAZ8IhggHIVCMIkiHCAafCIaIBSFQgGJIhR8IAR8IiAgGSAdfCIZIBUgISAPhUIBiSIPIB98IAN8Ih2FQiCJIhV8Ih8gD4VCKIkiDyAdfCACfCIdIBWFQjCJIhWFQiCJIiEgFyAbIBkgFoVCAYkiFiAefCABfCIZhUIgiSIbfCIXIBaFQiiJIhYgGXwgE3wiGSAbhUIwiSIbIBd8Ihd8Ih4gFIVCKIkiFCAgfCAMfCIgICGFQjCJIiEgHnwiHiAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIB18IBJ8Ih0gG4VCIIkiGyAafCIaIA6FQiiJIg4gHXwgC3wiHSAbhUIwiSIbIBcgFoVCAYkiFiAYfCANfCIXICKFQiCJIhggFSAffCIVfCIfIBaFQiiJIhYgF3wgEHwiFyAYhUIwiSIYIB98Ih8gFoVCAYkiFiAVIA+FQgGJIg8gGXwgCnwiFSAchUIgiSIZICN8IhwgD4VCKIkiDyAVfCAHfCIVfCASfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgBXwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAbIBp8IhogFSAZhUIwiSIVIB4gFIVCAYkiFCAXfCADfCIXhUIgiSIZfCIbIBSFQiiJIhQgF3wgB3wiF3wgAnwiHiAVIBx8IhUgGCAaIA6FQgGJIg4gIHwgC3wiGoVCIIkiGHwiHCAOhUIoiSIOIBp8IAR8IhogGIVCMIkiGIVCIIkiICAfICEgFSAPhUIBiSIPIB18IAZ8IhWFQiCJIh18Ih8gD4VCKIkiDyAVfCAKfCIVIB2FQjCJIh0gH3wiH3wiISAWhUIoiSIWIB58IAx8Ih4gIIVCMIkiICAhfCIhIBogFyAZhUIwiSIXIBt8IhkgFIVCAYkiFHwgEHwiGiAdhUIgiSIbICR8Ih0gFIVCKIkiFCAafCAJfCIaIBuFQjCJIhsgHyAPhUIBiSIPICJ8IBN8Ih8gF4VCIIkiFyAYIBx8Ihh8IhwgD4VCKIkiDyAffCABfCIfIBeFQjCJIhcgHHwiHCAPhUIBiSIPIBggDoVCAYkiDiAVfCAIfCIVICOFQiCJIhggGXwiGSAOhUIoiSIOIBV8IA18IhV8IA18IiKFQiCJIiN8IiQgD4VCKIkiDyAifCAMfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBsgHXwiGyAVIBiFQjCJIhUgISAWhUIBiSIWIB98IBB8IhiFQiCJIh18Ih8gFoVCKIkiFiAYfCAIfCIYfCASfCIhIBUgGXwiFSAXIBsgFIVCAYkiFCAefCAHfCIZhUIgiSIXfCIbIBSFQiiJIhQgGXwgAXwiGSAXhUIwiSIXhUIgiSIeIBwgICAVIA6FQgGJIg4gGnwgAnwiFYVCIIkiGnwiHCAOhUIoiSIOIBV8IAV8IhUgGoVCMIkiGiAcfCIcfCIgIA+FQiiJIg8gIXwgBHwiISAehUIwiSIeICB8IiAgGCAdhUIwiSIYIB98Ih0gFoVCAYkiFiAZfCAGfCIZIBqFQiCJIhogJHwiHyAWhUIoiSIWIBl8IBN8IhkgGoVCMIkiGiAcIA6FQgGJIg4gInwgCXwiHCAYhUIgiSIYIBcgG3wiF3wiGyAOhUIoiSIOIBx8IAN8IhwgGIVCMIkiGCAbfCIbIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAt8IhUgI4VCIIkiFyAdfCIdIBSFQiiJIhQgFXwgCnwiFXwgBHwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IAl8IiIgGyAeIBUgF4VCMIkiFSAdfCIXIBSFQgGJIhQgGXwgDHwiGYVCIIkiHXwiGyAUhUIoiSIUIBl8IAp8IhkgHYVCMIkiHSAbfCIbIBSFQgGJIhR8IAN8Ih4gGiAffCIaIBUgICAPhUIBiSIPIBx8IAd8IhyFQiCJIhV8Ih8gD4VCKIkiDyAcfCAQfCIcIBWFQjCJIhWFQiCJIiAgFyAYIBogFoVCAYkiFiAhfCATfCIahUIgiSIYfCIXIBaFQiiJIhYgGnwgDXwiGiAYhUIwiSIYIBd8Ihd8IiEgFIVCKIkiFCAefCAFfCIeICCFQjCJIiAgIXwiISAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIBx8IAt8IhwgGIVCIIkiGCAbfCIbIA6FQiiJIg4gHHwgEnwiHCAYhUIwiSIYIBcgFoVCAYkiFiAZfCABfCIXICKFQiCJIhkgFSAffCIVfCIfIBaFQiiJIhYgF3wgBnwiFyAZhUIwiSIZIB98Ih8gFoVCAYkiFiAVIA+FQgGJIg8gGnwgCHwiFSAdhUIgiSIaICN8Ih0gD4VCKIkiDyAVfCACfCIVfCANfCIihUIgiSIjfCIkIBaFQiiJIhYgInwgCXwiIiAjhUIwiSIjICR8IiQgFoVCAYkiFiAYIBt8IhggFSAahUIwiSIVICEgFIVCAYkiFCAXfCASfCIXhUIgiSIafCIbIBSFQiiJIhQgF3wgCHwiF3wgB3wiISAVIB18IhUgGSAYIA6FQgGJIg4gHnwgBnwiGIVCIIkiGXwiHSAOhUIoiSIOIBh8IAt8IhggGYVCMIkiGYVCIIkiHiAfICAgFSAPhUIBiSIPIBx8IAp8IhWFQiCJIhx8Ih8gD4VCKIkiDyAVfCAEfCIVIByFQjCJIhwgH3wiH3wiICAWhUIoiSIWICF8IAN8IiEgHoVCMIkiHiAgfCIgIBggFyAahUIwiSIXIBt8IhogFIVCAYkiFHwgBXwiGCAchUIgiSIbICR8IhwgFIVCKIkiFCAYfCABfCIYIBuFQjCJIhsgHyAPhUIBiSIPICJ8IAx8Ih8gF4VCIIkiFyAZIB18Ihl8Ih0gD4VCKIkiDyAffCATfCIfIBeFQjCJIhcgHXwiHSAPhUIBiSIPIBkgDoVCAYkiDiAVfCAQfCIVICOFQiCJIhkgGnwiGiAOhUIoiSIOIBV8IAJ8IhV8IBN8IiKFQiCJIiN8IiQgD4VCKIkiDyAifCASfCIiICOFQjCJIiMgJHwiJCAPhUIBiSIPIBsgHHwiGyAVIBmFQjCJIhUgICAWhUIBiSIWIB98IAt8IhmFQiCJIhx8Ih8gFoVCKIkiFiAZfCACfCIZfCAJfCIgIBUgGnwiFSAXIBsgFIVCAYkiFCAhfCAFfCIahUIgiSIXfCIbIBSFQiiJIhQgGnwgA3wiGiAXhUIwiSIXhUIgiSIhIB0gHiAVIA6FQgGJIg4gGHwgEHwiFYVCIIkiGHwiHSAOhUIoiSIOIBV8IAF8IhUgGIVCMIkiGCAdfCIdfCIeIA+FQiiJIg8gIHwgDXwiICAhhUIwiSIhIB58Ih4gGSAchUIwiSIZIB98IhwgFoVCAYkiFiAafCAIfCIaIBiFQiCJIhggJHwiHyAWhUIoiSIWIBp8IAp8IhogGIVCMIkiGCAdIA6FQgGJIg4gInwgBHwiHSAZhUIgiSIZIBcgG3wiF3wiGyAOhUIoiSIOIB18IAd8Ih0gGYVCMIkiGSAbfCIbIA6FQgGJIg4gFSAXIBSFQgGJIhR8IAx8IhUgI4VCIIkiFyAcfCIcIBSFQiiJIhQgFXwgBnwiFXwgEnwiIoVCIIkiI3wiJCAOhUIoiSIOICJ8IBN8IiIgGyAhIBUgF4VCMIkiFSAcfCIXIBSFQgGJIhQgGnwgBnwiGoVCIIkiHHwiGyAUhUIoiSIUIBp8IBB8IhogHIVCMIkiHCAbfCIbIBSFQgGJIhR8IA18IiEgGCAffCIYIBUgHiAPhUIBiSIPIB18IAJ8Ih2FQiCJIhV8Ih4gD4VCKIkiDyAdfCABfCIdIBWFQjCJIhWFQiCJIh8gFyAZIBggFoVCAYkiFiAgfCADfCIYhUIgiSIZfCIXIBaFQiiJIhYgGHwgBHwiGCAZhUIwiSIZIBd8Ihd8IiAgFIVCKIkiFCAhfCAIfCIhIB+FQjCJIh8gIHwiICAiICOFQjCJIiIgJHwiIyAOhUIBiSIOIB18IAd8Ih0gGYVCIIkiGSAbfCIbIA6FQiiJIg4gHXwgDHwiHSAZhUIwiSIZIBcgFoVCAYkiFiAafCALfCIXICKFQiCJIhogFSAefCIVfCIeIBaFQiiJIhYgF3wgCXwiFyAahUIwiSIaIB58Ih4gFoVCAYkiFiAVIA+FQgGJIg8gGHwgBXwiFSAchUIgiSIYICN8IhwgD4VCKIkiDyAVfCAKfCIVfCACfCIChUIgiSIifCIjIBaFQiiJIhYgAnwgC3wiAiAihUIwiSILICN8IiIgFoVCAYkiFiAZIBt8IhkgFSAYhUIwiSIVICAgFIVCAYkiFCAXfCANfCINhUIgiSIXfCIYIBSFQiiJIhQgDXwgBXwiBXwgEHwiECAVIBx8Ig0gGiAZIA6FQgGJIg4gIXwgDHwiDIVCIIkiFXwiGSAOhUIoiSIOIAx8IBJ8IhIgFYVCMIkiDIVCIIkiFSAeIB8gDSAPhUIBiSINIB18IAl8IgmFQiCJIg98IhogDYVCKIkiDSAJfCAIfCIJIA+FQjCJIgggGnwiD3wiGiAWhUIoiSIWIBB8IAd8IhAgEYUgDCAZfCIHIA6FQgGJIgwgCXwgCnwiCiALhUIgiSILIAUgF4VCMIkiBSAYfCIJfCIOIAyFQiiJIgwgCnwgE3wiEyALhUIwiSIKIA58IguFNwOAiQFBACADIAYgDyANhUIBiSINIAJ8fCICIAWFQiCJIgUgB3wiBiANhUIoiSIHIAJ8fCICQQApA4iJAYUgBCABIBIgCSAUhUIBiSIDfHwiASAIhUIgiSISICJ8IgkgA4VCKIkiAyABfHwiASAShUIwiSIEIAl8IhKFNwOIiQFBACATQQApA5CJAYUgECAVhUIwiSIQIBp8IhOFNwOQiQFBACABQQApA5iJAYUgAiAFhUIwiSICIAZ8IgGFNwOYiQFBACASIAOFQgGJQQApA6CJAYUgAoU3A6CJAUEAIBMgFoVCAYlBACkDqIkBhSAKhTcDqIkBQQAgASAHhUIBiUEAKQOwiQGFIASFNwOwiQFBACALIAyFQgGJQQApA7iJAYUgEIU3A7iJAQvdAgUBfwF+AX8BfgJ/IwBBwABrIgAkAAJAQQApA9CJAUIAUg0AQQBBACkDwIkBIgFBACgC4IoBIgKsfCIDNwPAiQFBAEEAKQPIiQEgAyABVK18NwPIiQECQEEALQDoigFFDQBBAEJ/NwPYiQELQQBCfzcD0IkBAkAgAkH/AEoNAEEAIQQDQCACIARqQeCJAWpBADoAACAEQQFqIgRBgAFBACgC4IoBIgJrSA0ACwtB4IkBEAIgAEEAKQOAiQE3AwAgAEEAKQOIiQE3AwggAEEAKQOQiQE3AxAgAEEAKQOYiQE3AxggAEEAKQOgiQE3AyAgAEEAKQOoiQE3AyggAEEAKQOwiQE3AzAgAEEAKQO4iQE3AzhBACgC5IoBIgVBAUgNAEEAIQRBACECA0AgBEGACWogACAEai0AADoAACAEQQFqIQQgBSACQQFqIgJB/wFxSg0ACwsgAEHAAGokAAv9AwMBfwF+AX8jAEGAAWsiAiQAQQBBgQI7AfKKAUEAIAE6APGKAUEAIAA6APCKAUGQfiEAA0AgAEGAiwFqQgA3AAAgAEH4igFqQgA3AAAgAEHwigFqQgA3AAAgAEEYaiIADQALQQAhAEEAQQApA/CKASIDQoiS853/zPmE6gCFNwOAiQFBAEEAKQP4igFCu86qptjQ67O7f4U3A4iJAUEAQQApA4CLAUKr8NP0r+68tzyFNwOQiQFBAEEAKQOIiwFC8e30+KWn/aelf4U3A5iJAUEAQQApA5CLAULRhZrv+s+Uh9EAhTcDoIkBQQBBACkDmIsBQp/Y+dnCkdqCm3+FNwOoiQFBAEEAKQOgiwFC6/qG2r+19sEfhTcDsIkBQQBBACkDqIsBQvnC+JuRo7Pw2wCFNwO4iQFBACADp0H/AXE2AuSKAQJAIAFBAUgNACACQgA3A3ggAkIANwNwIAJCADcDaCACQgA3A2AgAkIANwNYIAJCADcDUCACQgA3A0ggAkIANwNAIAJCADcDOCACQgA3AzAgAkIANwMoIAJCADcDICACQgA3AxggAkIANwMQIAJCADcDCCACQgA3AwBBACEEA0AgAiAAaiAAQYAJai0AADoAACAAQQFqIQAgBEEBaiIEQf8BcSABSA0ACyACQYABEAELIAJBgAFqJAALEgAgAEEDdkH/P3EgAEEQdhAECwkAQYAJIAAQAQsGAEGAiQELGwAgAUEDdkH/P3EgAUEQdhAEQYAJIAAQARADCwsLAQBBgAgLBPAAAAA=",hash:"c6f286e6"};function up(e){return!Number.isInteger(e)||e<8||e>512||e%8!=0?new Error("Invalid variant! Valid values: 8, 16, ..., 512"):null}function dp(e=512,t=null){if(up(e))return Promise.reject(up(e));let n=null,r=e;if(null!==t){if(n=Xh(t),n.length>64)return Promise.reject(new Error("Max key length is 64 bytes"));i=e,o=n.length,r=i|o<<16}var i,o;const s=e/8;return ap(cp,s).then(e=>{r>512&&e.writeMemory(n),e.init(r);const t={init:r>512?()=>(e.writeMemory(n),e.init(r),t):()=>(e.init(r),t),update:n=>(e.update(n),t),digest:t=>e.digest(t),save:()=>e.save(),load:n=>(e.load(n),t),blockSize:128,digestSize:s};return t})}new jh;const fp=new DataView(new ArrayBuffer(4));function hp(e){return fp.setInt32(0,e,!0),new Uint8Array(fp.buffer)}function pp(e,t,n){return Hh(this,void 0,void 0,function*(){if(n<=64){const e=yield dp(8*n);return e.update(hp(n)),e.update(t),e.digest("binary")}const r=Math.ceil(n/32)-2,i=new Uint8Array(n);e.init(),e.update(hp(n)),e.update(t);let o=e.digest("binary");i.set(o.subarray(0,32),0);for(let t=1;t{var t;if(!e||"object"!=typeof e)throw new Error("Invalid options parameter. It requires an object.");if(!e.password)throw new Error("Password must be specified");if(e.password=Xh(e.password),e.password.length<1)throw new Error("Password must be specified");if(!e.salt)throw new Error("Salt must be specified");if(e.salt=Xh(e.salt),e.salt.length<8)throw new Error("Salt should be at least 8 bytes long");if(e.secret=Xh(null!==(t=e.secret)&&void 0!==t?t:""),!Number.isInteger(e.iterations)||e.iterations<1)throw new Error("Iterations should be a positive number");if(!Number.isInteger(e.parallelism)||e.parallelism<1)throw new Error("Parallelism should be a positive number");if(!Number.isInteger(e.hashLength)||e.hashLength<4)throw new Error("Hash length should be at least 4 bytes.");if(!Number.isInteger(e.memorySize))throw new Error("Memory size should be specified.");if(e.memorySize<8*e.parallelism)throw new Error("Memory size should be at least 8 * parallelism.");if(void 0===e.outputType&&(e.outputType="hex"),!["hex","binary","encoded"].includes(e.outputType))throw new Error(`Insupported output type ${e.outputType}. Valid values: ['hex', 'binary', 'encoded']`)})(e),gp(Object.assign(Object.assign({},e),{hashType:"id"}))})}new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh,new jh;const yp={parallelism:4,iterations:8,memorySize:262144,hashLength:32,outputType:"binary"};let wp=null,vp=0;const Ap=new Map;async function bp(e,t){try{const n=function(){if(wp)return wp;const e=new Blob(["\n importScripts('https://cdn.jsdelivr.net/npm/hash-wasm@4.11.0/dist/argon2.umd.min.js');\n\n const ARGON2_CONFIG = {\n parallelism: 4,\n iterations: 8,\n memorySize: 262144,\n hashLength: 32,\n outputType: \"binary\"\n };\n\n self.onmessage = async function(e) {\n const { password, salt, id } = e.data;\n\n try {\n const result = await hashwasm.argon2id({\n password: password,\n salt: new Uint8Array(salt),\n ...ARGON2_CONFIG\n });\n\n self.postMessage({\n id,\n success: true,\n result: Array.from(result)\n });\n } catch (error) {\n self.postMessage({\n id,\n success: false,\n error: error.message\n });\n }\n };\n "],{type:"application/javascript"});return wp=new Worker(URL.createObjectURL(e)),wp.onmessage=function(e){const{id:t,success:n,result:r,error:i}=e.data,o=Ap.get(t);o&&(Ap.delete(t),n?o.resolve(new Uint8Array(r)):o.reject(new Error(i)))},wp.onerror=function(e){console.error("Argon2 worker error:",e)},wp}(),r=++vp;return new Promise((i,o)=>{Ap.set(r,{resolve:i,reject:o}),n.postMessage({id:r,password:e,salt:Array.from(t)})})}catch(n){console.warn("Worker failed, falling back to main thread:",n);return await mp({password:e,salt:t,...yp})}}const{window:kp}=l;function Ip(e){let t,n,i,o,s,a,l,f,p,g,y,b,k,I,C,E,x,S;function Q(e,t){return"extension"===e[2]?Ep:Cp}let F=Q(e),D=F(e),$=e[10]&&Np(e),R=e[11]&&Lp(e);return{c(){t=h("div"),n=h("div"),i=h("div"),o=h("h2"),o.textContent="Login to Nostr",s=m(),a=h("button"),a.textContent="×",l=m(),f=h("div"),p=h("div"),g=h("button"),g.textContent="Extension",y=m(),b=h("button"),b.textContent="Nsec",k=m(),I=h("div"),D.c(),C=m(),$&&$.c(),E=m(),R&&R.c(),A(o,"class","svelte-4xpfbi"),A(a,"class","close-btn svelte-4xpfbi"),A(i,"class","modal-header svelte-4xpfbi"),A(g,"class","tab-btn svelte-4xpfbi"),B(g,"active","extension"===e[2]),A(b,"class","tab-btn svelte-4xpfbi"),B(b,"active","nsec"===e[2]),A(p,"class","tabs svelte-4xpfbi"),A(I,"class","tab-content svelte-4xpfbi"),A(f,"class","tab-container svelte-4xpfbi"),A(n,"class","modal svelte-4xpfbi"),B(n,"dark-theme",e[1]),A(t,"class","modal-overlay svelte-4xpfbi"),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),c(f,p),c(p,g),c(p,y),c(p,b),c(f,k),c(f,I),D.m(I,null),c(I,C),$&&$.m(I,null),c(I,E),R&&R.m(I,null),x||(S=[w(a,"click",e[17]),w(g,"click",e[26]),w(b,"click",e[27]),w(n,"click",v(e[24])),w(n,"keydown",v(e[25])),w(t,"click",e[17]),w(t,"keydown",e[32])],x=!0)},p(e,t){4&t[0]&&B(g,"active","extension"===e[2]),4&t[0]&&B(b,"active","nsec"===e[2]),F===(F=Q(e))&&D?D.p(e,t):(D.d(1),D=F(e),D&&(D.c(),D.m(I,C))),e[10]?$?$.p(e,t):($=Np(e),$.c(),$.m(I,E)):$&&($.d(1),$=null),e[11]?R?R.p(e,t):(R=Lp(e),R.c(),R.m(I,null)):R&&(R.d(1),R=null),2&t[0]&&B(n,"dark-theme",e[1])},d(e){e&&d(t),D.d(),$&&$.d(),R&&R.d(),x=!1,r(S)}}}function Cp(e){let t;function n(e,t){return e[14]?Bp:xp}let r=n(e),i=r(e);return{c(){t=h("div"),i.c(),A(t,"class","nsec-login svelte-4xpfbi")},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 Ep(e){let t,n,r,i,o,s,a,l=e[7]?"Connecting...":"Log in using extension";return{c(){t=h("div"),n=h("p"),n.textContent="Login using a NIP-07 compatible browser\n extension like nos2x or Alby.",r=m(),i=h("button"),o=g(l),A(n,"class","svelte-4xpfbi"),A(i,"class","login-extension-btn svelte-4xpfbi"),i.disabled=e[7],A(t,"class","extension-login svelte-4xpfbi")},m(l,d){u(l,t,d),c(t,n),c(t,r),c(t,i),c(i,o),s||(a=w(i,"click",e[21]),s=!0)},p(e,t){128&t[0]&&l!==(l=e[7]?"Connecting...":"Log in using extension")&&k(o,l),128&t[0]&&(i.disabled=e[7])},d(e){e&&d(t),s=!1,a()}}}function xp(e){let t,n,i,o,s,a,l,f,p,y,v,b,C,E,x,B,S,Q,F,D,$,R,P,T=e[8]?"Generating...":"Generate New Key",U=e[12]&&Sp(e),N=e[4]&&Qp(e);function L(e,t){return e[9]?$p:e[7]?Dp:Fp}let M=L(e),_=M(e);return{c(){t=h("p"),t.textContent="Enter your nsec or generate a new one. Optionally\n set a password to encrypt it securely.",n=m(),i=h("button"),o=g(T),a=m(),U&&U.c(),l=m(),f=h("input"),y=m(),v=h("div"),b=h("label"),b.textContent="Encryption Password (optional but recommended):",C=m(),E=h("input"),B=m(),N&&N.c(),S=m(),Q=h("small"),Q.textContent="Password uses Argon2id with ~3 second derivation time for security.",F=m(),D=h("button"),_.c(),A(t,"class","svelte-4xpfbi"),A(i,"class","generate-btn svelte-4xpfbi"),i.disabled=s=e[7]||e[8],A(f,"type","password"),A(f,"placeholder","nsec1..."),f.disabled=p=e[7]||e[9],A(f,"class","nsec-input svelte-4xpfbi"),A(b,"class","svelte-4xpfbi"),A(E,"type","password"),A(E,"placeholder","Enter password (min 8 chars)"),E.disabled=x=e[7]||e[9],A(E,"class","password-input svelte-4xpfbi"),A(Q,"class","password-hint svelte-4xpfbi"),A(v,"class","password-section svelte-4xpfbi"),A(D,"class","login-nsec-btn svelte-4xpfbi"),D.disabled=$=e[7]||e[9]||!e[3].trim()},m(r,s){u(r,t,s),u(r,n,s),u(r,i,s),c(i,o),u(r,a,s),U&&U.m(r,s),u(r,l,s),u(r,f,s),I(f,e[3]),u(r,y,s),u(r,v,s),c(v,b),c(v,C),c(v,E),I(E,e[4]),c(v,B),N&&N.m(v,null),c(v,S),c(v,Q),u(r,F,s),u(r,D,s),_.m(D,null),R||(P=[w(i,"click",e[20]),w(f,"input",e[29]),w(E,"input",e[30]),w(D,"click",e[22])],R=!0)},p(e,t){256&t[0]&&T!==(T=e[8]?"Generating...":"Generate New Key")&&k(o,T),384&t[0]&&s!==(s=e[7]||e[8])&&(i.disabled=s),e[12]?U?U.p(e,t):(U=Sp(e),U.c(),U.m(l.parentNode,l)):U&&(U.d(1),U=null),640&t[0]&&p!==(p=e[7]||e[9])&&(f.disabled=p),8&t[0]&&f.value!==e[3]&&I(f,e[3]),640&t[0]&&x!==(x=e[7]||e[9])&&(E.disabled=x),16&t[0]&&E.value!==e[4]&&I(E,e[4]),e[4]?N?N.p(e,t):(N=Qp(e),N.c(),N.m(v,S)):N&&(N.d(1),N=null),M!==(M=L(e))&&(_.d(1),_=M(e),_&&(_.c(),_.m(D,null))),648&t[0]&&$!==($=e[7]||e[9]||!e[3].trim())&&(D.disabled=$)},d(e){e&&d(t),e&&d(n),e&&d(i),e&&d(a),U&&U.d(e),e&&d(l),e&&d(f),e&&d(y),e&&d(v),N&&N.d(),e&&d(F),e&&d(D),_.d(),R=!1,r(P)}}}function Bp(e){let t,n,i,o,s,a,l,f,p,y,v,b,k,C,E=e[15]&&Rp(e);function x(e,t){return e[9]?Up:e[7]?Tp:Pp}let B=x(e),S=B(e);return{c(){t=h("p"),t.textContent="You have a stored encrypted key. Enter your\n password to unlock it.",n=m(),E&&E.c(),i=m(),o=h("input"),a=m(),l=h("button"),S.c(),p=m(),y=h("button"),v=g("Clear stored key & start fresh"),A(t,"class","svelte-4xpfbi"),A(o,"type","password"),A(o,"placeholder","Enter your password"),o.disabled=s=e[7]||e[9],A(o,"class","password-input svelte-4xpfbi"),A(l,"class","login-nsec-btn svelte-4xpfbi"),l.disabled=f=e[7]||e[9]||!e[6],A(y,"class","clear-btn svelte-4xpfbi"),y.disabled=b=e[7]||e[9]},m(r,s){u(r,t,s),u(r,n,s),E&&E.m(r,s),u(r,i,s),u(r,o,s),I(o,e[6]),u(r,a,s),u(r,l,s),S.m(l,null),u(r,p,s),u(r,y,s),c(y,v),k||(C=[w(o,"input",e[28]),w(l,"click",e[18]),w(y,"click",e[16])],k=!0)},p(e,t){e[15]?E?E.p(e,t):(E=Rp(e),E.c(),E.m(i.parentNode,i)):E&&(E.d(1),E=null),640&t[0]&&s!==(s=e[7]||e[9])&&(o.disabled=s),64&t[0]&&o.value!==e[6]&&I(o,e[6]),B!==(B=x(e))&&(S.d(1),S=B(e),S&&(S.c(),S.m(l,null))),704&t[0]&&f!==(f=e[7]||e[9]||!e[6])&&(l.disabled=f),640&t[0]&&b!==(b=e[7]||e[9])&&(y.disabled=b)},d(e){e&&d(t),e&&d(n),E&&E.d(e),e&&d(i),e&&d(o),e&&d(a),e&&d(l),S.d(),e&&d(p),e&&d(y),k=!1,r(C)}}}function Sp(e){let t,n,r,i,o;return{c(){t=h("div"),n=h("label"),n.textContent="Your new public key (npub):",r=m(),i=h("code"),o=g(e[12]),A(n,"class","svelte-4xpfbi"),A(i,"class","npub-display svelte-4xpfbi"),A(t,"class","generated-info svelte-4xpfbi")},m(e,s){u(e,t,s),c(t,n),c(t,r),c(t,i),c(i,o)},p(e,t){4096&t[0]&&k(o,e[12])},d(e){e&&d(t)}}}function Qp(e){let t,n,r,i;return{c(){t=h("input"),A(t,"type","password"),A(t,"placeholder","Confirm password"),t.disabled=n=e[7]||e[9],A(t,"class","password-input svelte-4xpfbi")},m(n,o){u(n,t,o),I(t,e[5]),r||(i=w(t,"input",e[31]),r=!0)},p(e,r){640&r[0]&&n!==(n=e[7]||e[9])&&(t.disabled=n),32&r[0]&&t.value!==e[5]&&I(t,e[5])},d(e){e&&d(t),r=!1,i()}}}function Fp(e){let t;return{c(){t=g("Log in with nsec")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Dp(e){let t;return{c(){t=g("Logging in...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function $p(e){let t;return{c(){t=g("Deriving key...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Rp(e){let t,n,r,i,o,s,a,l=e[15].slice(0,16)+"",f=e[15].slice(-8)+"";return{c(){t=h("div"),n=h("label"),n.textContent="Stored public key:",r=m(),i=h("code"),o=g(l),s=g("..."),a=g(f),A(n,"class","svelte-4xpfbi"),A(i,"class","npub-display svelte-4xpfbi"),A(t,"class","stored-info svelte-4xpfbi")},m(e,l){u(e,t,l),c(t,n),c(t,r),c(t,i),c(i,o),c(i,s),c(i,a)},p(e,t){32768&t[0]&&l!==(l=e[15].slice(0,16)+"")&&k(o,l),32768&t[0]&&f!==(f=e[15].slice(-8)+"")&&k(a,f)},d(e){e&&d(t)}}}function Pp(e){let t;return{c(){t=g("Unlock")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Tp(e){let t;return{c(){t=g("Unlocking...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Up(e){let t;return{c(){t=g("Deriving key...")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Np(e){let t,n;return{c(){t=h("div"),n=g(e[10]),A(t,"class","message error-message svelte-4xpfbi")},m(e,r){u(e,t,r),c(t,n)},p(e,t){1024&t[0]&&k(n,e[10])},d(e){e&&d(t)}}}function Lp(e){let t,n;return{c(){t=h("div"),n=g(e[11]),A(t,"class","message success-message svelte-4xpfbi")},m(e,r){u(e,t,r),c(t,n)},p(e,t){2048&t[0]&&k(n,e[11])},d(e){e&&d(t)}}}function Mp(e){let t,n,r,i,o,s,a,l,f,p,y,w=e[13].toFixed(1)+"";return{c(){t=h("div"),n=h("div"),r=h("div"),i=m(),o=h("h3"),o.textContent="Deriving encryption key",s=m(),a=h("div"),l=g(w),f=g("s"),p=m(),y=h("p"),y.textContent="This may take 3-6 seconds for security",A(r,"class","deriving-spinner svelte-4xpfbi"),A(o,"class","svelte-4xpfbi"),A(a,"class","deriving-timer svelte-4xpfbi"),A(y,"class","deriving-note svelte-4xpfbi"),A(n,"class","deriving-modal svelte-4xpfbi"),B(n,"dark-theme",e[1]),A(t,"class","deriving-overlay svelte-4xpfbi")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),c(a,l),c(a,f),c(n,p),c(n,y)},p(e,t){8192&t[0]&&w!==(w=e[13].toFixed(1)+"")&&k(l,w),2&t[0]&&B(n,"dark-theme",e[1])},d(e){e&&d(t)}}}function _p(t){let n,r,i,o,s=t[0]&&Ip(t),a=t[9]&&Mp(t);return{c(){s&&s.c(),n=m(),a&&a.c(),r=y()},m(e,l){s&&s.m(e,l),u(e,n,l),a&&a.m(e,l),u(e,r,l),i||(o=w(kp,"keydown",t[23]),i=!0)},p(e,t){e[0]?s?s.p(e,t):(s=Ip(e),s.c(),s.m(n.parentNode,n)):s&&(s.d(1),s=null),e[9]?a?a.p(e,t):(a=Mp(e),a.c(),a.m(r.parentNode,r)):a&&(a.d(1),a=null)},i:e,o:e,d(e){s&&s.d(e),e&&d(n),a&&a.d(e),e&&d(r),i=!1,o()}}}function Op(e,t,n){const r=R();let{showModal:i=!1}=t,{isDarkTheme:o=!1}=t,s="extension",a="",l="",c="",u="",d=!1,f=!1,h=!1,p="",g="",m="",y="",w=0,v=null,A=null;function b(){n(13,w=0),v=performance.now(),k()}function k(){null!==v&&(n(13,w=(performance.now()-v)/1e3),A=requestAnimationFrame(k))}function I(){v=null,A&&(cancelAnimationFrame(A),A=null)}$(()=>{I()});let C=!1,E="";function x(){n(14,C=!!localStorage.getItem("nostr_privkey_encrypted")),n(15,E=localStorage.getItem("nostr_pubkey")||"")}function B(){n(0,i=!1),n(3,a=""),n(4,l=""),n(5,c=""),n(6,u=""),n(10,p=""),n(11,g=""),m="",n(12,y=""),r("close")}function S(e){n(2,s=e),n(10,p=""),n(11,g=""),m="",n(12,y="")}async function Q(){n(7,d=!0),n(10,p=""),n(11,g="");try{if(!a.trim())throw new Error("Please enter your nsec");if(!function(e){if(!e||!e.startsWith("nsec1"))return!1;try{return"nsec"===yu(e).type}catch{return!1}}(a.trim()))throw new Error("Invalid nsec format or checksum");if(l){if(l.length<8)throw new Error("Password must be at least 8 characters");if(l!==c)throw new Error("Passwords do not match")}const e=lf.fromKey(a.trim()),t=await e.getPublicKey();if(localStorage.setItem("nostr_auth_method","nsec"),localStorage.setItem("nostr_pubkey",t),l){n(9,h=!0),b();const e=await async function(e,t){if(!e.startsWith("nsec1"))throw new Error("Invalid nsec format - must start with nsec1");try{if("nsec"!==yu(e).type)throw new Error("Invalid nsec - wrong type")}catch(e){throw new Error("Invalid nsec - bech32 checksum failed")}const n=crypto.getRandomValues(new Uint8Array(32)),r=crypto.getRandomValues(new Uint8Array(12)),i=await bp(t,n),o=await crypto.subtle.importKey("raw",i,{name:"AES-GCM"},!1,["encrypt"]),s=new TextEncoder,a=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},o,s.encode(e)),l=new Uint8Array(n.length+r.length+a.byteLength);return l.set(n,0),l.set(r,n.length),l.set(new Uint8Array(a),n.length+r.length),btoa(String.fromCharCode(...l))}(a.trim(),l);I(),n(9,h=!1),localStorage.setItem("nostr_privkey_encrypted",e),localStorage.removeItem("nostr_privkey")}else localStorage.setItem("nostr_privkey",a.trim()),localStorage.removeItem("nostr_privkey_encrypted"),n(11,g="Successfully logged in with nsec!");r("login",{method:"nsec",pubkey:t,privateKey:a.trim(),signer:e}),setTimeout(()=>{B()},1500)}catch(e){n(10,p=e.message)}finally{n(7,d=!1)}}D(()=>{x()});return e.$$set=e=>{"showModal"in e&&n(0,i=e.showModal),"isDarkTheme"in e&&n(1,o=e.isDarkTheme)},e.$$.update=()=>{1&e.$$.dirty[0]&&i&&x()},[i,o,s,a,l,c,u,d,f,h,p,g,y,w,C,E,function(){localStorage.removeItem("nostr_privkey_encrypted"),localStorage.removeItem("nostr_privkey"),localStorage.removeItem("nostr_pubkey"),localStorage.removeItem("nostr_auth_method"),n(14,C=!1),n(15,E=""),n(6,u=""),n(10,p=""),n(11,g="")},B,async function(){n(7,d=!0),n(9,h=!0),b(),n(10,p=""),n(11,g="");try{if(!u)throw new Error("Please enter your password");const e=localStorage.getItem("nostr_privkey_encrypted");if(!e)throw new Error("No encrypted key found");const t=await async function(e,t){const n=new Uint8Array(atob(e).split("").map(e=>e.charCodeAt(0)));if(n.length<60)throw new Error("Invalid encrypted data - too short");const r=n.slice(0,32),i=n.slice(32,44),o=n.slice(44),s=await bp(t,r),a=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["decrypt"]);let l;try{l=await crypto.subtle.decrypt({name:"AES-GCM",iv:i},a,o)}catch(e){throw new Error("Decryption failed - invalid password or corrupted data")}const c=(new TextDecoder).decode(l);if(!c.startsWith("nsec1"))throw new Error("Decryption produced invalid data - not an nsec");try{if("nsec"!==yu(c).type)throw new Error("Decryption produced invalid nsec type")}catch(e){throw new Error("Decryption produced invalid nsec - bech32 checksum failed")}return c}(e,u);I(),n(9,h=!1);const i=lf.fromKey(t),o=await i.getPublicKey();r("login",{method:"nsec",pubkey:o,privateKey:t,signer:i}),B()}catch(e){I(),e.message.includes("decrypt")||e.message.includes("tag")?n(10,p="Invalid password"):n(10,p=e.message)}finally{n(7,d=!1),n(9,h=!1),I()}},S,async function(){n(8,f=!0),n(10,p=""),n(11,g="");try{const e=Zc(),t=Au("nsec",e),r=vu(Xc(e));m=t,n(12,y=r),n(3,a=t),n(11,g="New key generated! Set an encryption password below to secure it.")}catch(e){n(10,p="Failed to generate key: "+e.message)}finally{n(8,f=!1)}},async function(){n(7,d=!0),n(10,p=""),n(11,g="");try{if(!window.nostr)throw new Error("No Nostr extension found. Please install a NIP-07 compatible extension like nos2x or Alby.");const e=await window.nostr.getPublicKey();e&&(localStorage.setItem("nostr_auth_method","extension"),localStorage.setItem("nostr_pubkey",e),n(11,g="Successfully logged in with extension!"),r("login",{method:"extension",pubkey:e,signer:window.nostr}),setTimeout(()=>{B()},1500))}catch(e){n(10,p=e.message)}finally{n(7,d=!1)}},Q,function(e){"Escape"===e.key&&B(),"Enter"===e.key&&"nsec"===s&&Q()},function(t){P.call(this,e,t)},function(t){P.call(this,e,t)},()=>S("extension"),()=>S("nsec"),function(){u=this.value,n(6,u)},function(){a=this.value,n(3,a)},function(){l=this.value,n(4,l)},function(){c=this.value,n(5,c)},e=>"Escape"===e.key&&B()]}class Hp extends oe{constructor(e){super(),ie(this,e,Op,_p,o,{showModal:0,isDarkTheme:1},null,[-1,-1])}}function jp(e,t,n){const r=e.slice();return r[72]=t[n],r}function Gp(e,t,n){const r=e.slice();return r[75]=t[n],r}function Jp(e,t,n){const r=e.slice();return r[72]=t[n],r}function Kp(e,t,n){const r=e.slice();return r[72]=t[n],r}function Vp(e,t,n){const r=e.slice();return r[72]=t[n],r}function zp(e,t,n){const r=e.slice();return r[72]=t[n],r}function qp(e,t,n){const r=e.slice();return r[72]=t[n],r}function Yp(e){let t,n,r;return{c(){t=h("div"),n=g(e[3]),A(t,"class",r="message "+e[4]+" svelte-1y8wjwc")},m(e,r){u(e,t,r),c(t,n)},p(e,i){8&i[0]&&k(n,e[3]),16&i[0]&&r!==(r="message "+e[4]+" svelte-1y8wjwc")&&A(t,"class",r)},d(e){e&&d(t)}}}function Wp(e){let t,n,i,o,s,a,l,f,p,y,v,b,k,C,E,x,B,S,Q,F,D,$,R,P,T,U,N,L;function M(e,t){return e[5]&&e[5].length>0?Xp:Zp}let _=M(e),O=_(e);function H(e,t){return e[8]&&e[8].length>0?rg:ng}let j=H(e),G=j(e);return{c(){t=h("div"),n=h("div"),i=h("h3"),i.textContent="Banned Pubkeys",o=m(),s=h("div"),a=h("input"),l=m(),f=h("input"),p=m(),y=h("button"),v=g("Ban Pubkey"),b=m(),k=h("div"),O.c(),C=m(),E=h("div"),x=h("h3"),x.textContent="Allowed Pubkeys",B=m(),S=h("div"),Q=h("input"),F=m(),D=h("input"),$=m(),R=h("button"),P=g("Allow Pubkey"),T=m(),U=h("div"),G.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","text"),A(a,"placeholder","Pubkey (64 hex chars)"),A(a,"class","svelte-1y8wjwc"),A(f,"type","text"),A(f,"placeholder","Reason (optional)"),A(f,"class","svelte-1y8wjwc"),y.disabled=e[2],A(y,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(k,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(x,"class","svelte-1y8wjwc"),A(Q,"type","text"),A(Q,"placeholder","Pubkey (64 hex chars)"),A(Q,"class","svelte-1y8wjwc"),A(D,"type","text"),A(D,"placeholder","Reason (optional)"),A(D,"class","svelte-1y8wjwc"),R.disabled=e[2],A(R,"class","svelte-1y8wjwc"),A(S,"class","add-form svelte-1y8wjwc"),A(U,"class","list svelte-1y8wjwc"),A(E,"class","section svelte-1y8wjwc"),A(t,"class","pubkeys-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),I(a,e[6]),c(s,l),c(s,f),I(f,e[7]),c(s,p),c(s,y),c(y,v),c(n,b),c(n,k),O.m(k,null),c(t,C),c(t,E),c(E,x),c(E,B),c(E,S),c(S,Q),I(Q,e[9]),c(S,F),c(S,D),I(D,e[10]),c(S,$),c(S,R),c(R,P),c(E,T),c(E,U),G.m(U,null),N||(L=[w(a,"input",e[43]),w(f,"input",e[44]),w(y,"click",e[25]),w(Q,"input",e[45]),w(D,"input",e[46]),w(R,"click",e[26])],N=!0)},p(e,t){64&t[0]&&a.value!==e[6]&&I(a,e[6]),128&t[0]&&f.value!==e[7]&&I(f,e[7]),4&t[0]&&(y.disabled=e[2]),_===(_=M(e))&&O?O.p(e,t):(O.d(1),O=_(e),O&&(O.c(),O.m(k,null))),512&t[0]&&Q.value!==e[9]&&I(Q,e[9]),1024&t[0]&&D.value!==e[10]&&I(D,e[10]),4&t[0]&&(R.disabled=e[2]),j===(j=H(e))&&G?G.p(e,t):(G.d(1),G=j(e),G&&(G.c(),G.m(U,null)))},d(e){e&&d(t),O.d(),G.d(),N=!1,r(L)}}}function Zp(t){let n;return{c(){n=h("div"),n.innerHTML="

    No banned pubkeys configured.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Xp(e){let t,n=e[5],r=[];for(let t=0;tNo allowed pubkeys configured.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function rg(e){let t,n=e[8],r=[];for(let t=0;t0?lg:ag}let _=M(e),O=_(e);let H=function(e){return e[22]&&e[22].length>0?fg:dg}(e),j=H(e);return{c(){t=h("div"),n=h("div"),i=h("h3"),i.textContent="Banned Events",o=m(),s=h("div"),a=h("input"),l=m(),f=h("input"),p=m(),y=h("button"),v=g("Ban Event"),b=m(),k=h("div"),O.c(),C=m(),E=h("div"),x=h("h3"),x.textContent="Allowed Events",B=m(),S=h("div"),Q=h("input"),F=m(),D=h("input"),$=m(),R=h("button"),P=g("Allow Event"),T=m(),U=h("div"),j.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","text"),A(a,"placeholder","Event ID (64 hex chars)"),A(a,"class","svelte-1y8wjwc"),A(f,"type","text"),A(f,"placeholder","Reason (optional)"),A(f,"class","svelte-1y8wjwc"),y.disabled=e[2],A(y,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(k,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(x,"class","svelte-1y8wjwc"),A(Q,"type","text"),A(Q,"placeholder","Event ID (64 hex chars)"),A(Q,"class","svelte-1y8wjwc"),A(D,"type","text"),A(D,"placeholder","Reason (optional)"),A(D,"class","svelte-1y8wjwc"),R.disabled=e[2],A(R,"class","svelte-1y8wjwc"),A(S,"class","add-form svelte-1y8wjwc"),A(U,"class","list svelte-1y8wjwc"),A(E,"class","section svelte-1y8wjwc"),A(t,"class","events-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),I(a,e[12]),c(s,l),c(s,f),I(f,e[13]),c(s,p),c(s,y),c(y,v),c(n,b),c(n,k),O.m(k,null),c(t,C),c(t,E),c(E,x),c(E,B),c(E,S),c(S,Q),I(Q,e[14]),c(S,F),c(S,D),I(D,e[15]),c(S,$),c(S,R),c(R,P),c(E,T),c(E,U),j.m(U,null),N||(L=[w(a,"input",e[47]),w(f,"input",e[48]),w(y,"click",e[27]),w(Q,"input",e[49]),w(D,"input",e[50]),w(R,"click",e[28])],N=!0)},p(e,t){4096&t[0]&&a.value!==e[12]&&I(a,e[12]),8192&t[0]&&f.value!==e[13]&&I(f,e[13]),4&t[0]&&(y.disabled=e[2]),_===(_=M(e))&&O?O.p(e,t):(O.d(1),O=_(e),O&&(O.c(),O.m(k,null))),16384&t[0]&&Q.value!==e[14]&&I(Q,e[14]),32768&t[0]&&D.value!==e[15]&&I(D,e[15]),4&t[0]&&(R.disabled=e[2]),j.p(e,t)},d(e){e&&d(t),O.d(),j.d(),N=!1,r(L)}}}function ag(t){let n;return{c(){n=h("div"),n.innerHTML="

    No banned events configured.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function lg(e){let t,n=e[11],r=[];for(let t=0;tNo allowed events configured.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function fg(e){let t,n=e[22],r=[];for(let t=0;t0?mg:gg}let B=x(e),S=B(e);return{c(){t=h("div"),n=h("div"),i=h("h3"),i.textContent="Blocked IPs",o=m(),s=h("div"),a=h("input"),l=m(),f=h("input"),p=m(),y=h("button"),v=g("Block IP"),b=m(),k=h("div"),S.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","text"),A(a,"placeholder","IP Address"),A(a,"class","svelte-1y8wjwc"),A(f,"type","text"),A(f,"placeholder","Reason (optional)"),A(f,"class","svelte-1y8wjwc"),y.disabled=e[2],A(y,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(k,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(t,"class","ips-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),I(a,e[17]),c(s,l),c(s,f),I(f,e[18]),c(s,p),c(s,y),c(y,v),c(n,b),c(n,k),S.m(k,null),C||(E=[w(a,"input",e[51]),w(f,"input",e[52]),w(y,"click",e[29])],C=!0)},p(e,t){131072&t[0]&&a.value!==e[17]&&I(a,e[17]),262144&t[0]&&f.value!==e[18]&&I(f,e[18]),4&t[0]&&(y.disabled=e[2]),B===(B=x(e))&&S?S.p(e,t):(S.d(1),S=B(e),S&&(S.c(),S.m(k,null)))},d(e){e&&d(t),S.d(),C=!1,r(E)}}}function gg(t){let n;return{c(){n=h("div"),n.innerHTML="

    No blocked IPs configured.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function mg(e){let t,n=e[16],r=[];for(let t=0;t0?bg:Ag}let x=E(e),B=x(e);return{c(){t=h("div"),n=h("div"),i=h("h3"),i.textContent="Allowed Event Kinds",o=m(),s=h("div"),a=h("input"),l=m(),f=h("button"),p=g("Allow Kind"),y=m(),v=h("div"),B.c(),A(i,"class","svelte-1y8wjwc"),A(a,"type","number"),A(a,"placeholder","Kind number"),A(a,"class","svelte-1y8wjwc"),f.disabled=e[2],A(f,"class","svelte-1y8wjwc"),A(s,"class","add-form svelte-1y8wjwc"),A(v,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(t,"class","kinds-section")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(s,a),I(a,e[20]),c(s,l),c(s,f),c(f,p),c(n,y),c(n,v),B.m(v,null),k||(C=[w(a,"input",e[53]),w(f,"click",e[30])],k=!0)},p(e,t){1048576&t[0]&&b(a.value)!==e[20]&&I(a,e[20]),4&t[0]&&(f.disabled=e[2]),x===(x=E(e))&&B?B.p(e,t):(B.d(1),B=x(e),B&&(B.c(),B.m(v,null)))},d(e){e&&d(t),B.d(),k=!1,r(C)}}}function Ag(t){let n;return{c(){n=h("div"),n.innerHTML="

    No allowed kinds configured. All kinds are\n allowed by default.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function bg(e){let t,n=e[19],r=[];for(let t=0;t0?Eg:Cg}let v=y(e),b=v(e);return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Events Needing Moderation",i=m(),o=h("button"),s=g("Refresh"),a=m(),l=h("div"),b.c(),A(r,"class","svelte-1y8wjwc"),o.disabled=e[2],A(l,"class","list svelte-1y8wjwc"),A(n,"class","section svelte-1y8wjwc"),A(t,"class","moderation-section")},m(d,h){u(d,t,h),c(t,n),c(n,r),c(n,i),c(n,o),c(o,s),c(n,a),c(n,l),b.m(l,null),f||(p=w(o,"click",e[24]),f=!0)},p(e,t){4&t[0]&&(o.disabled=e[2]),v===(v=y(e))&&b?b.p(e,t):(b.d(1),b=v(e),b&&(b.c(),b.m(l,null)))},d(e){e&&d(t),b.d(),f=!1,p()}}}function Cg(t){let n;return{c(){n=h("div"),n.innerHTML="

    No events need moderation at this time.

    ",A(n,"class","no-items svelte-1y8wjwc")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Eg(e){let t,n=e[21],r=[];for(let t=0;tManaged ACL Configuration \n

    Configure access control using NIP-86 management API

    \n
    Owner Only: This interface is restricted to relay owners\n only.
    ',o=m(),z&&z.c(),s=m(),a=h("div"),l=h("button"),f=g("Pubkeys"),y=m(),v=h("button"),b=g("Events"),I=m(),C=h("button"),E=g("IPs"),B=m(),S=h("button"),Q=g("Kinds"),D=m(),$=h("button"),R=g("Moderation"),T=m(),U=h("button"),N=g("Relay Config"),M=m(),_=h("div"),q&&q.c(),O=m(),Y&&Y.c(),H=m(),W&&W.c(),j=m(),Z&&Z.c(),G=m(),X&&X.c(),J=m(),ee&&ee.c(),A(i,"class","header svelte-1y8wjwc"),A(l,"class",p="tab "+("pubkeys"===t[1]?"active":"")+" svelte-1y8wjwc"),A(v,"class",k="tab "+("events"===t[1]?"active":"")+" svelte-1y8wjwc"),A(C,"class",x="tab "+("ips"===t[1]?"active":"")+" svelte-1y8wjwc"),A(S,"class",F="tab "+("kinds"===t[1]?"active":"")+" svelte-1y8wjwc"),A($,"class",P="tab "+("moderation"===t[1]?"active":"")+" svelte-1y8wjwc"),A(U,"class",L="tab "+("relay"===t[1]?"active":"")+" svelte-1y8wjwc"),A(a,"class","tabs svelte-1y8wjwc"),A(_,"class","tab-content svelte-1y8wjwc")},m(e,r){u(e,n,r),c(n,i),c(n,o),z&&z.m(n,null),c(n,s),c(n,a),c(a,l),c(l,f),c(a,y),c(a,v),c(v,b),c(a,I),c(a,C),c(C,E),c(a,B),c(a,S),c(S,Q),c(a,D),c(a,$),c($,R),c(a,T),c(a,U),c(U,N),c(n,M),c(n,_),q&&q.m(_,null),c(_,O),Y&&Y.m(_,null),c(_,H),W&&W.m(_,null),c(_,j),Z&&Z.m(_,null),c(_,G),X&&X.m(_,null),c(_,J),ee&&ee.m(_,null),K||(V=[w(l,"click",t[37]),w(v,"click",t[38]),w(C,"click",t[39]),w(S,"click",t[40]),w($,"click",t[41]),w(U,"click",t[42])],K=!0)},p(e,t){e[3]?z?z.p(e,t):(z=Yp(e),z.c(),z.m(n,s)):z&&(z.d(1),z=null),2&t[0]&&p!==(p="tab "+("pubkeys"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(l,"class",p),2&t[0]&&k!==(k="tab "+("events"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(v,"class",k),2&t[0]&&x!==(x="tab "+("ips"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(C,"class",x),2&t[0]&&F!==(F="tab "+("kinds"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(S,"class",F),2&t[0]&&P!==(P="tab "+("moderation"===e[1]?"active":"")+" svelte-1y8wjwc")&&A($,"class",P),2&t[0]&&L!==(L="tab "+("relay"===e[1]?"active":"")+" svelte-1y8wjwc")&&A(U,"class",L),"pubkeys"===e[1]?q?q.p(e,t):(q=Wp(e),q.c(),q.m(_,O)):q&&(q.d(1),q=null),"events"===e[1]?Y?Y.p(e,t):(Y=sg(e),Y.c(),Y.m(_,H)):Y&&(Y.d(1),Y=null),"ips"===e[1]?W?W.p(e,t):(W=pg(e),W.c(),W.m(_,j)):W&&(W.d(1),W=null),"kinds"===e[1]?Z?Z.p(e,t):(Z=vg(e),Z.c(),Z.m(_,G)):Z&&(Z.d(1),Z=null),"moderation"===e[1]?X?X.p(e,t):(X=Ig(e),X.c(),X.m(_,J)):X&&(X.d(1),X=null),"relay"===e[1]?ee?ee.p(e,t):(ee=Sg(e),ee.c(),ee.m(_,null)):ee&&(ee.d(1),ee=null)},i:e,o:e,d(e){e&&d(n),z&&z.d(),q&&q.d(),Y&&Y.d(),W&&W.d(),Z&&Z.d(),X&&X.d(),ee&&ee.d(),K=!1,r(V)}}}function $g(e,t,n){let{userSigner:r}=t,{userPubkey:i}=t,o="pubkeys",s=!1,a="",l="info",c=[],u="",d="",f=[],h="",p="",g=[],m="",y="",w="",v="",A=[],k="",I="",C=[],E="",x=[],B={relay_name:"",relay_description:"",relay_icon:""};async function S(){try{n(2,s=!0),console.log("Fetching relay info from /");const e=await fetch(window.location.origin+"/",{headers:{Accept:"application/nostr+json"}});if(console.log("Response status:",e.status),console.log("Response headers:",e.headers),e.ok){const t=await e.json();console.log("Raw relay info:",t),n(0,B={relay_name:t.name||"",relay_description:t.description||"",relay_icon:t.icon||""}),console.log("Updated relayConfig:",B),console.log("Loaded relay info:",t),n(3,a="Relay configuration loaded successfully"),n(4,l="success")}else console.error("Failed to fetch relay info, status:",e.status),n(3,a=`Failed to fetch relay info: ${e.status}`),n(4,l="error")}catch(e){console.error("Failed to fetch relay info:",e),n(3,a=`Failed to fetch relay info: ${e.message}`),n(4,l="error")}finally{n(2,s=!1)}}async function Q(e,t=[]){try{n(2,s=!0),n(3,a="");const o={method:e,params:t},l=await async function(e,t){if(!r)throw new Error("No signer available for authentication. Please log in with a Nostr extension.");if(!i)throw new Error("No user pubkey available for authentication.");const n=window.location.origin+t,o={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",n],["method",e]],content:"",pubkey:i},s=await r.signEvent(o),a=JSON.stringify(s);return`Nostr ${btoa(a)}`}("POST","/api/nip86"),c=await fetch("/api/nip86",{method:"POST",headers:{"Content-Type":"application/nostr+json+rpc",Authorization:l},body:JSON.stringify(o)});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);const u=await c.json();if(u.error)throw new Error(u.error);return u.result}catch(e){throw console.error("NIP-86 API error:",e),n(3,a=e.message),n(4,l="error"),e}finally{n(2,s=!1)}}async function F(){try{n(5,c=await Q("listbannedpubkeys"))}catch(e){console.error("Failed to load banned pubkeys:",e)}}async function $(){try{n(8,f=await Q("listallowedpubkeys"))}catch(e){console.error("Failed to load allowed pubkeys:",e)}}async function R(){try{n(11,g=await Q("listbannedevents"))}catch(e){console.error("Failed to load banned events:",e)}}async function P(){try{n(16,A=await Q("listblockedips"))}catch(e){console.error("Failed to load blocked IPs:",e)}}async function T(){try{n(19,C=await Q("listallowedkinds"))}catch(e){console.error("Failed to load allowed kinds:",e)}}async function U(){try{n(2,s=!0),n(21,x=await Q("listeventsneedingmoderation")),console.log("Loaded events needing moderation:",x)}catch(e){console.error("Failed to load events needing moderation:",e),n(3,a=`Failed to load moderation events: ${e.message}`),n(4,l="error"),n(21,x=[])}finally{n(2,s=!1)}}async function N(e){try{await Q("disallowkind",[e]),n(3,a="Kind disallowed successfully"),n(4,l="success"),await T()}catch(e){console.error("Failed to disallow kind:",e)}}async function L(e){try{await Q("allowevent",[e,"Approved from moderation queue"]),n(3,a="Event allowed successfully"),n(4,l="success"),await U()}catch(e){console.error("Failed to allow event from moderation:",e)}}async function M(e){try{await Q("banevent",[e,"Banned from moderation queue"]),n(3,a="Event banned successfully"),n(4,l="success"),await U()}catch(e){console.error("Failed to ban event from moderation:",e)}}D(()=>{setTimeout(()=>{S()},100)}),async function(){await Promise.all([F(),$(),R(),P(),T()])}();return e.$$set=e=>{"userSigner"in e&&n(35,r=e.userSigner),"userPubkey"in e&&n(36,i=e.userPubkey)},e.$$.update=()=>{1&e.$$.dirty[0]&&console.log("relayConfig changed:",B)},[B,o,s,a,l,c,u,d,f,h,p,g,m,y,w,v,A,k,I,C,E,x,[],S,U,async function(){if(u)try{await Q("banpubkey",[u,d]),n(3,a="Pubkey banned successfully"),n(4,l="success"),n(6,u=""),n(7,d=""),await F()}catch(e){console.error("Failed to ban pubkey:",e)}},async function(){if(h)try{await Q("allowpubkey",[h,p]),n(3,a="Pubkey allowed successfully"),n(4,l="success"),n(9,h=""),n(10,p=""),await $()}catch(e){console.error("Failed to allow pubkey:",e)}},async function(){if(m)try{await Q("banevent",[m,y]),n(3,a="Event banned successfully"),n(4,l="success"),n(12,m=""),n(13,y=""),await R()}catch(e){console.error("Failed to ban event:",e)}},async function(){if(w)try{await Q("allowevent",[w,v]),n(3,a="Event allowed successfully"),n(4,l="success"),n(14,w=""),n(15,v="")}catch(e){console.error("Failed to allow event:",e)}},async function(){if(k)try{await Q("blockip",[k,I]),n(3,a="IP blocked successfully"),n(4,l="success"),n(17,k=""),n(18,I=""),await P()}catch(e){console.error("Failed to block IP:",e)}},async function(){if(!E)return;const e=parseInt(E);if(isNaN(e))return n(3,a="Invalid kind number"),void n(4,l="error");try{await Q("allowkind",[e]),n(3,a="Kind allowed successfully"),n(4,l="success"),n(20,E=""),await T()}catch(e){console.error("Failed to allow kind:",e)}},N,async function(){try{n(2,s=!0),n(3,a="");const e=[];if(B.relay_name&&e.push(Q("changerelayname",[B.relay_name])),B.relay_description&&e.push(Q("changerelaydescription",[B.relay_description])),B.relay_icon&&e.push(Q("changerelayicon",[B.relay_icon])),0===e.length)return n(3,a="No changes to update"),void n(4,l="info");await Promise.all(e),n(3,a="Relay configuration updated successfully"),n(4,l="success"),await S()}catch(e){console.error("Failed to update relay configuration:",e),n(3,a=`Failed to update relay configuration: ${e.message}`),n(4,l="error")}finally{n(2,s=!1)}},L,M,r,i,()=>n(1,o="pubkeys"),()=>n(1,o="events"),()=>n(1,o="ips"),()=>n(1,o="kinds"),()=>{n(1,o="moderation"),x&&0!==x.length||U()},()=>n(1,o="relay"),function(){u=this.value,n(6,u)},function(){d=this.value,n(7,d)},function(){h=this.value,n(9,h)},function(){p=this.value,n(10,p)},function(){m=this.value,n(12,m)},function(){y=this.value,n(13,y)},function(){w=this.value,n(14,w)},function(){v=this.value,n(15,v)},function(){k=this.value,n(17,k)},function(){I=this.value,n(18,I)},function(){E=b(this.value),n(20,E)},e=>N(e),e=>L(e.id),e=>M(e.id),function(){B.relay_name=this.value,n(0,B)},function(){B.relay_description=this.value,n(0,B)},function(){B.relay_icon=this.value,n(0,B)}]}class Rg extends oe{constructor(e){super(),ie(this,e,$g,Dg,o,{userSigner:35,userPubkey:36},null,[-1,-1,-1])}}function Pg(e){let t,n;return{c(){t=h("span"),n=g(e[3]),A(t,"class","permission-badge svelte-1qkhxam")},m(e,r){u(e,t,r),c(t,n)},p(e,t){8&t&&k(n,e[3])},d(e){e&&d(t)}}}function Tg(t){let n,r,i;return{c(){n=h("button"),n.textContent="Log in",A(n,"class","login-btn svelte-1qkhxam")},m(e,o){u(e,n,o),r||(i=w(n,"click",t[7]),r=!0)},p:e,d(e){e&&d(n),r=!1,i()}}}function Ug(e){let t,n,r,i,o,s,a=(e[4]?.name||e[5])+"";function l(e,t){return e[4]?.picture?Lg:Ng}let f=l(e),p=f(e);return{c(){t=h("button"),p.c(),n=m(),r=h("span"),i=g(a),A(r,"class","user-name svelte-1qkhxam"),A(t,"class","user-profile-btn svelte-1qkhxam")},m(a,l){u(a,t,l),p.m(t,null),c(t,n),c(t,r),c(r,i),o||(s=w(t,"click",e[6]),o=!0)},p(e,r){f===(f=l(e))&&p?p.p(e,r):(p.d(1),p=f(e),p&&(p.c(),p.m(t,n))),48&r&&a!==(a=(e[4]?.name||e[5])+"")&&k(i,a)},d(e){e&&d(t),p.d(),o=!1,s()}}}function Ng(t){let n;return{c(){n=h("div"),n.textContent="👤",A(n,"class","user-avatar-placeholder svelte-1qkhxam")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Lg(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[4].picture)||A(t,"src",n),A(t,"alt","User avatar"),A(t,"class","user-avatar svelte-1qkhxam")},m(e,n){u(e,t,n)},p(e,r){16&r&&!a(t.src,n=e[4].picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function Mg(t){let n,r,i,o,s,l,f,p,y,w,v=t[1]&&t[2]&&Pg(t);function b(e,t){return e[1]?Ug:Tg}let k=b(t),I=k(t);return{c(){n=h("header"),r=h("div"),i=h("img"),s=m(),l=h("div"),f=h("span"),p=g("ORLY? dashboard\n "),v&&v.c(),y=m(),w=h("div"),I.c(),a(i.src,o="/orly.png")||A(i,"src","/orly.png"),A(i,"alt","ORLY Logo"),A(i,"class","logo svelte-1qkhxam"),A(f,"class","app-title svelte-1qkhxam"),A(l,"class","header-title svelte-1qkhxam"),A(w,"class","header-buttons svelte-1qkhxam"),A(r,"class","header-content svelte-1qkhxam"),A(n,"class","main-header svelte-1qkhxam"),B(n,"dark-theme",t[0])},m(e,t){u(e,n,t),c(n,r),c(r,i),c(r,s),c(r,l),c(l,f),c(f,p),v&&v.m(f,null),c(r,y),c(r,w),I.m(w,null)},p(e,[t]){e[1]&&e[2]?v?v.p(e,t):(v=Pg(e),v.c(),v.m(f,null)):v&&(v.d(1),v=null),k===(k=b(e))&&I?I.p(e,t):(I.d(1),I=k(e),I&&(I.c(),I.m(w,null))),1&t&&B(n,"dark-theme",e[0])},i:e,o:e,d(e){e&&d(n),v&&v.d(),I.d()}}}function _g(e,t,n){let{isDarkTheme:r=!1}=t,{isLoggedIn:i=!1}=t,{userRole:o=""}=t,{currentEffectiveRole:s=""}=t,{userProfile:a=null}=t,{userPubkey:l=""}=t;const c=R();return e.$$set=e=>{"isDarkTheme"in e&&n(0,r=e.isDarkTheme),"isLoggedIn"in e&&n(1,i=e.isLoggedIn),"userRole"in e&&n(2,o=e.userRole),"currentEffectiveRole"in e&&n(3,s=e.currentEffectiveRole),"userProfile"in e&&n(4,a=e.userProfile),"userPubkey"in e&&n(5,l=e.userPubkey)},[r,i,o,s,a,l,function(){c("openSettingsDrawer")},function(){c("openLoginModal")}]}class Og extends oe{constructor(e){super(),ie(this,e,_g,Mg,o,{isDarkTheme:0,isLoggedIn:1,userRole:2,currentEffectiveRole:3,userProfile:4,userPubkey:5})}}function Hg(e,t,n){const r=e.slice();return r[10]=t[n],r}function jg(e){let t,n,i;function o(){return e[6](e[10])}function s(...t){return e[7](e[10],...t)}return{c(){t=h("span"),t.textContent="✕",A(t,"class","tab-close-icon svelte-wfmuj"),A(t,"role","button"),A(t,"tabindex","0")},m(e,r){u(e,t,r),n||(i=[w(t,"click",v(o)),w(t,"keydown",s)],n=!0)},p(t,n){e=t},d(e){e&&d(t),n=!1,r(i)}}}function Gg(e){let t,n,r,i,o,s,a,l,f,p,y=e[10].icon+"",v=e[10].label+"",b=e[10].isSearchTab&&jg(e);function I(){return e[8](e[10])}return{c(){t=h("button"),n=h("span"),r=g(y),i=m(),o=h("span"),s=g(v),a=m(),b&&b.c(),l=m(),A(n,"class","tab-icon svelte-wfmuj"),A(o,"class","tab-label svelte-wfmuj"),A(t,"class","tab svelte-wfmuj"),B(t,"active",e[2]===e[10].id)},m(e,d){u(e,t,d),c(t,n),c(n,r),c(t,i),c(t,o),c(o,s),c(t,a),b&&b.m(t,null),c(t,l),f||(p=w(t,"click",I),f=!0)},p(n,i){e=n,2&i&&y!==(y=e[10].icon+"")&&k(r,y),2&i&&v!==(v=e[10].label+"")&&k(s,v),e[10].isSearchTab?b?b.p(e,i):(b=jg(e),b.c(),b.m(t,l)):b&&(b.d(1),b=null),6&i&&B(t,"active",e[2]===e[10].id)},d(e){e&&d(t),b&&b.d(),f=!1,p()}}}function Jg(e){let t,n,r,i,o,s,a,l;return{c(){t=h("a"),n=p("svg"),r=p("path"),i=p("path"),o=m(),s=h("span"),a=g("v"),l=g(e[3]),A(r,"d","M5 6h12v2h1.5c1.38 0 2.5 1.12 2.5 2.5v1c0 1.38-1.12 2.5-2.5 2.5H17v1c0 1.66-1.34 3-3 3H8c-1.66 0-3-1.34-3-3V6zm12 6h1.5c.28 0 .5-.22.5-.5v-1c0-.28-.22-.5-.5-.5H17v2z"),A(i,"d","M9 9c1.5 0 3 .5 3 2.5S10.5 14 9 14c0-1.5.5-3.5 2-4.5"),A(i,"stroke","currentColor"),A(i,"stroke-width","1"),A(i,"fill","none"),A(n,"class","version-icon svelte-wfmuj"),A(n,"viewBox","0 0 24 24"),A(n,"fill","currentColor"),A(n,"xmlns","http://www.w3.org/2000/svg"),A(s,"class","version-text svelte-wfmuj"),A(t,"href","https://next.orly.dev"),A(t,"target","_blank"),A(t,"rel","noopener noreferrer"),A(t,"class","version-link svelte-wfmuj")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(n,i),c(t,o),c(t,s),c(s,a),c(s,l)},p(e,t){8&t&&k(l,e[3])},d(e){e&&d(t)}}}function Kg(t){let n,r,i,o,s=t[1],a=[];for(let e=0;e{"isDarkTheme"in e&&n(0,r=e.isDarkTheme),"tabs"in e&&n(1,i=e.tabs),"selectedTab"in e&&n(2,o=e.selectedTab),"version"in e&&n(3,s=e.version)},[r,i,o,s,l,c,e=>c(e.id),(e,t)=>"Enter"===t.key&&c(e.id),e=>l(e.id)]}class zg extends oe{constructor(e){super(),ie(this,e,Vg,Kg,o,{isDarkTheme:0,tabs:1,selectedTab:2,version:3})}}function qg(t){let n,r,i,o,s,a;return{c(){n=h("div"),r=h("p"),r.textContent="Please log in to access export functionality.",i=m(),o=h("button"),o.textContent="Log In",A(r,"class","svelte-jzrdtj"),A(o,"class","login-btn svelte-jzrdtj"),A(n,"class","login-prompt svelte-jzrdtj")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[5]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Yg(e){let t,n,r=e[0]&&Wg(e),i=e[1]&&Zg(e);return{c(){r&&r.c(),t=m(),i&&i.c(),n=y()},m(e,o){r&&r.m(e,o),u(e,t,o),i&&i.m(e,o),u(e,n,o)},p(e,o){e[0]?r?r.p(e,o):(r=Wg(e),r.c(),r.m(t.parentNode,t)):r&&(r.d(1),r=null),e[1]?i?i.p(e,o):(i=Zg(e),i.c(),i.m(n.parentNode,n)):i&&(i.d(1),i=null)},d(e){r&&r.d(e),e&&d(t),i&&i.d(e),e&&d(n)}}}function Wg(t){let n,r,i,o,s,a,l,f;return{c(){n=h("div"),r=h("h3"),r.textContent="Export My Events",i=m(),o=h("p"),o.textContent="Download your personal events as a JSONL file.",s=m(),a=h("button"),a.textContent="📤 Export My Events",A(r,"class","svelte-jzrdtj"),A(o,"class","svelte-jzrdtj"),A(a,"class","export-btn svelte-jzrdtj"),A(n,"class","export-section svelte-jzrdtj")},m(e,d){u(e,n,d),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),l||(f=w(a,"click",t[3]),l=!0)},p:e,d(e){e&&d(n),l=!1,f()}}}function Zg(t){let n,r,i,o,s,a,l,f;return{c(){n=h("div"),r=h("h3"),r.textContent="Export All Events",i=m(),o=h("p"),o.textContent="Download the complete database as a JSONL file. This includes\n all events from all users.",s=m(),a=h("button"),a.textContent="📤 Export All Events",A(r,"class","svelte-jzrdtj"),A(o,"class","svelte-jzrdtj"),A(a,"class","export-btn svelte-jzrdtj"),A(n,"class","export-section svelte-jzrdtj")},m(e,d){u(e,n,d),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),l||(f=w(a,"click",t[4]),l=!0)},p:e,d(e){e&&d(n),l=!1,f()}}}function Xg(t){let n;function r(e,t){return e[2]?Yg:qg}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 em(e,t,n){let r,i,{isLoggedIn:o=!1}=t,{currentEffectiveRole:s=""}=t,{aclMode:a=""}=t;const l=R();return e.$$set=e=>{"isLoggedIn"in e&&n(0,o=e.isLoggedIn),"currentEffectiveRole"in e&&n(6,s=e.currentEffectiveRole),"aclMode"in e&&n(7,a=e.aclMode)},e.$$.update=()=>{129&e.$$.dirty&&n(2,r="none"===a||o),192&e.$$.dirty&&n(1,i="none"===a||"admin"===s||"owner"===s)},[o,i,r,function(){l("exportMyEvents")},function(){l("exportAllEvents")},function(){l("openLoginModal")},s,a]}class tm extends oe{constructor(e){super(),ie(this,e,em,Xg,o,{isLoggedIn:0,currentEffectiveRole:6,aclMode:7})}}function nm(t){let n,r,i,o,s,a,l,f;return{c(){n=h("div"),r=h("h3"),r.textContent="Import Events",i=m(),o=h("p"),o.textContent="Please log in to access import functionality.",s=m(),a=h("button"),a.textContent="Log In",A(r,"class","recovery-header svelte-nonyqh"),A(o,"class","recovery-description svelte-nonyqh"),A(a,"class","login-btn svelte-nonyqh"),A(n,"class","login-prompt svelte-nonyqh")},m(e,d){u(e,n,d),c(n,r),c(n,i),c(n,o),c(n,s),c(n,a),l||(f=w(a,"click",t[6]),l=!0)},p:e,d(e){e&&d(n),l=!1,f()}}}function rm(t){let n;return{c(){n=h("div"),n.innerHTML='

    Import Events

    \n

    Admin or owner permission required for import functionality.

    ',A(n,"class","permission-denied svelte-nonyqh")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function im(e){let t,n,i,o,s,a,l,f,p,y,v,b,k,I,C=e[2]&&om(e);return{c(){t=h("h3"),t.textContent="Import Events",n=m(),i=h("p"),i.textContent="Upload a JSONL file to import events into the database.",o=m(),s=h("div"),a=h("input"),l=m(),f=h("div"),p=h("button"),y=g("Import Events"),b=m(),C&&C.c(),A(t,"class","svelte-nonyqh"),A(i,"class","svelte-nonyqh"),A(a,"type","file"),A(a,"id","import-file"),A(a,"accept",".jsonl,.txt"),A(a,"class","svelte-nonyqh"),A(p,"class","import-btn svelte-nonyqh"),p.disabled=v=!e[1]||"Uploading..."===e[2],A(f,"class","import-row svelte-nonyqh"),A(s,"class","recovery-controls-card svelte-nonyqh")},m(r,d){u(r,t,d),u(r,n,d),u(r,i,d),u(r,o,d),u(r,s,d),c(s,a),c(s,l),c(s,f),c(f,p),c(p,y),c(f,b),C&&C.m(f,null),k||(I=[w(a,"change",e[4]),w(p,"click",e[5])],k=!0)},p(e,t){6&t&&v!==(v=!e[1]||"Uploading..."===e[2])&&(p.disabled=v),e[2]?C?C.p(e,t):(C=om(e),C.c(),C.m(f,null)):C&&(C.d(1),C=null)},d(e){e&&d(t),e&&d(n),e&&d(i),e&&d(o),e&&d(s),C&&C.d(),k=!1,r(I)}}}function om(e){let t,n;return{c(){t=h("span"),n=g(e[2]),A(t,"class","import-message svelte-nonyqh"),B(t,"uploading","Uploading..."===e[2]),B(t,"success","Upload complete"===e[2]),B(t,"error",e[2].startsWith("Import failed")||e[2].startsWith("Admin")||e[2].startsWith("Please"))},m(e,r){u(e,t,r),c(t,n)},p(e,r){4&r&&k(n,e[2]),4&r&&B(t,"uploading","Uploading..."===e[2]),4&r&&B(t,"success","Upload complete"===e[2]),4&r&&B(t,"error",e[2].startsWith("Import failed")||e[2].startsWith("Admin")||e[2].startsWith("Please"))},d(e){e&&d(t)}}}function sm(t){let n;function r(e,t){return e[3]?im:e[0]?rm:nm}let i=r(t),o=i(t);return{c(){n=h("div"),o.c(),A(n,"class","import-section svelte-nonyqh")},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 am(e,t,n){let r,{isLoggedIn:i=!1}=t,{currentEffectiveRole:o=""}=t,{selectedFile:s=null}=t,{aclMode:a=""}=t,{importMessage:l=""}=t;const c=R();return e.$$set=e=>{"isLoggedIn"in e&&n(0,i=e.isLoggedIn),"currentEffectiveRole"in e&&n(7,o=e.currentEffectiveRole),"selectedFile"in e&&n(1,s=e.selectedFile),"aclMode"in e&&n(8,a=e.aclMode),"importMessage"in e&&n(2,l=e.importMessage)},e.$$.update=()=>{385&e.$$.dirty&&n(3,r="none"===a||i&&("admin"===o||"owner"===o))},[i,s,l,r,function(e){c("fileSelect",e)},function(){c("importEvents")},function(){c("openLoginModal")},o,a]}class lm extends oe{constructor(e){super(),ie(this,e,am,sm,o,{isLoggedIn:0,currentEffectiveRole:7,selectedFile:1,aclMode:8,importMessage:2})}}const cm={0:"Profile Metadata",1:"Text Note",2:"Recommend Relay",3:"Contacts",4:"Encrypted DM",5:"Delete Request",6:"Repost",7:"Reaction",8:"Badge Award",16:"Generic Repost",40:"Channel Creation",41:"Channel Metadata",42:"Channel Message",43:"Channel Hide Message",44:"Channel Mute User",1063:"File Metadata",1311:"Live Chat Message",1984:"Reporting",1985:"Label",9734:"Zap Request",9735:"Zap Receipt",1e4:"Mute List",10001:"Pin List",10002:"Relay List Metadata",10003:"Bookmark List",10004:"Communities List",10005:"Public Chats List",10006:"Blocked Relays List",10007:"Search Relays List",10009:"User Groups",10015:"Interests List",10030:"User Emoji List",13194:"Wallet Info",22242:"Client Auth",23194:"Wallet Request",23195:"Wallet Response",24133:"Nostr Connect",27235:"HTTP Auth",3e4:"Categorized People List",30001:"Categorized Bookmarks",30002:"Categorized Relay List",30003:"Bookmark Sets",30004:"Curation Sets",30005:"Video Sets",30008:"Profile Badges",30009:"Badge Definition",30015:"Interest Sets",30017:"Create/Update Stall",30018:"Create/Update Product",30019:"Marketplace UI/UX",30020:"Product Sold As Auction",30023:"Long-form Content",30024:"Draft Long-form Content",30030:"Emoji Sets",30063:"Release Artifact Sets",30078:"Application-specific Data",30311:"Live Event",30315:"User Statuses",30388:"Slide Set",30402:"Classified Listing",30403:"Draft Classified Listing",30617:"Repository Announcement",30618:"Repository State Announcement",30818:"Wiki Article",30819:"Redirects",31922:"Date-Based Calendar Event",31923:"Time-Based Calendar Event",31924:"Calendar",31925:"Calendar Event RSVP",31989:"Handler Recommendation",31990:"Handler Information",34550:"Community Definition",34551:"Community Post Approval"};function um(e,t=null){if(!e||"string"!=typeof e)return!1;return!!/^[0-9a-fA-F]+$/.test(e)&&(!t||e.length===t)}function dm(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}T${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function fm(e){return Math.floor(new Date(e).getTime()/1e3)}function hm(e,t,n){const r=e.slice();return r[62]=t[n],r[64]=n,r}function pm(e,t,n){const r=e.slice();return r[65]=t[n],r}function gm(e,t,n){const r=e.slice();return r[68]=t[n],r}function mm(e,t,n){const r=e.slice();return r[71]=t[n],r}function ym(e,t,n){const r=e.slice();return r[71]=t[n].kind,r[74]=t[n].name,r}function wm(e){let t,n,r,i,o,s,a=e[20],l=[];for(let t=0;t0&&Am(t),Ge=t[17]&&km(t),Je=t[2].length>0&&Im(t),Ke=t[18]&&Em(t),Ve=t[3].length>0&&xm(t),ze=t[19]&&Sm(t),qe=t[4].length>0&&Qm(t),Ye=t[5]&&Dm(t),We=t[6]&&$m(t),Ze=t[8]&&Rm(t);return{c(){n=h("div"),i=h("div"),o=h("div"),s=h("label"),s.textContent="Search Text (NIP-50)",a=m(),l=h("div"),f=h("input"),p=m(),y=h("label"),y.textContent="Event Kinds",v=m(),C=h("div"),E=h("button"),x=g(_e),S=g(" Select Kinds ("),Q=g(Oe),F=g(" selected)"),D=m(),He&&He.c(),$=m(),je&&je.c(),R=m(),P=h("label"),P.textContent="Authors (Pubkeys)",T=m(),U=h("div"),N=h("div"),L=h("input"),M=m(),_=h("button"),_.textContent="Add",O=m(),Ge&&Ge.c(),H=m(),Je&&Je.c(),j=m(),G=h("label"),G.textContent="Event IDs",J=m(),K=h("div"),V=h("div"),z=h("input"),q=m(),Y=h("button"),Y.textContent="Add",W=m(),Ke&&Ke.c(),Z=m(),Ve&&Ve.c(),X=m(),ee=h("label"),ee.textContent="Tags (#e, #p, #a)",te=m(),ne=h("div"),re=h("div"),ie=h("span"),ie.textContent="#",oe=m(),se=h("input"),ae=m(),le=h("input"),ce=m(),ue=h("button"),ue.textContent="Add",de=m(),ze&&ze.c(),fe=m(),qe&&qe.c(),he=m(),pe=h("label"),pe.textContent="Since",ge=m(),me=h("div"),ye=h("input"),we=m(),Ye&&Ye.c(),ve=m(),Ae=h("label"),Ae.textContent="Until",be=m(),ke=h("div"),Ie=h("input"),Ce=m(),We&&We.c(),Ee=m(),xe=h("label"),xe.textContent="Limit",Be=m(),Se=h("div"),Qe=h("input"),Fe=m(),Ze&&Ze.c(),De=m(),$e=h("div"),Re=h("button"),Re.textContent="🧹",Pe=m(),Te=h("div"),Ue=m(),Ne=h("button"),Ne.textContent="",A(s,"for","search-text"),A(s,"class","svelte-1a1v6k0"),A(f,"id","search-text"),A(f,"type","text"),A(f,"placeholder","Search events..."),A(f,"class","filter-input svelte-1a1v6k0"),A(l,"class","field-content svelte-1a1v6k0"),A(y,"class","svelte-1a1v6k0"),A(E,"class","picker-toggle-btn svelte-1a1v6k0"),A(C,"class","field-content svelte-1a1v6k0"),A(P,"class","svelte-1a1v6k0"),A(L,"type","text"),A(L,"placeholder","64 character hex pubkey..."),A(L,"class","filter-input svelte-1a1v6k0"),A(L,"maxlength","64"),A(_,"class","add-btn svelte-1a1v6k0"),A(N,"class","input-group svelte-1a1v6k0"),A(U,"class","field-content svelte-1a1v6k0"),A(G,"class","svelte-1a1v6k0"),A(z,"type","text"),A(z,"placeholder","64 character hex event ID..."),A(z,"class","filter-input svelte-1a1v6k0"),A(z,"maxlength","64"),A(Y,"class","add-btn svelte-1a1v6k0"),A(V,"class","input-group svelte-1a1v6k0"),A(K,"class","field-content svelte-1a1v6k0"),A(ee,"class","svelte-1a1v6k0"),A(ie,"class","hash-prefix svelte-1a1v6k0"),A(se,"type","text"),A(se,"placeholder","Tag"),A(se,"class","filter-input tag-name-input svelte-1a1v6k0"),A(se,"maxlength","1"),A(le,"type","text"),A(le,"placeholder","Value..."),A(le,"class","filter-input tag-value-input svelte-1a1v6k0"),A(ue,"class","add-btn svelte-1a1v6k0"),A(re,"class","tag-input-group svelte-1a1v6k0"),A(ne,"class","field-content svelte-1a1v6k0"),A(pe,"for","since-timestamp"),A(pe,"class","svelte-1a1v6k0"),A(ye,"id","since-timestamp"),A(ye,"type","datetime-local"),ye.value=t[32](),A(ye,"class","filter-input svelte-1a1v6k0"),A(me,"class","field-content timestamp-field svelte-1a1v6k0"),A(Ae,"for","until-timestamp"),A(Ae,"class","svelte-1a1v6k0"),A(Ie,"id","until-timestamp"),A(Ie,"type","datetime-local"),Ie.value=t[33](),A(Ie,"class","filter-input svelte-1a1v6k0"),A(ke,"class","field-content timestamp-field svelte-1a1v6k0"),A(xe,"for","limit"),A(xe,"class","svelte-1a1v6k0"),A(Qe,"id","limit"),A(Qe,"type","number"),A(Qe,"placeholder","Max events to return"),A(Qe,"class","filter-input svelte-1a1v6k0"),A(Qe,"min","1"),A(Se,"class","field-content svelte-1a1v6k0"),A(o,"class","filter-grid svelte-1a1v6k0"),A(i,"class","filter-content svelte-1a1v6k0"),A(Re,"class","clear-all-btn svelte-1a1v6k0"),A(Re,"title","Clear all filters"),A(Te,"class","spacer svelte-1a1v6k0"),A(Ne,"class","json-toggle-btn svelte-1a1v6k0"),A(Ne,"title","Edit filter JSON"),B(Ne,"active",t[8]),A($e,"class","clear-column svelte-1a1v6k0"),A(n,"class","filter-builder svelte-1a1v6k0")},m(e,r){u(e,n,r),c(n,i),c(i,o),c(o,s),c(o,a),c(o,l),c(l,f),I(f,t[0]),c(o,p),c(o,y),c(o,v),c(o,C),c(C,E),c(E,x),c(E,S),c(E,Q),c(E,F),c(C,D),He&&He.m(C,null),c(C,$),je&&je.m(C,null),c(o,R),c(o,P),c(o,T),c(o,U),c(U,N),c(N,L),I(L,t[13]),c(N,M),c(N,_),c(U,O),Ge&&Ge.m(U,null),c(U,H),Je&&Je.m(U,null),c(o,j),c(o,G),c(o,J),c(o,K),c(K,V),c(V,z),I(z,t[14]),c(V,q),c(V,Y),c(K,W),Ke&&Ke.m(K,null),c(K,Z),Ve&&Ve.m(K,null),c(o,X),c(o,ee),c(o,te),c(o,ne),c(ne,re),c(re,ie),c(re,oe),c(re,se),I(se,t[15]),c(re,ae),c(re,le),I(le,t[16]),c(re,ce),c(re,ue),c(ne,de),ze&&ze.m(ne,null),c(ne,fe),qe&&qe.m(ne,null),c(o,he),c(o,pe),c(o,ge),c(o,me),c(me,ye),c(me,we),Ye&&Ye.m(me,null),c(o,ve),c(o,Ae),c(o,be),c(o,ke),c(ke,Ie),c(ke,Ce),We&&We.m(ke,null),c(o,Ee),c(o,xe),c(o,Be),c(o,Se),c(Se,Qe),I(Qe,t[7]),c(o,Fe),Ze&&Ze.m(o,null),c(n,De),c(n,$e),c($e,Re),c($e,Pe),c($e,Te),c($e,Ue),c($e,Ne),Le||(Me=[w(f,"input",t[38]),w(E,"click",t[39]),w(L,"input",t[43]),w(L,"keydown",t[44]),w(_,"click",t[25]),w(z,"input",t[46]),w(z,"keydown",t[47]),w(Y,"click",t[27]),w(se,"input",t[49]),w(le,"input",t[50]),w(le,"keydown",t[51]),w(ue,"click",t[29]),w(ye,"change",t[34]),w(Ie,"change",t[35]),w(Qe,"input",t[55]),w(Re,"click",t[31]),w(Ne,"click",t[57])],Le=!0)},p(e,t){1&t[0]&&f.value!==e[0]&&I(f,e[0]),4096&t[0]&&_e!==(_e=e[12]?"▼":"▶")&&k(x,_e),2&t[0]&&Oe!==(Oe=e[1].length+"")&&k(Q,Oe),e[12]?He?He.p(e,t):(He=wm(e),He.c(),He.m(C,$)):He&&(He.d(1),He=null),e[1].length>0?je?je.p(e,t):(je=Am(e),je.c(),je.m(C,null)):je&&(je.d(1),je=null),8192&t[0]&&L.value!==e[13]&&I(L,e[13]),e[17]?Ge?Ge.p(e,t):(Ge=km(e),Ge.c(),Ge.m(U,H)):Ge&&(Ge.d(1),Ge=null),e[2].length>0?Je?Je.p(e,t):(Je=Im(e),Je.c(),Je.m(U,null)):Je&&(Je.d(1),Je=null),16384&t[0]&&z.value!==e[14]&&I(z,e[14]),e[18]?Ke?Ke.p(e,t):(Ke=Em(e),Ke.c(),Ke.m(K,Z)):Ke&&(Ke.d(1),Ke=null),e[3].length>0?Ve?Ve.p(e,t):(Ve=xm(e),Ve.c(),Ve.m(K,null)):Ve&&(Ve.d(1),Ve=null),32768&t[0]&&se.value!==e[15]&&I(se,e[15]),65536&t[0]&&le.value!==e[16]&&I(le,e[16]),e[19]?ze?ze.p(e,t):(ze=Sm(e),ze.c(),ze.m(ne,fe)):ze&&(ze.d(1),ze=null),e[4].length>0?qe?qe.p(e,t):(qe=Qm(e),qe.c(),qe.m(ne,null)):qe&&(qe.d(1),qe=null),e[5]?Ye?Ye.p(e,t):(Ye=Dm(e),Ye.c(),Ye.m(me,null)):Ye&&(Ye.d(1),Ye=null),e[6]?We?We.p(e,t):(We=$m(e),We.c(),We.m(ke,null)):We&&(We.d(1),We=null),128&t[0]&&b(Qe.value)!==e[7]&&I(Qe,e[7]),e[8]?Ze?Ze.p(e,t):(Ze=Rm(e),Ze.c(),Ze.m(o,null)):Ze&&(Ze.d(1),Ze=null),256&t[0]&&B(Ne,"active",e[8])},i:e,o:e,d(e){e&&d(n),He&&He.d(),je&&je.d(),Ge&&Ge.d(),Je&&Je.d(),Ke&&Ke.d(),Ve&&Ve.d(),ze&&ze.d(),qe&&qe.d(),Ye&&Ye.d(),We&&We.d(),Ze&&Ze.d(),Le=!1,r(Me)}}}function Um(e,t,n){let r,i;const o=R();let{searchText:s=""}=t,{selectedKinds:a=[]}=t,{pubkeys:l=[]}=t,{eventIds:c=[]}=t,{tags:u=[]}=t,{sinceTimestamp:d=null}=t,{untilTimestamp:f=null}=t,{limit:h=null}=t,{showJsonEditor:p=!1}=t,g="",m="",y=!1,w="",v="",A="",k="",I="",C="",E="",x="",B=null,S=!1;function Q(e){a.includes(e)?n(1,a=a.filter(t=>t!==e)):n(1,a=[...a,e].sort((e,t)=>e-t))}function F(e){n(1,a=a.filter(t=>t!==e))}function D(){const e=v.trim();e&&(um(e,64)?l.includes(e)?n(17,C="Pubkey already added"):(n(2,l=[...l,e]),n(13,v=""),n(17,C="")):n(17,C="Invalid pubkey: must be 64 character hex string"))}function P(e){n(2,l=l.filter(t=>t!==e))}function T(){const e=A.trim();e&&(um(e,64)?c.includes(e)?n(18,E="Event ID already added"):(n(3,c=[...c,e]),n(14,A=""),n(18,E="")):n(18,E="Invalid event ID: must be 64 character hex string"))}function U(e){n(3,c=c.filter(t=>t!==e))}function N(){const e=k.trim(),t=I.trim();e&&t&&(/^[a-zA-Z]$/.test(e)?u.some(n=>n.name===e&&n.value===t)?n(19,x="Tag already added"):(n(4,u=[...u,{name:e,value:t}]),n(15,k=""),n(16,I=""),n(19,x="")):n(19,x="Invalid tag name: must be single letter a-z or A-Z"))}function L(e){n(4,u=u.filter((t,n)=>n!==e))}function M(){o("apply",{searchText:s,selectedKinds:a,pubkeys:l,eventIds:c,tags:u,sinceTimestamp:d,untilTimestamp:f,limit:h})}$(()=>{B&&clearTimeout(B)});return e.$$set=e=>{"searchText"in e&&n(0,s=e.searchText),"selectedKinds"in e&&n(1,a=e.selectedKinds),"pubkeys"in e&&n(2,l=e.pubkeys),"eventIds"in e&&n(3,c=e.eventIds),"tags"in e&&n(4,u=e.tags),"sinceTimestamp"in e&&n(5,d=e.sinceTimestamp),"untilTimestamp"in e&&n(6,f=e.untilTimestamp),"limit"in e&&n(7,h=e.limit),"showJsonEditor"in e&&n(8,p=e.showJsonEditor)},e.$$.update=()=>{if(256&e.$$.dirty[0]&&p){const e=function(){const e={};return a.length>0&&(e.kinds=a),l.length>0&&(e.authors=l),c.length>0&&(e.ids=c),d&&(e.since=d),f&&(e.until=f),h&&(e.limit=h),s&&(e.search=s),u.forEach(t=>{const n=`#${t.name}`;e[n]||(e[n]=[]),e[n].push(t.value)}),e}();n(10,g=JSON.stringify(e,null,2))}255&e.$$.dirty[0]|32&e.$$.dirty[1]&&(S?(B&&clearTimeout(B),B=setTimeout(()=>{M()},1e3)):n(36,S=!0)),512&e.$$.dirty[0]|64&e.$$.dirty[1]&&n(20,i=r.filter(e=>e.kind.toString().includes(w)||e.name.toLowerCase().includes(w.toLowerCase())))},n(37,r=Object.entries(cm).map(([e,t])=>({kind:parseInt(e),name:t})).sort((e,t)=>e.kind-t.kind)),[s,a,l,c,u,d,f,h,p,w,g,m,y,v,A,k,I,C,E,x,i,o,function(){try{const e=JSON.parse(g);n(11,m=""),n(1,a=e.kinds||[]),n(2,l=e.authors||[]),n(3,c=e.ids||[]),n(5,d=e.since||null),n(6,f=e.until||null),n(7,h=e.limit||null),n(0,s=e.search||""),n(4,u=[]),Object.keys(e).forEach(t=>{if(t.startsWith("#")&&2===t.length){const n=t.slice(1);(Array.isArray(e[t])?e[t]:[e[t]]).forEach(e=>{u.push({name:n,value:String(e)})})}}),n(4,u),B&&clearTimeout(B),M()}catch(e){n(11,m="Invalid JSON: "+e.message)}},Q,F,D,P,T,U,N,L,function(){n(0,s=""),n(1,a=[]),n(2,l=[]),n(3,c=[]),n(4,u=[]),n(5,d=null),n(6,f=null),n(7,h=null),o("clear")},function(){return d?dm(d):""},function(){return f?dm(f):""},function(e){const t=e.target.value;n(5,d=t?fm(t):null)},function(e){const t=e.target.value;n(6,f=t?fm(t):null)},S,r,function(){s=this.value,n(0,s)},()=>n(12,y=!y),function(){w=this.value,n(9,w)},e=>Q(e),e=>F(e),function(){v=this.value,n(13,v)},e=>"Enter"===e.key&&D(),e=>P(e),function(){A=this.value,n(14,A)},e=>"Enter"===e.key&&T(),e=>U(e),function(){k=this.value,n(15,k)},function(){I=this.value,n(16,I)},e=>"Enter"===e.key&&N(),e=>L(e),()=>n(5,d=null),()=>n(6,f=null),function(){h=b(this.value),n(7,h)},function(){g=this.value,n(10,g),n(8,p)},()=>o("toggleJson")]}class Nm extends oe{constructor(e){super(),ie(this,e,Um,Tm,o,{searchText:0,selectedKinds:1,pubkeys:2,eventIds:3,tags:4,sinceTimestamp:5,untilTimestamp:6,limit:7,showJsonEditor:8},null,[-1,-1,-1])}}function Lm(e,t,n){const r=e.slice();return r[28]=t[n],r}function Mm(e,t,n){const r=e.slice();return r[31]=t[n],r}function _m(t){let n;return{c(){n=h("div"),n.innerHTML="

    ❌ Read, write, admin, or owner permission required to view all\n events.

    ",A(n,"class","permission-denied svelte-5kb1ec")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Om(e){let t,n,r,i;function o(e,t){return e[4].length>0?jm:e[6]?void 0:Hm}let s=o(e),a=s&&s(e),l=e[6]&&Wm();return{c(){t=h("div"),a&&a.c(),n=m(),l&&l.c(),A(t,"class","events-view-content svelte-5kb1ec")},m(o,s){u(o,t,s),a&&a.m(t,null),c(t,n),l&&l.m(t,null),r||(i=w(t,"scroll",e[9]),r=!0)},p(e,r){s===(s=o(e))&&a?a.p(e,r):(a&&a.d(1),a=s&&s(e),a&&(a.c(),a.m(t,n))),e[6]?l||(l=Wm(),l.c(),l.m(t,null)):l&&(l.d(1),l=null)},d(e){e&&d(t),a&&a.d(),l&&l.d(),r=!1,i()}}}function Hm(t){let n;return{c(){n=h("div"),n.innerHTML="

    No events found.

    ",A(n,"class","no-events svelte-5kb1ec")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function jm(e){let t,n=e[4],r=[];for(let t=0;t0&&Km(e);return{c(){t=h("div"),n=h("span"),n.textContent="🗑️ Delete Event",r=m(),i&&i.c(),A(n,"class","delete-event-label svelte-5kb1ec"),A(t,"class","delete-event-info svelte-5kb1ec")},m(e,o){u(e,t,o),c(t,n),c(t,r),i&&i.m(t,null)},p(e,n){e[28].tags&&e[28].tags.length>0?i?i.p(e,n):(i=Km(e),i.c(),i.m(t,null)):i&&(i.d(1),i=null)},d(e){e&&d(t),i&&i.d()}}}function Km(e){let t,n=e[28].tags.filter(sy),r=[];for(let t=0;t👤',o=m(),s=h("div"),a=h("div"),l=g(U),f=m(),p=h("div"),y=h("span"),v=g(N),b=m(),I=h("span"),C=g(L),E=m(),x=h("div"),S=h("div"),Q=g(M),F=m(),j.c(),D=m(),G&&G.c(),$=m(),V&&V.c(),R=m(),A(i,"class","events-view-avatar svelte-5kb1ec"),A(a,"class","events-view-author svelte-5kb1ec"),A(y,"class","kind-number svelte-5kb1ec"),B(y,"delete-event",5===e[28].kind),A(I,"class","kind-name svelte-5kb1ec"),A(p,"class","events-view-kind svelte-5kb1ec"),A(s,"class","events-view-info svelte-5kb1ec"),A(S,"class","event-timestamp svelte-5kb1ec"),A(x,"class","events-view-content svelte-5kb1ec"),A(n,"class","events-view-row svelte-5kb1ec"),A(n,"role","button"),A(n,"tabindex","0"),A(t,"class","events-view-item svelte-5kb1ec"),B(t,"expanded",e[5].has(e[28].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,C),c(n,E),c(n,x),c(x,S),c(S,Q),c(x,F),j.m(x,null),c(n,D),G&&G.m(n,null),c(t,$),V&&V.m(t,null),c(t,R),P||(T=[w(n,"click",J),w(n,"keydown",K)],P=!0)},p(r,i){e=r,16&i[0]&&U!==(U=ny(e[28].pubkey)+"")&&k(l,U),16&i[0]&&N!==(N=e[28].kind+"")&&k(v,N),16&i[0]&&B(y,"delete-event",5===e[28].kind),16&i[0]&&L!==(L=ry(e[28].kind)+"")&&k(C,L),16&i[0]&&M!==(M=iy(e[28].created_at)+"")&&k(Q,M),H===(H=O(e))&&j?j.p(e,i):(j.d(1),j=H(e),j&&(j.c(),j.m(x,null))),5!==e[28].kind&&("admin"===e[2]||"owner"===e[2]||"write"===e[2]&&e[28].pubkey&&e[28].pubkey===e[3])?G?G.p(e,i):(G=zm(e),G.c(),G.m(n,null)):G&&(G.d(1),G=null),48&i[0]&&(_=e[5].has(e[28].id)),_?V?V.p(e,i):(V=qm(e),V.c(),V.m(t,R)):V&&(V.d(1),V=null),48&i[0]&&B(t,"expanded",e[5].has(e[28].id))},d(e){e&&d(t),j.d(),G&&G.d(),V&&V.d(),P=!1,r(T)}}}function Wm(e){let t;return{c(){t=h("div"),t.innerHTML='
    \n

    Loading events...

    ',A(t,"class","loading-events svelte-5kb1ec")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function Zm(e){let t,n,i,o,s,a,l,f,p,y,v,b,k,I,C,E,x,S,Q,F,D,$,R,P;function T(e,t){return e[6]?ey:Xm}i=new Nm({props:{showJsonEditor:e[8]}}),i.$on("apply",e[17]),i.$on("clear",e[18]),i.$on("toggleJson",e[16]);let U=T(e),N=U(e);return{c(){t=h("div"),n=h("div"),ee(i.$$.fragment),o=m(),s=h("div"),a=h("div"),l=h("button"),l.innerHTML='',f=m(),p=h("div"),y=h("label"),v=h("input"),b=m(),k=h("span"),I=m(),C=h("span"),C.textContent="Only show my events",E=m(),x=h("div"),S=h("button"),Q=g("🔄 Load More"),F=m(),D=h("button"),N.c(),A(n,"class","filter-panel svelte-5kb1ec"),B(n,"open",e[7]),A(l,"class","filter-btn svelte-5kb1ec"),A(l,"title","Filter events"),B(l,"active",e[7]),A(v,"type","checkbox"),A(v,"class","svelte-5kb1ec"),A(k,"class","toggle-slider svelte-5kb1ec"),A(C,"class","toggle-label svelte-5kb1ec"),A(y,"class","toggle-container svelte-5kb1ec"),A(p,"class","events-view-toggle svelte-5kb1ec"),A(a,"class","events-view-left svelte-5kb1ec"),A(S,"class","refresh-btn svelte-5kb1ec"),S.disabled=e[6],A(D,"class","reload-btn svelte-5kb1ec"),D.disabled=e[6],A(x,"class","events-view-buttons svelte-5kb1ec"),A(s,"class","events-view-header svelte-5kb1ec"),A(t,"class","events-view-footer svelte-5kb1ec")},m(r,d){u(r,t,d),c(t,n),te(i,n,null),c(t,o),c(t,s),c(s,a),c(a,l),c(a,f),c(a,p),c(p,y),c(y,v),v.checked=e[0],c(y,b),c(y,k),c(y,I),c(y,C),c(s,E),c(s,x),c(x,S),c(S,Q),c(x,F),c(x,D),N.m(D,null),$=!0,R||(P=[w(l,"click",e[15]),w(v,"change",e[23]),w(v,"change",e[24]),w(S,"click",e[25]),w(D,"click",e[26])],R=!0)},p(e,t){const r={};256&t[0]&&(r.showJsonEditor=e[8]),i.$set(r),(!$||128&t[0])&&B(n,"open",e[7]),(!$||128&t[0])&&B(l,"active",e[7]),1&t[0]&&(v.checked=e[0]),(!$||64&t[0])&&(S.disabled=e[6]),U!==(U=T(e))&&(N.d(1),N=U(e),N&&(N.c(),N.m(D,null))),(!$||64&t[0])&&(D.disabled=e[6])},i(e){$||(W(i.$$.fragment,e),$=!0)},o(e){Z(i.$$.fragment,e),$=!1},d(e){e&&d(t),ne(i),N.d(),R=!1,r(P)}}}function Xm(e){let t;return{c(){t=g("🔄")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function ey(e){let t;return{c(){t=h("div"),A(t,"class","spinner svelte-5kb1ec")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function ty(e){let t,n,r;function i(e,t){return!e[1]||"read"!==e[2]&&"write"!==e[2]&&"admin"!==e[2]&&"owner"!==e[2]?_m:Om}let o=i(e),s=o(e),a=e[1]&&("read"===e[2]||"write"===e[2]||"admin"===e[2]||"owner"===e[2])&&Zm(e);return{c(){t=h("div"),s.c(),n=m(),a&&a.c(),A(t,"class","events-view-container svelte-5kb1ec")},m(e,i){u(e,t,i),s.m(t,null),c(t,n),a&&a.m(t,null),r=!0},p(e,r){o===(o=i(e))&&s?s.p(e,r):(s.d(1),s=o(e),s&&(s.c(),s.m(t,n))),!e[1]||"read"!==e[2]&&"write"!==e[2]&&"admin"!==e[2]&&"owner"!==e[2]?a&&(q(),Z(a,1,1,()=>{a=null}),Y()):a?(a.p(e,r),6&r[0]&&W(a,1)):(a=Zm(e),a.c(),W(a,1),a.m(t,null))},i(e){r||(W(a),r=!0)},o(e){Z(a),r=!1},d(e){e&&d(t),s.d(),a&&a.d()}}}function ny(e){return e?e.slice(0,8)+"..."+e.slice(-8):""}function ry(e){return{0:"Profile",1:"Text Note",2:"Recommend Relay",3:"Contacts",4:"Encrypted DM",5:"Delete",6:"Repost",7:"Reaction",8:"Badge Award",16:"Generic Repost",40:"Channel Creation",41:"Channel Metadata",42:"Channel Message",43:"Channel Hide Message",44:"Channel Mute User",1984:"Reporting",9734:"Zap Request",9735:"Zap",1e4:"Mute List",10001:"Pin List",10002:"Relay List",22242:"Client Auth",24133:"Nostr Connect",27235:"HTTP Auth",3e4:"Categorized People",30001:"Categorized Bookmarks",30008:"Profile Badges",30009:"Badge Definition",30017:"Create or update a stall",30018:"Create or update a product",30023:"Long-form Content",30024:"Draft Long-form Content",30078:"Application-specific Data",30311:"Live Event",30315:"User Statuses",30402:"Classified Listing",30403:"Draft Classified Listing",31922:"Date-Based Calendar Event",31923:"Time-Based Calendar Event",31924:"Calendar",31925:"Calendar Event RSVP",31989:"Handler recommendation",31990:"Handler information",34550:"Community Definition"}[e]||`Kind ${e}`}function iy(e){return new Date(1e3*e).toLocaleString()}function oy(e){return e?e.length>100?e.slice(0,100)+"...":e:""}const sy=e=>"e"===e[0];function ay(e,t,n){let{isLoggedIn:r=!1}=t,{userRole:i=""}=t,{userPubkey:o=""}=t,{filteredEvents:s=[]}=t,{expandedEvents:a=new Set}=t,{isLoadingEvents:l=!1}=t,{showOnlyMyEvents:c=!1}=t,{showFilterBuilder:u=!1}=t;const d=R();let f=!1;function h(e){d("toggleEventExpansion",e)}function p(e){d("deleteEvent",e)}function g(e,t){d("copyEventToClipboard",{event:e,e:t})}function m(){d("toggleChange")}function y(e,t){d("loadAllEvents",{refresh:e,authors:t})}return e.$$set=e=>{"isLoggedIn"in e&&n(1,r=e.isLoggedIn),"userRole"in e&&n(2,i=e.userRole),"userPubkey"in e&&n(3,o=e.userPubkey),"filteredEvents"in e&&n(4,s=e.filteredEvents),"expandedEvents"in e&&n(5,a=e.expandedEvents),"isLoadingEvents"in e&&n(6,l=e.isLoadingEvents),"showOnlyMyEvents"in e&&n(0,c=e.showOnlyMyEvents),"showFilterBuilder"in e&&n(7,u=e.showFilterBuilder)},[c,r,i,o,s,a,l,u,f,function(e){d("scroll",e)},h,p,g,m,y,function(){d("toggleFilterBuilder")},function(){n(8,f=!f)},function(e){d("filterApply",e.detail)},function(){d("filterClear")},e=>p(e.id),e=>h(e.id),(e,t)=>"Enter"===t.key&&h(e.id),(e,t)=>g(e,t),function(){c=this.checked,n(0,c)},()=>m(),()=>{y(!1,c&&o?[o]:null)},()=>{y(!0,c&&o?[o]:null)}]}class ly extends oe{constructor(e){super(),ie(this,e,ay,ty,o,{isLoggedIn:1,userRole:2,userPubkey:3,filteredEvents:4,expandedEvents:5,isLoadingEvents:6,showOnlyMyEvents:0,showFilterBuilder:7},null,[-1,-1])}}const cy=[{kind:0,name:"Metadata",description:"User profile information (name, about, picture, nip05, etc.)",nip:"01",isReplaceable:!0,template:{kind:0,content:"",tags:[]}},{kind:1,name:"Short Text Note",description:"Short-form text post (like a tweet)",nip:"01",template:{kind:1,content:"",tags:[]}},{kind:2,name:"Recommend Relay",description:"Relay recommendation",nip:"01",deprecated:!0,template:{kind:2,content:"",tags:[]}},{kind:3,name:"Follows",description:"Following list with optional relay hints",nip:"02",isReplaceable:!0,template:{kind:3,content:"",tags:[]}},{kind:4,name:"Encrypted Direct Message",description:"Private message using NIP-04 encryption",nip:"04",deprecated:!0,template:{kind:4,content:"",tags:[]}},{kind:5,name:"Event Deletion Request",description:"Request to delete events",nip:"09",template:{kind:5,content:"",tags:[]}},{kind:6,name:"Repost",description:"Share/repost another text note",nip:"18",template:{kind:6,content:"",tags:[]}},{kind:7,name:"Reaction",description:"Like, emoji reaction to an event",nip:"25",template:{kind:7,content:"",tags:[]}},{kind:8,name:"Badge Award",description:"Award a badge to someone",nip:"58",template:{kind:8,content:"",tags:[]}},{kind:9,name:"Chat Message",description:"Chat message",nip:"C7",template:{kind:9,content:"",tags:[]}},{kind:10,name:"Group Chat Threaded Reply",description:"Threaded reply in group chat",nip:"29",deprecated:!0,template:{kind:10,content:"",tags:[]}},{kind:11,name:"Thread",description:"Thread event",nip:"7D",template:{kind:11,content:"",tags:[]}},{kind:12,name:"Group Thread Reply",description:"Reply in group thread",nip:"29",deprecated:!0,template:{kind:12,content:"",tags:[]}},{kind:13,name:"Seal",description:"Sealed/encrypted event wrapper",nip:"59",template:{kind:13,content:"",tags:[]}},{kind:14,name:"Direct Message",description:"Private direct message using NIP-17",nip:"17",template:{kind:14,content:"",tags:[]}},{kind:15,name:"File Message",description:"File message in DMs",nip:"17",template:{kind:15,content:"",tags:[]}},{kind:16,name:"Generic Repost",description:"Repost any event kind",nip:"18",template:{kind:16,content:"",tags:[]}},{kind:17,name:"Reaction to Website",description:"Reaction to a website URL",nip:"25",template:{kind:17,content:"",tags:[]}},{kind:20,name:"Picture",description:"Picture-first feed post",nip:"68",template:{kind:20,content:"",tags:[]}},{kind:21,name:"Video Event",description:"Horizontal video event",nip:"71",template:{kind:21,content:"",tags:[]}},{kind:22,name:"Short-form Video",description:"Short-form portrait video (like TikTok)",nip:"71",template:{kind:22,content:"",tags:[]}},{kind:40,name:"Channel Creation",description:"Create a public chat channel",nip:"28",template:{kind:40,content:"",tags:[]}},{kind:41,name:"Channel Metadata",description:"Set channel name, about, picture",nip:"28",template:{kind:41,content:"",tags:[]}},{kind:42,name:"Channel Message",description:"Post message in channel",nip:"28",template:{kind:42,content:"",tags:[]}},{kind:43,name:"Channel Hide Message",description:"Hide a message in channel",nip:"28",template:{kind:43,content:"",tags:[]}},{kind:44,name:"Channel Mute User",description:"Mute a user in channel",nip:"28",template:{kind:44,content:"",tags:[]}},{kind:62,name:"Request to Vanish",description:"Request permanent deletion of all user data",nip:"62",template:{kind:62,content:"",tags:[]}},{kind:64,name:"Chess (PGN)",description:"Chess game in PGN format",nip:"64",template:{kind:64,content:"",tags:[]}},{kind:443,name:"KeyPackage",description:"Marmot protocol key package",nip:null,spec:"Marmot",template:{kind:443,content:"",tags:[]}},{kind:444,name:"Welcome Message",description:"Marmot protocol welcome message",nip:null,spec:"Marmot",template:{kind:444,content:"",tags:[]}},{kind:445,name:"Group Event",description:"Marmot protocol group event",nip:null,spec:"Marmot",template:{kind:445,content:"",tags:[]}},{kind:818,name:"Merge Requests",description:"Git merge request",nip:"54",template:{kind:818,content:"",tags:[]}},{kind:1018,name:"Poll Response",description:"Response to a poll",nip:"88",template:{kind:1018,content:"",tags:[]}},{kind:1021,name:"Bid",description:"Auction bid",nip:"15",template:{kind:1021,content:"",tags:[]}},{kind:1022,name:"Bid Confirmation",description:"Confirmation of auction bid",nip:"15",template:{kind:1022,content:"",tags:[]}},{kind:1040,name:"OpenTimestamps",description:"OpenTimestamps attestation",nip:"03",template:{kind:1040,content:"",tags:[]}},{kind:1059,name:"Gift Wrap",description:"Encrypted gift-wrapped event",nip:"59",template:{kind:1059,content:"",tags:[]}},{kind:1060,name:"Gift Wrap (Kind 4)",description:"Gift wrap variant for NIP-04 compatibility",nip:"59",template:{kind:1060,content:"",tags:[]}},{kind:1063,name:"File Metadata",description:"Metadata for shared files",nip:"94",template:{kind:1063,content:"",tags:[]}},{kind:1068,name:"Poll",description:"Create a poll",nip:"88",template:{kind:1068,content:"",tags:[]}},{kind:1111,name:"Comment",description:"Comment on events or external content",nip:"22",template:{kind:1111,content:"",tags:[]}},{kind:1222,name:"Voice Message",description:"Voice message",nip:"A0",template:{kind:1222,content:"",tags:[]}},{kind:1244,name:"Voice Message Comment",description:"Comment on voice message",nip:"A0",template:{kind:1244,content:"",tags:[]}},{kind:1311,name:"Live Chat Message",description:"Message in live stream chat",nip:"53",template:{kind:1311,content:"",tags:[]}},{kind:1337,name:"Code Snippet",description:"Code snippet post",nip:"C0",template:{kind:1337,content:"",tags:[]}},{kind:1517,name:"Bitcoin Block",description:"Bitcoin block data",nip:null,spec:"Nostrocket",template:{kind:1517,content:"",tags:[]}},{kind:1617,name:"Patches",description:"Git patches",nip:"34",template:{kind:1617,content:"",tags:[]}},{kind:1618,name:"Pull Requests",description:"Git pull request",nip:"34",template:{kind:1618,content:"",tags:[]}},{kind:1619,name:"Pull Request Updates",description:"Updates to git pull request",nip:"34",template:{kind:1619,content:"",tags:[]}},{kind:1621,name:"Issues",description:"Git issues",nip:"34",template:{kind:1621,content:"",tags:[]}},{kind:1622,name:"Git Replies",description:"Replies on git objects",nip:"34",deprecated:!0,template:{kind:1622,content:"",tags:[]}},{kind:1630,name:"Status",description:"Git status",nip:"34",template:{kind:1630,content:"",tags:[]}},{kind:1631,name:"Status",description:"Git status",nip:"34",template:{kind:1631,content:"",tags:[]}},{kind:1632,name:"Status",description:"Git status",nip:"34",template:{kind:1632,content:"",tags:[]}},{kind:1633,name:"Status",description:"Git status",nip:"34",template:{kind:1633,content:"",tags:[]}},{kind:1808,name:"Live Stream",description:"Live streaming event",nip:null,spec:"zap.stream",template:{kind:1808,content:"",tags:[]}},{kind:1971,name:"Problem Tracker",description:"Problem tracking",nip:null,spec:"Nostrocket",template:{kind:1971,content:"",tags:[]}},{kind:1984,name:"Reporting",description:"Report content or users",nip:"56",template:{kind:1984,content:"",tags:[]}},{kind:1985,name:"Label",description:"Label/tag content with namespace",nip:"32",template:{kind:1985,content:"",tags:[]}},{kind:1986,name:"Relay Reviews",description:"Reviews of relays",nip:null,template:{kind:1986,content:"",tags:[]}},{kind:1987,name:"AI Embeddings",description:"AI embeddings/vector lists",nip:null,spec:"NKBIP-02",template:{kind:1987,content:"",tags:[]}},{kind:2003,name:"Torrent",description:"Torrent magnet link",nip:"35",template:{kind:2003,content:"",tags:[]}},{kind:2004,name:"Torrent Comment",description:"Comment on torrent",nip:"35",template:{kind:2004,content:"",tags:[]}},{kind:2022,name:"Coinjoin Pool",description:"Coinjoin coordination",nip:null,spec:"joinstr",template:{kind:2022,content:"",tags:[]}},{kind:4550,name:"Community Post Approval",description:"Approve post in community",nip:"72",template:{kind:4550,content:"",tags:[]}},{kind:5e3,name:"Job Request",description:"Data vending machine job request (start of range)",nip:"90",template:{kind:5e3,content:"",tags:[]}},{kind:6e3,name:"Job Result",description:"Data vending machine job result (start of range)",nip:"90",template:{kind:6e3,content:"",tags:[]}},{kind:7e3,name:"Job Feedback",description:"Feedback on job request/result",nip:"90",template:{kind:7e3,content:"",tags:[]}},{kind:7374,name:"Reserved Cashu Wallet Tokens",description:"Reserved Cashu wallet tokens",nip:"60",template:{kind:7374,content:"",tags:[]}},{kind:7375,name:"Cashu Wallet Tokens",description:"Cashu wallet tokens",nip:"60",template:{kind:7375,content:"",tags:[]}},{kind:7376,name:"Cashu Wallet History",description:"Cashu wallet transaction history",nip:"60",template:{kind:7376,content:"",tags:[]}},{kind:7516,name:"Geocache Log",description:"Geocaching log entry",nip:null,spec:"geocaching",template:{kind:7516,content:"",tags:[]}},{kind:7517,name:"Geocache Proof of Find",description:"Proof of geocache find",nip:null,spec:"geocaching",template:{kind:7517,content:"",tags:[]}},{kind:8e3,name:"Add User",description:"Add user to group",nip:"43",template:{kind:8e3,content:"",tags:[]}},{kind:8001,name:"Remove User",description:"Remove user from group",nip:"43",template:{kind:8001,content:"",tags:[]}},{kind:9e3,name:"Group Control Events",description:"Group control events (start of range)",nip:"29",template:{kind:9e3,content:"",tags:[]}},{kind:9041,name:"Zap Goal",description:"Fundraising goal for zaps",nip:"75",template:{kind:9041,content:"",tags:[]}},{kind:9321,name:"Nutzap",description:"Cashu nutzap",nip:"61",template:{kind:9321,content:"",tags:[]}},{kind:9467,name:"Tidal Login",description:"Tidal streaming login",nip:null,spec:"Tidal-nostr",template:{kind:9467,content:"",tags:[]}},{kind:9734,name:"Zap Request",description:"Request Lightning payment",nip:"57",template:{kind:9734,content:"",tags:[]}},{kind:9735,name:"Zap",description:"Lightning payment receipt",nip:"57",template:{kind:9735,content:"",tags:[]}},{kind:9802,name:"Highlights",description:"Highlighted text selection",nip:"84",template:{kind:9802,content:"",tags:[]}},{kind:1e4,name:"Mute List",description:"List of muted users/content",nip:"51",isReplaceable:!0,template:{kind:1e4,content:"",tags:[]}},{kind:10001,name:"Pin List",description:"Pinned events",nip:"51",isReplaceable:!0,template:{kind:10001,content:"",tags:[]}},{kind:10002,name:"Relay List Metadata",description:"User's preferred relays for read/write",nip:"65",isReplaceable:!0,template:{kind:10002,content:"",tags:[]}},{kind:10003,name:"Bookmark List",description:"Bookmarked events",nip:"51",isReplaceable:!0,template:{kind:10003,content:"",tags:[]}},{kind:10004,name:"Communities List",description:"Communities user belongs to",nip:"51",isReplaceable:!0,template:{kind:10004,content:"",tags:[]}},{kind:10005,name:"Public Chats List",description:"Public chats user is in",nip:"51",isReplaceable:!0,template:{kind:10005,content:"",tags:[]}},{kind:10006,name:"Blocked Relays List",description:"Relays user has blocked",nip:"51",isReplaceable:!0,template:{kind:10006,content:"",tags:[]}},{kind:10007,name:"Search Relays List",description:"Preferred search relays",nip:"51",isReplaceable:!0,template:{kind:10007,content:"",tags:[]}},{kind:10008,name:"Relay Group Configuration",description:"Relay group configuration",nip:null,isReplaceable:!0,template:{kind:10008,content:"",tags:[]}},{kind:10009,name:"User Groups",description:"Groups user belongs to",nip:"29",isReplaceable:!0,template:{kind:10009,content:"",tags:[]}},{kind:10012,name:"Favorite Relays List",description:"User's favorite relays",nip:"51",isReplaceable:!0,template:{kind:10012,content:"",tags:[]}},{kind:10013,name:"Private Event Relay List",description:"Relays for private events",nip:"37",isReplaceable:!0,template:{kind:10013,content:"",tags:[]}},{kind:10015,name:"Interests List",description:"User interests/topics",nip:"51",isReplaceable:!0,template:{kind:10015,content:"",tags:[]}},{kind:10019,name:"Nutzap Mint Recommendation",description:"Recommended Cashu mints for nutzaps",nip:"61",isReplaceable:!0,template:{kind:10019,content:"",tags:[]}},{kind:10020,name:"Media Follows",description:"Followed media accounts",nip:"51",isReplaceable:!0,template:{kind:10020,content:"",tags:[]}},{kind:10030,name:"User Emoji List",description:"Custom emoji list",nip:"51",isReplaceable:!0,template:{kind:10030,content:"",tags:[]}},{kind:10050,name:"DM Relays List",description:"Relays to receive DMs on",nip:"17",isReplaceable:!0,template:{kind:10050,content:"",tags:[]}},{kind:10051,name:"KeyPackage Relays List",description:"Marmot key package relays",nip:null,isReplaceable:!0,spec:"Marmot",template:{kind:10051,content:"",tags:[]}},{kind:10063,name:"User Server List",description:"Blossom server list",nip:null,isReplaceable:!0,spec:"Blossom",template:{kind:10063,content:"",tags:[]}},{kind:10096,name:"File Storage Server List",description:"File storage servers",nip:"96",isReplaceable:!0,deprecated:!0,template:{kind:10096,content:"",tags:[]}},{kind:10166,name:"Relay Monitor Announcement",description:"Relay monitoring announcement",nip:"66",isReplaceable:!0,template:{kind:10166,content:"",tags:[]}},{kind:10312,name:"Room Presence",description:"Presence in live room",nip:"53",isReplaceable:!0,template:{kind:10312,content:"",tags:[]}},{kind:10377,name:"Proxy Announcement",description:"Nostr proxy announcement",nip:null,isReplaceable:!0,spec:"Nostr Epoxy",template:{kind:10377,content:"",tags:[]}},{kind:11111,name:"Transport Method Announcement",description:"Transport method announcement",nip:null,isReplaceable:!0,spec:"Nostr Epoxy",template:{kind:11111,content:"",tags:[]}},{kind:12345,name:"Relay Policy Configuration",description:"Relay-internal policy configuration (admin only)",nip:null,isReplaceable:!0,spec:"orly",template:{kind:12345,content:"",tags:[]}},{kind:13004,name:"JWT Binding",description:"Link between JWT certificate and pubkey",nip:null,isReplaceable:!0,template:{kind:13004,content:"",tags:[]}},{kind:13194,name:"Wallet Service Info",description:"NWC wallet service information",nip:"47",isReplaceable:!0,template:{kind:13194,content:"",tags:[]}},{kind:13534,name:"Membership Lists",description:"Group membership lists",nip:"43",isReplaceable:!0,template:{kind:13534,content:"",tags:[]}},{kind:14388,name:"User Sound Effect Lists",description:"Sound effect lists",nip:null,isReplaceable:!0,spec:"Corny Chat",template:{kind:14388,content:"",tags:[]}},{kind:17375,name:"Cashu Wallet Event",description:"Cashu wallet event",nip:"60",isReplaceable:!0,template:{kind:17375,content:"",tags:[]}},{kind:21e3,name:"Lightning Pub RPC",description:"Lightning.Pub RPC",nip:null,isEphemeral:!0,spec:"Lightning.Pub",template:{kind:21e3,content:"",tags:[]}},{kind:22242,name:"Client Authentication",description:"Authenticate to relay",nip:"42",isEphemeral:!0,template:{kind:22242,content:"",tags:[]}},{kind:23194,name:"Wallet Request",description:"NWC wallet request",nip:"47",isEphemeral:!0,template:{kind:23194,content:"",tags:[]}},{kind:23195,name:"Wallet Response",description:"NWC wallet response",nip:"47",isEphemeral:!0,template:{kind:23195,content:"",tags:[]}},{kind:23196,name:"Wallet Notification (NIP-04)",description:"NWC wallet notification (NIP-04 encrypted)",nip:"47",isEphemeral:!0,template:{kind:23196,content:"",tags:[]}},{kind:23197,name:"Wallet Notification",description:"NWC wallet notification",nip:"47",isEphemeral:!0,template:{kind:23197,content:"",tags:[]}},{kind:24133,name:"Nostr Connect",description:"Remote signer connection",nip:"46",isEphemeral:!0,template:{kind:24133,content:"",tags:[]}},{kind:24242,name:"Blobs Stored on Mediaservers",description:"Blossom blob storage",nip:null,isEphemeral:!0,spec:"Blossom",template:{kind:24242,content:"",tags:[]}},{kind:27235,name:"HTTP Auth",description:"Authenticate HTTP requests",nip:"98",isEphemeral:!0,template:{kind:27235,content:"",tags:[]}},{kind:28934,name:"Join Request",description:"Request to join group",nip:"43",isEphemeral:!0,template:{kind:28934,content:"",tags:[]}},{kind:28935,name:"Invite Request",description:"Invite to group",nip:"43",isEphemeral:!0,template:{kind:28935,content:"",tags:[]}},{kind:28936,name:"Leave Request",description:"Leave group request",nip:"43",isEphemeral:!0,template:{kind:28936,content:"",tags:[]}},{kind:3e4,name:"Follow Sets",description:"Categorized people lists",nip:"51",isAddressable:!0,template:{kind:3e4,content:"",tags:[["d","identifier"]]}},{kind:30001,name:"Generic Lists",description:"Generic categorized lists",nip:"51",isAddressable:!0,deprecated:!0,template:{kind:30001,content:"",tags:[["d","identifier"]]}},{kind:30002,name:"Relay Sets",description:"Categorized relay lists",nip:"51",isAddressable:!0,template:{kind:30002,content:"",tags:[["d","identifier"]]}},{kind:30003,name:"Bookmark Sets",description:"Categorized bookmark lists",nip:"51",isAddressable:!0,template:{kind:30003,content:"",tags:[["d","identifier"]]}},{kind:30004,name:"Curation Sets",description:"Curated content sets",nip:"51",isAddressable:!0,template:{kind:30004,content:"",tags:[["d","identifier"]]}},{kind:30005,name:"Video Sets",description:"Video playlists",nip:"51",isAddressable:!0,template:{kind:30005,content:"",tags:[["d","identifier"]]}},{kind:30007,name:"Kind Mute Sets",description:"Muted event kinds",nip:"51",isAddressable:!0,template:{kind:30007,content:"",tags:[["d","identifier"]]}},{kind:30008,name:"Profile Badges",description:"Badges displayed on profile",nip:"58",isAddressable:!0,template:{kind:30008,content:"",tags:[["d","identifier"]]}},{kind:30009,name:"Badge Definition",description:"Define a badge/achievement",nip:"58",isAddressable:!0,template:{kind:30009,content:"",tags:[["d","identifier"]]}},{kind:30015,name:"Interest Sets",description:"Interest/topic sets",nip:"51",isAddressable:!0,template:{kind:30015,content:"",tags:[["d","identifier"]]}},{kind:30017,name:"Stall",description:"Marketplace stall definition",nip:"15",isAddressable:!0,template:{kind:30017,content:"",tags:[["d","identifier"]]}},{kind:30018,name:"Product",description:"Marketplace product listing",nip:"15",isAddressable:!0,template:{kind:30018,content:"",tags:[["d","identifier"]]}},{kind:30019,name:"Marketplace UI/UX",description:"Marketplace interface settings",nip:"15",isAddressable:!0,template:{kind:30019,content:"",tags:[["d","identifier"]]}},{kind:30020,name:"Product Sold as Auction",description:"Auction product listing",nip:"15",isAddressable:!0,template:{kind:30020,content:"",tags:[["d","identifier"]]}},{kind:30023,name:"Long-form Content",description:"Blog post, article in markdown",nip:"23",isAddressable:!0,template:{kind:30023,content:"",tags:[["d","identifier"]]}},{kind:30024,name:"Draft Long-form Content",description:"Draft article",nip:"23",isAddressable:!0,template:{kind:30024,content:"",tags:[["d","identifier"]]}},{kind:30030,name:"Emoji Sets",description:"Custom emoji sets",nip:"51",isAddressable:!0,template:{kind:30030,content:"",tags:[["d","identifier"]]}},{kind:30040,name:"Curated Publication Index",description:"Publication index",nip:null,isAddressable:!0,spec:"NKBIP-01",template:{kind:30040,content:"",tags:[["d","identifier"]]}},{kind:30041,name:"Curated Publication Content",description:"Publication content",nip:null,isAddressable:!0,spec:"NKBIP-01",template:{kind:30041,content:"",tags:[["d","identifier"]]}},{kind:30063,name:"Release Artifact Sets",description:"Software release artifacts",nip:"51",isAddressable:!0,template:{kind:30063,content:"",tags:[["d","identifier"]]}},{kind:30078,name:"Application-specific Data",description:"App-specific key-value storage",nip:"78",isAddressable:!0,template:{kind:30078,content:"",tags:[["d","identifier"]]}},{kind:30166,name:"Relay Discovery",description:"Relay discovery/monitoring",nip:"66",isAddressable:!0,template:{kind:30166,content:"",tags:[["d","identifier"]]}},{kind:30267,name:"App Curation Sets",description:"Curated app sets",nip:"51",isAddressable:!0,template:{kind:30267,content:"",tags:[["d","identifier"]]}},{kind:30311,name:"Live Event",description:"Live streaming event",nip:"53",isAddressable:!0,template:{kind:30311,content:"",tags:[["d","identifier"]]}},{kind:30312,name:"Interactive Room",description:"Interactive live room",nip:"53",isAddressable:!0,template:{kind:30312,content:"",tags:[["d","identifier"]]}},{kind:30313,name:"Conference Event",description:"Conference/meetup event",nip:"53",isAddressable:!0,template:{kind:30313,content:"",tags:[["d","identifier"]]}},{kind:30315,name:"User Statuses",description:"User status updates",nip:"38",isAddressable:!0,template:{kind:30315,content:"",tags:[["d","identifier"]]}},{kind:30388,name:"Slide Set",description:"Presentation slides",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:30388,content:"",tags:[["d","identifier"]]}},{kind:30402,name:"Classified Listing",description:"Classified ad listing",nip:"99",isAddressable:!0,template:{kind:30402,content:"",tags:[["d","identifier"]]}},{kind:30403,name:"Draft Classified Listing",description:"Draft classified ad",nip:"99",isAddressable:!0,template:{kind:30403,content:"",tags:[["d","identifier"]]}},{kind:30617,name:"Repository Announcements",description:"Git repository announcement",nip:"34",isAddressable:!0,template:{kind:30617,content:"",tags:[["d","identifier"]]}},{kind:30618,name:"Repository State Announcements",description:"Git repository state",nip:"34",isAddressable:!0,template:{kind:30618,content:"",tags:[["d","identifier"]]}},{kind:30818,name:"Wiki Article",description:"Wiki article",nip:"54",isAddressable:!0,template:{kind:30818,content:"",tags:[["d","identifier"]]}},{kind:30819,name:"Redirects",description:"URL redirects",nip:"54",isAddressable:!0,template:{kind:30819,content:"",tags:[["d","identifier"]]}},{kind:31234,name:"Draft Event",description:"Draft of any event",nip:"37",isAddressable:!0,template:{kind:31234,content:"",tags:[["d","identifier"]]}},{kind:31388,name:"Link Set",description:"Link collection",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:31388,content:"",tags:[["d","identifier"]]}},{kind:31890,name:"Feed",description:"Custom feed definition",nip:null,isAddressable:!0,spec:"NUD: Custom Feeds",template:{kind:31890,content:"",tags:[["d","identifier"]]}},{kind:31922,name:"Date-Based Calendar Event",description:"All-day calendar event",nip:"52",isAddressable:!0,template:{kind:31922,content:"",tags:[["d","identifier"]]}},{kind:31923,name:"Time-Based Calendar Event",description:"Calendar event with time",nip:"52",isAddressable:!0,template:{kind:31923,content:"",tags:[["d","identifier"]]}},{kind:31924,name:"Calendar",description:"Calendar definition",nip:"52",isAddressable:!0,template:{kind:31924,content:"",tags:[["d","identifier"]]}},{kind:31925,name:"Calendar Event RSVP",description:"RSVP to calendar event",nip:"52",isAddressable:!0,template:{kind:31925,content:"",tags:[["d","identifier"]]}},{kind:31989,name:"Handler Recommendation",description:"Recommended app for event kind",nip:"89",isAddressable:!0,template:{kind:31989,content:"",tags:[["d","identifier"]]}},{kind:31990,name:"Handler Information",description:"App handler declaration",nip:"89",isAddressable:!0,template:{kind:31990,content:"",tags:[["d","identifier"]]}},{kind:32123,name:"WaveLake Track",description:"WaveLake music track",nip:null,isAddressable:!0,spec:"WaveLake",template:{kind:32123,content:"",tags:[["d","identifier"]]}},{kind:32267,name:"Software Application",description:"Software application listing",nip:null,isAddressable:!0,template:{kind:32267,content:"",tags:[["d","identifier"]]}},{kind:32388,name:"User Room Favorites",description:"Favorite rooms",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:32388,content:"",tags:[["d","identifier"]]}},{kind:33388,name:"High Scores",description:"Game high scores",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:33388,content:"",tags:[["d","identifier"]]}},{kind:34235,name:"Video Event Horizontal",description:"Horizontal video event",nip:"71",isAddressable:!0,template:{kind:34235,content:"",tags:[["d","identifier"]]}},{kind:34236,name:"Video Event Vertical",description:"Vertical video event",nip:"71",isAddressable:!0,template:{kind:34236,content:"",tags:[["d","identifier"]]}},{kind:34388,name:"Sound Effects",description:"Sound effect definitions",nip:null,isAddressable:!0,spec:"Corny Chat",template:{kind:34388,content:"",tags:[["d","identifier"]]}},{kind:34550,name:"Community Definition",description:"Define a community",nip:"72",isAddressable:!0,template:{kind:34550,content:"",tags:[["d","identifier"]]}},{kind:37516,name:"Geocache Listing",description:"Geocache location listing",nip:null,isAddressable:!0,spec:"geocaching",template:{kind:37516,content:"",tags:[["d","identifier"]]}},{kind:38172,name:"Cashu Mint Announcement",description:"Cashu mint announcement",nip:"87",isAddressable:!0,template:{kind:38172,content:"",tags:[["d","identifier"]]}},{kind:38173,name:"Fedimint Announcement",description:"Fedimint announcement",nip:"87",isAddressable:!0,template:{kind:38173,content:"",tags:[["d","identifier"]]}},{kind:38383,name:"Peer-to-peer Order Events",description:"P2P trading orders",nip:"69",isAddressable:!0,template:{kind:38383,content:"",tags:[["d","identifier"]]}},{kind:39e3,name:"Group Metadata Events",description:"Group metadata (start of range)",nip:"29",isAddressable:!0,template:{kind:39e3,content:"",tags:[["d","identifier"]]}},{kind:39089,name:"Starter Packs",description:"Starter pack lists",nip:"51",isAddressable:!0,template:{kind:39089,content:"",tags:[["d","identifier"]]}},{kind:39092,name:"Media Starter Packs",description:"Media starter packs",nip:"51",isAddressable:!0,template:{kind:39092,content:"",tags:[["d","identifier"]]}},{kind:39701,name:"Web Bookmarks",description:"Web URL bookmarks",nip:"B0",isAddressable:!0,template:{kind:39701,content:"",tags:[["d","identifier"]]}},{kind:39998,name:"ACL Event",description:"Access control list event",nip:null,isAddressable:!0,template:{kind:39998,content:"",tags:[["d","identifier"]]}}];function uy(e,t=null){const n=function(e){return cy.find(t=>t.kind===e)}(e);return n?{...n.template,created_at:Math.floor(Date.now()/1e3),pubkey:t||""}:{kind:e,content:"",tags:[],created_at:Math.floor(Date.now()/1e3),pubkey:t||""}}const dy=[{id:"all",name:"All Kinds",filter:()=>!0},{id:"regular",name:"Regular Events (0-9999)",filter:e=>e.kind<1e4&&!e.isReplaceable},{id:"replaceable",name:"Replaceable (10000-19999)",filter:e=>e.isReplaceable},{id:"ephemeral",name:"Ephemeral (20000-29999)",filter:e=>e.isEphemeral},{id:"addressable",name:"Addressable (30000-39999)",filter:e=>e.isAddressable},{id:"social",name:"Social",filter:e=>[0,1,3,6,7].includes(e.kind)},{id:"messaging",name:"Messaging",filter:e=>[4,9,10,11,12,14,15,40,41,42].includes(e.kind)},{id:"lists",name:"Lists",filter:e=>e.name.toLowerCase().includes("list")||e.name.toLowerCase().includes("set")},{id:"marketplace",name:"Marketplace",filter:e=>[30017,30018,30019,30020,1021,1022,30402,30403].includes(e.kind)},{id:"lightning",name:"Lightning/Zaps",filter:e=>[9734,9735,9041,9321,7374,7375,7376].includes(e.kind)},{id:"media",name:"Media",filter:e=>[20,21,22,1063,1222,1244].includes(e.kind)},{id:"git",name:"Git/Code",filter:e=>[818,1337,1617,1618,1619,1621,1622,30617,30618].includes(e.kind)},{id:"calendar",name:"Calendar",filter:e=>[31922,31923,31924,31925].includes(e.kind)},{id:"groups",name:"Groups",filter:e=>e.kind>=9e3&&e.kind<=9030||e.kind>=39e3&&e.kind<=39009}];function fy(e,t,n){const r=e.slice();return r[13]=t[n],r}function hy(e,t,n){const r=e.slice();return r[16]=t[n],r}function py(e){let t,n,i,o,s,a,l,p,y,v,b,C,E,x,B,S,Q,F,D,$,R,P,T,U,N,L=e[3].length+"",M=1!==e[3].length?"s":"",_=dy,O=[];for(let t=0;t<_.length;t+=1)O[t]=gy(hy(e,_,t));function H(e,t){return 0===e[3].length?yy:my}let j=H(e),G=j(e);return{c(){t=h("div"),n=h("div"),i=h("div"),o=h("h2"),o.textContent="Generate Event Template",s=m(),a=h("button"),a.textContent="×",l=m(),p=h("div"),y=h("div"),v=h("input"),b=m(),C=h("div");for(let e=0;e=2e4&&e.kind<3e4?"badge-ephemeral":"badge-regular"}function ky(e){return e.isAddressable?"Addressable":e.isReplaceable?"Replaceable":e.kind>=2e4&&e.kind<3e4?"Ephemeral":"Regular"}function Iy(e,t,n){let{isOpen:r=!1}=t,{userPubkey:i=""}=t;const o=R();let s="",a="all",l=cy;function c(e){const t=uy(e.kind,i);o("select",{kind:e,template:t}),u()}function u(){n(0,r=!1),n(1,s=""),n(2,a="all"),o("close")}return e.$$set=e=>{"isOpen"in e&&n(0,r=e.isOpen),"userPubkey"in e&&n(8,i=e.userPubkey)},e.$$.update=()=>{if(6&e.$$.dirty){let e=cy;const t=dy.find(e=>e.id===a);if(t&&(e=e.filter(t.filter)),s.trim()){const t=s.toLowerCase();e=e.filter(e=>e.name.toLowerCase().includes(t)||e.description.toLowerCase().includes(t)||e.kind.toString().includes(t)||e.nip&&e.nip.includes(t))}n(3,l=e)}},[r,s,a,l,c,u,function(e){"Escape"===e.key&&u()},function(e){e.target===e.currentTarget&&u()},i,function(){s=this.value,n(1,s)},e=>n(2,a=e.id),e=>c(e)]}class Cy extends oe{constructor(e){super(),ie(this,e,Iy,Ay,o,{isOpen:0,userPubkey:8})}}function Ey(e){let t,n,r,i,o,s,a,l,f,p;return{c(){t=h("div"),n=h("div"),r=h("span"),r.textContent="⚠",i=m(),o=h("span"),s=g(e[1]),a=m(),l=h("button"),l.textContent="×",A(r,"class","error-icon svelte-46pmgb"),A(o,"class","error-message svelte-46pmgb"),A(n,"class","error-content svelte-46pmgb"),A(l,"class","error-dismiss svelte-46pmgb"),A(t,"class","error-banner svelte-46pmgb")},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),c(t,l),f||(p=w(l,"click",e[10]),f=!0)},p(e,t){2&t&&k(s,e[1])},d(e){e&&d(t),f=!1,p()}}}function xy(e){let t,n,i,o,s,a,l,f,p,g,y,v,b,k,C,E,x,B,S,Q=e[1]&&Ey(e);function F(t){e[14](t)}let D={userPubkey:e[2]};return void 0!==e[3]&&(D.isOpen=e[3]),C=new Cy({props:D}),U.push(()=>X(C,"isOpen",F)),C.$on("select",e[8]),C.$on("close",e[9]),{c(){t=h("div"),n=h("div"),i=h("button"),i.textContent="Generate Template",o=m(),s=h("button"),s.textContent="Reformat",a=m(),l=h("button"),l.textContent="Sign",f=m(),p=h("button"),p.textContent="Publish",g=m(),Q&&Q.c(),y=m(),v=h("div"),b=h("textarea"),k=m(),ee(C.$$.fragment),A(i,"class","compose-btn template-btn svelte-46pmgb"),A(s,"class","compose-btn reformat-btn svelte-46pmgb"),A(l,"class","compose-btn sign-btn svelte-46pmgb"),A(p,"class","compose-btn publish-btn svelte-46pmgb"),A(n,"class","compose-header svelte-46pmgb"),A(b,"class","compose-textarea svelte-46pmgb"),A(b,"placeholder","Enter your Nostr event JSON here, or click 'Generate Template' to start with a template..."),A(b,"spellcheck","false"),A(v,"class","compose-editor svelte-46pmgb"),A(t,"class","compose-view svelte-46pmgb")},m(r,d){u(r,t,d),c(t,n),c(n,i),c(n,o),c(n,s),c(n,a),c(n,l),c(n,f),c(n,p),c(t,g),Q&&Q.m(t,null),c(t,y),c(t,v),c(v,b),I(b,e[0]),u(r,k,d),te(C,r,d),x=!0,B||(S=[w(i,"click",e[7]),w(s,"click",e[4]),w(l,"click",e[5]),w(p,"click",e[6]),w(b,"input",e[13])],B=!0)},p(e,[n]){e[1]?Q?Q.p(e,n):(Q=Ey(e),Q.c(),Q.m(t,y)):Q&&(Q.d(1),Q=null),1&n&&I(b,e[0]);const r={};4&n&&(r.userPubkey=e[2]),!E&&8&n&&(E=!0,r.isOpen=e[3],H(()=>E=!1)),C.$set(r)},i(e){x||(W(C.$$.fragment,e),x=!0)},o(e){Z(C.$$.fragment,e),x=!1},d(e){e&&d(t),Q&&Q.d(),e&&d(k),ne(C,e),B=!1,r(S)}}}function By(e,t,n){let{composeEventJson:r=""}=t,{userPubkey:i=""}=t,{userRole:o=""}=t,{policyEnabled:s=!1}=t,{publishError:a=""}=t;const l=R();let c=!1;return e.$$set=e=>{"composeEventJson"in e&&n(0,r=e.composeEventJson),"userPubkey"in e&&n(2,i=e.userPubkey),"userRole"in e&&n(11,o=e.userRole),"policyEnabled"in e&&n(12,s=e.policyEnabled),"publishError"in e&&n(1,a=e.publishError)},[r,a,i,c,function(){l("reformatJson")},function(){l("signEvent")},function(){l("publishEvent")},function(){n(3,c=!0)},function(e){const{kind:t,template:i}=e.detail;n(0,r=JSON.stringify(i,null,2)),l("templateSelected",{kind:t,template:i})},function(){n(3,c=!1)},function(){n(1,a=""),l("clearError")},o,s,function(){r=this.value,n(0,r)},function(e){c=e,n(3,c)}]}class Sy extends oe{constructor(e){super(),ie(this,e,By,xy,o,{composeEventJson:0,userPubkey:2,userRole:11,policyEnabled:12,publishError:1})}}function Qy(e,t,n){const r=e.slice();return r[23]=t[n],r}function Fy(t){let n,r,i,o,s,a;return{c(){n=h("div"),r=h("p"),r.textContent="Please log in to access sprocket management.",i=m(),o=h("button"),o.textContent="Log In",A(r,"class","svelte-fiaj1r"),A(o,"class","login-btn svelte-fiaj1r"),A(n,"class","login-prompt svelte-fiaj1r")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[18]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Dy(e){let t,n,r,i,o,s,a,l,f,p=(e[2]||"none")+"";return{c(){t=h("div"),n=h("p"),n.textContent="❌ Owner permission required for sprocket management.",r=m(),i=h("p"),i.innerHTML='To enable sprocket functionality, set the ORLY_OWNERS environment variable with your npub when starting the relay.',o=m(),s=h("p"),a=g("Current user role: "),l=h("strong"),f=g(p),A(n,"class","svelte-fiaj1r"),A(i,"class","svelte-fiaj1r"),A(s,"class","svelte-fiaj1r"),A(t,"class","permission-denied svelte-fiaj1r")},m(e,d){u(e,t,d),c(t,n),c(t,r),c(t,i),c(t,o),c(t,s),c(s,a),c(s,l),c(l,f)},p(e,t){4&t&&p!==(p=(e[2]||"none")+"")&&k(f,p)},d(e){e&&d(t)}}}function $y(e){let t,n,i,o,s,a,l,p,y,v,b,C,E,x,S,Q,F,D,$,R,P,T,U,N,L,M,_,O,H,j,G,J,K,V,z,q,Y,W,Z,X,ee,te,ne,re,ie,oe,se,ae,le,ce,ue,de,fe,he,pe,ge,me=e[3]?.is_running?"🟢 Running":"🔴 Stopped",ye=e[3]?.script_exists?"✅ Exists":"❌ Not found",we=e[3]?.pid&&Ry(e),ve=e[6]&&Py(e),Ae=e[8],be=[];for(let t=0;t{"isLoggedIn"in e&&n(1,r=e.isLoggedIn),"userRole"in e&&n(2,i=e.userRole),"sprocketStatus"in e&&n(3,o=e.sprocketStatus),"isLoadingSprocket"in e&&n(4,s=e.isLoadingSprocket),"sprocketUploadFile"in e&&n(5,a=e.sprocketUploadFile),"sprocketScript"in e&&n(0,l=e.sprocketScript),"sprocketMessage"in e&&n(6,c=e.sprocketMessage),"sprocketMessageType"in e&&n(7,u=e.sprocketMessageType),"sprocketVersions"in e&&n(8,d=e.sprocketVersions)},[l,r,i,o,s,a,c,u,d,function(){f("restartSprocket")},function(){f("deleteSprocket")},function(e){f("sprocketFileSelect",e)},function(){f("uploadSprocketScript")},function(){f("saveSprocket")},function(){f("loadSprocket")},function(){f("loadVersions")},h,p,function(){f("openLoginModal")},function(){l=this.value,n(0,l)},e=>h(e),e=>p(e.name)]}class _y extends oe{constructor(e){super(),ie(this,e,My,Ly,o,{isLoggedIn:1,userRole:2,sprocketStatus:3,isLoadingSprocket:4,sprocketUploadFile:5,sprocketScript:0,sprocketMessage:6,sprocketMessageType:7,sprocketVersions:8})}}function Oy(e,t,n){const r=e.slice();return r[26]=t[n],r}function Hy(e,t,n){const r=e.slice();return r[29]=t[n],r}function jy(e,t,n){const r=e.slice();return r[32]=t[n],r}function Gy(t){let n,r,i,o,s,a;return{c(){n=h("div"),r=h("p"),r.textContent="Please log in to access policy configuration.",i=m(),o=h("button"),o.textContent="Log In",A(r,"class","svelte-gkxvxc"),A(o,"class","login-btn svelte-gkxvxc"),A(n,"class","login-prompt svelte-gkxvxc")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[16]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function Jy(e){let t,n,r,i,o,s,a,l,f,p=(e[3]||"none")+"";return{c(){t=h("div"),n=h("p"),n.textContent="Policy configuration requires owner or policy admin permissions.",r=m(),i=h("p"),i.innerHTML='To become a policy admin, ask an existing policy admin to add your pubkey\n to the policy_admins list.',o=m(),s=h("p"),a=g("Current user role: "),l=h("strong"),f=g(p),A(n,"class","svelte-gkxvxc"),A(i,"class","svelte-gkxvxc"),A(s,"class","svelte-gkxvxc"),A(t,"class","permission-denied svelte-gkxvxc")},m(e,d){u(e,t,d),c(t,n),c(t,r),c(t,i),c(t,o),c(t,s),c(s,a),c(s,l),c(l,f)},p(e,t){8&t[0]&&p!==(p=(e[3]||"none")+"")&&k(f,p)},d(e){e&&d(t)}}}function Ky(e){let t,n,i,o,s,a,l,f,p,y,v,b,C,E,x,S,Q,F,D,$,R,P,T,U,N,L,M,_,O,H,j,G,J,K,V,z,q,Y,W,Z,X,ee,te,ne,re,ie,oe,se,ae,le,ce,ue,de,fe,he,pe,ge,me,ye,we,ve,Ae,be,ke,Ie,Ce,Ee,xe,Be,Se,Qe,Fe,De,$e,Re,Pe=e[5]?"Policy Enabled":"Policy Disabled",Te=e[10].length+"",Ue=e[4]&&Vy(),Ne=e[9].length>0&&zy(e),Le=e[7]&&Yy(e);function Me(e,t){return 0===e[1].length?Zy:Wy}let _e=Me(e),Oe=_e(e);function He(e,t){return 0===e[10].length?tw:ew}let je=He(e),Ge=je(e);return{c(){t=h("div"),n=h("div"),i=h("h3"),i.textContent="Policy Editor",o=m(),s=h("div"),a=h("span"),l=g(Pe),f=m(),Ue&&Ue.c(),p=m(),y=h("div"),y.innerHTML='

    Edit the policy JSON below and click "Save & Publish" to update the relay's policy configuration.\n Changes are applied immediately after validation.

    \n

    Policy updates are published as kind 12345 events and require policy admin permissions.

    ',v=m(),b=h("div"),C=h("textarea"),E=m(),Ne&&Ne.c(),x=m(),S=h("div"),Q=h("button"),F=g("Load Current"),D=m(),$=h("button"),R=g("Format JSON"),P=m(),T=h("button"),U=g("Validate"),N=m(),L=h("button"),M=g("Save & Publish"),_=m(),Le&&Le.c(),O=m(),H=h("div"),j=h("h3"),j.textContent="Policy Administrators",G=m(),J=h("div"),J.innerHTML='

    Policy admins can update the relay's policy configuration via kind 12345 events.\n Their follows get whitelisted if policy_follow_whitelist_enabled is true in the policy.

    \n

    Note: Policy admins are separate from relay admins (ORLY_ADMINS).\n Changes here update the JSON editor - click "Save & Publish" to apply.

    ',K=m(),V=h("div"),Oe.c(),z=m(),q=h("div"),Y=h("input"),W=m(),Z=h("button"),X=g("+ Add Admin"),te=m(),ne=h("div"),re=h("h3"),re.textContent="Policy Follow Whitelist",ie=m(),oe=h("div"),oe.innerHTML='

    Pubkeys followed by policy admins (kind 3 events).\n These get automatic read+write access when rules have write_allow_follows: true.

    ',se=m(),ae=h("div"),le=h("span"),ce=g(Te),ue=g(" pubkey(s) in whitelist"),de=m(),fe=h("button"),he=g("🔄 Refresh Follows"),pe=m(),ge=h("div"),Ge.c(),me=m(),ye=h("div"),we=h("h3"),we.textContent="Policy Reference",ve=m(),Ae=h("div"),be=h("h4"),be.textContent="Structure Overview",ke=m(),Ie=h("ul"),Ie.innerHTML='
  • kind.whitelist - Only allow these event kinds (takes precedence)
  • \n
  • kind.blacklist - Deny these event kinds (if no whitelist)
  • \n
  • global - Rules applied to all events
  • \n
  • rules - Per-kind rules (keyed by kind number as string)
  • \n
  • default_policy - "allow" or "deny" when no rules match
  • \n
  • policy_admins - Hex pubkeys that can update policy
  • \n
  • policy_follow_whitelist_enabled - Enable follow-based access
  • ',Ce=m(),Ee=h("h4"),Ee.textContent="Rule Fields",xe=m(),Be=h("ul"),Be.innerHTML='
  • description - Human-readable rule description
  • \n
  • write_allow / write_deny - Pubkey lists for write access
  • \n
  • read_allow / read_deny - Pubkey lists for read access
  • \n
  • write_allow_follows - Grant access to policy admin follows
  • \n
  • size_limit - Max total event size in bytes
  • \n
  • content_limit - Max content field size in bytes
  • \n
  • max_expiry - Max expiry offset in seconds
  • \n
  • max_age_of_event - Max age of created_at in seconds
  • \n
  • max_age_event_in_future - Max future offset in seconds
  • \n
  • must_have_tags - Required tag letters (e.g., ["d", "t"])
  • \n
  • tag_validation - Regex patterns for tag values
  • \n
  • script - Path to external validation script
  • ',Se=m(),Qe=h("h4"),Qe.textContent="Example Policy",Fe=m(),De=h("pre"),De.textContent=`${e[20]}`,A(i,"class","svelte-gkxvxc"),A(a,"class","status-badge svelte-gkxvxc"),B(a,"enabled",e[5]),A(s,"class","policy-status svelte-gkxvxc"),A(n,"class","policy-header svelte-gkxvxc"),A(y,"class","policy-info svelte-gkxvxc"),A(C,"class","policy-editor svelte-gkxvxc"),A(C,"placeholder","Loading policy configuration..."),C.disabled=e[6],A(C,"spellcheck","false"),A(b,"class","editor-container svelte-gkxvxc"),A(Q,"class","policy-btn load-btn svelte-gkxvxc"),Q.disabled=e[6],A($,"class","policy-btn format-btn svelte-gkxvxc"),$.disabled=e[6],A(T,"class","policy-btn validate-btn svelte-gkxvxc"),T.disabled=e[6],A(L,"class","policy-btn save-btn svelte-gkxvxc"),L.disabled=e[6],A(S,"class","policy-actions svelte-gkxvxc"),A(t,"class","policy-section svelte-gkxvxc"),A(J,"class","policy-info svelte-gkxvxc"),A(V,"class","admin-list svelte-gkxvxc"),A(Y,"type","text"),A(Y,"placeholder","npub or hex pubkey"),Y.disabled=e[6],A(Y,"class","svelte-gkxvxc"),A(Z,"class","policy-btn add-btn svelte-gkxvxc"),Z.disabled=ee=e[6]||!e[11].trim(),A(q,"class","add-admin svelte-gkxvxc"),A(H,"class","policy-section svelte-gkxvxc"),A(oe,"class","policy-info svelte-gkxvxc"),A(le,"class","follows-count svelte-gkxvxc"),A(fe,"class","policy-btn refresh-btn svelte-gkxvxc"),fe.disabled=e[6],A(ae,"class","follows-header svelte-gkxvxc"),A(ge,"class","follows-list svelte-gkxvxc"),A(ne,"class","policy-section svelte-gkxvxc"),A(be,"class","svelte-gkxvxc"),A(Ie,"class","field-list svelte-gkxvxc"),A(Ee,"class","svelte-gkxvxc"),A(Be,"class","field-list svelte-gkxvxc"),A(Qe,"class","svelte-gkxvxc"),A(De,"class","example-json svelte-gkxvxc"),A(Ae,"class","reference-content svelte-gkxvxc"),A(ye,"class","policy-section svelte-gkxvxc")},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(s,f),Ue&&Ue.m(s,null),c(t,p),c(t,y),c(t,v),c(t,b),c(b,C),I(C,e[0]),c(t,E),Ne&&Ne.m(t,null),c(t,x),c(t,S),c(S,Q),c(Q,F),c(S,D),c(S,$),c($,R),c(S,P),c(S,T),c(T,U),c(S,N),c(S,L),c(L,M),c(t,_),Le&&Le.m(t,null),u(r,O,d),u(r,H,d),c(H,j),c(H,G),c(H,J),c(H,K),c(H,V),Oe.m(V,null),c(H,z),c(H,q),c(q,Y),I(Y,e[11]),c(q,W),c(q,Z),c(Z,X),u(r,te,d),u(r,ne,d),c(ne,re),c(ne,ie),c(ne,oe),c(ne,se),c(ne,ae),c(ae,le),c(le,ce),c(le,ue),c(ae,de),c(ae,fe),c(fe,he),c(ne,pe),c(ne,ge),Ge.m(ge,null),u(r,me,d),u(r,ye,d),c(ye,we),c(ye,ve),c(ye,Ae),c(Ae,be),c(Ae,ke),c(Ae,Ie),c(Ae,Ce),c(Ae,Ee),c(Ae,xe),c(Ae,Be),c(Ae,Se),c(Ae,Qe),c(Ae,Fe),c(Ae,De),$e||(Re=[w(C,"input",e[21]),w(Q,"click",e[12]),w($,"click",e[15]),w(T,"click",e[13]),w(L,"click",e[14]),w(Y,"input",e[23]),w(Y,"keydown",e[24]),w(Z,"click",e[18]),w(fe,"click",e[17])],$e=!0)},p(e,n){32&n[0]&&Pe!==(Pe=e[5]?"Policy Enabled":"Policy Disabled")&&k(l,Pe),32&n[0]&&B(a,"enabled",e[5]),e[4]?Ue||(Ue=Vy(),Ue.c(),Ue.m(s,null)):Ue&&(Ue.d(1),Ue=null),64&n[0]&&(C.disabled=e[6]),1&n[0]&&I(C,e[0]),e[9].length>0?Ne?Ne.p(e,n):(Ne=zy(e),Ne.c(),Ne.m(t,x)):Ne&&(Ne.d(1),Ne=null),64&n[0]&&(Q.disabled=e[6]),64&n[0]&&($.disabled=e[6]),64&n[0]&&(T.disabled=e[6]),64&n[0]&&(L.disabled=e[6]),e[7]?Le?Le.p(e,n):(Le=Yy(e),Le.c(),Le.m(t,null)):Le&&(Le.d(1),Le=null),_e===(_e=Me(e))&&Oe?Oe.p(e,n):(Oe.d(1),Oe=_e(e),Oe&&(Oe.c(),Oe.m(V,null))),64&n[0]&&(Y.disabled=e[6]),2048&n[0]&&Y.value!==e[11]&&I(Y,e[11]),2112&n[0]&&ee!==(ee=e[6]||!e[11].trim())&&(Z.disabled=ee),1024&n[0]&&Te!==(Te=e[10].length+"")&&k(ce,Te),64&n[0]&&(fe.disabled=e[6]),je===(je=He(e))&&Ge?Ge.p(e,n):(Ge.d(1),Ge=je(e),Ge&&(Ge.c(),Ge.m(ge,null)))},d(e){e&&d(t),Ue&&Ue.d(),Ne&&Ne.d(),Le&&Le.d(),e&&d(O),e&&d(H),Oe.d(),e&&d(te),e&&d(ne),Ge.d(),e&&d(me),e&&d(ye),$e=!1,r(Re)}}}function Vy(e){let t;return{c(){t=h("span"),t.textContent="Policy Admin",A(t,"class","admin-badge svelte-gkxvxc")},m(e,n){u(e,t,n)},d(e){e&&d(t)}}}function zy(e){let t,n,r,i,o=e[9],s=[];for(let t=0;t{"isLoggedIn"in e&&n(2,r=e.isLoggedIn),"userRole"in e&&n(3,i=e.userRole),"isPolicyAdmin"in e&&n(4,o=e.isPolicyAdmin),"policyEnabled"in e&&n(5,s=e.policyEnabled),"policyJson"in e&&n(0,a=e.policyJson),"isLoadingPolicy"in e&&n(6,l=e.isLoadingPolicy),"policyMessage"in e&&n(7,c=e.policyMessage),"policyMessageType"in e&&n(8,u=e.policyMessageType),"validationErrors"in e&&n(9,d=e.validationErrors),"policyAdmins"in e&&n(1,f=e.policyAdmins),"policyFollows"in e&&n(10,h=e.policyFollows)},e.$$.update=()=>{if(1&e.$$.dirty[0])try{if(a){const e=JSON.parse(a);n(1,f=e.policy_admins||[])}}catch(e){}},[a,f,r,i,o,s,l,c,u,d,h,g,function(){p("loadPolicy")},function(){p("validatePolicy")},function(){p("savePolicy")},function(){p("formatJson")},function(){p("openLoginModal")},function(){p("refreshFollows")},m,y,'{\n "kind": {\n "whitelist": [0, 1, 3, 6, 7, 10002],\n "blacklist": []\n },\n "global": {\n "description": "Global rules applied to all events",\n "size_limit": 65536,\n "max_age_of_event": 86400,\n "max_age_event_in_future": 300\n },\n "rules": {\n "1": {\n "description": "Kind 1 (short text notes)",\n "content_limit": 8192,\n "write_allow_follows": true\n },\n "30023": {\n "description": "Long-form articles",\n "content_limit": 100000,\n "tag_validation": {\n "d": "^[a-z0-9-]{1,64}$",\n "t": "^[a-z0-9-]{1,32}$"\n }\n }\n },\n "default_policy": "allow",\n "policy_admins": [""],\n "policy_follow_whitelist_enabled": true\n}',function(){a=this.value,n(0,a)},e=>y(e),function(){g=this.value,n(11,g)},e=>"Enter"===e.key&&m()]}class ow extends oe{constructor(e){super(),ie(this,e,iw,rw,o,{isLoggedIn:2,userRole:3,isPolicyAdmin:4,policyEnabled:5,policyJson:0,isLoadingPolicy:6,policyMessage:7,policyMessageType:8,validationErrors:9,policyAdmins:1,policyFollows:10},null,[-1,-1])}}const{window:sw}=l;function aw(e,t,n){const r=e.slice();return r[57]=t[n],r}function lw(e,t,n){const r=e.slice();return r[54]=t[n],r}function cw(t){let n,r,i,o,s,a;return{c(){n=h("div"),r=h("p"),r.textContent="Please log in to view your Blossom storage.",i=m(),o=h("button"),o.textContent="Log In",A(r,"class","svelte-on0yal"),A(o,"class","login-btn svelte-on0yal"),A(n,"class","login-prompt svelte-on0yal")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[20]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function uw(e){let t,n,r,i,o,s,a,l,f,p,y,v,b,I,C=e[0]||e[12]?"Loading...":"Refresh";function E(e,t){return e[13]?hw:e[10]?fw:dw}let x=E(e),B=x(e),S=e[14]&&!e[10]&&!e[13]&&gw(e),Q=!e[10]&&!e[13]&&mw(e),F=e[2]&&ww(e);function D(e,t){return e[10]&&!e[13]?Aw:vw}let $=D(e),R=$(e);return{c(){t=h("div"),n=h("div"),B.c(),r=m(),i=h("div"),S&&S.c(),o=m(),s=h("button"),a=g("🔄 "),l=g(C),p=m(),Q&&Q.c(),y=m(),F&&F.c(),v=m(),R.c(),A(s,"class","refresh-btn svelte-on0yal"),s.disabled=f=e[0]||e[12],A(i,"class","header-buttons svelte-on0yal"),A(n,"class","header-section svelte-on0yal"),A(t,"class","blossom-view svelte-on0yal")},m(d,f){u(d,t,f),c(t,n),B.m(n,null),c(n,r),c(n,i),S&&S.m(i,null),c(i,o),c(i,s),c(s,a),c(s,l),c(t,p),Q&&Q.m(t,null),c(t,y),F&&F.m(t,null),c(t,v),R.m(t,null),b||(I=w(s,"click",e[30]),b=!0)},p(e,a){x===(x=E(e))&&B?B.p(e,a):(B.d(1),B=x(e),B&&(B.c(),B.m(n,r))),!e[14]||e[10]||e[13]?S&&(S.d(1),S=null):S?S.p(e,a):(S=gw(e),S.c(),S.m(i,o)),4097&a[0]&&C!==(C=e[0]||e[12]?"Loading...":"Refresh")&&k(l,C),4097&a[0]&&f!==(f=e[0]||e[12])&&(s.disabled=f),e[10]||e[13]?Q&&(Q.d(1),Q=null):Q?Q.p(e,a):(Q=mw(e),Q.c(),Q.m(t,y)),e[2]?F?F.p(e,a):(F=ww(e),F.c(),F.m(t,v)):F&&(F.d(1),F=null),$===($=D(e))&&R?R.p(e,a):(R.d(1),R=$(e),R&&(R.c(),R.m(t,null)))},d(e){e&&d(t),B.d(),S&&S.d(),Q&&Q.d(),F&&F.d(),R.d(),b=!1,I()}}}function dw(t){let n;return{c(){n=h("h3"),n.textContent="Blossom Media Storage",A(n,"class","svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function fw(t){let n,r,i,o,s;return{c(){n=h("button"),n.textContent="← Back",r=m(),i=h("h3"),i.textContent="All Users Storage",A(n,"class","back-btn svelte-on0yal"),A(i,"class","svelte-on0yal")},m(e,a){u(e,n,a),u(e,r,a),u(e,i,a),o||(s=w(n,"click",t[27]),o=!0)},p:e,d(e){e&&d(n),e&&d(r),e&&d(i),o=!1,s()}}}function hw(e){let t,n,r,i,o,s,a,l=(e[13].profile?.name||Yw(e[25](e[13].pubkey)))+"",f=e[13].profile?.picture&&pw(e);return{c(){t=h("button"),t.textContent="← Back",n=m(),r=h("h3"),f&&f.c(),i=m(),o=g(l),A(t,"class","back-btn svelte-on0yal"),A(r,"class","user-header svelte-on0yal")},m(l,d){u(l,t,d),u(l,n,d),u(l,r,d),f&&f.m(r,null),c(r,i),c(r,o),s||(a=w(t,"click",e[29]),s=!0)},p(e,t){e[13].profile?.picture?f?f.p(e,t):(f=pw(e),f.c(),f.m(r,i)):f&&(f.d(1),f=null),8192&t[0]&&l!==(l=(e[13].profile?.name||Yw(e[25](e[13].pubkey)))+"")&&k(o,l)},d(e){e&&d(t),e&&d(n),e&&d(r),f&&f.d(),s=!1,a()}}}function pw(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[13].profile.picture)||A(t,"src",n),A(t,"alt",""),A(t,"class","header-avatar svelte-on0yal")},m(e,n){u(e,t,n)},p(e,r){8192&r[0]&&!a(t.src,n=e[13].profile.picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function gw(e){let t,n,r,i;return{c(){t=h("button"),n=g("Admin"),A(t,"class","admin-btn svelte-on0yal"),t.disabled=e[0]},m(o,s){u(o,t,s),c(t,n),r||(i=w(t,"click",e[26]),r=!0)},p(e,n){1&n[0]&&(t.disabled=e[0])},d(e){e&&d(t),r=!1,i()}}}function mw(e){let t,n,i,o,s,a,l,f,p,y,v=e[3].length>0&&yw(e);return{c(){t=h("div"),n=h("span"),n.textContent="Upload new files",i=m(),o=h("input"),s=m(),v&&v.c(),a=m(),l=h("button"),f=g("Select Files"),A(n,"class","upload-label svelte-on0yal"),A(o,"type","file"),o.multiple=!0,A(o,"class","file-input-hidden svelte-on0yal"),A(l,"class","select-btn svelte-on0yal"),l.disabled=e[4],A(t,"class","upload-section svelte-on0yal")},m(r,d){u(r,t,d),c(t,n),c(t,i),c(t,o),e[39](o),c(t,s),v&&v.m(t,null),c(t,a),c(t,l),c(l,f),p||(y=[w(o,"change",e[22]),w(l,"click",e[23])],p=!0)},p(e,n){e[3].length>0?v?v.p(e,n):(v=yw(e),v.c(),v.m(t,a)):v&&(v.d(1),v=null),16&n[0]&&(l.disabled=e[4])},d(n){n&&d(t),e[39](null),v&&v.d(),p=!1,r(y)}}}function yw(e){let t,n,r,i,o,s,a,l,f=e[3].length+"",p=(e[4]?e[5]:"Upload")+"";return{c(){t=h("span"),n=g(f),r=g(" file(s) selected"),i=m(),o=h("button"),s=g(p),A(t,"class","selected-count svelte-on0yal"),A(o,"class","upload-btn svelte-on0yal"),o.disabled=e[4]},m(d,f){u(d,t,f),c(t,n),c(t,r),u(d,i,f),u(d,o,f),c(o,s),a||(l=w(o,"click",e[24]),a=!0)},p(e,t){8&t[0]&&f!==(f=e[3].length+"")&&k(n,f),48&t[0]&&p!==(p=(e[4]?e[5]:"Upload")+"")&&k(s,p),16&t[0]&&(o.disabled=e[4])},d(e){e&&d(t),e&&d(i),e&&d(o),a=!1,l()}}}function ww(e){let t,n;return{c(){t=h("div"),n=g(e[2]),A(t,"class","error-message svelte-on0yal")},m(e,r){u(e,t,r),c(t,n)},p(e,t){4&t[0]&&k(n,e[2])},d(e){e&&d(t)}}}function vw(e){let t,n,r;function i(e,r){return 1&r[0]&&(t=null),null==t&&(t=!(!e[0]||0!==e[31]().length)),t?Iw:(null==n&&(n=!(0!==e[31]().length)),n?kw:bw)}let o=i(e,[-1,-1]),s=o(e);return{c(){s.c(),r=y()},m(e,t){s.m(e,t),u(e,r,t)},p(e,t){o===(o=i(e,t))&&s?s.p(e,t):(s.d(1),s=o(e),s&&(s.c(),s.m(r.parentNode,r)))},d(e){s.d(e),e&&d(r)}}}function Aw(e){let t;function n(e,t){return e[12]?Fw:0===e[11].length?Qw:Sw}let r=n(e),i=r(e);return{c(){i.c(),t=y()},m(e,n){i.m(e,n),u(e,t,n)},p(e,o){r===(r=n(e))&&i?i.p(e,o):(i.d(1),i=r(e),i&&(i.c(),i.m(t.parentNode,t)))},d(e){i.d(e),e&&d(t)}}}function bw(e){let t,n=e[31](),r=[];for(let t=0;tNo users have uploaded files yet.

    ",A(n,"class","empty-state svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Fw(t){let n;return{c(){n=h("div"),n.textContent="Loading user statistics...",A(n,"class","loading svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function Dw(t){let n;return{c(){n=h("div"),A(n,"class","user-avatar-placeholder svelte-on0yal")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function $w(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[54].profile.picture)||A(t,"src",n),A(t,"alt",""),A(t,"class","user-avatar svelte-on0yal")},m(e,n){u(e,t,n)},p(e,r){2048&r[0]&&!a(t.src,n=e[54].profile.picture)&&A(t,"src",n)},d(e){e&&d(t)}}}function Rw(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,C,E,x,B,S,Q,F,D,$,R,P,T,U=(e[54].profile?.name||Yw(e[25](e[54].pubkey)))+"",N=e[25](e[54].pubkey)+"",L=Yw(e[25](e[54].pubkey))+"",M=e[54].blob_count+"",_=Gw(e[54].total_size_bytes)+"";function O(e,t){return e[54].profile?.picture?$w:Dw}let H=O(e),j=H(e);function G(){return e[40](e[54])}function J(...t){return e[41](e[54],...t)}return{c(){t=h("div"),n=h("div"),j.c(),i=m(),o=h("div"),s=h("div"),a=g(U),l=m(),f=h("div"),p=h("span"),y=g(N),v=m(),b=h("span"),I=g(L),E=m(),x=h("div"),B=h("span"),S=g(M),Q=g(" files"),F=m(),D=h("span"),$=g(_),R=m(),A(n,"class","user-avatar-container svelte-on0yal"),A(s,"class","user-name svelte-on0yal"),A(p,"class","npub-full svelte-on0yal"),A(b,"class","npub-truncated svelte-on0yal"),A(f,"class","user-npub svelte-on0yal"),A(f,"title",C=e[54].pubkey),A(o,"class","user-info svelte-on0yal"),A(B,"class","blob-count svelte-on0yal"),A(D,"class","total-size svelte-on0yal"),A(x,"class","user-stats svelte-on0yal"),A(t,"class","user-stat-item svelte-on0yal"),A(t,"role","button"),A(t,"tabindex","0")},m(e,r){u(e,t,r),c(t,n),j.m(n,null),c(t,i),c(t,o),c(o,s),c(s,a),c(o,l),c(o,f),c(f,p),c(p,y),c(f,v),c(f,b),c(b,I),c(t,E),c(t,x),c(x,B),c(B,S),c(B,Q),c(x,F),c(x,D),c(D,$),c(t,R),P||(T=[w(t,"click",G),w(t,"keypress",J)],P=!0)},p(t,r){H===(H=O(e=t))&&j?j.p(e,r):(j.d(1),j=H(e),j&&(j.c(),j.m(n,null))),2048&r[0]&&U!==(U=(e[54].profile?.name||Yw(e[25](e[54].pubkey)))+"")&&k(a,U),2048&r[0]&&N!==(N=e[25](e[54].pubkey)+"")&&k(y,N),2048&r[0]&&L!==(L=Yw(e[25](e[54].pubkey))+"")&&k(I,L),2048&r[0]&&C!==(C=e[54].pubkey)&&A(f,"title",C),2048&r[0]&&M!==(M=e[54].blob_count+"")&&k(S,M),2048&r[0]&&_!==(_=Gw(e[54].total_size_bytes)+"")&&k($,_)},d(e){e&&d(t),j.d(),P=!1,r(T)}}}function Pw(e){let t,n,i,o,s,a,l,f,p,y,b,I,C,E,x,B,S,Q,F,D,$,R,P,T,U,N,L,M,_,O,H,j,G,J,K,V,z,q,Y,W,Z,X,ee,te=Kw(e[8].sha256)+"",ne=(e[8].type||"unknown")+"",re="image"===Vw(e[8].type),ie=Gw(e[8].size)+"",oe=Jw(e[8].uploaded)+"",se=re&&Tw(e);function ae(e,t){return 256&t[0]&&(B=null),256&t[0]&&(S=null),256&t[0]&&(Q=null),null==B&&(B=!("image"!==Vw(e[8].type))),B?Mw:(null==S&&(S=!("video"!==Vw(e[8].type))),S?Lw:(null==Q&&(Q=!("audio"!==Vw(e[8].type))),Q?Nw:Uw))}let le=ae(e,[-1,-1]),ce=le(e);return{c(){t=h("div"),n=h("div"),i=h("div"),o=h("div"),s=h("span"),a=g(te),l=m(),f=h("span"),p=g(ne),y=m(),b=h("div"),se&&se.c(),I=m(),C=h("button"),C.textContent="X",E=m(),x=h("div"),ce.c(),F=m(),D=h("div"),$=h("div"),R=h("span"),P=g("Size: "),T=g(ie),U=m(),N=h("span"),L=g("Uploaded: "),M=g(oe),_=m(),O=h("div"),H=h("input"),G=m(),J=h("button"),J.textContent="Copy",K=m(),V=h("div"),z=h("a"),q=g("Open in New Tab"),W=m(),Z=h("button"),Z.textContent="Delete",A(s,"class","modal-hash svelte-on0yal"),A(f,"class","modal-type svelte-on0yal"),A(o,"class","modal-title svelte-on0yal"),A(C,"class","close-btn svelte-on0yal"),A(b,"class","modal-controls svelte-on0yal"),A(i,"class","modal-header svelte-on0yal"),A(x,"class","modal-body svelte-on0yal"),A($,"class","blob-details svelte-on0yal"),A(H,"type","text"),H.readOnly=!0,H.value=j=qw(e[8]),A(H,"class","blob-url-input svelte-on0yal"),A(J,"class","copy-btn svelte-on0yal"),A(O,"class","blob-url-section svelte-on0yal"),A(z,"href",Y=qw(e[8])),A(z,"target","_blank"),A(z,"rel","noopener noreferrer"),A(z,"class","action-btn svelte-on0yal"),A(Z,"class","action-btn danger svelte-on0yal"),A(V,"class","modal-actions svelte-on0yal"),A(D,"class","modal-footer svelte-on0yal"),A(n,"class","modal-content svelte-on0yal"),A(n,"role","dialog"),A(t,"class","modal-overlay svelte-on0yal"),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(o,s),c(s,a),c(o,l),c(o,f),c(f,p),c(i,y),c(i,b),se&&se.m(b,null),c(b,I),c(b,C),c(n,E),c(n,x),ce.m(x,null),c(n,F),c(n,D),c(D,$),c($,R),c(R,P),c(R,T),c($,U),c($,N),c(N,L),c(N,M),c(D,_),c(D,O),c(O,H),c(O,G),c(O,J),c(D,K),c(D,V),c(V,z),c(z,q),c(V,W),c(V,Z),X||(ee=[w(C,"click",e[16]),w(H,"click",Ww),w(J,"click",e[45]),w(Z,"click",e[46]),w(n,"click",v(e[37])),w(n,"keypress",v(e[38])),w(t,"click",e[16]),w(t,"keypress",e[47])],X=!0)},p(e,t){256&t[0]&&te!==(te=Kw(e[8].sha256)+"")&&k(a,te),256&t[0]&&ne!==(ne=(e[8].type||"unknown")+"")&&k(p,ne),256&t[0]&&(re="image"===Vw(e[8].type)),re?se?se.p(e,t):(se=Tw(e),se.c(),se.m(b,I)):se&&(se.d(1),se=null),le===(le=ae(e,t))&&ce?ce.p(e,t):(ce.d(1),ce=le(e),ce&&(ce.c(),ce.m(x,null))),256&t[0]&&ie!==(ie=Gw(e[8].size)+"")&&k(T,ie),256&t[0]&&oe!==(oe=Jw(e[8].uploaded)+"")&&k(M,oe),256&t[0]&&j!==(j=qw(e[8]))&&H.value!==j&&(H.value=j),256&t[0]&&Y!==(Y=qw(e[8]))&&A(z,"href",Y)},d(e){e&&d(t),se&&se.d(),ce.d(),X=!1,r(ee)}}}function Tw(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,C=Math.round(100*e[9])+"";return{c(){t=h("button"),n=g("-"),o=m(),s=h("span"),a=g(C),l=g("%"),f=m(),p=h("button"),y=g("+"),A(t,"class","zoom-btn svelte-on0yal"),t.disabled=i=e[9]<=Ow,A(s,"class","zoom-level svelte-on0yal"),A(p,"class","zoom-btn svelte-on0yal"),p.disabled=v=e[9]>=Hw},m(r,i){u(r,t,i),c(t,n),u(r,o,i),u(r,s,i),c(s,a),c(s,l),u(r,f,i),u(r,p,i),c(p,y),b||(I=[w(t,"click",e[18]),w(p,"click",e[17])],b=!0)},p(e,n){512&n[0]&&i!==(i=e[9]<=Ow)&&(t.disabled=i),512&n[0]&&C!==(C=Math.round(100*e[9])+"")&&k(a,C),512&n[0]&&v!==(v=e[9]>=Hw)&&(p.disabled=v)},d(e){e&&d(t),e&&d(o),e&&d(s),e&&d(f),e&&d(p),b=!1,r(I)}}}function Uw(e){let t,n,r,i,o,s,a,l,f,p=zw(e[8].type)+"";return{c(){t=h("div"),n=h("div"),r=g(p),i=m(),o=h("p"),o.textContent="Preview not available for this file type.",s=m(),a=h("a"),l=g("Download File"),A(n,"class","file-icon svelte-on0yal"),A(a,"href",f=qw(e[8])),A(a,"target","_blank"),A(a,"rel","noopener noreferrer"),A(a,"class","download-link svelte-on0yal"),A(t,"class","file-preview svelte-on0yal")},m(e,d){u(e,t,d),c(t,n),c(n,r),c(t,i),c(t,o),c(t,s),c(t,a),c(a,l)},p(e,t){256&t[0]&&p!==(p=zw(e[8].type)+"")&&k(r,p),256&t[0]&&f!==(f=qw(e[8]))&&A(a,"href",f)},d(e){e&&d(t)}}}function Nw(e){let t,n,r;return{c(){t=h("div"),n=h("audio"),n.controls=!0,a(n.src,r=qw(e[8]))||A(n,"src",r),A(n,"class","svelte-on0yal"),A(t,"class","media-container audio svelte-on0yal")},m(e,r){u(e,t,r),c(t,n)},p(e,t){256&t[0]&&!a(n.src,r=qw(e[8]))&&A(n,"src",r)},d(e){e&&d(t)}}}function Lw(e){let t,n,r,i;return{c(){t=h("div"),n=h("video"),r=h("track"),A(r,"kind","captions"),n.controls=!0,a(n.src,i=qw(e[8]))||A(n,"src",i),A(n,"class","svelte-on0yal"),A(t,"class","media-container svelte-on0yal")},m(e,i){u(e,t,i),c(t,n),c(n,r)},p(e,t){256&t[0]&&!a(n.src,i=qw(e[8]))&&A(n,"src",i)},d(e){e&&d(t)}}}function Mw(e){let t,n,r;return{c(){t=h("div"),n=h("img"),a(n.src,r=qw(e[8]))||A(n,"src",r),A(n,"alt","Blob content"),A(n,"class","svelte-on0yal"),A(t,"class","media-container svelte-on0yal"),C(t,"transform","scale("+e[9]+")")},m(e,r){u(e,t,r),c(t,n)},p(e,i){256&i[0]&&!a(n.src,r=qw(e[8]))&&A(n,"src",r),512&i[0]&&C(t,"transform","scale("+e[9]+")")},d(e){e&&d(t)}}}function _w(t){let n,r,i,o;function s(e,t){return e[1]?uw:cw}let a=s(t),l=a(t),c=t[7]&&t[8]&&Pw(t);return{c(){l.c(),n=m(),c&&c.c(),r=y()},m(e,s){l.m(e,s),u(e,n,s),c&&c.m(e,s),u(e,r,s),i||(o=w(sw,"keydown",t[19]),i=!0)},p(e,t){a===(a=s(e))&&l?l.p(e,t):(l.d(1),l=a(e),l&&(l.c(),l.m(n.parentNode,n))),e[7]&&e[8]?c?c.p(e,t):(c=Pw(e),c.c(),c.m(r.parentNode,r)):c&&(c.d(1),c=null)},i:e,o:e,d(e){l.d(e),e&&d(n),c&&c.d(e),e&&d(r),i=!1,o()}}}const Ow=.25,Hw=4;async function jw(e,t,n=null){if(!e)return console.log("No signer available for Blossom auth"),null;try{const r=Math.floor(Date.now()/1e3),i=[["t",t],["expiration",(r+60).toString()]];n&&i.push(["x",n]);const o={kind:24242,created_at:r,tags:i,content:`Blossom ${t} operation`},s=await e.signEvent(o);return btoa(JSON.stringify(s)).replace(/\+/g,"-").replace(/\//g,"_")}catch(e){return console.error("Error creating Blossom auth:",e),null}}function Gw(e){if(!e)return"0 B";const t=["B","KB","MB","GB"];let n=0,r=e;for(;r>=1024&&ne.target.select();function Zw(e,t,n){let r,i,{isLoggedIn:o=!1}=t,{userPubkey:s=""}=t,{userSigner:a=null}=t,{currentEffectiveRole:l=""}=t;const c=R();let u,d=[],f=!1,h="",p=[],g=!1,m="",y=!1,w=null,v=1,A=!1,b=[],k=!1,I=null,C=[],E=!1;async function x(){if(s){n(0,f=!0),n(2,h="");try{const e=`${window.location.origin}/blossom/list/${s}`,t=await jw(a,"list"),n=await fetch(e,{headers:t?{Authorization:`Nostr ${t}`}:{}});if(!n.ok)throw new Error(`Failed to load blobs: ${n.statusText}`);const r=await n.json();d=Array.isArray(r)?r:[],d.sort((e,t)=>(t.uploaded||0)-(e.uploaded||0)),console.log("Loaded blobs:",d)}catch(e){console.error("Error loading blobs:",e),n(2,h=e.message||"Failed to load blobs")}finally{n(0,f=!1)}}}function B(e){n(8,w=e),n(9,v=1),n(7,y=!0)}function S(){n(7,y=!1),n(8,w=null),n(9,v=1)}function Q(){vOw&&n(9,v=Math.max(Ow,v-.25))}async function $(e){if(confirm(`Delete blob ${Kw(e.sha256)}?`))try{const t=`${window.location.origin}/blossom/${e.sha256}`,n=await jw(a,"delete",e.sha256),r=await fetch(t,{method:"DELETE",headers:n?{Authorization:`Nostr ${n}`}:{}});if(!r.ok)throw new Error(`Failed to delete: ${r.statusText}`);d=d.filter(t=>t.sha256!==e.sha256),w?.sha256===e.sha256&&S()}catch(e){console.error("Error deleting blob:",e),alert(`Failed to delete blob: ${e.message}`)}}async function T(){n(12,k=!0),n(2,h="");try{const e=`${window.location.origin}/blossom/admin/users`,t=await jw(a,"admin"),r=await fetch(e,{headers:t?{Authorization:`Nostr ${t}`}:{}});if(!r.ok)throw new Error(`Failed to load user stats: ${r.statusText}`);n(11,b=await r.json());for(const e of b)Ph(e.pubkey).then(t=>{e.profile=t||{name:"",picture:""},n(11,b)}).catch(()=>{e.profile={name:"",picture:""}})}catch(e){console.error("Error fetching admin user stats:",e),n(2,h=e.message||"Failed to load user stats")}finally{n(12,k=!1)}}async function N(e){n(0,f=!0),n(2,h="");try{const t=`${window.location.origin}/blossom/list/${e}`,n=await jw(a,"list"),r=await fetch(t,{headers:n?{Authorization:`Nostr ${n}`}:{}});if(!r.ok)throw new Error(`Failed to load user blobs: ${r.statusText}`);C=await r.json(),C.sort((e,t)=>(t.uploaded||0)-(e.uploaded||0))}catch(e){console.error("Error loading user blobs:",e),n(2,h=e.message||"Failed to load user blobs")}finally{n(0,f=!1)}}async function L(e){n(13,I={pubkey:e.pubkey,profile:e.profile}),await N(e.pubkey)}D(()=>{r&&!E&&(n(36,E=!0),x())});return e.$$set=e=>{"isLoggedIn"in e&&n(32,o=e.isLoggedIn),"userPubkey"in e&&n(33,s=e.userPubkey),"userSigner"in e&&n(34,a=e.userSigner),"currentEffectiveRole"in e&&n(35,l=e.currentEffectiveRole)},e.$$.update=()=>{6&e.$$.dirty[1]&&n(1,r=o&&s),16&e.$$.dirty[1]&&n(14,i="admin"===l||"owner"===l),3&e.$$.dirty[0]|32&e.$$.dirty[1]&&(!r||E||f||(n(36,E=!0),x()))},[f,r,h,p,g,m,u,y,w,v,A,b,k,I,i,B,S,Q,F,function(e){y&&("Escape"===e.key?S():"+"===e.key||"="===e.key?Q():"-"===e.key&&F())},function(){c("openLoginModal")},$,function(e){n(3,p=Array.from(e.target.files))},function(){u?.click()},async function(){if(0===p.length)return;n(4,g=!0),n(2,h="");const e=[],t=[];for(let r=0;r0&&await x(),t.length>0&&n(2,h=`Failed to upload: ${t.map(e=>e.name).join(", ")}`)},function(e){try{return vu(e)}catch(t){return Kw(e)}},function(){n(10,A=!0),T()},function(){n(10,A=!1),n(11,b=[]),n(13,I=null),C=[]},L,function(){n(13,I=null),C=[]},function(){I?N(I.pubkey):A?T():x()},function(){return I?C:d},o,s,a,l,E,function(t){P.call(this,e,t)},function(t){P.call(this,e,t)},function(e){U[e?"unshift":"push"](()=>{u=e,n(6,u)})},e=>L(e),(e,t)=>"Enter"===t.key&&L(e),e=>$(e),e=>B(e),(e,t)=>"Enter"===t.key&&B(e),()=>{navigator.clipboard.writeText(qw(w))},()=>$(w),e=>"Enter"===e.key&&S()]}class Xw extends oe{constructor(e){super(),ie(this,e,Zw,_w,o,{isLoggedIn:32,userPubkey:33,userSigner:34,currentEffectiveRole:35},null,[-1,-1])}}var ev={},tv={},nv={};let rv;const iv=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];nv.getSymbolSize=function(e){if(!e)throw new Error('"version" cannot be null or undefined');if(e<1||e>40)throw new Error('"version" should be in range from 1 to 40');return 4*e+17},nv.getSymbolTotalCodewords=function(e){return iv[e]},nv.getBCHDigit=function(e){let t=0;for(;0!==e;)t++,e>>>=1;return t},nv.setToSJISFunction=function(e){if("function"!=typeof e)throw new Error('"toSJISFunc" is not a valid function.');rv=e},nv.isKanjiModeEnabled=function(){return void 0!==rv},nv.toSJIS=function(e){return rv(e)};var ov,sv={};function av(){this.buffer=[],this.length=0}(ov=sv).L={bit:1},ov.M={bit:0},ov.Q={bit:3},ov.H={bit:2},ov.isValid=function(e){return e&&void 0!==e.bit&&e.bit>=0&&e.bit<4},ov.from=function(e,t){if(ov.isValid(e))return e;try{return function(e){if("string"!=typeof e)throw new Error("Param is not a string");switch(e.toLowerCase()){case"l":case"low":return ov.L;case"m":case"medium":return ov.M;case"q":case"quartile":return ov.Q;case"h":case"high":return ov.H;default:throw new Error("Unknown EC Level: "+e)}}(e)}catch(e){return t}},av.prototype={get:function(e){const t=Math.floor(e/8);return 1==(this.buffer[t]>>>7-e%8&1)},put:function(e,t){for(let n=0;n>>t-n-1&1))},getLengthInBits:function(){return this.length},putBit:function(e){const t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}};var lv=av;function cv(e){if(!e||e<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}cv.prototype.set=function(e,t,n,r){const i=e*this.size+t;this.data[i]=n,r&&(this.reservedBit[i]=!0)},cv.prototype.get=function(e,t){return this.data[e*this.size+t]},cv.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},cv.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]};var uv=cv,dv={};!function(e){const t=nv.getSymbolSize;e.getRowColCoords=function(e){if(1===e)return[];const n=Math.floor(e/7)+2,r=t(e),i=145===r?26:2*Math.ceil((r-13)/(2*n-2)),o=[r-7];for(let e=1;e=0&&e<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(e){const n=e.size;let r=0,i=0,o=0,s=null,a=null;for(let l=0;l=5&&(r+=t+(i-5)),s=n,i=1),n=e.get(c,l),n===a?o++:(o>=5&&(r+=t+(o-5)),a=n,o=1)}i>=5&&(r+=t+(i-5)),o>=5&&(r+=t+(o-5))}return r},e.getPenaltyN2=function(e){const t=e.size;let r=0;for(let n=0;n=10&&(1488===i||93===i)&&n++,o=o<<1&2047|e.get(s,r),s>=10&&(1488===o||93===o)&&n++}return n*r},e.getPenaltyN4=function(e){let t=0;const n=e.data.length;for(let r=0;r=0;){const e=r[0];for(let i=0;i0){const e=new Uint8Array(this.degree);return e.set(n,r),e}return n};var Ev=Cv,xv={},Bv={},Sv={isValid:function(e){return!isNaN(e)&&e>=1&&e<=40}},Qv={};const Fv="[0-9]+";let Dv="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";Dv=Dv.replace(/u/g,"\\u");const $v="(?:(?![A-Z0-9 $%*+\\-./:]|"+Dv+")(?:.|[\r\n]))+";Qv.KANJI=new RegExp(Dv,"g"),Qv.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),Qv.BYTE=new RegExp($v,"g"),Qv.NUMERIC=new RegExp(Fv,"g"),Qv.ALPHANUMERIC=new RegExp("[A-Z $%*+\\-./:]+","g");const Rv=new RegExp("^"+Dv+"$"),Pv=new RegExp("^"+Fv+"$"),Tv=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");Qv.testKanji=function(e){return Rv.test(e)},Qv.testNumeric=function(e){return Pv.test(e)},Qv.testAlphanumeric=function(e){return Tv.test(e)},function(e){const t=Sv,n=Qv;e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(e,n){if(!e.ccBits)throw new Error("Invalid mode: "+e);if(!t.isValid(n))throw new Error("Invalid version: "+n);return n>=1&&n<10?e.ccBits[0]:n<27?e.ccBits[1]:e.ccBits[2]},e.getBestModeForData=function(t){return n.testNumeric(t)?e.NUMERIC:n.testAlphanumeric(t)?e.ALPHANUMERIC:n.testKanji(t)?e.KANJI:e.BYTE},e.toString=function(e){if(e&&e.id)return e.id;throw new Error("Invalid mode")},e.isValid=function(e){return e&&e.bit&&e.ccBits},e.from=function(t,n){if(e.isValid(t))return t;try{return function(t){if("string"!=typeof t)throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+t)}}(t)}catch(e){return n}}}(Bv),function(e){const t=nv,n=gv,r=sv,i=Bv,o=Sv,s=t.getBCHDigit(7973);function a(e,t){return i.getCharCountIndicator(e,t)+4}function l(e,t){let n=0;return e.forEach(function(e){const r=a(e.mode,t);n+=r+e.getBitsLength()}),n}e.from=function(e,t){return o.isValid(e)?parseInt(e,10):t},e.getCapacity=function(e,r,s){if(!o.isValid(e))throw new Error("Invalid QR Code version");void 0===s&&(s=i.BYTE);const l=8*(t.getSymbolTotalCodewords(e)-n.getTotalCodewordsCount(e,r));if(s===i.MIXED)return l;const c=l-a(s,e);switch(s){case i.NUMERIC:return Math.floor(c/10*3);case i.ALPHANUMERIC:return Math.floor(c/11*2);case i.KANJI:return Math.floor(c/13);case i.BYTE:default:return Math.floor(c/8)}},e.getBestVersionForData=function(t,n){let o;const s=r.from(n,r.M);if(Array.isArray(t)){if(t.length>1)return function(t,n){for(let r=1;r<=40;r++)if(l(t,r)<=e.getCapacity(r,n,i.MIXED))return r}(t,s);if(0===t.length)return 1;o=t[0]}else o=t;return function(t,n,r){for(let i=1;i<=40;i++)if(n<=e.getCapacity(i,r,t))return i}(o.mode,o.getLength(),s)},e.getEncodedBits=function(e){if(!o.isValid(e)||e<7)throw new Error("Invalid QR Code version");let n=e<<12;for(;t.getBCHDigit(n)-s>=0;)n^=7973<=0;)r^=1335<0&&(n=this.data.substr(t),r=parseInt(n,10),e.put(r,3*i+1))};var Hv=Ov;const jv=Bv,Gv=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function Jv(e){this.mode=jv.ALPHANUMERIC,this.data=e}Jv.getBitsLength=function(e){return 11*Math.floor(e/2)+e%2*6},Jv.prototype.getLength=function(){return this.data.length},Jv.prototype.getBitsLength=function(){return Jv.getBitsLength(this.data.length)},Jv.prototype.write=function(e){let t;for(t=0;t+2<=this.data.length;t+=2){let n=45*Gv.indexOf(this.data[t]);n+=Gv.indexOf(this.data[t+1]),e.put(n,11)}this.data.length%2&&e.put(Gv.indexOf(this.data[t]),6)};var Kv=Jv;const Vv=Bv;function zv(e){this.mode=Vv.BYTE,this.data="string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e)}zv.getBitsLength=function(e){return 8*e},zv.prototype.getLength=function(){return this.data.length},zv.prototype.getBitsLength=function(){return zv.getBitsLength(this.data.length)},zv.prototype.write=function(e){for(let t=0,n=this.data.length;t=33088&&n<=40956)n-=33088;else{if(!(n>=57408&&n<=60351))throw new Error("Invalid SJIS character: "+this.data[t]+"\nMake sure your charset is UTF-8");n-=49472}n=192*(n>>>8&255)+(255&n),e.put(n,13)}};var Xv=Zv,eA={exports:{}};!function(e){var t={single_source_shortest_paths:function(e,n,r){var i={},o={};o[n]=0;var s,a,l,c,u,d,f,h=t.PriorityQueue.make();for(h.push(n,0);!h.empty();)for(l in a=(s=h.pop()).value,c=s.cost,u=e[a]||{})u.hasOwnProperty(l)&&(d=c+u[l],f=o[l],(void 0===o[l]||f>d)&&(o[l]=d,h.push(l,d),i[l]=a));if(void 0!==r&&void 0===o[r]){var p=["Could not find a path from ",n," to ",r,"."].join("");throw new Error(p)}return i},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],r=t;r;)n.push(r),e[r],r=e[r];return n.reverse(),n},find_path:function(e,n,r){var i=t.single_source_shortest_paths(e,n,r);return t.extract_shortest_path_from_predecessor_list(i,r)},PriorityQueue:{make:function(e){var n,r=t.PriorityQueue,i={};for(n in e=e||{},r)r.hasOwnProperty(n)&&(i[n]=r[n]);return i.queue=[],i.sorter=e.sorter||r.default_sorter,i},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){var n={value:e,cost:t};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return 0===this.queue.length}}};e.exports=t}(eA);var tA=eA.exports;!function(e){const t=Bv,n=Hv,r=Kv,i=qv,o=Xv,s=Qv,a=nv,l=tA;function c(e){return unescape(encodeURIComponent(e)).length}function u(e,t,n){const r=[];let i;for(;null!==(i=e.exec(n));)r.push({data:i[0],index:i.index,mode:t,length:i[0].length});return r}function d(e){const n=u(s.NUMERIC,t.NUMERIC,e),r=u(s.ALPHANUMERIC,t.ALPHANUMERIC,e);let i,o;a.isKanjiModeEnabled()?(i=u(s.BYTE,t.BYTE,e),o=u(s.KANJI,t.KANJI,e)):(i=u(s.BYTE_KANJI,t.BYTE,e),o=[]);return n.concat(r,i,o).sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function f(e,s){switch(s){case t.NUMERIC:return n.getBitsLength(e);case t.ALPHANUMERIC:return r.getBitsLength(e);case t.KANJI:return o.getBitsLength(e);case t.BYTE:return i.getBitsLength(e)}}function h(e,s){let l;const c=t.getBestModeForData(e);if(l=t.from(s,c),l!==t.BYTE&&l.bit=0?e[e.length-1]:null;return n&&n.mode===t.mode?(e[e.length-1].data+=t.data,e):(e.push(t),e)},[])}(u))},e.rawSplit=function(t){return e.fromArray(d(t,a.isKanjiModeEnabled()))}}(Mv);const nA=nv,rA=sv,iA=lv,oA=uv,sA=dv,aA=fv,lA=pv,cA=gv,uA=Ev,dA=xv,fA=Uv,hA=Bv,pA=Mv;function gA(e,t,n){const r=e.size,i=fA.getEncodedBits(t,n);let o,s;for(o=0;o<15;o++)s=1==(i>>o&1),o<6?e.set(o,8,s,!0):o<8?e.set(o+1,8,s,!0):e.set(r-15+o,8,s,!0),o<8?e.set(8,r-o-1,s,!0):o<9?e.set(8,15-o-1+1,s,!0):e.set(8,15-o-1,s,!0);e.set(r-8,8,1,!0)}function mA(e,t,n){const r=new iA;n.forEach(function(t){r.put(t.mode.bit,4),r.put(t.getLength(),hA.getCharCountIndicator(t.mode,e)),t.write(r)});const i=8*(nA.getSymbolTotalCodewords(e)-cA.getTotalCodewordsCount(e,t));for(r.getLengthInBits()+4<=i&&r.put(0,4);r.getLengthInBits()%8!=0;)r.putBit(0);const o=(i-r.getLengthInBits())/8;for(let e=0;e=0&&t<=6&&(0===r||6===r)||r>=0&&r<=6&&(0===t||6===t)||t>=2&&t<=4&&r>=2&&r<=4?e.set(i+t,o+r,!0,!0):e.set(i+t,o+r,!1,!0))}}(l,t),function(e){const t=e.size;for(let n=8;n=7&&function(e,t){const n=e.size,r=dA.getEncodedBits(t);let i,o,s;for(let t=0;t<18;t++)i=Math.floor(t/3),o=t%3+n-8-3,s=1==(r>>t&1),e.set(i,o,s,!0),e.set(o,i,s,!0)}(l,t),function(e,t){const n=e.size;let r=-1,i=n-1,o=7,s=0;for(let a=n-1;a>0;a-=2)for(6===a&&a--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,a-n)){let r=!1;s>>o&1)),e.set(i,a-n,r),o--,-1===o&&(s++,o=7)}if(i+=r,i<0||n<=i){i-=r,r=-r;break}}}(l,s),isNaN(r)&&(r=lA.getBestMask(l,gA.bind(null,l,n))),lA.applyMask(r,l),gA(l,n,r),{modules:l,version:t,errorCorrectionLevel:n,maskPattern:r,segments:i}}tv.create=function(e,t){if(void 0===e||""===e)throw new Error("No input text");let n,r,i=rA.M;return void 0!==t&&(i=rA.from(t.errorCorrectionLevel,rA.M),n=dA.from(t.version),r=lA.from(t.maskPattern),t.toSJISFunc&&nA.setToSJISFunction(t.toSJISFunc)),yA(e,n,i,r)};var wA={},vA={};!function(e){function t(e){if("number"==typeof e&&(e=e.toString()),"string"!=typeof e)throw new Error("Color should be defined as hex string");let t=e.slice().replace("#","").split("");if(t.length<3||5===t.length||t.length>8)throw new Error("Invalid hex color: "+e);3!==t.length&&4!==t.length||(t=Array.prototype.concat.apply([],t.map(function(e){return[e,e]}))),6===t.length&&t.push("F","F");const n=parseInt(t.join(""),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:255&n,hex:"#"+t.slice(0,6).join("")}}e.getOptions=function(e){e||(e={}),e.color||(e.color={});const n=void 0===e.margin||null===e.margin||e.margin<0?4:e.margin,r=e.width&&e.width>=21?e.width:void 0,i=e.scale||4;return{width:r,scale:r?4:i,margin:n,color:{dark:t(e.color.dark||"#000000ff"),light:t(e.color.light||"#ffffffff")},type:e.type,rendererOpts:e.rendererOpts||{}}},e.getScale=function(e,t){return t.width&&t.width>=e+2*t.margin?t.width/(e+2*t.margin):t.scale},e.getImageWidth=function(t,n){const r=e.getScale(t,n);return Math.floor((t+2*n.margin)*r)},e.qrToImageData=function(t,n,r){const i=n.modules.size,o=n.modules.data,s=e.getScale(i,r),a=Math.floor((i+2*r.margin)*s),l=r.margin*s,c=[r.color.light,r.color.dark];for(let e=0;e=l&&n>=l&&e':"",l="0&&l>0&&e[a-1]||(r+=o?IA("M",l+n,.5+c+n):IA("m",i,0),i=0,o=!1),l+1',c='viewBox="0 0 '+s+" "+s+'"',u=''+a+l+"\n";return"function"==typeof n&&n(null,u),u};const CA=function(){return"function"==typeof Promise&&Promise.prototype&&Promise.prototype.then},EA=tv,xA=wA,BA=AA;function SA(e,t,n,r,i){const o=[].slice.call(arguments,1),s=o.length,a="function"==typeof o[s-1];if(!a&&!CA())throw new Error("Callback required as last argument");if(!a){if(s<1)throw new Error("Too few arguments provided");return 1===s?(n=t,t=r=void 0):2!==s||t.getContext||(r=n,n=t,t=void 0),new Promise(function(i,o){try{const o=EA.create(n,r);i(e(o,t,r))}catch(e){o(e)}})}if(s<2)throw new Error("Too few arguments provided");2===s?(i=n,n=t,t=r=void 0):3===s&&(t.getContext&&void 0===i?(i=r,r=void 0):(i=r,r=n,n=t,t=void 0));try{const o=EA.create(n,r);i(null,e(o,t,r))}catch(e){i(e)}}async function QA(e,t,n,r){if(!e||!t)return console.log("No signer or pubkey available"),null;try{const t={kind:27235,created_at:Math.floor(Date.now()/1e3),tags:[["u",r],["method",n]],content:""},i=await e.signEvent(t);return btoa(JSON.stringify(i)).replace(/\+/g,"-").replace(/\//g,"_")}catch(e){return console.error("Error creating NIP-98 auth:",e),null}}async function FA(e,t){const n=`${window.location.origin}/api/wireguard/config`,r=await QA(e,t,"GET",n),i=await fetch(n,{headers:r?{Authorization:`Nostr ${r}`}:{}});if(!i.ok){const e=await i.text();throw new Error(e||`Failed to get WireGuard config: ${i.statusText}`)}return await i.json()}async function DA(e,t){const n=`${window.location.origin}/api/bunker/url`,r=await QA(e,t,"GET",n),i=await fetch(n,{headers:r?{Authorization:`Nostr ${r}`}:{}});if(!i.ok){const e=await i.text();throw new Error(e||`Failed to get bunker URL: ${i.statusText}`)}return await i.json()}async function $A(e,t){const n=`${window.location.origin}/api/wireguard/audit`,r=await QA(e,t,"GET",n),i=await fetch(n,{headers:r?{Authorization:`Nostr ${r}`}:{}});if(!i.ok){const e=await i.text();throw new Error(e||`Failed to get audit log: ${i.statusText}`)}return await i.json()}function RA(e,t,n){const r=e.slice();return r[22]=t[n],r}function PA(e,t,n){const r=e.slice();return r[25]=t[n],r}function TA(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-mnczw"),A(o,"class","login-btn svelte-mnczw"),A(n,"class","login-prompt svelte-mnczw")},m(e,l){u(e,n,l),c(n,r),c(n,i),c(n,o),s||(a=w(o,"click",t[14]),s=!0)},p:e,d(e){e&&d(n),s=!1,a()}}}function UA(e){let t,n,r,i,o,s,a,l,f=(e[1]||"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-mnczw"),A(o,"class","svelte-mnczw"),A(n,"class","access-denied svelte-mnczw"),A(t,"class","bunker-view svelte-mnczw")},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){2&t&&f!==(f=(e[1]||"read-only")+"")&&k(l,f)},d(e){e&&d(t)}}}function NA(e){let t,n,r,i,o,s,a,l,f,p,y=e[3]?"Loading...":"Refresh",v=e[8]&&MA(e);function b(e,t){return e[3]&&!e[5]?OA:e[5]?_A:void 0}let I=b(e),C=I&&I(e);return{c(){t=h("div"),n=h("div"),r=h("h3"),r.textContent="Remote Signing (Bunker)",i=m(),o=h("button"),s=g(y),a=m(),v&&v.c(),l=m(),C&&C.c(),A(r,"class","svelte-mnczw"),A(o,"class","refresh-btn svelte-mnczw"),o.disabled=e[3],A(n,"class","header-section svelte-mnczw"),A(t,"class","bunker-view svelte-mnczw")},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),v&&v.m(t,null),c(t,l),C&&C.m(t,null),f||(p=w(o,"click",e[11]),f=!0)},p(e,n){8&n&&y!==(y=e[3]?"Loading...":"Refresh")&&k(s,y),8&n&&(o.disabled=e[3]),e[8]?v?v.p(e,n):(v=MA(e),v.c(),v.m(t,l)):v&&(v.d(1),v=null),I===(I=b(e))&&C?C.p(e,n):(C&&C.d(1),C=I&&I(e),C&&(C.c(),C.m(t,null)))},d(e){e&&d(t),v&&v.d(),C&&C.d(),f=!1,p()}}}function LA(t){let n;return{c(){n=h("div"),n.innerHTML='

    Remote Signing Not Available

    \n

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

    \n

    Remote signing requires the relay operator to enable WireGuard VPN and use ACL mode "follows" or "managed".

    ',A(n,"class","bunker-view svelte-mnczw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function MA(e){let t,n;return{c(){t=h("div"),n=g(e[8]),A(t,"class","error-message svelte-mnczw")},m(e,r){u(e,t,r),c(t,n)},p(e,t){256&t&&k(n,e[8])},d(e){e&&d(t)}}}function _A(e){let t,n,i,o,s,a,l,f,p,v,b,I,C,E,x,B,S,Q,F,D,$,R,P,T,U,N,L,M,_,O,H,j,G,J,K,V,z,q,Y,W,Z,X,ee,te,ne,re,ie,oe,se=e[5].config_text+"",ae=e[5].interface.address+"";function le(e,t){return e[9]?jA:HA}let ce=le(e),ue=ce(e),de=e[6]&&GA(e),fe=e[7]&&(e[7].revoked_keys?.length>0||e[7].access_logs?.length>0)&&VA(e);return{c(){t=h("div"),t.innerHTML='

    How it works: Connect to the relay's private VPN, then use Amber to sign events remotely.

    ',n=m(),i=h("div"),o=h("section"),o.innerHTML='

    Step 1: Install WireGuard

    \n

    Download the WireGuard app for your device:

    \n\n ',s=m(),a=h("section"),l=h("h4"),l.textContent="Step 2: Add VPN Configuration",f=m(),p=h("p"),p.textContent="Scan this QR code with the WireGuard app:",v=m(),b=h("div"),ue.c(),I=m(),C=h("div"),E=h("button"),E.textContent="Copy Config",x=m(),B=h("button"),B.textContent="Download .conf",S=m(),Q=h("details"),F=h("summary"),F.textContent="Show raw config",D=m(),$=h("pre"),R=g(se),P=m(),T=h("section"),U=h("h4"),U.textContent="Step 3: Connect to VPN",N=m(),L=h("p"),L.textContent="After importing the config, toggle the VPN connection ON in the WireGuard app.",M=m(),_=h("div"),O=h("span"),O.textContent="Your VPN IP:",H=m(),j=h("code"),G=g(ae),J=m(),de&&de.c(),K=m(),V=h("section"),V.innerHTML='

    Get Amber (NIP-46 Signer)

    \n

    Amber is an Android app for secure remote signing:

    \n\n ',z=m(),q=h("div"),Y=h("h4"),Y.textContent="Danger Zone",W=m(),Z=h("p"),Z.textContent="Regenerate your WireGuard keys if you believe they've been compromised.",X=m(),ee=h("button"),te=g("Regenerate Keys"),ne=m(),fe&&fe.c(),re=y(),A(t,"class","instructions svelte-mnczw"),A(o,"class","config-section svelte-mnczw"),A(l,"class","svelte-mnczw"),A(p,"class","section-desc svelte-mnczw"),A(b,"class","qr-container svelte-mnczw"),A(E,"class","svelte-mnczw"),A(B,"class","svelte-mnczw"),A(C,"class","config-actions svelte-mnczw"),A(F,"class","svelte-mnczw"),A($,"class","config-text svelte-mnczw"),A(Q,"class","config-text-details svelte-mnczw"),A(a,"class","config-section svelte-mnczw"),A(U,"class","svelte-mnczw"),A(L,"class","section-desc svelte-mnczw"),A(O,"class","label svelte-mnczw"),A(j,"class","svelte-mnczw"),A(_,"class","ip-info svelte-mnczw"),A(T,"class","config-section svelte-mnczw"),A(V,"class","config-section svelte-mnczw"),A(i,"class","config-sections svelte-mnczw"),A(Y,"class","svelte-mnczw"),A(Z,"class","svelte-mnczw"),A(ee,"class","danger-btn svelte-mnczw"),ee.disabled=e[3],A(q,"class","danger-zone svelte-mnczw")},m(r,d){u(r,t,d),u(r,n,d),u(r,i,d),c(i,o),c(i,s),c(i,a),c(a,l),c(a,f),c(a,p),c(a,v),c(a,b),ue.m(b,null),c(a,I),c(a,C),c(C,E),c(C,x),c(C,B),c(a,S),c(a,Q),c(Q,F),c(Q,D),c(Q,$),c($,R),c(i,P),c(i,T),c(T,U),c(T,N),c(T,L),c(T,M),c(T,_),c(_,O),c(_,H),c(_,j),c(j,G),c(i,J),de&&de.m(i,null),c(i,K),c(i,V),u(r,z,d),u(r,q,d),c(q,Y),c(q,W),c(q,Z),c(q,X),c(q,ee),c(ee,te),u(r,ne,d),fe&&fe.m(r,d),u(r,re,d),ie||(oe=[w(E,"click",e[18]),w(B,"click",e[13]),w(ee,"click",e[12])],ie=!0)},p(e,t){ce===(ce=le(e))&&ue?ue.p(e,t):(ue.d(1),ue=ce(e),ue&&(ue.c(),ue.m(b,null))),32&t&&se!==(se=e[5].config_text+"")&&k(R,se),32&t&&ae!==(ae=e[5].interface.address+"")&&k(G,ae),e[6]?de?de.p(e,t):(de=GA(e),de.c(),de.m(i,K)):de&&(de.d(1),de=null),8&t&&(ee.disabled=e[3]),e[7]&&(e[7].revoked_keys?.length>0||e[7].access_logs?.length>0)?fe?fe.p(e,t):(fe=VA(e),fe.c(),fe.m(re.parentNode,re)):fe&&(fe.d(1),fe=null)},d(e){e&&d(t),e&&d(n),e&&d(i),ue.d(),de&&de.d(),e&&d(z),e&&d(q),e&&d(ne),fe&&fe.d(e),e&&d(re),ie=!1,r(oe)}}}function OA(t){let n;return{c(){n=h("div"),n.textContent="Loading configuration...",A(n,"class","loading svelte-mnczw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function HA(t){let n;return{c(){n=h("div"),n.textContent="Generating QR...",A(n,"class","qr-placeholder svelte-mnczw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function jA(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[9])||A(t,"src",n),A(t,"alt","WireGuard Configuration QR Code"),A(t,"class","qr-code svelte-mnczw")},m(e,n){u(e,t,n)},p(e,r){512&r&&!a(t.src,n=e[9])&&A(t,"src",n)},d(e){e&&d(t)}}}function GA(e){let t,n,r,i,o,s,a,l,f,p,y,v,b,I,C,E,x,B,S,Q,F=e[6].url+"",D=e[6].relay_npub+"";function $(e,t){return e[10]?KA:JA}let R=$(e),P=R(e);return{c(){t=h("section"),n=h("h4"),n.textContent="Step 4: Add Bunker to Amber",r=m(),i=h("p"),i.innerHTML='With VPN connected, scan this QR code in Amber:',o=m(),s=h("div"),P.c(),a=m(),l=h("div"),f=h("code"),p=g(F),y=m(),v=h("button"),v.textContent="Copy",b=m(),I=h("div"),C=h("span"),C.textContent="Relay npub:",E=m(),x=h("code"),B=g(D),A(n,"class","svelte-mnczw"),A(i,"class","section-desc svelte-mnczw"),A(s,"class","qr-container svelte-mnczw"),A(f,"class","bunker-url svelte-mnczw"),A(v,"class","svelte-mnczw"),A(l,"class","bunker-url-container svelte-mnczw"),A(C,"class","label svelte-mnczw"),A(x,"class","npub svelte-mnczw"),A(I,"class","relay-info svelte-mnczw"),A(t,"class","config-section svelte-mnczw")},m(d,h){u(d,t,h),c(t,n),c(t,r),c(t,i),c(t,o),c(t,s),P.m(s,null),c(t,a),c(t,l),c(l,f),c(f,p),c(l,y),c(l,v),c(t,b),c(t,I),c(I,C),c(I,E),c(I,x),c(x,B),S||(Q=w(v,"click",e[19]),S=!0)},p(e,t){R===(R=$(e))&&P?P.p(e,t):(P.d(1),P=R(e),P&&(P.c(),P.m(s,null))),64&t&&F!==(F=e[6].url+"")&&k(p,F),64&t&&D!==(D=e[6].relay_npub+"")&&k(B,D)},d(e){e&&d(t),P.d(),S=!1,Q()}}}function JA(t){let n;return{c(){n=h("div"),n.textContent="Generating QR...",A(n,"class","qr-placeholder svelte-mnczw")},m(e,t){u(e,n,t)},p:e,d(e){e&&d(n)}}}function KA(e){let t,n;return{c(){t=h("img"),a(t.src,n=e[10])||A(t,"src",n),A(t,"alt","Bunker URL QR Code"),A(t,"class","qr-code svelte-mnczw")},m(e,n){u(e,t,n)},p(e,r){1024&r&&!a(t.src,n=e[10])&&A(t,"src",n)},d(e){e&&d(t)}}}function VA(e){let t,n,r,i,o,s,a=e[7].revoked_keys?.length>0&&zA(e),l=e[7].access_logs?.length>0&&YA(e);return{c(){t=h("div"),n=h("h4"),n.textContent="Key History & Access Log",r=m(),i=h("p"),i.textContent="Monitor activity on your old WireGuard keys. High access counts might indicate you left something connected or someone copied your credentials.",o=m(),a&&a.c(),s=m(),l&&l.c(),A(n,"class","svelte-mnczw"),A(i,"class","audit-desc svelte-mnczw"),A(t,"class","audit-section svelte-mnczw")},m(e,d){u(e,t,d),c(t,n),c(t,r),c(t,i),c(t,o),a&&a.m(t,null),c(t,s),l&&l.m(t,null)},p(e,n){e[7].revoked_keys?.length>0?a?a.p(e,n):(a=zA(e),a.c(),a.m(t,s)):a&&(a.d(1),a=null),e[7].access_logs?.length>0?l?l.p(e,n):(l=YA(e),l.c(),l.m(t,null)):l&&(l.d(1),l=null)},d(e){e&&d(t),a&&a.d(),l&&l.d()}}}function zA(e){let t,n,r,i,o,s,a,l,p=e[7].revoked_keys,g=[];for(let t=0;tClient IP \n Created \n Revoked \n Access Count \n Last Access',a=m(),l=h("tbody");for(let e=0;e0),A(I,"class","svelte-mnczw"),A(t,"class","svelte-mnczw"),B(t,"warning",e[25].access_count>0)},m(e,d){u(e,t,d),c(t,n),c(n,r),c(r,i),c(t,o),c(t,s),c(s,a),c(t,l),c(t,f),c(f,p),c(t,y),c(t,w),c(w,v),c(t,b),c(t,I),c(I,C),c(t,E)},p(e,n){128&n&&x!==(x=e[25].client_ip+"")&&k(i,x),128&n&&S!==(S=XA(e[25].created_at)+"")&&k(a,S),128&n&&Q!==(Q=XA(e[25].revoked_at)+"")&&k(p,Q),128&n&&F!==(F=e[25].access_count+"")&&k(v,F),128&n&&B(w,"highlight",e[25].access_count>0),128&n&&D!==(D=XA(e[25].last_access_at)+"")&&k(C,D),128&n&&B(t,"warning",e[25].access_count>0)},d(e){e&&d(t)}}}function YA(e){let t,n,r,i,o,s,a,l,p=e[7].access_logs,g=[];for(let t=0;tClient IP \n Time \n Remote Address',a=m(),l=h("tbody");for(let e=0;enull)]);n(5,c=e),n(6,u=t),n(7,f=r),c?.config_text&&n(9,g=await ev.toDataURL(c.config_text,{width:256,margin:2,color:{dark:"#000000",light:"#ffffff"}})),u?.url&&n(10,m=await ev.toDataURL(u.url,{width:256,margin:2,color:{dark:"#000000",light:"#ffffff"}}))}catch(e){console.error("Error loading bunker config:",e),n(8,p=e.message||"Failed to load configuration")}finally{n(3,h=!1)}}}D(async()=>{await async function(){try{n(2,d=await async function(){try{const e=await fetch(`${window.location.origin}/api/wireguard/status`);if(e.ok)return await e.json()}catch(e){console.error("Error fetching WireGuard status:",e)}return{wireguard_enabled:!1,bunker_enabled:!1,available:!1}}())}catch(e){console.error("Error checking WireGuard status:",e),n(2,d={available:!1})}}(),r&&d?.available&&!y&&(n(17,y=!0),await w())});return e.$$set=e=>{"isLoggedIn"in e&&n(0,i=e.isLoggedIn),"userPubkey"in e&&n(15,o=e.userPubkey),"userSigner"in e&&n(16,s=e.userSigner),"currentEffectiveRole"in e&&n(1,a=e.currentEffectiveRole)},e.$$.update=()=>{32771&e.$$.dirty&&n(4,r=i&&o&&("write"===a||"admin"===a||"owner"===a)),131100&e.$$.dirty&&r&&d?.available&&!y&&!h&&(n(17,y=!0),w())},[i,a,d,h,r,c,u,f,p,g,m,w,async function(){if(confirm("Regenerate your WireGuard keys? Your current keys will stop working.")){n(3,h=!0),n(8,p="");try{await async function(e,t){const n=`${window.location.origin}/api/wireguard/regenerate`,r=await QA(e,t,"POST",n),i=await fetch(n,{method:"POST",headers:r?{Authorization:`Nostr ${r}`}:{}});if(!i.ok){const e=await i.text();throw new Error(e||`Failed to regenerate WireGuard: ${i.statusText}`)}return await i.json()}(s,o),n(17,y=!1),await w()}catch(e){console.error("Error regenerating keys:",e),n(8,p=e.message||"Failed to regenerate keys")}finally{n(3,h=!1)}}},function(){if(!c?.config_text)return;const e=new Blob([c.config_text],{type:"text/plain"}),t=URL.createObjectURL(e),n=document.createElement("a");n.href=t,n.download="wg-orly.conf",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)},function(){l("openLoginModal")},o,s,y,()=>eb(c.config_text,"Config"),()=>eb(u.url,"Bunker URL")]}ev.create=EA.create,ev.toCanvas=SA.bind(null,xA.render),ev.toDataURL=SA.bind(null,xA.renderToDataURL),ev.toString=SA.bind(null,function(e,t,n){return BA.render(e,n)});class nb extends oe{constructor(e){super(),ie(this,e,tb,ZA,o,{isLoggedIn:0,userPubkey:15,userSigner:16,currentEffectiveRole:1})}}function rb(e,t,n){const r=e.slice();return r[29]=t[n],r}function ib(e,t,n){const r=e.slice();return r[32]=t[n],r}function ob(e){let t,n,r;function i(e,t){return e[0]?ab:lb}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 sb(e){let t,n,i,o,s,a,l,p,y,v,b,I,C,x,B,S,Q,F,D,$,R,P,T,U,N,L,M,_,H,j,G,J=e[3]?"Loading...":"Refresh",K=e[2].length+"",V=e[12],z=[];for(let t=0;te[18].call(y)),A(a,"class","level-selector svelte-w6h7aj"),A(b,"class","clear-btn svelte-w6h7aj"),b.disabled=C=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($,"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 hb(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 pb(e){let t,n,r,i,o,s,a,l,f,p,y,w=vb(e[29].timestamp)+"",v=e[29].level+"",b=e[29].message+"",I=e[29].file&&hb(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 "+Ab(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=vb(e[29].timestamp)+"")&&k(r,w),4&n[0]&&v!==(v=e[29].level+"")&&k(s,v),4&n[0]&&a!==(a="log-level "+Ab(e[29].level)+" svelte-w6h7aj")&&A(o,"class",a),e[29].file?I?I.p(e,n):(I=hb(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 gb(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 mb(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 yb(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 wb(t){let n;function r(e,t){return e[4]?sb:ob}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 vb(e){if(!e)return"";return new Date(e).toLocaleString()}function Ab(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 bb(e,t,n){let r,{isLoggedIn:i=!1}=t,{userRole:o=""}=t,{userSigner:s=null}=t;const a=R();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)}())}),$(()=>{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){U[e?"unshift":"push"](()=>{w=e,n(11,w)})},function(e){U[e?"unshift":"push"](()=>{y=e,n(10,y)})}]}class kb extends oe{constructor(e){super(),ie(this,e,bb,wb,o,{isLoggedIn:0,userRole:1,userSigner:17},null,[-1,-1])}}function Ib(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 Cb(t){let n,r=t[0]&&t[1]&&Ib(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=Ib(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 Eb(e,t,n){let r,i;const o=R();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 xb extends oe{constructor(e){super(),ie(this,e,Eb,Cb,o,{filter:4,showFilter:0})}}function Bb(e){return kh[e]||`Kind ${e}`}function Sb(e){return e?e.slice(0,8)+"..."+e.slice(-8):"unknown"}function Qb(e,t=100){return e?e.length>t?e.slice(0,t)+"...":e:""}function Fb(e){return e?new Date(1e3*e).toLocaleString():""}class Db{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 $b(e,t,n,r){const i=new Db(e,n,r);try{await i.connect();return await i.publishEvent(t)}finally{i.close()}}function Rb(e,t,n){const r=e.slice();return r[169]=t[n],r}function Pb(e,t,n){const r=e.slice();return r[179]=t[n],r}function Tb(e,t,n){const r=e.slice();return r[172]=t[n],r}function Ub(e,t,n){const r=e.slice();r[172]=t[n];const i=r[52](r[172]);return r[173]=i,r}function Nb(e,t,n){const r=e.slice();return r[176]=t[n],r}function Lb(t){let n;function r(e,t){return e[1]?Zb:Wb}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 Mb(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[36]&&parseInt(t[36])>=0,R=bh,P=[];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;et[115].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(C,"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=0||""!==e[36]&&parseInt(e[36])>=0),$?T?T.p(e,t):(T=ck(e),T.c(),T.m(n,null)):T&&(T.d(1),T=null)},i:e,o:e,d(e){e&&d(n),f(P,e),T&&T.d(),F=!1,r(D)}}}function Ob(e){let t,n;return t=new kb({props:{isLoggedIn:e[1],userRole:e[4],userSigner:e[13]}}),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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){ne(t,e)}}}function Hb(e){let t,n,r;function i(t){e[114](t)}let o={isLoggedIn:e[1],userRole:e[4],isPolicyAdmin:Rk,policyEnabled:e[8],isLoadingPolicy:e[27],policyMessage:e[28],policyMessageType:e[29],validationErrors:e[30],policyFollows:e[31]};return void 0!==e[26]&&(o.policyJson=e[26]),t=new ow({props:o}),U.push(()=>X(t,"policyJson",i)),t.$on("loadPolicy",e[60]),t.$on("validatePolicy",e[61]),t.$on("savePolicy",e[62]),t.$on("formatJson",e[63]),t.$on("addPolicyAdmin",e[64]),t.$on("removePolicyAdmin",e[65]),t.$on("refreshFollows",e[66]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,n){te(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]),134217728&r[0]&&(i.isLoadingPolicy=e[27]),268435456&r[0]&&(i.policyMessage=e[28]),536870912&r[0]&&(i.policyMessageType=e[29]),1073741824&r[0]&&(i.validationErrors=e[30]),1&r[1]&&(i.policyFollows=e[31]),!n&&67108864&r[0]&&(n=!0,i.policyJson=e[26],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){ne(t,e)}}}function jb(e){let t,n,r;function i(t){e[111](t)}let o={isLoggedIn:e[1],userRole:e[4],sprocketStatus:e[20],isLoadingSprocket:e[22],sprocketUploadFile:e[25],sprocketMessage:e[23],sprocketMessageType:e[24],sprocketVersions:e[21]};return void 0!==e[19]&&(o.sprocketScript=e[19]),t=new _y({props:o}),U.push(()=>X(t,"sprocketScript",i)),t.$on("restartSprocket",e[55]),t.$on("deleteSprocket",e[56]),t.$on("sprocketFileSelect",e[67]),t.$on("uploadSprocketScript",e[68]),t.$on("saveSprocket",e[54]),t.$on("loadSprocket",e[53]),t.$on("loadVersions",e[57]),t.$on("loadVersion",e[112]),t.$on("deleteVersion",e[113]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,n){te(t,e,n),r=!0},p(e,r){const i={};2&r[0]&&(i.isLoggedIn=e[1]),16&r[0]&&(i.userRole=e[4]),1048576&r[0]&&(i.sprocketStatus=e[20]),4194304&r[0]&&(i.isLoadingSprocket=e[22]),33554432&r[0]&&(i.sprocketUploadFile=e[25]),8388608&r[0]&&(i.sprocketMessage=e[23]),16777216&r[0]&&(i.sprocketMessageType=e[24]),2097152&r[0]&&(i.sprocketVersions=e[21]),!n&&524288&r[0]&&(n=!0,i.sprocketScript=e[19],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){ne(t,e)}}}function Gb(e){let t,n,r,i;const o=[Ak,vk,wk],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):(q(),Z(s[l],1,1,()=>{s[l]=null}),Y(),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 Jb(e){let t,n,r;function i(t){e[110](t)}let o={userPubkey:e[2],userRole:e[4],policyEnabled:e[8],publishError:e[34]};return void 0!==e[33]&&(o.composeEventJson=e[33]),t=new Sy({props:o}),U.push(()=>X(t,"composeEventJson",i)),t.$on("reformatJson",e[90]),t.$on("signEvent",e[91]),t.$on("publishEvent",e[92]),t.$on("clearError",e[93]),{c(){ee(t.$$.fragment)},m(e,n){te(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]),8&r[1]&&(i.publishError=e[34]),!n&&4&r[1]&&(n=!0,i.composeEventJson=e[33],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){ne(t,e)}}}function Kb(e){let t,n;return t=new nb({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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){ne(t,e)}}}function Vb(e){let t,n;return t=new Xw({props:{isLoggedIn:e[1],userPubkey:e[2],userSigner:e[13],currentEffectiveRole:e[10]}}),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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){ne(t,e)}}}function zb(e){let t,n;return t=new ly({props:{isLoggedIn:e[1],userRole:e[4],userPubkey:e[2],filteredEvents:e[41],expandedEvents:e[18],isLoadingEvents:e[7],showOnlyMyEvents:$k,showFilterBuilder:e[15]}}),t.$on("scroll",e[89]),t.$on("toggleEventExpansion",e[106]),t.$on("deleteEvent",e[107]),t.$on("copyEventToClipboard",e[108]),t.$on("toggleChange",e[45]),t.$on("loadAllEvents",e[109]),t.$on("toggleFilterBuilder",e[76]),t.$on("filterApply",e[77]),t.$on("filterClear",e[78]),{c(){ee(t.$$.fragment)},m(e,r){te(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]),1024&n[1]&&(r.filteredEvents=e[41]),262144&n[0]&&(r.expandedEvents=e[18]),128&n[0]&&(r.isLoadingEvents=e[7]),32768&n[0]&&(r.showFilterBuilder=e[15]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function qb(e){let t,n;return t=new lm({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],selectedFile:e[16],aclMode:e[9],importMessage:e[17]}}),t.$on("fileSelect",e[86]),t.$on("importEvents",e[87]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(t,e,r),n=!0},p(e,n){const r={};2&n[0]&&(r.isLoggedIn=e[1]),1024&n[0]&&(r.currentEffectiveRole=e[10]),65536&n[0]&&(r.selectedFile=e[16]),512&n[0]&&(r.aclMode=e[9]),131072&n[0]&&(r.importMessage=e[17]),t.$set(r)},i(e){n||(W(t.$$.fragment,e),n=!0)},o(e){Z(t.$$.fragment,e),n=!1},d(e){ne(t,e)}}}function Yb(e){let t,n;return t=new tm({props:{isLoggedIn:e[1],currentEffectiveRole:e[10],aclMode:e[9]}}),t.$on("exportMyEvents",e[85]),t.$on("exportAllEvents",e[84]),t.$on("openLoginModal",e[70]),{c(){ee(t.$$.fragment)},m(e,r){te(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){ne(t,e)}}}function Wb(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 Zb(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 Xb(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,C,E,x,B,S,Q,F,D,$=e[179].label+"",R=e[42].get(e[179].id)?.isLoading,P=!e[42].get(e[179].id)?.hasMore&&e[42].get(e[179].id)?.events?.length>0;function T(){return e[120](e[179])}function U(e,t){return 64&t[0]&&(C=null),64&t[0]&&(E=null),null==C&&(C=!!(e[42].get(e[179].id)?.events?.length>0)),C?tk:(null==E&&(E=!e[42].get(e[179].id)?.isLoading),E?ek:void 0)}v=new xb({props:{filter:e[42].get(e[179].id)?.filter||{}}}),v.$on("sweep",function(){return e[121](e[179])});let N=U(e,[-1,-1,-1,-1,-1,-1]),L=N&&N(e),M=R&&ok(),_=P&&sk();function O(...t){return e[126](e[179],...t)}return{c(){t=h("div"),n=h("div"),i=h("h2"),o=g("🔍 "),s=g($),a=m(),l=h("button"),f=g("🔄 Refresh"),y=m(),ee(v.$$.fragment),b=m(),I=h("div"),L&&L.c(),x=m(),M&&M.c(),B=m(),_&&_.c(),S=m(),A(i,"class","svelte-u3u5mw"),A(l,"class","refresh-btn svelte-u3u5mw"),l.disabled=p=e[42].get(e[179].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),te(v,t,null),c(t,b),c(t,I),L&&L.m(I,null),c(I,x),M&&M.m(I,null),c(I,B),_&&_.m(I,null),c(t,S),Q=!0,F||(D=[w(l,"click",T),w(I,"scroll",O)],F=!0)},p(t,n){e=t,(!Q||64&n[0])&&$!==($=e[179].label+"")&&k(s,$),(!Q||64&n[0]&&p!==(p=e[42].get(e[179].id)?.isLoading))&&(l.disabled=p);const r={};64&n[0]&&(r.filter=e[42].get(e[179].id)?.filter||{}),v.$set(r),N===(N=U(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]&&(R=e[42].get(e[179].id)?.isLoading),R?M||(M=ok(),M.c(),M.m(I,B)):M&&(M.d(1),M=null),64&n[0]&&(P=!e[42].get(e[179].id)?.hasMore&&e[42].get(e[179].id)?.events?.length>0),P?_||(_=sk(),_.c(),_.m(I,null)):_&&(_.d(1),_=null)},i(e){Q||(W(v.$$.fragment,e),Q=!0)},o(e){Z(v.$$.fragment,e),Q=!1},d(e){e&&d(t),ne(v),L&&L.d(),M&&M.d(),_&&_.d(),F=!1,r(D)}}}function ek(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 tk(e){let t,n=e[42].get(e[179].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(M),b=m(),I=h("span"),C=g(_),E=m(),x=h("div"),S=h("div"),Q=g(O),F=m(),D=h("div"),$=g(H),R=m(),G&&G.c(),P=m(),V&&V.c(),T=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[18].has(e[172].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,C),c(n,E),c(n,x),c(x,S),c(S,Q),c(x,F),c(x,D),c(D,$),c(n,R),G&&G.m(n,null),c(t,P),V&&V.m(t,null),c(t,T),U||(N=[w(n,"click",J),w(n,"keydown",K)],U=!0)},p(r,i){e=r,64&i[0]&&L!==(L=Sb(e[172].pubkey)+"")&&k(l,L),64&i[0]&&M!==(M=e[172].kind+"")&&k(v,M),64&i[0]&&_!==(_=Bb(e[172].kind)+"")&&k(C,_),64&i[0]&&O!==(O=Fb(e[172].created_at)+"")&&k(Q,O),64&i[0]&&H!==(H=Qb(e[172].content)+"")&&k($,H),5!==e[172].kind&&("admin"===e[4]||"owner"===e[4]||"write"===e[4]&&e[172].pubkey&&e[172].pubkey===e[2])?G?G.p(e,i):(G=nk(e),G.c(),G.m(n,null)):G&&(G.d(1),G=null),262208&i[0]&&(j=e[18].has(e[172].id)),j?V?V.p(e,i):(V=rk(e),V.c(),V.m(t,T)):V&&(V.d(1),V=null),262208&i[0]|2048&i[1]&&B(t,"expanded",e[18].has(e[172].id))},d(e){e&&d(t),G&&G.d(),V&&V.d(),U=!1,r(N)}}}function ok(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 sk(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 ak(e){let t,n,r=e[179].id===e[5]&&Xb(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[179].id===e[5]?r?(r.p(e,n),96&n[0]&&W(r,1)):(r=Xb(e),r.c(),W(r,1),r.m(t.parentNode,t)):r&&(q(),Z(r,1,1,()=>{r=null}),Y())},i(e){n||(W(r),n=!0)},o(e){Z(r),n=!1},d(e){r&&r.d(e),e&&d(t)}}}function lk(t){let n,r,i=t[176].label+"";return{c(){n=h("option"),r=g(i),n.__value=t[176].value,n.value=n.__value},m(e,t){u(e,n,t),c(n,r)},p:e,d(e){e&&d(n)}}}function ck(e){let t;function n(e,t){return e[38]?fk:0===e[37].length?dk:uk}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 uk(e){let t,n,r,i=e[37],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 bk(e){let t,n,i,o,s,a,l,f,p,g;function y(e,t){return e[3]?Ik:e[1]&&e[2]?kk: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[75]),w(n,"click",v(e[101])),w(n,"keydown",v(e[102])),w(t,"click",e[75]),w(t,"keydown",e[128])],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 kk(e){let t,n,i,o,s,a,l,f,p,y,v,b,I,C,E,x,B,S=e[2].slice(0,16)+"",Q=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),C=g("..."),E=g(Q),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,C),c(y,E),x||(B=[w(n,"click",e[72]),w(f,"click",e[83])],x=!0)},p(e,t){4&t[0]&&S!==(S=e[2].slice(0,16)+"")&&k(I,S),4&t[0]&&Q!==(Q=e[2].slice(-8)+"")&&k(E,Q)},d(e){e&&d(t),x=!1,r(B)}}}function Ik(e){let t,n,r,i,o,s,a,l,f,p,v,b,I,C,E,x=(e[3].name||"Unknown User")+"",B=e[3].banner&&Ck(e);function S(e,t){return e[3].picture?xk:Ek}let Q=S(e),F=Q(e),D=e[3].nip05&&Bk(e),$=e[3].about&&Sk(e),R=e[4]&&"read"!==e[4]&&Qk(e);return{c(){t=h("div"),n=h("div"),B&&B.c(),r=m(),i=h("button"),i.textContent="Log out",o=m(),F.c(),s=m(),a=h("div"),l=h("h3"),f=g(x),p=m(),D&&D.c(),v=m(),$&&$.c(),b=m(),R&&R.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),F.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),$&&$.m(t,null),u(d,b,h),R&&R.m(d,h),u(d,I,h),C||(E=w(i,"click",e[72]),C=!0)},p(e,i){e[3].banner?B?B.p(e,i):(B=Ck(e),B.c(),B.m(n,r)):B&&(B.d(1),B=null),Q===(Q=S(e))&&F?F.p(e,i):(F.d(1),F=Q(e),F&&(F.c(),F.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=Bk(e),D.c(),D.m(a,null)):D&&(D.d(1),D=null),e[3].about?$?$.p(e,i):($=Sk(e),$.c(),$.m(t,null)):$&&($.d(1),$=null),e[4]&&"read"!==e[4]?R?R.p(e,i):(R=Qk(e),R.c(),R.m(I.parentNode,I)):R&&(R.d(1),R=null)},d(e){e&&d(t),B&&B.d(),F.d(),D&&D.d(),$&&$.d(),e&&d(b),R&&R.d(e),e&&d(I),C=!1,E()}}}function Ck(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 Ek(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 xk(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 Bk(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 Sk(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[40]},p(e,t){512&t[1]&&(n.innerHTML=e[40])},d(e){e&&d(t)}}}function Qk(e){let t,n,r,i,o,s,a=e[95](),l=[];for(let t=0;tX(y,"showModal",E)),y.$on("login",e[71]),y.$on("close",e[73]),{c(){ee(t.$$.fragment),n=m(),r=h("div"),ee(i.$$.fragment),o=m(),s=h("main"),f.c(),p=m(),C&&C.c(),g=m(),ee(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){te(t,e,a),u(e,n,a),u(e,r,a),te(i,r,null),c(r,o),c(r,s),k[l].m(s,null),u(e,p,a),C&&C.m(e,a),u(e,g,a),te(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]),2&n[1]&&(a.version=e[32]),i.$set(a);let c=l;l=I(e,n),l===c?k[l].p(e,n):(q(),Z(k[c],1,1,()=>{k[c]=null}),Y(),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[14]?C?C.p(e,n):(C=bk(e),C.c(),C.m(g.parentNode,g)):C&&(C.d(1),C=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){ne(t,e),e&&d(n),e&&d(r),ne(i),k[l].d(),e&&d(p),C&&C.d(e),e&&d(g),ne(y,e)}}}let $k=!1,Rk=!1;function Pk(e,t,n){let r,i,o,s,a;"undefined"!=typeof window&&(window.debugIndexedDB=Oh);let l=!1,c=!1,u=!1,d="",f="",h=null,p="",g=null,m=!1,y=localStorage.getItem("selectedTab")||"export",w=!1,v={},A=[],k=[],I=null,C="",E=new Set,B=!1,S=!0,Q=null,F="",D=new Map,$=[],R=0,T=[],U=!0,N=null,L="",M=null,_=[],O=!1,H="",j="info",G=!1,J=null,K="",V=!1,z=!1,q="",Y="info",W=[],Z=[],X="",ee="",te="",ne="",re=null,ie="",oe=[],se=!1,ae=!0,le=null;function ce(e){E.has(e)?E.delete(e):E.add(e),n(18,E)}async function ue(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 de(e){if(!u)return void alert("Please log in first");const t=k.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 $b(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 Eh.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 Nh(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 Lh(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(96,k=k.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),$=$.filter(t=>t.id!==e);for(const[t,n]of D)n.events&&(n.events=n.events.filter(t=>t.id!==e),D.set(t,n));ge(),console.log("Reloading events to show delete event...");const r=$k&&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 Ch;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 Nh(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 Lh(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(96,k=k.filter(t=>t.id!==e)),T=T.filter(t=>t.id!==e),$=$.filter(t=>t.id!==e);for(const[t,n]of D)n.events&&(n.events=n.events.filter(t=>t.id!==e),D.set(t,n));ge(),console.log("Reloading events to show delete event...");const t=$k&&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 fe(){const e=ie?parseInt(ie):re;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(38,se=!0);try{const t=[{kinds:[e],authors:[d],limit:100}];le&&(t[0].until=le),console.log("Recovery filters:",t);const r=await _h(t,{timeout:3e4,cacheFirst:!0});console.log("Recovery events received:",r.length),console.log("Recovery events kinds:",r.map(e=>e.kind)),n(37,oe=le?[...oe,...r]:r),r.length>0?(le=Math.min(...r.map(e=>e.created_at)),n(39,ae=100===r.length)):n(39,ae=!1)}catch(e){console.error("Failed to load recovery events:",e)}finally{n(38,se=!1)}}else console.log("Not logged in, cannot load recovery events")}async function he(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 Eh.publish(e,[t]);console.log("Repost publish result:",i),i.success&&i.okCount>0?(alert("Event reposted successfully!"),n(39,ae=!1),await fe()):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 pe(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 $h([{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 Eh.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(39,ae=!1),await fe()):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),$e(),Re()),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,y=r.selectedTab),r.expandedEvents&&n(18,E=new Set(r.expandedEvents)),r.globalEventsCache&&($=r.globalEventsCache),r.globalCacheTimestamp&&(R=r.globalCacheTimestamp),void 0!==r.hasMoreEvents&&(S=r.hasMoreEvents),r.oldestEventTimestamp&&(Q=r.oldestEventTimestamp),void 0!==r.hasMoreMyEvents&&(U=r.hasMoreMyEvents),r.oldestMyEventTimestamp&&(N=r.oldestMyEventTimestamp),$.length>0&&((e=R)&&Date.now()-et.created_at-e.created_at),R=Date.now(),ge()}async function ye(){if(u&&"owner"===p&&G)try{n(22,O=!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(20,M=await e.json()):be("Failed to load sprocket status","error")}catch(e){be(`Error loading sprocket status: ${e.message}`,"error")}finally{n(22,O=!1)}}async function we(){if(u&&"owner"===p)try{n(22,O=!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(21,_=await e.json()):be("Failed to load versions","error")}catch(e){be(`Error loading versions: ${e.message}`,"error")}finally{n(22,O=!1)}}async function ve(e){u&&"owner"===p&&(n(19,L=e.content),be(`Loaded version: ${e.name}`,"success"))}async function Ae(e){if(u&&"owner"===p&&confirm(`Are you sure you want to delete version ${e}?`))try{n(22,O=!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)be(`Version ${e} deleted successfully`,"success"),await we();else{be(`Failed to delete version: ${await t.text()}`,"error")}}catch(e){be(`Error deleting version: ${e.message}`,"error")}finally{n(22,O=!1)}}function be(e,t="info"){n(23,H=e),n(24,j=t),setTimeout(()=>{n(23,H="")},5e3)}function ke(e,t="info"){n(28,q=e),n(29,Y=t),"error"!==t&&setTimeout(()=>{n(28,q="")},5e3)}async function Ie(){if(n(30,W=[]),!K.trim())return n(30,W=["Policy JSON is empty"]),ke("Validation failed","error"),!1;try{const e=JSON.parse(K);if("object"!=typeof e||null===e)return n(30,W=["Policy must be a JSON object"]),ke("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)||W.push(`Invalid policy_admin pubkey: ${t}`);else W.push("policy_admins must be an array");if(e.rules)if("object"!=typeof e.rules)W.push("rules must be an object");else for(const[t,n]of Object.entries(e.rules))if(/^\d+$/.test(t)||W.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){W.push(`Invalid regex for tag '${e}': ${t}`)}return e.default_policy&&!["allow","deny"].includes(e.default_policy)&&W.push("default_policy must be 'allow' or 'deny'"),W.length>0?(ke("Validation failed - see errors below","error"),!1):(ke("Validation passed","success"),!0)}catch(e){return n(30,W=[`JSON parse error: ${e.message}`]),ke("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 Ee(e){n(5,y=e),"sprocket"===e&&u&&"owner"===p&&G&&(ye(),we()),ge()}function xe(){n(14,m=!1)}function Be(e){Se(e)}function Se(e){n(6,A=A.filter(t=>t.id!==e)),D.delete(e),y===e&&n(5,y="export")}async function Qe(e,t=!0){const n=D.get(e);if(n&&!n.isLoading){n.isLoading=!0,D.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 Uh([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(96,k=o.sort((e,t)=>t.created_at-e.created_at)),me(o)):(n(96,k=[...k,...o].sort((e,t)=>t.created_at-e.created_at)),me(k)),o.length>0){const e=Math.min(...o.map(e=>e.created_at));(!Q||e{if("events"===y){const e=document.querySelectorAll(".events-view-content")[0];e&&e.scrollHeight<=e.clientHeight&&Ue()}},100)}catch(e){console.error("Failed to load events:",e),alert("Failed to load events: "+e.message)}finally{n(7,B=!1)}}}async function Ue(){await Te(!1)}let Ne=!1;async function Le(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 Oe(e){n(97,F=e),localStorage.setItem("viewAsRole",e),console.log("View as role changed to:",e,"Current effective role:",a)}F=localStorage.getItem("viewAsRole")||"";return e.$$.update=()=>{var t;if(6&e.$$.dirty[0]|8&e.$$.dirty[3]&&n(41,r=k.sort((e,t)=>t.created_at-e.created_at)),8&e.$$.dirty[0]&&n(40,i=h?.about?(t=h.about,t?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"):"").replace(/\n{2,}/g,"
    "):""),16&e.$$.dirty[0]|16&e.$$.dirty[3]&&n(10,a=F&&""!==F?F:p),1810&e.$$.dirty[0]|48&e.$$.dirty[3]&&n(100,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&&!G)&&(!("policy"===e.id&&!V)&&(("managed-acl"!==e.id||"managed"===X)&&(console.log(`Tab ${e.id} filter check:`,{isLoggedIn:u,userRole:p,viewAsRole:F,currentRole:t,requiresAdmin:e.requiresAdmin,requiresOwner:e.requiresOwner,requiresWrite:e.requiresWrite,visible:!0}),!0))))))})),64&e.$$.dirty[0]|128&e.$$.dirty[3]&&n(11,s=[...o,...A]),2578&e.$$.dirty[0]|128&e.$$.dirty[3]&&console.log("Tabs debug:",{isLoggedIn:u,userRole:p,aclMode:X,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&&De(),182&e.$$.dirty[0]|72&e.$$.dirty[3]&&"events"===y&&u&&("read"===p||"write"===p||"admin"===p||"owner"===p)&&0===k.length&&!Ne&&!B){n(99,Ne=!0);Te(!0,null)}32&e.$$.dirty[0]|8&e.$$.dirty[3]&&("events"!==y||"events"===y&&k.length>0)&&n(99,Ne=!1),32&e.$$.dirty[0]&&localStorage.setItem("selectedTab",y)},[l,u,d,h,p,y,A,B,V,X,a,s,c,g,m,w,I,C,E,L,M,_,O,H,j,J,K,z,q,Y,W,Z,ee,te,ne,re,ie,oe,se,ae,i,r,D,ce,ue,async function(){console.log("Toggle changed, showOnlyMyEvents:",$k),n(99,Ne=!1),await Te(!0,null)},de,fe,he,pe,function(){console.log("selectRecoveryKind called, recoverySelectedKind:",re),null!=re?(n(36,ie=""),n(37,oe=[]),le=null,n(39,ae=!0),fe()):console.log("No kind selected, skipping load")},function(){console.log("handleCustomKindInput called, recoveryCustomKind:",ie);const e=parseInt(ie);""!==ie&&!isNaN(e)&&e>=0&&(n(35,re=null),n(37,oe=[]),le=null,n(39,ae=!0),fe())},function(e){const t=oe.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(22,O=!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(19,L=t.script_content||""),n(20,M=t),be("Script loaded successfully","success")}else be("Failed to load script","error")}catch(e){be(`Error loading script: ${e.message}`,"error")}finally{n(22,O=!1)}},async function(){if(u&&"owner"===p)try{n(22,O=!0);const e=await fetch("/api/sprocket/update",{method:"POST",headers:{Authorization:`Nostr ${await Me("POST","/api/sprocket/update")}`,"Content-Type":"text/plain"},body:L});if(e.ok)be("Script saved and updated successfully","success"),await ye(),await we();else{be(`Failed to save script: ${await e.text()}`,"error")}}catch(e){be(`Error saving script: ${e.message}`,"error")}finally{n(22,O=!1)}},async function(){if(u&&"owner"===p)try{n(22,O=!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)be("Sprocket restarted successfully","success"),await ye();else{be(`Failed to restart sprocket: ${await e.text()}`,"error")}}catch(e){be(`Error restarting sprocket: ${e.message}`,"error")}finally{n(22,O=!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(22,O=!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(19,L=""),be("Sprocket script deleted successfully","success"),await ye(),await we();else{be(`Failed to delete script: ${await e.text()}`,"error")}}catch(e){be(`Error deleting script: ${e.message}`,"error")}finally{n(22,O=!1)}},we,ve,Ae,async function(){if(u&&("owner"===p||Rk))try{n(27,z=!0),n(30,W=[]);const e={kinds:[12345],limit:1},t=await _h(e);if(t&&t.length>0){n(26,K=t[0].content);try{n(26,K=JSON.stringify(JSON.parse(K),null,2))}catch(e){}ke("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(26,K=JSON.stringify(t,null,2)),ke("Policy loaded from file","success")}else ke("No policy configuration found","info"),n(26,K="")}}catch(e){ke(`Error loading policy: ${e.message}`,"error")}finally{n(27,z=!1)}},Ie,async function(){if(!u||"owner"!==p&&!Rk)return;if(await Ie())try{n(27,z=!0);const e={kind:12345,created_at:Math.floor(Date.now()/1e3),tags:[],content:K},t=await $b(e,g);t.success?ke("Policy updated successfully","success"):ke(`Failed to publish policy: ${t.error||"Unknown error"}`,"error")}catch(e){ke(`Error saving policy: ${e.message}`,"error")}finally{n(27,z=!1)}},function(){try{const e=JSON.parse(K);n(26,K=JSON.stringify(e,null,2)),ke("JSON formatted","success")}catch(e){ke(`Cannot format: ${e.message}`,"error")}},function(e){const t=e.detail;if(!t)return void ke("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(K||"{}");if(e.policy_admins||(e.policy_admins=[]),e.policy_admins.includes(r))return void ke("Admin already in list","warning");e.policy_admins.push(r),n(26,K=JSON.stringify(e,null,2)),ke("Admin added - click 'Save & Publish' to apply","info")}catch(e){ke(`Error adding admin: ${e.message}`,"error")}else ke("Invalid pubkey format. Use hex (64 chars) or npub","error")},function(e){const t=e.detail;try{const e=JSON.parse(K||"{}");e.policy_admins&&(e.policy_admins=e.policy_admins.filter(e=>e!==t),n(26,K=JSON.stringify(e,null,2)),ke("Admin removed - click 'Save & Publish' to apply","info"))}catch(e){ke(`Error removing admin: ${e.message}`,"error")}},async function(){if(u&&("owner"===p||Rk))try{n(27,z=!0),n(31,Z=[]);let e=[];try{e=JSON.parse(K||"{}").policy_admins||[]}catch(e){return void ke("Cannot parse policy JSON to get admins","error")}if(0===e.length)return void ke("No policy admins configured","warning");const t={kinds:[3],authors:e,limit:e.length},r=await _h(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(31,Z=Array.from(i)),ke(`Loaded ${Z.length} follows from ${r.length} admin(s)`,"success")}catch(e){ke(`Error loading follows: ${e.message}`,"error")}finally{n(27,z=!1)}},function(e){n(25,J=e.target.files[0])},async function(){if(u&&"owner"===p&&J)try{n(22,O=!0);const e=await J.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(19,L=e),be("Script uploaded and updated successfully","success"),await ye(),await we();else{be(`Failed to upload script: ${await t.text()}`,"error")}}catch(e){be(`Error uploading script: ${e.message}`,"error")}finally{n(22,O=!1),n(25,J=null);const e=document.getElementById("sprocket-upload-file");e&&(e.value="")}},Ee,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);try{if(await Mh(),"extension"===t&&o)Eh.setSigner(o);else if("nsec"===t&&i){const e=new lf(i);Eh.setSigner(e)}n(3,h=await Ph(r)),console.log("Profile loaded:",h)}catch(e){console.error("Failed to load profile:",e)}await $e(),await Re()},function(){n(1,u=!1),n(2,d=""),f="",n(3,h=null),n(4,p=""),n(13,g=null),n(14,m=!1),T=[],n(96,k=[]),$=[],R=0,ge(),"undefined"!=typeof localStorage&&(localStorage.removeItem("nostr_auth_method"),localStorage.removeItem("nostr_pubkey"),localStorage.removeItem("nostr_privkey"))},function(){n(12,c=!1)},function(){n(14,m=!0)},xe,function(){n(15,w=!w)},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});v=c,Te(!0,null)},function(){v={},Te(!0,null)},Be,Se,Qe,Fe,De,async function(){await Pe([])},async function(){await Pe([d])},function(e){n(16,I=e.detail.target.files[0])},async function(){if("none"!==X&&(!u||"admin"!==p&&"owner"!==p))return n(17,C="Admin or owner permission required"),void setTimeout(()=>{n(17,C="")},5e3);if(!I)return n(17,C="Please select a file"),void setTimeout(()=>{n(17,C="")},5e3);try{n(17,C="Uploading...");const e={};"none"!==X&&u&&(e.Authorization=await Le("/api/import","POST"));const t=new FormData;t.append("file",I);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(17,C="Upload complete"),n(16,I=null),document.getElementById("import-file").value="",setTimeout(()=>{n(17,C="")},5e3)}catch(e){console.error("Import failed:",e),n(17,C="Import failed: "+e.message),setTimeout(()=>{n(17,C="")},5e3)}},Te,function(e){const{scrollTop:t,scrollHeight:n,clientHeight:r}=e.target;n-t-r<100&&Ue()},function(){try{if(!te.trim())return void alert("Please enter some JSON to reformat");const e=JSON.parse(te);n(33,te=JSON.stringify(e,null,2))}catch(e){alert("Invalid JSON: "+e.message)}},async function(){try{if(!te.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(te);e.pubkey=d,e.created_at=Math.floor(Date.now()/1e3),delete e.id,delete e.sig;const t=await g.signEvent(e);n(33,te=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(34,ne="");try{if(!te.trim())return void n(34,ne="Please enter an event to publish");if(!u)return void n(34,ne="Please log in to publish events");if(!g)return void n(34,ne="No signer available. Please log in with a valid authentication method.");let e;try{e=JSON.parse(te)}catch(e){return void n(34,ne=`Invalid JSON: ${e.message}`)}if(!e.id||!e.sig)return void n(34,ne='Event must be signed before publishing. Please click "Sign" first.');if("read"===p)return void n(34,ne=`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 $b(t,e,g,d);if(r.success)n(34,ne=""),alert("Event published successfully to ORLY relay!");else{const t=r.reason||"Unknown error";n(34,ne=_e(t,e.kind))}}catch(e){console.error("Error publishing event:",e);const t=e.message||"Unknown error";n(34,ne=_e(t,null))}},function(){n(34,ne="")},Oe,function(){const e=["owner","admin","write","read"],t=e.indexOf(p);return-1===t?["read"]:e.slice(t)},k,F,G,Ne,o,function(t){P.call(this,e,t)},function(t){P.call(this,e,t)},e=>e.id===y,e=>Ee(e.detail),e=>Se(e.detail),e=>ce(e.detail),e=>de(e.detail),e=>ue(e.detail.event,e.detail.e),e=>Te(e.detail.refresh,e.detail.authors),function(e){te=e,n(33,te)},function(e){L=e,n(19,L)},e=>ve(e.detail),e=>Ae(e.detail),function(e){K=e,n(26,K)},function(){re=x(this),n(35,re)},function(){ie=b(this.value),n(36,ie)},e=>pe(e),e=>he(e),(e,t)=>ue(e,t),e=>Qe(e.id,!0),e=>Be(e.id),e=>de(e.id),e=>ce(e.id),(e,t)=>"Enter"===t.key&&ce(e.id),(e,t)=>ue(e,t),(e,t)=>Fe(t,e.id),e=>Oe(e===p?"":e),e=>"Escape"===e.key&&xe(),function(e){c=e,n(12,c)}]}return new class extends oe{constructor(e){super(),ie(this,e,Pk,Dk,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 3d57dd9..007f3e9 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/@noble/curves/node_modules/@noble/hashes/esm/_assert.js","../node_modules/@noble/curves/node_modules/@noble/hashes/esm/crypto.js","../node_modules/@noble/curves/node_modules/@noble/hashes/esm/utils.js","../node_modules/@noble/curves/node_modules/@noble/hashes/esm/_sha2.js","../node_modules/@noble/curves/node_modules/@noble/hashes/esm/sha256.js","../node_modules/@noble/curves/esm/abstract/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/node_modules/@noble/hashes/esm/hmac.js","../node_modules/@noble/curves/esm/_shortw_utils.js","../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/@scure/base/lib/esm/index.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/@noble/secp256k1/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","../src/LogView.svelte","../src/FilterDisplay.svelte","../src/utils.js","../src/websocket-auth.js","../src/App.svelte","../src/api.js","../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