Social Annotations in the Atmosphere
15
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: remove server-side proxy

+147 -4138
-17
AGENTS.md
··· 9 9 pnpm dev # Start WXT dev server with hot reload 10 10 pnpm build # Build extension for production 11 11 pnpm zip # Package for Chrome/Firefox stores 12 - pnpm build:via # Build proxy client 13 - pnpm dev:via # Watch mode for proxy client 14 - pnpm build:landing # Build landing page 15 12 ``` 16 13 17 14 ## Project Structure ··· 34 31 │ ├── utils/ # Utilities (highlights, selectors) 35 32 │ └── types.ts # TypeScript interfaces 36 33 ├── landing/ # Public landing page 37 - ├── proxy/ # pywb proxy service 38 34 └── history/ # Architecture docs and planning 39 35 ``` 40 - 41 - ## Issue Tracking (bd/beads) 42 - 43 - **IMPORTANT**: Use `bd` for ALL issue tracking. Do NOT use markdown TODOs. 44 - 45 - ```bash 46 - bd ready --json # Show ready work 47 - bd create "Title" -t bug -p 1 --json # Create issue 48 - bd update bd-42 --status in_progress # Claim work 49 - bd close bd-42 --reason "Done" # Complete work 50 - ``` 51 - 52 - Priorities: 0=critical, 1=high, 2=medium, 3=low, 4=backlog 53 36 54 37 ## AT Protocol OAuth Primer 55 38
-51
Caddyfile
··· 1 - # Seams Via Proxy - Development Configuration 2 - # Use http:// to disable automatic HTTPS 3 - :8082 { 4 - bind 0.0.0.0 5 - # Proxy routes to pywb (must come first) 6 - handle /proxy/* { 7 - reverse_proxy 127.0.0.1:8081 { 8 - # Trust upstream headers for scheme/host 9 - header_up X-Forwarded-Proto {header.X-Forwarded-Proto} 10 - header_up X-Forwarded-Host {host} 11 - header_down -Content-Security-Policy 12 - } 13 - } 14 - 15 - # Proxy static files served by pywb 16 - handle /static/* { 17 - reverse_proxy 127.0.0.1:8081 18 - } 19 - 20 - # Redirect root to seams.so 21 - handle / { 22 - redir https://seams.so 23 - } 24 - 25 - # Serve .well-known for TWA (Digital Asset Links) 26 - handle /.well-known/* { 27 - root * proxy/static 28 - file_server 29 - } 30 - 31 - # OAuth callback rewrite 32 - handle /oauth/callback { 33 - root * proxy/static 34 - rewrite * /oauth-callback.html 35 - file_server 36 - } 37 - 38 - # Serve static files (CSS, JS, etc) from proxy/static 39 - handle /* { 40 - root * proxy/static 41 - try_files {path} {path}.html 42 - file_server 43 - } 44 - 45 - # Enable logging 46 - log { 47 - output stdout 48 - format console 49 - level INFO 50 - } 51 - }
-86
Dockerfile.proxy
··· 1 - # Build stage - compile via client with Node 2 - FROM node:20-alpine AS builder 3 - 4 - RUN apk add --no-cache bash 5 - RUN npm install -g pnpm 6 - 7 - WORKDIR /build 8 - COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ 9 - COPY packages/ ./packages/ 10 - COPY entrypoints/via-client/ ./entrypoints/via-client/ 11 - COPY entrypoints/sidepanel/ ./entrypoints/sidepanel/ 12 - COPY proxy/via-html/ ./proxy/via-html/ 13 - COPY landing/landing.css landing/fonts.css landing/favicon.ico ./landing/ 14 - COPY landing/fonts/ ./landing/fonts/ 15 - COPY landing/oauth/client-metadata.json ./landing/oauth/ 16 - COPY vite.via.config.ts tsconfig.json ./ 17 - COPY scripts/postbuild-via.sh ./scripts/ 18 - 19 - RUN pnpm install --frozen-lockfile 20 - RUN BACKEND_URL=https://seams.so pnpm build:via 21 - 22 - # Runtime stage 23 - FROM python:3.11-slim 24 - 25 - # Install system dependencies 26 - RUN apt-get update && apt-get install -y --no-install-recommends \ 27 - curl \ 28 - ca-certificates \ 29 - && rm -rf /var/lib/apt/lists/* 30 - 31 - # Install uv 32 - RUN curl -LsSf https://astral.sh/uv/install.sh | sh 33 - ENV PATH="/root/.local/bin:$PATH" 34 - 35 - # Install Caddy 36 - RUN curl -L "https://caddyserver.com/api/download?os=linux&arch=amd64" -o /usr/local/bin/caddy \ 37 - && chmod +x /usr/local/bin/caddy 38 - 39 - WORKDIR /app 40 - 41 - # Copy proxy config and collections 42 - COPY proxy/config.yaml ./proxy/ 43 - COPY proxy/collections/ ./proxy/collections/ 44 - 45 - # Copy built static files from builder 46 - COPY --from=builder /build/proxy/static/ ./proxy/static/ 47 - 48 - # Copy Caddyfile 49 - COPY Caddyfile ./ 50 - 51 - # Create startup script 52 - RUN cat <<'EOF' > /app/start.sh 53 - #!/bin/bash 54 - set -e 55 - 56 - echo "🚀 Starting Seams Proxy..." 57 - 58 - # Install pywb at runtime using uv (like flake.nix does) 59 - echo "📦 Installing pywb..." 60 - export UV_CACHE_DIR=/root/.cache/uv 61 - export UV_TOOL_BIN_DIR=/root/.local/bin 62 - uv tool install pywb --with setuptools 63 - 64 - # Add local bin to PATH 65 - export PATH=$PATH:/root/.local/bin 66 - 67 - # Start wayback (pywb) on port 8081 68 - cd /app/proxy 69 - echo "📦 Starting wayback on :8081" 70 - wayback -p 8081 -b 127.0.0.1 & 71 - WB_PID=$! 72 - 73 - # Wait for wayback to initialize 74 - sleep 2 75 - 76 - # Start Caddy on port 8082 77 - cd /app 78 - echo "🌐 Starting Caddy on :8082" 79 - caddy run --config /app/Caddyfile --adapter caddyfile 80 - EOF 81 - 82 - RUN chmod +x /app/start.sh 83 - 84 - EXPOSE 8082 85 - 86 - CMD ["/app/start.sh"]
-36
deploy-proxy.sh
··· 1 - #!/usr/bin/env bash 2 - set -e 3 - 4 - # Define app name 5 - APP_NAME="sure-seams-so" 6 - CONFIG_FILE="fly.proxy.toml" 7 - 8 - echo "Building proxy service" 9 - pnpm build:via 10 - 11 - echo "➕ Adding static assets to git index (for Nix)..." 12 - git add -f proxy/static 13 - 14 - echo "🏗️ Building Proxy Docker image with Nix..." 15 - nix build .#proxy 16 - 17 - echo "➖ Resetting git index..." 18 - git reset proxy/static 19 - 20 - echo "📦 Loading image into Docker..." 21 - docker load < result 22 - 23 - echo "🏷️ Tagging image for Fly.io registry..." 24 - docker tag seams-proxy:latest registry.fly.io/$APP_NAME:latest 25 - 26 - echo "🔐 Authenticating with Fly.io Docker registry..." 27 - flyctl auth docker 28 - 29 - echo "⬆️ Pushing image to Fly.io..." 30 - docker push registry.fly.io/$APP_NAME:latest 31 - 32 - echo "🚀 Deploying to Fly.io..." 33 - flyctl deploy --config $CONFIG_FILE --image registry.fly.io/$APP_NAME:latest 34 - 35 - echo "✅ Proxy deployment complete!" 36 - echo "🌐 Visit: https://sure.seams.so"
-171
entrypoints/via-client/main.ts
··· 1 - // Via proxy client - injects sidebar iframe and handles page interaction 2 - import { WebStorageAdapter, BackgroundWorker, ProxyContentScript, applyHighlights, clearHighlights, generateSelectors, createMobileAnnotateButton, createMobileSidebarToggle, createMobileAnnotationModal } from '@seams/core'; 3 - import type { Annotation } from '@seams/core'; 4 - 5 - console.log('🔬 Seams via client loaded!'); 6 - 7 - // Initialize web storage adapter 8 - const storage = new WebStorageAdapter(); 9 - 10 - const SIDEBAR_ID = 'seams-sidebar-iframe'; 11 - const SIDEBAR_WIDTH = 400; 12 - const IS_MOBILE = window.innerWidth <= 768; 13 - 14 - // Initialize content script only (sidebar handles fetching via BackgroundWorker) 15 - const contentScript = new ProxyContentScript({ 16 - storage, 17 - getCurrentUrl: getActualUrl, 18 - applyHighlights, 19 - clearHighlights, 20 - generateSelectors, 21 - onAnnotate: (data) => { 22 - const iframe = document.getElementById(SIDEBAR_ID) as HTMLIFrameElement; 23 - if (!iframe || !iframe.contentWindow) return; 24 - 25 - // Always use desktop flow: Activate form 26 - iframe.contentWindow.postMessage({ 27 - type: 'ACTIVATE_ANNOTATION', 28 - payload: null 29 - }, '*'); 30 - 31 - // Mobile handling: If sidebar is hidden, show it 32 - if (IS_MOBILE) { 33 - const isHidden = iframe.style.display === 'none'; 34 - if (isHidden) { 35 - iframe.style.display = 'block'; 36 - // We should also update the toggle button text if we could access it, 37 - // but it's inside a closure in injectSidebar. 38 - // Ideally we should trigger the toggle logic. 39 - } 40 - } 41 - }, 42 - onSelectionChange: (selection) => { 43 - const iframe = document.getElementById(SIDEBAR_ID) as HTMLIFrameElement; 44 - if (iframe && iframe.contentWindow) { 45 - iframe.contentWindow.postMessage({ 46 - type: 'SELECTION_CHANGED', 47 - payload: selection 48 - }, '*'); 49 - } 50 - } 51 - }); 52 - 53 - function injectSidebar() { 54 - // Don't inject if already present 55 - if (document.getElementById(SIDEBAR_ID)) { 56 - console.log('[seams-via] Sidebar already injected'); 57 - return; 58 - } 59 - 60 - // Create iframe for sidebar 61 - const iframe = document.createElement('iframe'); 62 - iframe.id = SIDEBAR_ID; 63 - // Use relative URL to load through Caddy proxy (same origin for CSP) 64 - iframe.src = '/static/seams-sidebar.html'; 65 - iframe.style.cssText = ` 66 - position: fixed; 67 - top: 0; 68 - right: 0; 69 - width: ${SIDEBAR_WIDTH}px; 70 - height: 100dvh; 71 - border: none; 72 - border-left: 1px solid #ccc; 73 - z-index: 2147483647; 74 - background: white; 75 - box-shadow: -2px 0 8px rgba(0,0,0,0.1); 76 - `; 77 - 78 - document.body.appendChild(iframe); 79 - console.log('[seams-via] Sidebar injected'); 80 - 81 - // Adjust page content to avoid overlap (only on desktop) 82 - if (!IS_MOBILE) { 83 - document.body.style.marginRight = `${SIDEBAR_WIDTH}px`; 84 - } else { 85 - iframe.style.width = '100%'; 86 - iframe.style.display = 'none'; // Hidden by default on mobile 87 - } 88 - 89 - // When iframe loads, send the URL 90 - iframe.onload = () => { 91 - console.log('[seams-via] Sidebar iframe loaded, sending URL'); 92 - iframe.contentWindow?.postMessage({ 93 - type: 'SEAMS_PAGE_URL', 94 - url: getActualUrl(), 95 - }, '*'); 96 - }; 97 - 98 - // Add toggle button for mobile 99 - if (IS_MOBILE) { 100 - const toggleBtn = createMobileSidebarToggle(() => { 101 - const isHidden = iframe.style.display === 'none'; 102 - iframe.style.display = isHidden ? 'block' : 'none'; 103 - toggleBtn.textContent = isHidden ? '>>' : '<<'; 104 - }); 105 - } 106 - } 107 - 108 - function normalizeUrl(url: string): string { 109 - try { 110 - const parsed = new URL(url); 111 - // Remove fragment 112 - parsed.hash = ''; 113 - // Remove trailing slash 114 - let path = parsed.pathname; 115 - if (path.endsWith('/') && path !== '/') { 116 - path = path.slice(0, -1); 117 - } 118 - parsed.pathname = path; 119 - return parsed.toString(); 120 - } catch { 121 - return url; 122 - } 123 - } 124 - 125 - function getActualUrl(): string { 126 - // Extract actual URL from pywb proxy URL 127 - // URL format: http://localhost:8081/proxy/https://example.com 128 - const proxyUrl = window.location.href; 129 - 130 - // Try to get from wbinfo (pywb metadata) 131 - const wbinfo = (window as any).wbinfo; 132 - if (wbinfo && wbinfo.url) { 133 - const rawUrl = wbinfo.url; 134 - const normalized = normalizeUrl(rawUrl); 135 - console.log('[seams-via] Got URL from wbinfo:', rawUrl); 136 - console.log('[seams-via] Normalized URL:', normalized); 137 - return normalized; 138 - } 139 - 140 - // Fallback: parse from proxy URL 141 - const match = proxyUrl.match(/\/proxy\/(https?:\/\/.+)/); 142 - if (match) { 143 - const rawUrl = match[1]; 144 - const normalized = normalizeUrl(rawUrl); 145 - console.log('[seams-via] Extracted URL from proxy path:', rawUrl); 146 - console.log('[seams-via] Normalized URL:', normalized); 147 - return normalized; 148 - } 149 - 150 - console.warn('[seams-via] Could not extract actual URL, using:', proxyUrl); 151 - return proxyUrl; 152 - } 153 - 154 - // Initialize 155 - function init() { 156 - if (document.body) { 157 - injectSidebar(); 158 - } else { 159 - document.addEventListener('DOMContentLoaded', () => { 160 - injectSidebar(); 161 - }); 162 - } 163 - 164 - // Start content script (loads and renders annotations from localStorage) 165 - contentScript.start(); 166 - } 167 - 168 - init(); 169 - 170 - // Listen for messages from sidebar 171 - // window.addEventListener('message', (event) => { ... });
-47
entrypoints/via-client/oauth-callback.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams OAuth Callback</title> 7 - <style> 8 - body { 9 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 10 - display: flex; 11 - align-items: center; 12 - justify-content: center; 13 - height: 100vh; 14 - margin: 0; 15 - background: #f5f5f5; 16 - } 17 - .message { 18 - text-align: center; 19 - padding: 32px; 20 - background: white; 21 - border-radius: 8px; 22 - box-shadow: 0 2px 8px rgba(0,0,0,0.1); 23 - } 24 - .spinner { 25 - border: 3px solid #f3f3f3; 26 - border-top: 3px solid #0085ff; 27 - border-radius: 50%; 28 - width: 40px; 29 - height: 40px; 30 - animation: spin 1s linear infinite; 31 - margin: 0 auto 16px; 32 - } 33 - @keyframes spin { 34 - 0% { transform: rotate(0deg); } 35 - 100% { transform: rotate(360deg); } 36 - } 37 - </style> 38 - </head> 39 - <body> 40 - <div class="message"> 41 - <div class="spinner"></div> 42 - <h2>Completing login...</h2> 43 - <p id="status">Processing OAuth response</p> 44 - </div> 45 - <script type="module" src="./oauth-callback.ts"></script> 46 - </body> 47 - </html>
-58
entrypoints/via-client/oauth-callback.ts
··· 1 - // OAuth callback handler for via-client 2 - import { handleOAuthCallback, WebStorageAdapter } from '@seams/core'; 3 - 4 - console.log('[oauth-callback] Processing OAuth callback'); 5 - 6 - const statusEl = document.getElementById('status'); 7 - 8 - async function processCallback() { 9 - try { 10 - const storage = new WebStorageAdapter(); 11 - const config = { 12 - clientId: import.meta.env.VITE_OAUTH_CLIENT_ID || 'https://seams.so/oauth/client-metadata.json', 13 - redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'https://sure.seams.so/oauth-callback.html', 14 - scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic', 15 - }; 16 - console.log('[oauth-callback] Config:', config); 17 - const session = await handleOAuthCallback(storage, config); 18 - 19 - if (session) { 20 - if (statusEl) statusEl.textContent = 'Login successful! Redirecting...'; 21 - console.log('[oauth-callback] Login successful'); 22 - 23 - // Check if we are in a popup 24 - if (window.opener) { 25 - console.log('[oauth-callback] Sending message to opener'); 26 - window.opener.postMessage({ 27 - type: 'SEAMS_OAUTH_CALLBACK', 28 - url: window.location.href 29 - }, '*'); 30 - 31 - setTimeout(() => { 32 - window.close(); 33 - }, 500); 34 - } else { 35 - // Not a popup (mobile or full page redirect) 36 - if (statusEl) statusEl.textContent = 'Login successful! Redirecting...'; 37 - 38 - // Redirect back to the page the user was on 39 - const previousUrl = sessionStorage.getItem('seams_login_redirect') || '/'; 40 - console.log('[oauth-callback] Redirecting to:', previousUrl); 41 - setTimeout(() => { 42 - window.location.href = previousUrl; 43 - }, 1000); 44 - } 45 - } else { 46 - if (statusEl) statusEl.textContent = 'No OAuth response found'; 47 - console.log('[oauth-callback] No OAuth response'); 48 - } 49 - } catch (error) { 50 - console.error('[oauth-callback] Error processing callback:', error); 51 - if (statusEl) { 52 - statusEl.textContent = 'Login failed: ' + (error as Error).message; 53 - statusEl.style.color = '#e74c3c'; 54 - } 55 - } 56 - } 57 - 58 - processCallback();
-135
entrypoints/via-client/sidebar.css
··· 1 - * { 2 - margin: 0; 3 - padding: 0; 4 - box-sizing: border-box; 5 - } 6 - 7 - body { 8 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; 9 - font-size: 14px; 10 - line-height: 1.5; 11 - color: #333; 12 - } 13 - 14 - .sidebar { 15 - display: flex; 16 - flex-direction: column; 17 - height: 100vh; 18 - background: white; 19 - } 20 - 21 - .sidebar-header { 22 - padding: 16px; 23 - border-bottom: 1px solid #e0e0e0; 24 - background: #f5f5f5; 25 - } 26 - 27 - .sidebar-header h1 { 28 - font-size: 20px; 29 - font-weight: 600; 30 - margin-bottom: 4px; 31 - } 32 - 33 - .sidebar-header p { 34 - font-size: 12px; 35 - color: #666; 36 - } 37 - 38 - .profile-info { 39 - display: flex; 40 - align-items: center; 41 - gap: 8px; 42 - margin-top: 8px; 43 - } 44 - 45 - .profile-avatar { 46 - width: 32px; 47 - height: 32px; 48 - border-radius: 50%; 49 - } 50 - 51 - .profile-handle { 52 - font-size: 14px; 53 - color: #333; 54 - } 55 - 56 - .sidebar-content { 57 - flex: 1; 58 - overflow-y: auto; 59 - padding: 16px; 60 - } 61 - 62 - .login-container { 63 - display: flex; 64 - flex-direction: column; 65 - gap: 12px; 66 - } 67 - 68 - .login-container h2 { 69 - font-size: 18px; 70 - font-weight: 600; 71 - margin-bottom: 8px; 72 - } 73 - 74 - .input-wrapper { 75 - position: relative; 76 - display: flex; 77 - align-items: center; 78 - } 79 - 80 - .at-symbol { 81 - position: absolute; 82 - left: 12px; 83 - color: #666; 84 - font-size: 14px; 85 - pointer-events: none; 86 - } 87 - 88 - .handle-input { 89 - width: 100%; 90 - padding: 10px 12px 10px 28px; 91 - border: 1px solid #ccc; 92 - border-radius: 4px; 93 - font-size: 14px; 94 - font-family: inherit; 95 - } 96 - 97 - .handle-input:focus { 98 - outline: none; 99 - border-color: #0085ff; 100 - } 101 - 102 - button { 103 - padding: 10px 16px; 104 - background: #0085ff; 105 - color: white; 106 - border: none; 107 - border-radius: 4px; 108 - font-size: 14px; 109 - font-weight: 500; 110 - cursor: pointer; 111 - font-family: inherit; 112 - } 113 - 114 - button:hover { 115 - background: #0073e6; 116 - } 117 - 118 - button:active { 119 - background: #0061c2; 120 - } 121 - 122 - #auth-status { 123 - font-size: 12px; 124 - color: #666; 125 - min-height: 16px; 126 - } 127 - 128 - #logout-btn { 129 - background: #e74c3c; 130 - margin-top: 8px; 131 - } 132 - 133 - #logout-btn:hover { 134 - background: #c0392b; 135 - }
-12
entrypoints/via-client/sidebar.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams Sidebar</title> 7 - </head> 8 - <body> 9 - <div id="app"></div> 10 - <script type="module" src="./sidebar.ts"></script> 11 - </body> 12 - </html>
-59
entrypoints/via-client/sidebar.ts
··· 1 - import '../sidepanel/style.css'; 2 - import { WebStorageAdapter, WebOAuthLauncher, Sidebar, BackgroundWorker, fetchAnnotations } from '@seams/core'; 3 - 4 - console.log('[seams-sidebar] Loading sidebar (v2.1)...'); 5 - 6 - const app = document.getElementById('app'); 7 - if (!app) { 8 - throw new Error('App element not found'); 9 - } 10 - 11 - const storage = new WebStorageAdapter(); 12 - const launcher = new WebOAuthLauncher(); 13 - 14 - const backgroundWorker = new BackgroundWorker({ 15 - storage, 16 - fetchAnnotations: async (url: string) => { 17 - const backendUrl = import.meta.env.VITE_BACKEND_URL || import.meta.env.BACKEND_URL || 'https://seams.so'; 18 - return fetchAnnotations(backendUrl, url); 19 - }, 20 - }); 21 - 22 - const sidebar = new Sidebar( 23 - app, 24 - storage, 25 - launcher, 26 - { 27 - oauth: { 28 - clientId: import.meta.env.VITE_OAUTH_CLIENT_ID || 'http://localhost:8081/static/client-metadata.json', 29 - redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'http://localhost:8081/static/oauth-callback.html', 30 - scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic', 31 - }, 32 - pds: { 33 - backendUrl: import.meta.env.VITE_BACKEND_URL || import.meta.env.BACKEND_URL || 'https://seams.so', 34 - }, 35 - }, 36 - () => { 37 - backgroundWorker.forceSync(); 38 - } 39 - ); 40 - 41 - // Listen for messages from parent (page URL) 42 - window.addEventListener('message', (event) => { 43 - if (event.data.type === 'SEAMS_PAGE_URL') { 44 - const url = event.data.url; 45 - console.log('[seams-sidebar] Received page URL:', url); 46 - sidebar.setCurrentUrl(url); 47 - backgroundWorker.setCurrentUrl(url); 48 - } else if (event.data.type === 'SELECTION_CHANGED') { 49 - console.log('[seams-sidebar] Received selection update'); 50 - sidebar.setSelection(event.data.payload); 51 - } else if (event.data.type === 'ACTIVATE_ANNOTATION') { 52 - console.log('[seams-sidebar] Received activation request'); 53 - sidebar.handleActivateAnnotation(); 54 - } 55 - }); 56 - 57 - // Notify parent window that sidebar is ready 58 - window.parent.postMessage({ type: 'SEAMS_SIDEBAR_READY' }, '*'); 59 - console.log('[seams-sidebar] Ready');
-19
fly.proxy.toml
··· 1 - # fly.proxy.toml app configuration file for sure.seams.so (Proxy) 2 - app = 'sure-seams-so' 3 - primary_region = 'sjc' 4 - 5 - [build] 6 - dockerfile = "Dockerfile.proxy" 7 - 8 - [http_service] 9 - internal_port = 8082 10 - force_https = true 11 - auto_stop_machines = true 12 - auto_start_machines = true 13 - min_machines_running = 1 14 - processes = ['app'] 15 - 16 - [[vm]] 17 - memory = '512mb' 18 - cpu_kind = 'shared' 19 - cpus = 1
+1 -5
package.json
··· 7 7 "dev": "wxt", 8 8 "build": "wxt build", 9 9 "zip": "wxt zip -b firefox && wxt zip -b chrome", 10 - "build:landing": "vite build --config vite.landing.config.ts", 11 - "build:via": "vite build --config vite.via.config.ts && bash scripts/postbuild-via.sh", 12 - "dev:via": "vite build --config vite.via.config.ts --watch", 13 - "dev:server": "pnpm run build:landing && cd server && air", 14 - "via": "bash scripts/start-via.sh" 10 + "dev:server": "cd server && air" 15 11 }, 16 12 "repository": { 17 13 "type": "git",
+146 -146
packages/core/src/oauth/index.ts
··· 1 1 import { 2 - configureOAuth, 3 - createAuthorizationUrl, 4 - finalizeAuthorization, 5 - resolveFromIdentity, 6 - OAuthUserAgent, 7 - type OAuthSession, 2 + configureOAuth, 3 + createAuthorizationUrl, 4 + finalizeAuthorization, 5 + resolveFromIdentity, 6 + OAuthUserAgent, 7 + type OAuthSession, 8 8 } from "@atcute/oauth-browser-client"; 9 9 import type { StorageAdapter } from "../storage"; 10 10 11 - const OAUTH_SESSION_KEY = "synthesis-oauth:session"; 11 + const OAUTH_SESSION_KEY = "seams-oauth:session"; 12 12 13 13 export interface OAuthLauncher { 14 - launch(authUrl: URL): Promise<string>; 14 + launch(authUrl: URL): Promise<string>; 15 15 } 16 16 17 17 export interface OAuthConfig { 18 - clientId: string; 19 - redirectUri: string; 20 - scope: string; 18 + clientId: string; 19 + redirectUri: string; 20 + scope: string; 21 21 } 22 22 23 23 let isOAuthInitialized = false; 24 24 25 25 export class OAuthManager { 26 - private storage: StorageAdapter; 27 - private launcher: OAuthLauncher; 28 - private config: OAuthConfig; 26 + private storage: StorageAdapter; 27 + private launcher: OAuthLauncher; 28 + private config: OAuthConfig; 29 29 30 - constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) { 31 - this.storage = storage; 32 - this.launcher = launcher; 33 - this.config = config; 34 - } 30 + constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) { 31 + this.storage = storage; 32 + this.launcher = launcher; 33 + this.config = config; 34 + } 35 35 36 - initialize() { 37 - if (typeof window !== "undefined" && !isOAuthInitialized) { 38 - configureOAuth({ 39 - metadata: { 40 - client_id: this.config.clientId, 41 - redirect_uri: this.config.redirectUri, 42 - }, 43 - }); 44 - isOAuthInitialized = true; 45 - } 46 - } 36 + initialize() { 37 + if (typeof window !== "undefined" && !isOAuthInitialized) { 38 + configureOAuth({ 39 + metadata: { 40 + client_id: this.config.clientId, 41 + redirect_uri: this.config.redirectUri, 42 + }, 43 + }); 44 + isOAuthInitialized = true; 45 + } 46 + } 47 47 48 - async startLoginProcess(handle: string): Promise<void> { 49 - console.log('[oauth] Starting login process for handle:', handle); 50 - 51 - // Store current location for redirect back after login (for web flow) 52 - if (typeof window !== 'undefined' && window.location) { 53 - try { 54 - let targetStorage = sessionStorage; 55 - let returnUrl = window.location.href; 56 - 57 - // If we are in an iframe (like the proxy sidebar), try to use parent's storage and URL 58 - // This allows us to redirect the top frame back to the original page 59 - if (window.self !== window.top && window.parent) { 60 - try { 61 - // Check if we can access parent (throws if cross-origin) 62 - const parentLocation = window.parent.location.href; 63 - returnUrl = parentLocation; 64 - targetStorage = window.parent.sessionStorage; 65 - console.log('[oauth] Using parent context for redirect URL:', returnUrl); 66 - } catch (e) { 67 - console.warn('[oauth] Could not access parent context, using iframe context', e); 68 - } 69 - } 70 - 71 - targetStorage.setItem('seams_login_redirect', returnUrl); 72 - } catch (e) { 73 - console.warn('[oauth] Failed to save redirect URL:', e); 74 - } 75 - } 48 + async startLoginProcess(handle: string): Promise<void> { 49 + console.log('[oauth] Starting login process for handle:', handle); 76 50 77 - this.initialize(); 78 - 79 - console.log('[oauth] Resolving identity...'); 80 - const { metadata } = await resolveFromIdentity(handle); 81 - console.log('[oauth] PDS metadata:', metadata); 82 - 83 - console.log('[oauth] Creating authorization URL...'); 84 - const authUrl = await createAuthorizationUrl({ 85 - metadata: metadata, 86 - scope: this.config.scope, 87 - }); 88 - console.log('[oauth] Auth URL:', authUrl.toString()); 51 + // Store current location for redirect back after login (for web flow) 52 + if (typeof window !== 'undefined' && window.location) { 53 + try { 54 + let targetStorage = sessionStorage; 55 + let returnUrl = window.location.href; 89 56 90 - console.log('[oauth] Launching auth flow...'); 91 - const capturedUrl = await this.launcher.launch(authUrl); 92 - 93 - if (!capturedUrl) { 94 - throw new Error('OAuth flow cancelled or failed'); 95 - } 57 + // If we are in an iframe (like the proxy sidebar), try to use parent's storage and URL 58 + // This allows us to redirect the top frame back to the original page 59 + if (window.self !== window.top && window.parent) { 60 + try { 61 + // Check if we can access parent (throws if cross-origin) 62 + const parentLocation = window.parent.location.href; 63 + returnUrl = parentLocation; 64 + targetStorage = window.parent.sessionStorage; 65 + console.log('[oauth] Using parent context for redirect URL:', returnUrl); 66 + } catch (e) { 67 + console.warn('[oauth] Could not access parent context, using iframe context', e); 68 + } 69 + } 96 70 97 - console.log('[oauth] Captured redirect URL:', capturedUrl); 71 + targetStorage.setItem('seams_login_redirect', returnUrl); 72 + } catch (e) { 73 + console.warn('[oauth] Failed to save redirect URL:', e); 74 + } 75 + } 98 76 99 - // Parse OAuth response from redirect URL (params can be in search or hash) 100 - const url = new URL(capturedUrl); 101 - const paramString = url.search || url.hash.slice(1); 102 - const params = new URLSearchParams(paramString); 103 - 104 - console.log('[oauth] OAuth params:', Object.fromEntries(params)); 77 + this.initialize(); 105 78 106 - if (params.has('error')) { 107 - const error = params.get('error'); 108 - const errorDesc = params.get('error_description'); 109 - console.error('[oauth] OAuth error:', error, errorDesc); 110 - throw new Error(`OAuth error: ${error} - ${errorDesc}`); 111 - } 79 + console.log('[oauth] Resolving identity...'); 80 + const { metadata } = await resolveFromIdentity(handle); 81 + console.log('[oauth] PDS metadata:', metadata); 112 82 113 - // Finalize authorization with the params 114 - console.log('[oauth] Finalizing authorization...'); 115 - const session = await finalizeAuthorization(params); 116 - console.log('[oauth] Authorization complete, session:', session); 83 + console.log('[oauth] Creating authorization URL...'); 84 + const authUrl = await createAuthorizationUrl({ 85 + metadata: metadata, 86 + scope: this.config.scope, 87 + }); 88 + console.log('[oauth] Auth URL:', authUrl.toString()); 89 + 90 + console.log('[oauth] Launching auth flow...'); 91 + const capturedUrl = await this.launcher.launch(authUrl); 92 + 93 + if (!capturedUrl) { 94 + throw new Error('OAuth flow cancelled or failed'); 95 + } 96 + 97 + console.log('[oauth] Captured redirect URL:', capturedUrl); 98 + 99 + // Parse OAuth response from redirect URL (params can be in search or hash) 100 + const url = new URL(capturedUrl); 101 + const paramString = url.search || url.hash.slice(1); 102 + const params = new URLSearchParams(paramString); 103 + 104 + console.log('[oauth] OAuth params:', Object.fromEntries(params)); 105 + 106 + if (params.has('error')) { 107 + const error = params.get('error'); 108 + const errorDesc = params.get('error_description'); 109 + console.error('[oauth] OAuth error:', error, errorDesc); 110 + throw new Error(`OAuth error: ${error} - ${errorDesc}`); 111 + } 112 + 113 + // Finalize authorization with the params 114 + console.log('[oauth] Finalizing authorization...'); 115 + const session = await finalizeAuthorization(params); 116 + console.log('[oauth] Authorization complete, session:', session); 117 117 118 - // Store session 119 - await this.saveSession(session); 120 - console.log('[oauth] Session saved successfully'); 121 - } 118 + // Store session 119 + await this.saveSession(session); 120 + console.log('[oauth] Session saved successfully'); 121 + } 122 122 123 - async saveSession(session: OAuthSession): Promise<void> { 124 - await this.storage.set(OAUTH_SESSION_KEY, session); 125 - } 123 + async saveSession(session: OAuthSession): Promise<void> { 124 + await this.storage.set(OAUTH_SESSION_KEY, session); 125 + } 126 126 127 - async loadSession(): Promise<OAuthSession | null> { 128 - return await this.storage.get(OAUTH_SESSION_KEY); 129 - } 127 + async loadSession(): Promise<OAuthSession | null> { 128 + return await this.storage.get(OAUTH_SESSION_KEY); 129 + } 130 130 131 - async clearSession(): Promise<void> { 132 - await this.storage.set(OAUTH_SESSION_KEY, null); 133 - } 131 + async clearSession(): Promise<void> { 132 + await this.storage.set(OAUTH_SESSION_KEY, null); 133 + } 134 134 135 - async getProfile(session: OAuthSession): Promise<any> { 136 - const agent = new OAuthUserAgent(session); 137 - const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub); 138 - return await response.json(); 139 - } 135 + async getProfile(session: OAuthSession): Promise<any> { 136 + const agent = new OAuthUserAgent(session); 137 + const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub); 138 + return await response.json(); 139 + } 140 140 } 141 141 142 142 /** ··· 144 144 * Call this from your oauth-callback page to process the redirect 145 145 */ 146 146 export async function handleOAuthCallback(storage: StorageAdapter, config?: OAuthConfig): Promise<OAuthSession | null> { 147 - console.log('[oauth] Handling OAuth callback'); 147 + console.log('[oauth] Handling OAuth callback'); 148 + 149 + if (config) { 150 + console.log('[oauth] Configuring OAuth client with:', config); 151 + configureOAuth({ 152 + metadata: { 153 + client_id: config.clientId, 154 + redirect_uri: config.redirectUri, 155 + }, 156 + }); 157 + } 158 + 159 + // Parse OAuth response from URL (params can be in search or hash) 160 + const url = new URL(window.location.href); 161 + const paramString = url.search || url.hash.slice(1); 162 + const params = new URLSearchParams(paramString); 148 163 149 - if (config) { 150 - console.log('[oauth] Configuring OAuth client with:', config); 151 - configureOAuth({ 152 - metadata: { 153 - client_id: config.clientId, 154 - redirect_uri: config.redirectUri, 155 - }, 156 - }); 157 - } 158 - 159 - // Parse OAuth response from URL (params can be in search or hash) 160 - const url = new URL(window.location.href); 161 - const paramString = url.search || url.hash.slice(1); 162 - const params = new URLSearchParams(paramString); 163 - 164 - console.log('[oauth] OAuth params:', Object.fromEntries(params)); 164 + console.log('[oauth] OAuth params:', Object.fromEntries(params)); 165 165 166 - if (!params.has('code') && !params.has('error')) { 167 - console.log('[oauth] No OAuth params found'); 168 - return null; 169 - } 166 + if (!params.has('code') && !params.has('error')) { 167 + console.log('[oauth] No OAuth params found'); 168 + return null; 169 + } 170 170 171 - if (params.has('error')) { 172 - const error = params.get('error'); 173 - const errorDesc = params.get('error_description'); 174 - console.error('[oauth] OAuth error:', error, errorDesc); 175 - throw new Error(`OAuth error: ${error} - ${errorDesc}`); 176 - } 171 + if (params.has('error')) { 172 + const error = params.get('error'); 173 + const errorDesc = params.get('error_description'); 174 + console.error('[oauth] OAuth error:', error, errorDesc); 175 + throw new Error(`OAuth error: ${error} - ${errorDesc}`); 176 + } 177 177 178 - // Finalize authorization with the params 179 - console.log('[oauth] Finalizing authorization...'); 180 - const session = await finalizeAuthorization(params); 181 - console.log('[oauth] Authorization complete, session:', session); 178 + // Finalize authorization with the params 179 + console.log('[oauth] Finalizing authorization...'); 180 + const session = await finalizeAuthorization(params); 181 + console.log('[oauth] Authorization complete, session:', session); 182 182 183 - // Store session 184 - await storage.set(OAUTH_SESSION_KEY, session); 185 - console.log('[oauth] Session saved successfully'); 183 + // Store session 184 + await storage.set(OAUTH_SESSION_KEY, session); 185 + console.log('[oauth] Session saved successfully'); 186 186 187 - return session; 187 + return session; 188 188 }
-14
packages/core/src/sidebar/utils.ts
··· 1 - export function normalizeUrl(url: string): string { 2 - try { 3 - const parsed = new URL(url); 4 - parsed.hash = ''; 5 - let path = parsed.pathname; 6 - if (path.endsWith('/') && path !== '/') { 7 - path = path.slice(0, -1); 8 - } 9 - parsed.pathname = path; 10 - return parsed.toString(); 11 - } catch { 12 - return url; 13 - } 14 - }
-2
proxy/collections/proxy/templates/head_insert.html
··· 1 - <!-- Seams via client injection --> 2 - <script type="module" src="/static/seams-client.js"></script>
-20
proxy/config.yaml
··· 1 - collections: 2 - proxy: 3 - index: $live 4 - templates: 5 - head_insert: collections/proxy/templates/head_insert.html 6 - # Minimal rewriting to inject head_insert only 7 - enable_banner: false 8 - enable_wombat: false 9 - # Disable CSP injection to allow proxied scripts to run 10 - enable_content_security_policy: false 11 - # Exclude API calls from proxy interception 12 - ignore_prefixes: 13 - - https://seams.so/api/ 14 - - http://localhost:8080/api/ 15 - 16 - framed_replay: false 17 - 18 - # Serve our static client script 19 - static_routes: 20 - static: ./static/
-8
proxy/static/.well-known/assetlinks.json
··· 1 - [{ 2 - "relation": ["delegate_permission/common.handle_all_urls"], 3 - "target": { 4 - "namespace": "android_app", 5 - "package_name": "so.seams.twa", 6 - "sha256_cert_fingerprints": ["06:05:95:95:46:4F:A4:50:9E:5E:7E:57:7B:93:52:48:15:19:BC:C7:9C:F4:DC:8B:E8:84:BF:12:E8:DC:75:DA"] 7 - } 8 - }]
-323
proxy/static/about.css
··· 1 - @import url('fonts.css'); 2 - 3 - * { 4 - box-sizing: border-box; 5 - margin: 0; 6 - padding: 0; 7 - } 8 - 9 - :root { 10 - --forest-green: #2d5016; 11 - --forest-green-light: #3d6b1f; 12 - --forest-green-dark: #1f3810; 13 - } 14 - 15 - body { 16 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 17 - background: #fafafa; 18 - color: #1a1a1a; 19 - position: relative; 20 - line-height: 1.6; 21 - margin: 0; 22 - padding: 0; 23 - } 24 - 25 - /* Blueprint grid background */ 26 - body::before { 27 - content: ''; 28 - position: fixed; 29 - inset: 0; 30 - pointer-events: none; 31 - background-image: 32 - radial-gradient(circle, rgba(45, 80, 22, 0.06) 1px, transparent 1px); 33 - background-size: 20px 20px; 34 - z-index: 0; 35 - } 36 - 37 - /* Layout - Sidebar + Main Content */ 38 - .layout { 39 - display: flex; 40 - min-height: 100vh; 41 - position: relative; 42 - z-index: 1; 43 - } 44 - 45 - /* Sidebar */ 46 - .sidebar { 47 - width: 420px; 48 - background: #fff; 49 - border-right: 2px dashed #d0d0d0; 50 - position: sticky; 51 - top: 0; 52 - height: 100vh; 53 - overflow-y: auto; 54 - flex-shrink: 0; 55 - } 56 - 57 - .sidebar-content { 58 - display: flex; 59 - flex-direction: column; 60 - justify-content: space-between; 61 - min-height: 100vh; 62 - padding: 60px 0; 63 - } 64 - 65 - /* Hero Section in Sidebar */ 66 - .hero { 67 - flex: 1; 68 - display: flex; 69 - flex-direction: column; 70 - justify-content: center; 71 - align-items: center; 72 - text-align: center; 73 - padding: 0 48px; 74 - } 75 - 76 - .logo { 77 - font-family: 'Spectral', serif; 78 - font-size: 16px; 79 - font-weight: 700; 80 - letter-spacing: 0.1em; 81 - text-transform: uppercase; 82 - color: #666; 83 - margin-bottom: 24px; 84 - } 85 - 86 - .hero h1 { 87 - font-family: 'Fraunces', serif; 88 - font-size: clamp(28px, 3vw, 40px); 89 - font-weight: 600; 90 - margin-bottom: 24px; 91 - color: #1a1a1a; 92 - line-height: 1.2; 93 - letter-spacing: -0.01em; 94 - } 95 - 96 - /* CTA Buttons */ 97 - .cta-buttons { 98 - display: flex; 99 - gap: 12px; 100 - flex-direction: column; 101 - align-items: center; 102 - } 103 - 104 - .cta-primary, 105 - .cta-secondary { 106 - padding: 12px 28px; 107 - border-radius: 2px; 108 - font-size: 14px; 109 - font-weight: 500; 110 - text-decoration: none; 111 - transition: all 0.2s; 112 - border: 1px dashed; 113 - display: inline-block; 114 - } 115 - 116 - .cta-primary { 117 - background: var(--forest-green); 118 - color: #fff; 119 - border-color: var(--forest-green-dark); 120 - } 121 - 122 - .cta-primary:hover { 123 - background: var(--forest-green-dark); 124 - transform: translateY(-1px); 125 - } 126 - 127 - .cta-secondary { 128 - background: transparent; 129 - color: var(--forest-green); 130 - border-color: var(--forest-green); 131 - } 132 - 133 - .cta-secondary:hover { 134 - border-color: var(--forest-green-dark); 135 - background: rgba(45, 80, 22, 0.05); 136 - } 137 - 138 - /* Main Content Area */ 139 - .main-content { 140 - flex: 1; 141 - background: #fafafa; 142 - overflow-y: auto; 143 - } 144 - 145 - /* Content Section */ 146 - .content-section { 147 - padding: 60px 48px; 148 - max-width: 900px; 149 - } 150 - 151 - .content-container h1 { 152 - font-family: 'Fraunces', serif; 153 - font-size: 36px; 154 - font-weight: 700; 155 - margin-bottom: 24px; 156 - color: #1a1a1a; 157 - line-height: 1.2; 158 - } 159 - 160 - .content-container h2 { 161 - font-family: 'Fraunces', serif; 162 - font-size: 24px; 163 - font-weight: 600; 164 - margin-top: 40px; 165 - margin-bottom: 16px; 166 - color: #1a1a1a; 167 - line-height: 1.3; 168 - } 169 - 170 - .content-container p { 171 - font-family: 'Fraunces', serif; 172 - margin-bottom: 16px; 173 - line-height: 1.7; 174 - color: #333; 175 - font-size: 16px; 176 - } 177 - 178 - .content-container ul { 179 - font-family: 'Fraunces', serif; 180 - margin-bottom: 16px; 181 - padding-left: 24px; 182 - } 183 - 184 - .content-container li { 185 - margin-bottom: 12px; 186 - line-height: 1.7; 187 - color: #333; 188 - } 189 - 190 - .content-container a { 191 - color: var(--forest-green); 192 - text-decoration: none; 193 - border-bottom: 1px dashed var(--forest-green); 194 - transition: border-color 0.2s; 195 - } 196 - 197 - .content-container a:hover { 198 - border-bottom-color: var(--forest-green-dark); 199 - } 200 - 201 - .content-container strong { 202 - font-weight: 600; 203 - color: #1a1a1a; 204 - } 205 - 206 - /* Footer in Sidebar */ 207 - .footer { 208 - padding-top: 40px; 209 - color: #999; 210 - font-size: 13px; 211 - text-align: center; 212 - margin: 0; 213 - border-top: 2px dashed #d0d0d0; 214 - } 215 - 216 - .mobile-footer { 217 - display: none; 218 - } 219 - 220 - .desktop-footer { 221 - display: block; 222 - } 223 - 224 - .footer-icons { 225 - display: flex; 226 - gap: 20px; 227 - justify-content: center; 228 - align-items: center; 229 - } 230 - 231 - .footer-icons a { 232 - color: #1a1a1a; 233 - text-decoration: none; 234 - transition: all 0.2s; 235 - display: flex; 236 - align-items: center; 237 - justify-content: center; 238 - } 239 - 240 - .footer-icons a img, 241 - .footer-icons a svg { 242 - width: 32px; 243 - height: 32px; 244 - opacity: 0.6; 245 - transition: opacity 0.2s; 246 - } 247 - 248 - .footer-icons a:hover img, 249 - .footer-icons a:hover svg { 250 - opacity: 1; 251 - } 252 - 253 - /* Responsive */ 254 - @media (max-width: 1024px) { 255 - .layout { 256 - flex-direction: column; 257 - } 258 - 259 - .sidebar { 260 - width: 100%; 261 - height: auto; 262 - position: relative; 263 - border-right: none; 264 - border-bottom: 2px dashed #d0d0d0; 265 - } 266 - 267 - .sidebar-content { 268 - min-height: auto; 269 - padding: 40px 0; 270 - } 271 - 272 - .hero { 273 - justify-content: flex-start; 274 - padding: 0 32px; 275 - } 276 - 277 - .desktop-footer { 278 - display: none; 279 - } 280 - 281 - .mobile-footer { 282 - display: block; 283 - padding: 40px 32px; 284 - margin: 0; 285 - border-top: 2px dashed #d0d0d0; 286 - background: #fafafa; 287 - } 288 - 289 - .content-section { 290 - padding: 48px 32px; 291 - } 292 - } 293 - 294 - @media (max-width: 640px) { 295 - .sidebar-content { 296 - padding: 32px 0; 297 - } 298 - 299 - .hero { 300 - padding: 0 24px; 301 - } 302 - 303 - .hero h1 { 304 - font-size: 28px; 305 - } 306 - 307 - .mobile-footer { 308 - padding: 32px 24px; 309 - font-size: 12px; 310 - } 311 - 312 - .content-section { 313 - padding: 32px 24px; 314 - } 315 - 316 - .content-container h1 { 317 - font-size: 28px; 318 - } 319 - 320 - .content-container h2 { 321 - font-size: 20px; 322 - } 323 - }
-85
proxy/static/about.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>About - Seams.so</title> 7 - <link rel="stylesheet" href="about.css"> 8 - </head> 9 - <body> 10 - <div class="layout"> 11 - <aside class="sidebar"> 12 - <div class="sidebar-content"> 13 - <header class="hero"> 14 - <div class="logo">Seams</div> 15 - <h1>About</h1> 16 - <div class="cta-buttons"> 17 - <a href="/" class="cta-secondary">← Back to Home</a> 18 - </div> 19 - </header> 20 - 21 - <footer class="footer desktop-footer"> 22 - <div class="footer-icons"> 23 - <a href="https://tangled.org/@hyl.st/seams.so" target="_blank" aria-label="Tangled"> 24 - <img src="https://semble.so/_next/static/media/tangled-icon.b95d4d65.svg" alt="Tangled" /> 25 - </a> 26 - <a href="https://bsky.app" target="_blank" aria-label="Bluesky"> 27 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"> 28 - <path fill="currentColor" d="M180 142c-16.3-31.7-60.7-90.8-102-120C38.5-5.9 23.4-1 13.5 3.4 2.1 8.6 0 26.2 0 36.5c0 10.4 5.7 84.8 9.4 97.2 12.2 41 55.7 55 95.7 50.5-58.7 8.6-110.8 30-42.4 106.1 75.1 77.9 103-16.7 117.3-64.6 14.3 48 30.8 139 116 64.6 64-64.6 17.6-97.5-41.1-106.1 40 4.4 83.5-9.5 95.7-50.5 3.7-12.4 9.4-86.8 9.4-97.2 0-10.3-2-27.9-13.5-33C336.5-1 321.5-6 282 22c-41.3 29.2-85.7 88.3-102 120Z"/> 29 - </svg> 30 - </a> 31 - </div> 32 - </footer> 33 - </div> 34 - </aside> 35 - 36 - <main class="main-content"> 37 - <div class="content-section"> 38 - <div class="content-container"> 39 - <h1>About Seams</h1> 40 - 41 - <p>Seams is an open social annotation tool built on AT Protocol. It's an experiment in collaborative knowledge-building, inspired by tools like Hypothesis, but designed for the decentralized web. <br/> We believe strongly that new tools that respect their users, and allow them to work together can bring around more positive futures</p> 42 - 43 - <h2>Why AT Protocol?</h2> 44 - <ul> 45 - <li><strong>You own your content</strong> - Your annotations are stored in your AT Protocol Personal Data Server (PDS), which in most cases is hosted by Bluesky. If Seams shuts down, all your annotations remain accessible.</li> 46 - <li><strong>It's portable</strong> - Your data can move with you. If you switch PDS providers, Seams continues to work with your annotations.</li> 47 - </ul> 48 - 49 - <h2>Get Started</h2> 50 - <p>To start using Seams, you'll need:</p> 51 - <ul> 52 - <li>An AT Protocol account (most likely a Bluesky account)</li> 53 - <li>The Seams browser extension (available for Chrome and Firefox)</li> 54 - </ul> 55 - <p>Once installed, simply highlight text on any webpage and add your annotation. Your insights become part of the collective knowledge layer.</p> 56 - 57 - <h2>Privacy</h2> 58 - <p>...or "We don't want you data"</p> 59 - <ul> 60 - <li><strong>Your annotations are yours</strong> - They're stored in your AT Protocol Personal Data Server (PDS), which you control. We don't own and won't try to sell your data.</li> 61 - <li><strong>Public by default</strong> - Annotations you create are publicly visible to anyone who visits the same page or finds them through our feed. This is a social annotation tool, not a private archive. When AT Protocol introduces more granular privacy controls, we will adopt their approach.</li> 62 - <li><strong>What we collect</strong> - The app indexes annotations from your PDS for display. We cache profile information (handle, display name, avatar) for performance. We don't track your browsing behavior or use analytics that can personally identify you.</li> 63 - </ul> 64 - 65 - <h2>Contact</h2> 66 - <p>Questions or feedback? Reach out to <a href="https://bsky.app/profile/seams.so" target="_blank">@seams.so</a> on Bluesky.</p> 67 - </div> 68 - </div> 69 - </main> 70 - 71 - <footer class="footer mobile-footer"> 72 - <div class="footer-icons"> 73 - <a href="https://tangled.org/@sealight.xyz/seams.so" target="_blank" aria-label="Tangled"> 74 - <img src="https://semble.so/_next/static/media/tangled-icon.b95d4d65.svg" alt="Tangled" /> 75 - </a> 76 - <a href="https://bsky.app" target="_blank" aria-label="Bluesky"> 77 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"> 78 - <path fill="currentColor" d="M180 142c-16.3-31.7-60.7-90.8-102-120C38.5-5.9 23.4-1 13.5 3.4 2.1 8.6 0 26.2 0 36.5c0 10.4 5.7 84.8 9.4 97.2 12.2 41 55.7 55 95.7 50.5-58.7 8.6-110.8 30-42.4 106.1 75.1 77.9 103-16.7 117.3-64.6 14.3 48 30.8 139 116 64.6 64-64.6 17.6-97.5-41.1-106.1 40 4.4 83.5-9.5 95.7-50.5 3.7-12.4 9.4-86.8 9.4-97.2 0-10.3-2-27.9-13.5-33C336.5-1 321.5-6 282 22c-41.3 29.2-85.7 88.3-102 120Z"/> 79 - </svg> 80 - </a> 81 - </div> 82 - </footer> 83 - </div> 84 - </body> 85 - </html>
-21
proxy/static/client-metadata.json
··· 1 - { 2 - "client_id": "https://seams.so/oauth/client-metadata.json", 3 - "client_uri": "https://seams.so", 4 - "redirect_uris": [ 5 - "https://seams.so/oauth/callback", 6 - "https://seams.so/oauth/ff/callback", 7 - "https://sure.seams.so/oauth-callback.html" 8 - ], 9 - "application_type": "web", 10 - "client_name": "Seams", 11 - "dpop_bound_access_tokens": true, 12 - "grant_types": [ 13 - "authorization_code", 14 - "refresh_token" 15 - ], 16 - "response_types": [ 17 - "code" 18 - ], 19 - "scope": "atproto transition:generic", 20 - "token_endpoint_auth_method": "none" 21 - }
-48
proxy/static/entrypoints/via-client/oauth-callback.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams OAuth Callback</title> 7 - <style> 8 - body { 9 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 10 - display: flex; 11 - align-items: center; 12 - justify-content: center; 13 - height: 100vh; 14 - margin: 0; 15 - background: #f5f5f5; 16 - } 17 - .message { 18 - text-align: center; 19 - padding: 32px; 20 - background: white; 21 - border-radius: 8px; 22 - box-shadow: 0 2px 8px rgba(0,0,0,0.1); 23 - } 24 - .spinner { 25 - border: 3px solid #f3f3f3; 26 - border-top: 3px solid #0085ff; 27 - border-radius: 50%; 28 - width: 40px; 29 - height: 40px; 30 - animation: spin 1s linear infinite; 31 - margin: 0 auto 16px; 32 - } 33 - @keyframes spin { 34 - 0% { transform: rotate(0deg); } 35 - 100% { transform: rotate(360deg); } 36 - } 37 - </style> 38 - <script type="module" crossorigin src="/seams-oauth-callback.js"></script> 39 - <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-59aEHZEI.js"> 40 - </head> 41 - <body> 42 - <div class="message"> 43 - <div class="spinner"></div> 44 - <h2>Completing login...</h2> 45 - <p id="status">Processing OAuth response</p> 46 - </div> 47 - </body> 48 - </html>
-15
proxy/static/entrypoints/via-client/sidebar.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams Sidebar</title> 7 - <script type="module" crossorigin src="/seams-seams-sidebar.js"></script> 8 - <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-59aEHZEI.js"> 9 - <link rel="modulepreload" crossorigin href="/assets/web-Ts7v-0PE.js"> 10 - <link rel="stylesheet" crossorigin href="/assets/seams-sidebar-gO3IQ7ah.css"> 11 - </head> 12 - <body> 13 - <div id="app"></div> 14 - </body> 15 - </html>
-16
proxy/static/extension-callback.html
··· 1 - <!DOCTYPE html> 2 - <html> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <title>OAuth Callback</title> 6 - </head> 7 - <body> 8 - <p>Authenticated. This window will close automatically.</p> 9 - <script> 10 - // Log what we received to help debug 11 - console.log('[extension-callback] Full URL:', window.location.href); 12 - console.log('[extension-callback] Search:', window.location.search); 13 - console.log('[extension-callback] Hash:', window.location.hash); 14 - </script> 15 - </body> 16 - </html>
proxy/static/favicon.ico

This is a binary file and will not be displayed.

-64
proxy/static/fonts.css
··· 1 - /* fraunces-regular - latin */ 2 - @font-face { 3 - font-display: swap; 4 - font-family: 'Fraunces'; 5 - font-style: normal; 6 - font-weight: 400; 7 - src: url('fonts/fraunces-v38-latin-regular.eot'); /* IE9 Compat Modes */ 8 - src: url('fonts/fraunces-v38-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ 9 - url('fonts/fraunces-v38-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ 10 - url('fonts/fraunces-v38-latin-regular.woff') format('woff'), /* Modern Browsers */ 11 - url('fonts/fraunces-v38-latin-regular.ttf') format('truetype'); /* Safari, Android, iOS */ 12 - } 13 - 14 - /* fraunces-600 - latin */ 15 - @font-face { 16 - font-display: swap; 17 - font-family: 'Fraunces'; 18 - font-style: normal; 19 - font-weight: 600; 20 - src: url('fonts/fraunces-v38-latin-600.eot'); /* IE9 Compat Modes */ 21 - src: url('fonts/fraunces-v38-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ 22 - url('fonts/fraunces-v38-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ 23 - url('fonts/fraunces-v38-latin-600.woff') format('woff'), /* Modern Browsers */ 24 - url('fonts/fraunces-v38-latin-600.ttf') format('truetype'); /* Safari, Android, iOS */ 25 - } 26 - 27 - /* fraunces-700 - latin */ 28 - @font-face { 29 - font-display: swap; 30 - font-family: 'Fraunces'; 31 - font-style: normal; 32 - font-weight: 700; 33 - src: url('fonts/fraunces-v38-latin-700.eot'); /* IE9 Compat Modes */ 34 - src: url('fonts/fraunces-v38-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ 35 - url('fonts/fraunces-v38-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ 36 - url('fonts/fraunces-v38-latin-700.woff') format('woff'), /* Modern Browsers */ 37 - url('fonts/fraunces-v38-latin-700.ttf') format('truetype'); /* Safari, Android, iOS */ 38 - } 39 - 40 - /* spectral-600 - latin */ 41 - @font-face { 42 - font-display: swap; 43 - font-family: 'Spectral'; 44 - font-style: normal; 45 - font-weight: 600; 46 - src: url('fonts/spectral-v15-latin-600.eot'); /* IE9 Compat Modes */ 47 - src: url('fonts/spectral-v15-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ 48 - url('fonts/spectral-v15-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ 49 - url('fonts/spectral-v15-latin-600.woff') format('woff'), /* Modern Browsers */ 50 - url('fonts/spectral-v15-latin-600.ttf') format('truetype'); /* Safari, Android, iOS */ 51 - } 52 - 53 - /* spectral-700 - latin */ 54 - @font-face { 55 - font-display: swap; 56 - font-family: 'Spectral'; 57 - font-style: normal; 58 - font-weight: 700; 59 - src: url('fonts/spectral-v15-latin-700.eot'); /* IE9 Compat Modes */ 60 - src: url('fonts/spectral-v15-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ 61 - url('fonts/spectral-v15-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ 62 - url('fonts/spectral-v15-latin-700.woff') format('woff'), /* Modern Browsers */ 63 - url('fonts/spectral-v15-latin-700.ttf') format('truetype'); /* Safari, Android, iOS */ 64 - }
proxy/static/fonts/fraunces-v38-latin-600.eot

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-600.ttf

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-600.woff

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-600.woff2

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-700.eot

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-700.ttf

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-700.woff

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-700.woff2

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-regular.eot

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-regular.ttf

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-regular.woff

This is a binary file and will not be displayed.

proxy/static/fonts/fraunces-v38-latin-regular.woff2

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-600.eot

This is a binary file and will not be displayed.

-341
proxy/static/fonts/spectral-v15-latin-600.svg
··· 1 - <?xml version="1.0" standalone="no"?> 2 - <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3 - <svg xmlns="http://www.w3.org/2000/svg"> 4 - <defs > 5 - <font id="Spectral" horiz-adv-x="598" ><font-face 6 - font-family="Spectral SemiBold" 7 - units-per-em="1000" 8 - panose-1="0 0 0 0 0 0 0 0 0 0" 9 - ascent="1059" 10 - descent="-463" 11 - alphabetic="0" /> 12 - <glyph unicode=" " glyph-name="space" horiz-adv-x="250" /> 13 - <glyph unicode="!" glyph-name="exclam" horiz-adv-x="261" d="M117 211L62 660H199L144 211H117ZM130 -5Q102 -5 82 15T62 64Q62 92 82 112T130 133Q158 133 178 113T199 64Q199 36 179 16T130 -5Z" /> 14 - <glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="450" d="M114 490L76 740H174L136 490H114ZM314 490L276 740H374L336 490H314Z" /> 15 - <glyph unicode="#" glyph-name="numbersign" horiz-adv-x="536" d="M57 0L116 202H19V251H130L174 402H77V451H188L249 660H301L240 451H368L429 660H481L420 451H517V402H406L362 251H459V202H347L289 0H237L296 202H167L109 0H57ZM182 251H310L354 402H226L182 251Z" /> 16 - <glyph unicode="$" glyph-name="dollar" horiz-adv-x="536" d="M207 -80V-5Q133 8 94 48T54 134Q54 174 94 174H145V77Q169 56 207 46V296Q124 333 91 375T58 479Q58 518 78 553T131 616T207 658V740H244V667Q262 670 280 670Q292 670 304 669V740H341V664Q402 17 - 652 436 618T470 543Q470 522 461 513T431 504H385V588Q367 604 341 612V374Q397 347 429 320T475 260T489 185Q489 118 447 70T341 2V-80H304V-7Q283 -10 263 -10Q253 -10 244 -9V-80H207ZM282 619Q261 619 244 615V418Q257 411 272 404T304 390V618Q293 619 282 18 - 619ZM163 523Q163 498 172 479T207 441V600Q163 574 163 523ZM261 39Q284 39 304 44V251Q280 264 244 280V40Q252 40 261 39ZM388 141Q388 169 379 189T341 229V58Q388 85 388 141Z" /> 19 - <glyph unicode="%" glyph-name="percent" horiz-adv-x="775" d="M161 345Q91 345 51 400T10 548Q10 605 29 651T83 723T161 750Q231 750 271 695T312 547Q312 490 292 444T238 372T161 345ZM168 372Q185 372 195 396T209 456T214 531Q214 581 208 624T189 695T155 20 - 722Q138 722 128 699T113 640T108 564Q108 514 114 471T133 400T168 372ZM133 17L602 750L643 723L174 -10L133 17ZM615 -10Q545 -10 505 45T464 193Q464 250 483 296T537 368T615 395Q685 395 725 340T766 192Q766 135 746 89T692 17T615 -10ZM622 17Q639 17 649 21 - 41T663 101T668 176Q668 226 662 269T643 340T609 367Q592 367 582 344T567 285T562 209Q562 159 568 116T587 45T622 17Z" /> 22 - <glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="736" d="M233 -10Q142 -10 86 35T30 160Q30 212 63 259T169 347Q138 380 121 405T95 453T87 507Q87 551 113 588T184 647T286 670Q370 670 418 633T467 537Q467 494 428 458T302 382Q311 374 320 365T338 23 - 346L491 192Q542 269 584 390L486 429V445H729V429L643 392Q613 326 583 269T519 164L631 52L714 16V0H514L441 73Q397 33 346 12T233 -10ZM202 540Q202 506 220 477T277 408Q313 437 332 469T352 541Q352 577 332 601T277 625Q243 625 223 601T202 540ZM147 194Q147 24 - 130 184 95T282 59Q351 59 411 104L255 260Q238 276 224 291T197 319Q166 289 157 261T147 194Z" /> 25 - <glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="250" d="M114 490L76 740H174L136 490H114Z" /> 26 - <glyph unicode="(" glyph-name="parenleft" horiz-adv-x="257" d="M224 -150Q139 -51 95 60T51 295Q51 419 95 530T224 740H247V737Q187 641 155 537T122 295Q122 204 136 128T179 -15T247 -147V-150H224Z" /> 27 - <glyph unicode=")" glyph-name="parenright" horiz-adv-x="257" d="M10 -150V-147Q51 -82 78 -15T120 128T135 295Q135 432 103 536T10 737V740H33Q118 641 162 530T206 295Q206 171 162 60T33 -150H10Z" /> 28 - <glyph unicode="*" glyph-name="asterisk" horiz-adv-x="379" d="M24 595Q22 616 27 633T48 665L178 599L153 741Q189 760 225 741L201 599L330 665Q345 651 351 634T355 595L209 574L314 470Q299 433 255 428L189 555L124 428Q80 433 65 470L169 574L24 595Z" /> 29 - <glyph unicode="+" glyph-name="plus" horiz-adv-x="536" d="M240 62V246H58V298H240V482H296V298H478V246H296V62H240Z" /> 30 - <glyph unicode="," glyph-name="comma" horiz-adv-x="261" d="M29 -197L87 108H211V91L50 -197H29Z" /> 31 - <glyph unicode="-" glyph-name="hyphen" horiz-adv-x="371" d="M48 222V292H323V222H48Z" /> 32 - <glyph unicode="." glyph-name="period" horiz-adv-x="261" d="M130 -5Q102 -5 82 15T62 64Q62 92 82 112T130 133Q158 133 178 113T199 64Q199 36 179 16T130 -5Z" /> 33 - <glyph unicode="/" glyph-name="slash" horiz-adv-x="250" d="M0 -120L200 750H250L50 -120H0Z" /> 34 - <glyph unicode="0" glyph-name="zero" horiz-adv-x="536" d="M268 -10Q194 -10 141 31T61 149T33 330Q33 428 62 504T145 625T268 670Q342 670 395 629T475 512T503 330Q503 233 473 156T390 35T268 -10ZM286 38Q315 38 334 71T364 164T374 299Q374 392 362 465T322 35 - 581T253 623Q223 623 203 590T173 499T162 363Q162 269 175 196T215 80T286 38Z" /> 36 - <glyph unicode="1" glyph-name="one" horiz-adv-x="536" d="M150 0V16L243 53V552L73 472V510L319 660H364V53L447 16V0H150Z" /> 37 - <glyph unicode="2" glyph-name="two" horiz-adv-x="536" d="M52 0V32Q135 125 189 188T275 294T322 369T341 431T345 500Q345 555 319 585T244 615Q188 615 146 583V467H73Q55 467 48 474T40 504Q40 532 59 561T111 615T188 655T279 670Q338 670 383 647T453 583T478 38 - 493Q478 461 471 434T444 378T391 312T303 224T173 100H427L482 198H498L488 0H52Z" /> 39 - <glyph unicode="3" glyph-name="three" horiz-adv-x="536" d="M258 -10Q194 -10 144 9T65 59T36 124Q36 146 43 153T68 161H142V64Q182 39 248 39Q307 39 340 76T373 172Q373 241 337 280T212 319H157V365H197Q258 365 298 402T339 508Q339 568 315 594T245 621Q226 40 - 621 204 616T159 596V485H85Q66 485 59 492T52 521Q52 558 82 592T164 648T277 670Q337 670 380 649T448 593T472 513Q472 462 430 419T310 359Q412 346 459 298T507 179Q507 130 475 87T386 17T258 -10Z" /> 41 - <glyph unicode="4" glyph-name="four" horiz-adv-x="536" d="M191 0V16L284 53V182H12V208L359 660H404V256H523V182H404V53L488 16V0H191ZM109 256H284V491L109 256Z" /> 42 - <glyph unicode="5" glyph-name="five" horiz-adv-x="536" d="M476 227Q476 156 442 103T349 20T212 -10Q135 -10 97 14T59 67Q59 85 75 96L124 132L189 35Q200 34 214 34Q279 34 323 73T367 186Q367 255 323 294T192 334Q167 334 142 331T88 320L100 660H444V569H151L144 43 - 381Q212 410 275 410Q338 410 383 386T452 320T476 227Z" /> 44 - <glyph unicode="6" glyph-name="six" horiz-adv-x="536" d="M271 -10Q201 -10 148 21T65 109T36 240Q36 348 85 434T227 580T445 670V637Q326 600 257 516T171 316Q198 352 237 372T328 392Q383 392 422 367T483 298T505 201Q505 147 479 99T401 20T271 -10ZM166 45 - 243Q166 140 196 89T275 37Q311 37 333 58T367 112T378 176Q378 244 352 282T271 320Q238 320 211 305T167 263Q166 253 166 243Z" /> 46 - <glyph unicode="7" glyph-name="seven" horiz-adv-x="536" d="M98 0Q124 60 151 115T211 233T290 372T396 553H55V660H486V629Q451 560 412 482T337 323T272 159T227 0H98Z" /> 47 - <glyph unicode="8" glyph-name="eight" horiz-adv-x="536" d="M266 -10Q205 -10 154 9T72 64T41 147Q41 176 52 205T91 262T174 320Q110 360 86 399T61 493Q61 541 91 581T169 646T274 670Q328 670 373 649T446 591T474 507Q474 466 439 432T347 367Q424 323 459 48 - 281T495 179Q495 121 463 79T378 13T266 -10ZM176 535Q176 509 185 487T221 442T304 390Q335 411 353 439T371 504Q371 565 343 594T268 624Q228 624 202 601T176 535ZM148 165Q148 104 181 69T267 34Q320 34 349 62T379 136Q379 172 362 196T308 243T212 298V298Q173 49 - 270 161 240T148 165Z" /> 50 - <glyph unicode="9" glyph-name="nine" horiz-adv-x="536" d="M91 -10V23Q210 60 279 144T365 344Q339 308 299 288T209 268Q154 268 114 293T53 362T31 459Q31 513 57 561T135 640T265 670Q336 670 389 639T471 551T501 420Q501 312 451 226T310 80T91 -10ZM159 51 - 484Q159 417 185 379T265 340Q298 340 325 355T370 398Q370 407 370 417Q370 520 340 571T262 623Q226 623 203 602T170 548T159 484Z" /> 52 - <glyph unicode=":" glyph-name="colon" horiz-adv-x="261" d="M130 -5Q102 -5 82 15T62 64Q62 92 82 112T130 133Q158 133 178 113T199 64Q199 36 179 16T130 -5ZM130 324Q102 324 82 344T62 393Q62 421 82 441T130 462Q158 462 178 442T199 393Q199 365 179 345T130 53 - 324Z" /> 54 - <glyph unicode=";" glyph-name="semicolon" horiz-adv-x="261" d="M130 324Q102 324 82 344T62 393Q62 421 82 441T130 462Q158 462 178 442T199 393Q199 365 179 345T130 324ZM268 -197L326 108H450V91L289 -197H268Z" /> 55 - <glyph unicode="&lt;" glyph-name="less" horiz-adv-x="536" d="M478 62L58 247V297L478 482V423L135 272L478 121V62Z" /> 56 - <glyph unicode="=" glyph-name="equal" horiz-adv-x="536" d="M58 348V400H478V348H58ZM58 144V196H478V144H58Z" /> 57 - <glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="536" d="M58 62V121L401 272L58 423V482L478 297V247L58 62Z" /> 58 - <glyph unicode="?" glyph-name="question" horiz-adv-x="479" d="M197 211L168 364Q245 382 287 417T329 509Q329 565 299 592T223 619Q203 619 183 614T143 595V484H64Q47 484 41 492T34 523Q34 558 62 592T139 648T246 670Q303 670 345 647T411 583T435 493Q435 59 - 425 386 373T235 288L224 211H197ZM210 -5Q182 -5 162 15T141 64Q141 92 161 112T210 133Q237 133 258 113T279 64Q279 36 258 16T210 -5Z" /> 60 - <glyph unicode="@" glyph-name="at" horiz-adv-x="810" d="M372 -118Q280 -118 211 -79T103 28T64 182Q64 262 91 331T170 452T290 533T442 562Q540 562 607 520T708 409T742 257Q742 187 717 134T652 50T562 20Q507 20 479 50T452 131Q414 73 379 47T304 21Q269 61 - 21 246 50T223 136Q223 194 243 247T297 341T373 405T461 429Q484 429 504 424T538 408L576 426H597L546 143Q539 101 550 83T592 65Q623 65 649 89T692 157T708 258Q708 332 678 394T590 493T448 530Q348 530 277 487T169 370T132 200Q132 114 166 50T260 -49T400 62 - -84Q464 -84 514 -69T606 -25L619 -48Q565 -82 509 -100T372 -118ZM319 177Q319 129 329 110T362 91Q384 91 408 111T457 167L491 360Q480 374 467 383T433 392Q401 392 376 363T335 284T319 177Z" /> 63 - <glyph unicode="A" glyph-name="A" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280Z" /> 64 - <glyph unicode="B" glyph-name="B" horiz-adv-x="686" d="M53 0V16L136 57V603L53 644V660H345Q414 660 469 644T555 595T587 512Q587 461 551 419T445 358Q539 345 592 302T646 192Q646 137 610 94T511 25T369 0H53ZM306 605H261V366H312Q380 366 418 397T457 65 - 483Q457 605 306 605ZM343 315H261V55H350Q425 55 468 92T511 186Q511 252 468 283T343 315Z" /> 66 - <glyph unicode="C" glyph-name="C" horiz-adv-x="717" d="M399 -10Q295 -10 219 32T100 148T57 315Q57 388 86 452T165 565T279 642T415 670Q466 670 501 664T564 647T620 622L629 440H611L530 581Q500 601 475 610T417 620Q352 620 300 584T218 483T188 333Q188 67 - 242 217 177T295 77T406 42Q451 42 483 54T543 83L621 206H638L625 41Q583 18 530 4T399 -10Z" /> 68 - <glyph unicode="D" glyph-name="D" horiz-adv-x="791" d="M53 0V16L136 57V603L53 644V660H374Q489 660 569 621T692 514T735 360Q735 282 708 217T631 103T514 27T367 0H53ZM340 605H261V55H355Q434 55 489 88T574 183T604 329Q604 455 537 530T340 605Z" /> 69 - <glyph unicode="E" glyph-name="E" horiz-adv-x="669" d="M53 0V16L136 57V603L53 644V660H575V487H559L490 605H261V368H422L476 453H492V230H476L422 313H261V55H515L587 195H603V0H53Z" /> 70 - <glyph unicode="F" glyph-name="F" horiz-adv-x="624" d="M53 0V16L136 57V603L53 644V660H565V487H549L483 605H261V366H412L466 451H482V232H466L412 315H261V57L359 16V0H53Z" /> 71 - <glyph unicode="G" glyph-name="G" horiz-adv-x="761" d="M398 -10Q326 -10 265 14T157 82T84 185T58 315Q58 391 87 456T168 569T285 643T426 670Q479 670 516 664T583 647T642 622L650 451H633L550 582Q517 603 490 612T428 621Q360 621 305 586T219 489T187 72 - 346Q187 252 219 185T305 82T427 46Q450 46 475 49T525 58V236L436 280V296H723V280L650 234V74Q620 49 578 30T488 1T398 -10Z" /> 73 - <glyph unicode="H" glyph-name="H" horiz-adv-x="825" d="M53 0V16L136 57V603L53 644V660H340V644L261 603V368H564V603L485 644V660H773V644L690 603V57L773 16V0H485V16L564 57V313H261V57L340 16V0H53Z" /> 74 - <glyph unicode="I" glyph-name="I" horiz-adv-x="404" d="M56 0V16L139 57V603L56 644V660H348V644L265 603V57L348 16V0H56Z" /> 75 - <glyph unicode="J" glyph-name="J" horiz-adv-x="415" d="M58 -174Q37 -174 25 -164T12 -139Q12 -134 15 -119L26 -76L115 -93Q134 -69 142 -36T150 50V603L67 644V660H359V644L276 603V243Q276 133 253 54T184 -81Q139 -136 112 -155T58 -174Z" /> 76 - <glyph unicode="K" glyph-name="K" horiz-adv-x="752" d="M53 0V16L136 57V603L53 644V660H345V644L261 603V57L345 16V0H53ZM262 335L537 609L465 644V660H690V644L625 617L380 380L673 44L740 16V0H550L262 335Z" /> 77 - <glyph unicode="L" glyph-name="L" horiz-adv-x="642" d="M53 0V16L136 57V603L53 644V660H355V644L261 603V55H491L567 235H583V0H53Z" /> 78 - <glyph unicode="M" glyph-name="M" horiz-adv-x="980" d="M49 0V16L132 57L152 603L66 644V660H288L501 167L713 660H926V644L841 610L858 57L931 16V0H658V16L736 56L726 538L494 -5H442L210 534L197 56L282 16V0H49Z" /> 79 - <glyph unicode="N" glyph-name="N" horiz-adv-x="809" d="M49 0V16L133 57V602L50 644V660H222L608 204V605L500 644V660H760V644L678 604V-5H626L203 493V56L311 16V0H49Z" /> 80 - <glyph unicode="O" glyph-name="O" horiz-adv-x="796" d="M398 -10Q325 -10 263 15T154 86T83 194T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 257 714 195T642 87T534 16T398 -10ZM416 41Q472 41 514 73T581 81 - 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41Z" /> 82 - <glyph unicode="P" glyph-name="P" horiz-adv-x="665" d="M53 0V16L136 57V603L53 644V660H363Q481 660 552 618T624 482Q624 426 587 384T486 317T339 293H261V57L359 16V0H53ZM318 605H261V344H325Q404 344 449 380T494 473Q494 543 449 574T318 605Z" /> 83 - <glyph unicode="Q" glyph-name="Q" horiz-adv-x="796" d="M685 -153Q641 -153 594 -142T490 -99T357 -8Q270 1 203 47T96 166T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 251 710 186T628 74T505 6Q561 -40 603 84 - -66T680 -104T745 -115Q767 -115 783 -112T810 -105V-126Q787 -137 756 -145T685 -153ZM416 41Q472 41 514 73T581 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41Z" /> 85 - <glyph unicode="R" glyph-name="R" horiz-adv-x="700" d="M53 0V16L136 57V603L53 644V660H360Q465 660 525 617T586 497Q586 441 549 400T450 335L637 55L707 16V0H520L331 305H261V58L336 16V0H53ZM312 605H261V356H318Q380 356 418 391T457 482Q457 540 419 86 - 572T312 605Z" /> 87 - <glyph unicode="S" glyph-name="S" horiz-adv-x="555" d="M268 -10Q204 -10 157 2T63 39L53 206H70L131 91Q193 40 261 40Q317 40 351 67T385 146Q385 184 368 207T314 250T221 296Q150 330 112 369T74 476Q74 513 92 548T143 610T215 654T296 670Q346 670 389 88 - 659T473 626L483 466H467L406 576Q377 598 352 609T294 620Q252 620 225 592T197 521Q197 476 227 449T327 388Q388 360 427 333T485 272T504 188Q504 140 484 104T429 42T352 3T268 -10Z" /> 89 - <glyph unicode="T" glyph-name="T" horiz-adv-x="690" d="M178 0V16L282 57V605H131L56 448H40V660H650V448H634L559 605H408V57L511 16V0H178Z" /> 90 - <glyph unicode="U" glyph-name="U" horiz-adv-x="826" d="M416 -10Q334 -10 271 18T172 108T136 272V603L53 644V660H345V644L262 603V278Q262 195 288 147T357 79T455 58Q499 58 536 76T597 135T620 243V605L524 644V660H773V644L690 604V272Q690 171 655 109T558 91 - 18T416 -10Z" /> 92 - <glyph unicode="V" glyph-name="V" horiz-adv-x="754" d="M356 -5L96 607L26 644V660H312V644L228 606L410 174H416L598 607L515 644V660H728V644L671 613L405 -5H356Z" /> 93 - <glyph unicode="W" glyph-name="W" horiz-adv-x="1017" d="M278 -5L89 605L13 644V660H303V644L218 606L338 202H343L516 665H566L741 202H746L865 606L780 644V660H1004V644L936 608L745 -5H696L516 458H510L327 -5H278Z" /> 94 - <glyph unicode="X" glyph-name="X" horiz-adv-x="764" d="M30 0V16L106 55L316 319L108 608L43 644V660H340V644L261 606V601L406 403L563 601V605L486 644V660H710V644L645 609L441 356L663 56L734 16V0H432V16L504 53V57L351 270L184 58L183 54L264 16V0H30Z" /> 95 - <glyph unicode="Y" glyph-name="Y" horiz-adv-x="739" d="M221 0V16L311 57V308L91 608L26 644V660H308V644L233 608V604L409 365L568 602V606L492 644V660H713V644L648 611L437 309V57L526 16V0H221Z" /> 96 - <glyph unicode="Z" glyph-name="Z" horiz-adv-x="678" d="M86 0V29L428 605H184L114 465H98V660H581V631L239 55H504L576 205H592V0H86Z" /> 97 - <glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="257" d="M61 -150V740H245V715H129V-125H245V-150H61Z" /> 98 - <glyph unicode="\" glyph-name="backslash" horiz-adv-x="250" d="M200 -120L0 750H50L250 -120H200Z" /> 99 - <glyph unicode="]" glyph-name="bracketright" horiz-adv-x="257" d="M12 -150V-125H128V715H12V740H196V-150H12Z" /> 100 - <glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="536" d="M58 250L243 670H293L478 250H419L268 593L116 250H58Z" /> 101 - <glyph unicode="_" glyph-name="underscore" horiz-adv-x="500" d="M25 -140V-90H475V-140H25Z" /> 102 - <glyph unicode="`" glyph-name="grave" horiz-adv-x="272" d="M227 530H210L29 689V707H149L227 530Z" /> 103 - <glyph unicode="a" glyph-name="a" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 464 367 433T410 104 - 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126Z" /> 105 - <glyph unicode="b" glyph-name="b" horiz-adv-x="573" d="M95 -6V636L33 685V695L201 750H211V403H216Q287 464 362 464Q409 464 447 438T509 363T532 247Q532 166 501 109T416 21T298 -10Q213 -10 151 24L105 -6H95ZM291 387Q251 387 211 363V77Q249 41 304 41Q333 106 - 41 359 57T401 113T417 223Q417 307 379 347T291 387Z" /> 107 - <glyph unicode="c" glyph-name="c" horiz-adv-x="482" d="M256 -10Q192 -10 144 17T70 92T43 206Q43 282 76 340T168 431T298 464Q346 464 378 449T426 415T443 382Q443 366 424 352L386 321L301 421Q294 422 288 422Q247 422 217 399T170 338T154 253Q154 173 108 - 195 129T312 84Q341 84 372 92T440 119H443V105Q419 57 371 24T256 -10Z" /> 109 - <glyph unicode="d" glyph-name="d" horiz-adv-x="573" d="M208 -10Q161 -10 122 15T60 86T37 194Q37 279 68 339T154 431T275 464Q323 464 359 455V636L292 686V695L465 750H475V45L545 16V0H369L360 50H354Q316 19 282 5T208 -10ZM153 222Q153 142 191 105T279 110 - 67Q319 67 359 91V377Q341 394 322 403T278 412Q244 412 216 395T170 337T153 222Z" /> 111 - <glyph unicode="e" glyph-name="e" horiz-adv-x="491" d="M260 -10Q159 -10 101 49T43 206Q43 282 74 340T159 431T276 464Q356 464 401 409T447 254L443 249H155Q155 205 171 168T222 107T318 84Q346 84 378 92T445 119H448V105Q424 56 375 23T260 -10ZM256 419Q216 112 - 419 191 387T158 294H350Q341 363 318 391T256 419Z" /> 113 - <glyph unicode="f" glyph-name="f" horiz-adv-x="359" d="M44 0V16L109 48V408H32V454H109V481Q109 522 131 568T190 656T271 723T361 749Q389 749 401 739T413 715Q413 711 412 706T410 694L399 647L274 679Q251 658 238 616T225 510V454H349V408H225V47L299 16V0H44Z" /> 114 - <glyph unicode="g" glyph-name="g" horiz-adv-x="543" d="M251 163Q224 163 198 170Q172 157 164 143T155 114Q155 96 171 85T222 74H344Q420 74 456 40T493 -60Q493 -105 465 -146T382 -213T251 -240Q161 -240 118 -201T75 -108Q75 -87 85 -65L148 -20V-18Q113 115 - -7 95 18T76 78Q76 92 79 105T88 133L164 183Q125 202 102 236T78 314Q78 356 100 390T162 443T251 463Q275 463 301 457T342 443L497 453V395L390 403L388 401Q404 385 414 362T425 314Q425 271 402 237T340 183T251 163ZM258 205Q290 205 307 234T325 311Q325 116 - 363 303 392T247 422Q215 422 197 394T178 316Q178 264 200 235T258 205ZM153 -86Q153 -138 185 -171T268 -205Q326 -205 361 -175T397 -102Q397 -66 378 -46T301 -26H205Q198 -26 193 -26Q172 -33 163 -49T153 -86Z" /> 117 - <glyph unicode="h" glyph-name="h" horiz-adv-x="603" d="M38 0V16L103 48V636L41 685V695L209 750H219V390H223Q260 426 294 445T373 464Q433 464 471 434T510 343V48L575 16V0H335V16L394 46V300Q394 338 371 358T311 379Q288 379 262 371T219 349V46L278 16V0H38Z" /> 118 - <glyph unicode="i" glyph-name="i" horiz-adv-x="325" d="M162 571Q133 571 114 590T95 639Q95 668 114 687T162 706Q191 706 210 687T230 639Q230 610 211 591T162 571ZM42 0V16L107 48V350L45 398V409L213 464H223V48L284 16V0H42Z" /> 119 - <glyph unicode="j" glyph-name="j" horiz-adv-x="324" d="M161 571Q132 571 113 590T94 639Q94 668 113 687T161 706Q190 706 209 687T229 639Q229 610 210 591T161 571ZM43 -230V-213Q68 -191 81 -169T100 -115T106 -37V350L44 398V409L212 464H222V14Q222 -42 120 - 206 -85T152 -163T43 -230Z" /> 121 - <glyph unicode="k" glyph-name="k" horiz-adv-x="584" d="M38 0V16L103 48V636L41 685V695L209 750H219V259L373 396V402L324 438V454H527V438L463 403L315 288L506 50L570 16V0H401L367 52L219 239V46L286 16V0H38Z" /> 122 - <glyph unicode="l" glyph-name="l" horiz-adv-x="313" d="M35 0V16L101 48V636L38 685V695L207 750H216V48L277 16V0H35Z" /> 123 - <glyph unicode="m" glyph-name="m" horiz-adv-x="884" d="M38 0V16L103 48V350L41 395V405L199 464H209L218 390H223Q259 426 292 445T369 464Q418 464 452 443T498 379H501Q541 420 576 442T659 464Q717 464 754 434T791 343V48L856 16V0H616V16L675 48V300Q675 124 - 338 653 358T596 379Q569 379 544 370T502 343V48L560 16V0H330V16L386 48V300Q386 338 364 358T307 379Q285 379 260 371T219 349V48L274 16V0H38Z" /> 125 - <glyph unicode="n" glyph-name="n" horiz-adv-x="603" d="M38 0V16L103 48V350L41 395V405L199 464H209L218 390H223Q260 426 294 445T373 464Q433 464 471 434T510 343V48L575 16V0H335V16L394 48V300Q394 338 371 358T311 379Q288 379 262 371T219 349V48L278 16V0H38Z" /> 126 - <glyph unicode="o" glyph-name="o" horiz-adv-x="544" d="M272 -10Q203 -10 151 21T70 107T41 227Q41 293 70 346T151 432T272 464Q341 464 393 432T474 347T503 227Q503 161 474 107T393 22T272 -10ZM284 37Q318 37 339 61T371 124T381 207Q381 261 369 309T331 127 - 387T262 418Q228 418 206 394T174 331T163 248Q163 194 175 146T215 67T284 37Z" /> 128 - <glyph unicode="p" glyph-name="p" horiz-adv-x="580" d="M38 -230V-214L103 -182V346L41 395V405L199 464H209L217 403H223Q261 435 295 449T370 464Q417 464 455 438T517 363T540 247Q540 166 509 109T425 21T310 -10Q258 -10 219 0V-182L294 -214V-230H38ZM299 129 - 387Q259 387 219 363V77Q258 41 319 41Q346 41 370 57T409 111T425 216Q425 304 387 345T299 387Z" /> 130 - <glyph unicode="q" glyph-name="q" horiz-adv-x="571" d="M286 -230V-214L361 -185V49H355Q319 18 284 4T210 -10Q163 -10 125 15T63 86T40 194Q40 279 72 339T159 431T283 464Q318 464 346 458T402 440L468 464H477V-183L542 -214V-230H286ZM156 222Q156 142 131 - 193 105T281 67Q299 67 319 72T361 91V340Q361 367 360 375T351 389Q335 402 316 407T274 412Q242 412 215 395T172 336T156 222Z" /> 132 - <glyph unicode="r" glyph-name="r" horiz-adv-x="413" d="M41 0V16L106 48V346L44 395V405L202 464H211L221 371H225Q260 421 290 441T350 462Q375 462 389 451T404 418Q404 412 400 397L388 350L290 372Q250 358 221 321V48L298 16V0H41Z" /> 133 - <glyph unicode="s" glyph-name="s" horiz-adv-x="435" d="M211 -10Q162 -10 127 -1T57 25V140H71L105 86Q139 31 207 31Q246 31 267 47T288 93Q288 117 276 132T239 159T174 188Q120 211 93 240T66 317Q66 358 87 391T145 444T225 464Q294 464 356 432V317H341L309 134 - 366Q291 395 271 408T225 421Q193 421 174 405T155 361Q155 332 177 315T254 275Q283 263 310 249T356 208T375 135Q375 89 351 57T288 7T211 -10Z" /> 135 - <glyph unicode="t" glyph-name="t" horiz-adv-x="373" d="M216 -10Q162 -10 126 16T89 89V408H13V418L103 454L191 564H205V454H341V408H205V111Q205 86 227 74T280 61Q299 61 314 63T343 68L346 67V53Q332 29 298 10T216 -10Z" /> 136 - <glyph unicode="u" glyph-name="u" horiz-adv-x="578" d="M221 -10Q161 -10 123 20T85 111V406L20 438V454H201V154Q201 115 224 95T284 75Q306 75 331 82T374 105V406L309 438V454H490V46L556 16V0H374V63H370Q333 27 299 9T221 -10Z" /> 137 - <glyph unicode="v" glyph-name="v" horiz-adv-x="478" d="M221 0L34 409L-30 438V454H234V438L160 408V404L274 158H278L379 399V404L312 438V454H508V438L436 403L252 0H221Z" /> 138 - <glyph unicode="w" glyph-name="w" horiz-adv-x="738" d="M195 0L34 409L-30 438V454H234V438L160 408V404L252 159H257L383 454H414L543 160H547L639 399V404L572 438V454H769V438L697 403L525 0H494L362 294L226 0H195Z" /> 139 - <glyph unicode="x" glyph-name="x" horiz-adv-x="527" d="M21 0V16L74 49L209 215L69 409L24 438V454H268V438L208 410V404L290 289L370 398V404L317 438V454H490V438L437 405L315 255L466 45L507 16V0H271V16L328 44V50L234 180L144 56V50L202 16V0H21Z" /> 140 - <glyph unicode="y" glyph-name="y" horiz-adv-x="478" d="M-31 454H230V438L160 408V404L280 149H285L381 399V404L315 438V454H508V438L436 404L221 -119Q201 -166 183 -192T142 -229T89 -240Q65 -240 57 -233T48 -199V-146H151Q168 -125 183 -96T222 -10L226 141 - 1L33 409L-31 438V454Z" /> 142 - <glyph unicode="z" glyph-name="z" horiz-adv-x="494" d="M60 0V19L279 408H127L76 302H59L70 464H75Q88 460 107 457T143 454H423V435L204 46H371L414 158H431V0H60Z" /> 143 - <glyph unicode="{" glyph-name="braceleft" horiz-adv-x="257" d="M222 -150Q139 -150 102 -113T64 -17Q64 25 76 61T100 131T112 199Q112 232 94 257T26 283H1V308H26Q75 308 93 333T112 391Q112 425 100 459T76 529T64 607Q64 666 101 703T222 740H245V715H218Q175 144 - 715 154 690T132 625Q132 586 143 551T164 482T175 413Q175 376 155 346T85 295Q135 274 155 244T175 177Q175 143 165 109T143 40T132 -35Q132 -75 153 -100T218 -125H245V-150H222Z" /> 145 - <glyph unicode="|" glyph-name="bar" horiz-adv-x="250" d="M100 -250V750H150V-250H100Z" /> 146 - <glyph unicode="}" glyph-name="braceright" horiz-adv-x="257" d="M35 -150H12V-125H39Q83 -125 104 -100T125 -35Q125 4 115 39T93 109T82 177Q82 214 102 244T172 295Q122 316 102 346T82 413Q82 448 93 481T114 550T125 625Q125 665 104 690T39 715H12V740H35Q118 147 - 740 155 703T193 607Q193 566 181 530T157 459T145 391Q145 358 163 333T231 308H256V283H231Q182 283 164 258T145 199Q145 165 157 131T181 61T193 -17Q193 -76 156 -113T35 -150Z" /> 148 - <glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="536" d="M58 201Q58 269 89 306T172 343Q208 343 233 330T279 298T320 267T366 253Q396 253 410 275T424 343H478Q478 275 448 238T364 201Q328 201 302 214T256 246T215 277T170 291Q143 291 128 268T112 149 - 201H58Z" /> 150 - <glyph unicode="&#xa0;" glyph-name="uni00A0" horiz-adv-x="250" /> 151 - <glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="261" d="M131 326Q103 326 83 346T62 395Q62 422 82 443T131 464Q158 464 179 443T200 395Q200 367 179 347T131 326ZM62 -201L117 248H144L199 -201H62Z" /> 152 - <glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="536" d="M183 26L202 105Q137 125 100 179T63 310Q63 386 96 444T187 534T316 567L333 635H373L356 565Q409 557 436 533T463 489Q463 478 459 471T445 455L406 423L341 507L266 202Q295 191 332 191Q360 153 - 191 392 201T460 231H463V202Q438 158 390 126T276 94Q258 94 240 96L223 26H183ZM174 357Q174 315 188 280T231 222L306 525Q265 525 236 502T190 441T174 357Z" /> 154 - <glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="536" d="M44 314V354H122V457Q122 499 142 537T197 605T273 652T360 669Q416 669 450 649T485 605Q485 592 473 579L434 532L341 624H337Q293 624 266 590T238 493V354H393V314H238V267Q238 235 226 155 - 209T176 141L139 100H393L465 197H483L444 0H41L35 30L90 107Q104 127 111 140T120 166T122 199V314H44Z" /> 156 - <glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="536" d="M57 99L135 178Q121 198 113 222T105 272Q105 298 113 322T135 366L57 445L96 483L174 405Q194 419 218 427T268 435Q294 435 318 427T361 405L440 483L479 445L400 366Q414 346 422 322T431 157 - 272Q431 246 423 222T400 178L479 99L440 61L361 139Q341 125 318 117T268 109Q242 109 218 117T174 139L96 61L57 99ZM268 159Q314 159 345 191T376 272Q376 321 345 353T268 385Q222 385 191 353T160 272Q160 223 191 191T268 159Z" /> 158 - <glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="536" d="M122 0V16L208 57V238H75V278H208V388H75V428H184L45 622L2 644V660H254V644L192 620V618L306 448L407 614V617L343 644V660H534V644L483 623L351 428H461V388H329V278H461V238H329V57L415 16V0H122Z" /> 159 - <glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="250" d="M100 350V750H150V350H100ZM100 -250V150H150V-250H100Z" /> 160 - <glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="520" d="M310 670Q348 670 378 660T427 634T445 603Q445 595 436 585L396 539L296 626Q251 625 221 600T191 540Q191 518 202 501T245 469T334 440Q422 418 454 383T487 296Q487 246 459 210T379 152Q404 161 - 133 414 108T425 49Q425 3 395 -35T315 -97T210 -121Q172 -121 140 -110T89 -83T69 -51Q69 -42 79 -32L119 14L222 -79Q270 -78 301 -54T333 4Q333 28 322 46T279 80T189 111Q100 132 66 169T31 261Q31 310 60 345T138 401Q117 419 108 443T99 499Q99 547 128 586T206 162 - 647T310 670ZM268 198Q308 189 336 177Q362 184 380 203T398 248Q398 272 387 290T344 323T255 350Q205 361 172 378Q147 367 136 349T124 305Q124 280 135 261T178 227T268 198Z" /> 163 - <glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="390" d="M99 563Q75 563 60 578T44 617Q44 640 59 655T99 671Q122 671 137 656T153 617Q153 594 138 579T99 563ZM291 563Q267 563 252 578T237 617Q237 640 252 655T291 671Q315 671 330 656T345 164 - 617Q345 594 330 579T291 563Z" /> 165 - <glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="806" d="M403 -10Q331 -10 271 15T165 86T95 194T70 330Q70 404 95 466T165 573T270 644T403 670Q475 670 535 645T641 574T711 466T736 330Q736 257 711 195T641 87T536 16T403 -10ZM403 28Q487 166 - 28 553 67T657 175T696 330Q696 417 658 485T553 592T403 632Q319 632 253 593T149 485T110 330Q110 243 148 175T253 68T403 28ZM416 129Q319 129 264 183T209 324Q209 383 238 432T317 510T426 540Q471 540 498 532T552 509L556 394H527L488 474Q471 485 458 167 - 490T427 495Q370 495 334 452T297 341Q297 263 332 219T420 175Q442 175 459 180T492 193L534 266H563L555 162Q526 148 494 139T416 129Z" /> 168 - <glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="408" d="M144 417Q119 417 101 433T82 477Q82 506 100 522T168 552L218 565V599Q218 640 180 640Q173 640 166 639T151 633V582H106Q91 582 91 598Q91 615 107 631T147 658T199 669Q245 669 270 169 - 652T295 602V464Q304 455 322 455H337L339 453V445Q333 434 319 426T280 417Q236 417 222 452H218Q204 437 185 427T144 417ZM156 492Q156 477 165 469T190 460Q204 460 218 466V543Q181 535 169 523T156 492ZM85 291V343H326V291H85Z" /> 170 - <glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="451" d="M225 70L24 247L225 424H241L132 247L241 70H225ZM412 70L211 247L412 424H428L319 247L428 70H412Z" /> 171 - <glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="536" d="M424 62V246H58V298H478V62H424Z" /> 172 - <glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="547" d="M274 232Q212 232 163 260T86 338T58 451Q58 513 86 562T163 641T274 670Q336 670 384 641T461 563T489 451Q489 388 461 339T385 261T274 232ZM274 263Q327 263 367 288T430 355T453 451Q453 173 - 504 431 546T368 613T274 638Q220 638 180 614T117 547T94 451Q94 397 116 355T179 288T274 263ZM162 325V332L193 348V558L162 574V580H276Q316 580 339 564T363 517Q363 496 348 479T309 452L364 345L390 332V325H318L262 442H242V348L272 332V325H162ZM257 557H242V465H259Q280 174 - 465 295 477T311 512Q311 536 296 546T257 557Z" /> 175 - <glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="370" d="M45 589V645H325V589H45Z" /> 176 - <glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="500" d="M250 410Q213 410 184 428T137 475T120 540Q120 575 137 604T183 652T250 670Q288 670 317 652T363 605T380 540Q380 505 363 476T317 428T250 410ZM250 452Q285 452 309 475T334 540Q334 581 177 - 310 605T250 629Q215 629 191 605T166 540Q166 499 190 476T250 452Z" /> 178 - <glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="536" d="M240 152V286H58V338H240V482H296V338H478V286H296V152H240ZM58 61V113H478V61H58Z" /> 179 - <glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="331" d="M27 505V527Q82 588 115 630T167 702T191 756T198 803Q198 831 185 847T144 864Q118 864 94 850V767H41Q31 767 26 771T20 790Q20 815 41 840T97 883T173 900Q230 900 263 870T296 794Q296 180 - 771 289 751T262 707T202 650T98 566H266L296 625H311L305 505H27Z" /> 181 - <glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="333" d="M156 495Q114 495 84 507T37 539T20 577Q20 590 25 594T42 598H93V540Q114 528 146 528Q180 528 197 548T215 602Q215 643 195 665T123 687H90V717H104Q144 717 169 739T195 805Q195 182 - 864 143 864Q133 864 122 862T101 854V785H50Q39 785 34 789T28 810Q28 830 47 851T97 886T169 900Q224 900 258 876T293 808Q293 772 264 747T183 713Q313 700 313 610Q313 577 293 551T236 510T156 495Z" /> 183 - <glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="272" d="M44 530L122 707H242V689L62 530H44Z" /> 184 - <glyph unicode="&#xb5;" glyph-name="micro" horiz-adv-x="561" d="M232 -10Q208 -10 186 -3T145 22L181 -210L78 -230H76V454H192V154Q192 115 215 95T274 75Q296 75 322 82T365 105V454H481V71Q488 64 500 60T532 55H564L568 52V43Q556 23 531 7T467 -10Q427 185 - -10 403 9T369 63H362Q330 28 301 9T232 -10Z" /> 186 - <glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="507" d="M265 -110V359H223Q169 359 127 379T60 434T35 514Q35 590 82 625T207 660H320V-110H265ZM376 -110V660H514V644L431 603V-110H376Z" /> 187 - <glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="250" d="M125 203Q97 203 77 223T56 271Q56 299 76 319T125 340Q153 340 173 320T194 271Q194 243 174 223T125 203Z" /> 188 - <glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="500" d="M240 -240Q186 -240 158 -214V-198H162Q186 -209 221 -209Q249 -209 262 -199T276 -171Q276 -149 256 -135T176 -103L234 23H271L238 -48Q296 -65 319 -88T342 -151Q342 -189 315 -214T240 -240Z" /> 189 - <glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="283" d="M59 505V520L115 542V819L15 770V802L160 890H208V542L258 520V505H59Z" /> 190 - <glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="408" d="M204 417Q146 417 111 454T75 543Q75 595 110 632T204 669Q262 669 297 632T333 543Q333 491 297 454T204 417ZM210 443Q231 443 242 468T253 532Q253 579 239 611T199 643Q177 643 167 191 - 617T156 554Q156 506 169 475T210 443ZM85 291V343H326V291H85Z" /> 192 - <glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="451" d="M24 70L132 247L24 424H39L241 247L39 70H24ZM211 70L319 247L211 424H226L428 247L226 70H211Z" /> 193 - <glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="775" d="M98 355V370L154 392V669L54 620V652L199 740H247V392L297 370V355H98ZM145 17L614 750L655 723L186 -10L145 17ZM513 0V15L569 40V101H405V119L597 385H662V147H732V101H662V40L712 15V0H513ZM467 194 - 147H569V294L467 147Z" /> 195 - <glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="775" d="M92 355V370L148 392V669L48 620V652L193 740H241V392L291 370V355H92ZM116 17L585 750L626 723L157 -10L116 17ZM437 0V22Q492 83 525 125T577 197T601 251T608 298Q608 326 595 342T554 359Q528 196 - 359 504 345V262H451Q441 262 436 266T430 285Q430 310 451 335T507 378T583 395Q640 395 673 365T706 289Q706 266 699 246T672 202T612 145T508 61H676L706 120H721L715 0H437Z" /> 197 - <glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="775" d="M169 345Q127 345 97 357T50 389T33 427Q33 440 38 444T55 448H106V390Q127 378 159 378Q193 378 210 398T228 452Q228 493 208 515T136 537H103V567H117Q157 567 182 589T208 655Q208 198 - 714 156 714Q146 714 135 712T114 704V635H63Q52 635 47 639T41 660Q41 680 60 701T110 736T182 750Q237 750 271 726T306 658Q306 622 277 597T196 563Q326 550 326 460Q326 427 306 401T249 360T169 345ZM166 17L635 750L676 723L207 -10L166 17ZM538 0V15L594 199 - 40V101H430V119L622 385H687V147H757V101H687V40L737 15V0H538ZM492 147H594V294L492 147Z" /> 200 - <glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="479" d="M269 464Q297 464 317 443T338 395Q338 367 318 347T269 326Q242 326 222 346T201 395Q201 422 221 443T269 464ZM282 248L311 94Q234 76 192 41T150 -50Q150 -106 180 -133T256 -161Q276 201 - -161 296 -156T336 -137V-25H415Q432 -25 438 -33T445 -64Q445 -99 417 -133T340 -189T233 -211Q176 -211 134 -188T68 -124T44 -34Q44 33 93 85T244 171L255 248H282Z" /> 202 - <glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280ZM390 710H371L198 842V862H315L390 710Z" /> 203 - <glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280ZM373 710L448 862H565V842L393 710H373Z" /> 204 - <glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280ZM228 710L362 862H402L537 710H519L382 779L245 710H228Z" /> 205 - <glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280ZM223 724Q239 774 254 800T286 835T323 845Q351 845 374 832T420 206 - 805T464 792Q482 792 496 802T523 845H542Q526 794 511 768T478 733T441 724Q413 724 390 737T344 763T300 776Q282 776 269 767T241 724H223Z" /> 207 - <glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280ZM286 731Q262 731 247 747T231 786Q231 809 246 824T286 840Q309 208 - 840 324 825T340 786Q340 763 325 747T286 731ZM478 731Q454 731 439 747T424 786Q424 809 439 824T478 840Q502 840 517 825T532 786Q532 763 517 747T478 731Z" /> 209 - <glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="764" d="M25 0V16L87 50L346 665H416L672 51L740 16V0H452V16L539 51L468 225H229L158 51L241 16V0H25ZM251 280H445L348 518L251 280ZM382 710Q343 710 319 734T294 794Q294 830 318 854T382 878Q421 210 - 878 445 854T470 794Q470 758 446 734T382 710ZM387 734Q418 734 418 787Q418 854 378 854Q363 854 355 842T347 801Q347 734 387 734Z" /> 211 - <glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="1010" d="M464 660H915V487H899L830 605H602V368H763L816 453H832V230H816L763 313H602V55H855L927 195H943V0H393V16L476 57V232H269L158 50L237 16V0H22V16L86 51L464 660ZM302 287H476V573L302 287Z" /> 212 - <glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="717" d="M378 -209Q407 -209 420 -199T433 -171Q433 -149 413 -135T334 -103L377 -9Q279 -5 208 38T97 153T57 315Q57 388 86 452T165 565T279 642T415 670Q466 670 501 664T564 647T620 622L629 440H611L530 213 - 581Q500 601 475 610T417 620Q352 620 300 584T218 483T188 333Q188 242 217 177T295 77T406 42Q451 42 483 54T543 83L621 206H638L625 41Q585 19 535 5T413 -10L396 -48Q453 -65 476 -88T499 -151Q499 -189 472 -214T398 -240Q343 -240 316 -214V-198H319Q344 214 - -209 378 -209Z" /> 215 - <glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="669" d="M53 0V16L136 57V603L53 644V660H575V487H559L490 605H261V368H422L476 453H492V230H476L422 313H261V55H515L587 195H603V0H53ZM354 710H335L162 842V862H279L354 710Z" /> 216 - <glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="669" d="M53 0V16L136 57V603L53 644V660H575V487H559L490 605H261V368H422L476 453H492V230H476L422 313H261V55H515L587 195H603V0H53ZM337 710L412 862H529V842L357 710H337Z" /> 217 - <glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="669" d="M53 0V16L136 57V603L53 644V660H575V487H559L490 605H261V368H422L476 453H492V230H476L422 313H261V55H515L587 195H603V0H53ZM192 710L326 862H366L501 710H483L346 779L209 710H192Z" /> 218 - <glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="669" d="M53 0V16L136 57V603L53 644V660H575V487H559L490 605H261V368H422L476 453H492V230H476L422 313H261V55H515L587 195H603V0H53ZM250 731Q226 731 211 747T195 786Q195 809 210 824T250 840Q273 219 - 840 288 825T304 786Q304 763 289 747T250 731ZM442 731Q418 731 403 747T388 786Q388 809 403 824T442 840Q466 840 481 825T496 786Q496 763 481 747T442 731Z" /> 220 - <glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="404" d="M56 0V16L139 57V603L56 644V660H348V644L265 603V57L348 16V0H56ZM210 710H191L18 842V862H135L210 710Z" /> 221 - <glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="404" d="M56 0V16L139 57V603L56 644V660H348V644L265 603V57L348 16V0H56ZM193 710L268 862H385V842L213 710H193Z" /> 222 - <glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="404" d="M56 0V16L139 57V603L56 644V660H348V644L265 603V57L348 16V0H56ZM48 710L182 862H222L357 710H339L202 779L65 710H48Z" /> 223 - <glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="404" d="M56 0V16L139 57V603L56 644V660H348V644L265 603V57L348 16V0H56ZM106 731Q82 731 67 747T51 786Q51 809 66 824T106 840Q129 840 144 825T160 786Q160 763 145 747T106 731ZM298 731Q274 224 - 731 259 747T244 786Q244 809 259 824T298 840Q322 840 337 825T352 786Q352 763 337 747T298 731Z" /> 225 - <glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="791" d="M53 0V16L136 57V316H53V368H136V603L53 644V660H374Q489 660 569 621T692 514T735 360Q735 282 708 217T631 103T514 27T367 0H53ZM423 316H261V55H355Q434 55 489 88T574 183T604 329Q604 455 226 - 537 530T340 605H261V368H423V316Z" /> 227 - <glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="809" d="M49 0V16L133 57V602L50 644V660H222L608 204V605L500 644V660H760V644L678 604V-5H626L203 493V56L311 16V0H49ZM253 724Q269 774 284 800T316 835T353 845Q381 845 404 832T450 805T494 792Q512 228 - 792 526 802T553 845H572Q556 794 541 768T508 733T471 724Q443 724 420 737T374 763T330 776Q312 776 299 767T271 724H253Z" /> 229 - <glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="796" d="M398 -10Q325 -10 263 15T154 86T83 194T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 257 714 195T642 87T534 16T398 -10ZM416 41Q472 41 230 - 514 73T581 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41ZM398 710H379L206 842V862H323L398 710Z" /> 231 - <glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="796" d="M398 -10Q325 -10 263 15T154 86T83 194T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 257 714 195T642 87T534 16T398 -10ZM416 41Q472 41 232 - 514 73T581 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41ZM382 710L457 862H574V842L402 710H382Z" /> 233 - <glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="796" d="M398 -10Q325 -10 263 15T154 86T83 194T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 257 714 195T642 87T534 16T398 -10ZM416 41Q472 234 - 41 514 73T581 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41ZM236 710L370 862H410L545 710H527L390 779L253 710H236Z" /> 235 - <glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="796" d="M398 -10Q325 -10 263 15T154 86T83 194T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 257 714 195T642 87T534 16T398 -10ZM416 41Q472 41 236 - 514 73T581 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41ZM231 724Q247 774 262 800T294 835T331 845Q359 845 382 832T428 805T472 792Q490 792 504 802T531 845H550Q534 794 519 768T486 733T449 237 - 724Q421 724 398 737T352 763T308 776Q290 776 277 767T249 724H231Z" /> 238 - <glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="796" d="M398 -10Q325 -10 263 15T154 86T83 194T57 330Q57 404 82 466T154 573T262 644T398 670Q471 670 533 645T642 574T713 466T739 330Q739 257 714 195T642 87T534 16T398 -10ZM416 41Q472 239 - 41 514 73T581 163T605 300Q605 397 576 469T496 580T383 620Q327 620 284 589T216 499T191 362Q191 265 221 193T302 81T416 41ZM295 731Q271 731 256 747T240 786Q240 809 255 824T295 840Q318 840 333 825T349 786Q349 763 334 747T295 731ZM487 731Q463 731 240 - 448 747T433 786Q433 809 448 824T487 840Q511 840 526 825T541 786Q541 763 526 747T487 731Z" /> 241 - <glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="536" d="M121 87L82 126L229 272L82 419L121 458L268 311L415 458L453 419L307 272L453 126L415 87L268 233L121 87Z" /> 242 - <glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="796" d="M58 -10L149 92Q106 137 82 198T57 330Q57 404 82 466T154 573T262 644T398 670Q458 670 511 653T607 604L666 670H739L647 568Q690 523 714 462T739 330Q739 257 714 195T642 87T534 16T398 243 - -10Q338 -10 285 7T190 56L130 -10H58ZM191 362Q191 309 200 263T227 180L542 531Q512 574 471 597T383 620Q327 620 284 589T216 499T191 362ZM416 41Q472 41 514 73T581 163T605 300Q605 352 596 398T570 481L256 130Q286 88 327 65T416 41Z" /> 244 - <glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="826" d="M416 -10Q334 -10 271 18T172 108T136 272V603L53 644V660H345V644L262 603V278Q262 195 288 147T357 79T455 58Q499 58 536 76T597 135T620 243V605L524 644V660H773V644L690 604V272Q690 171 245 - 655 109T558 18T416 -10ZM447 710H428L255 842V862H372L447 710Z" /> 246 - <glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="826" d="M416 -10Q334 -10 271 18T172 108T136 272V603L53 644V660H345V644L262 603V278Q262 195 288 147T357 79T455 58Q499 58 536 76T597 135T620 243V605L524 644V660H773V644L690 604V272Q690 171 247 - 655 109T558 18T416 -10ZM431 710L506 862H623V842L451 710H431Z" /> 248 - <glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="826" d="M416 -10Q334 -10 271 18T172 108T136 272V603L53 644V660H345V644L262 603V278Q262 195 288 147T357 79T455 58Q499 58 536 76T597 135T620 243V605L524 644V660H773V644L690 604V272Q690 249 - 171 655 109T558 18T416 -10ZM285 710L419 862H459L594 710H576L439 779L302 710H285Z" /> 250 - <glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="826" d="M416 -10Q334 -10 271 18T172 108T136 272V603L53 644V660H345V644L262 603V278Q262 195 288 147T357 79T455 58Q499 58 536 76T597 135T620 243V605L524 644V660H773V644L690 604V272Q690 251 - 171 655 109T558 18T416 -10ZM344 731Q320 731 305 747T289 786Q289 809 304 824T344 840Q367 840 382 825T398 786Q398 763 383 747T344 731ZM536 731Q512 731 497 747T482 786Q482 809 497 824T536 840Q560 840 575 825T590 786Q590 763 575 747T536 731Z" /> 252 - <glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="739" d="M221 0V16L311 57V308L91 608L26 644V660H308V644L233 608V604L409 365L568 602V606L492 644V660H713V644L648 611L437 309V57L526 16V0H221ZM390 710L465 862H582V842L410 710H390Z" /> 253 - <glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="665" d="M53 0V16L136 57V603L53 644V660H345V644L261 603V535H363Q481 535 552 493T624 357Q624 301 587 259T486 192T339 168H261V57L345 16V0H53ZM318 480H261V219H325Q404 219 449 255T494 348Q494 254 - 418 449 449T318 480Z" /> 255 - <glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="644" d="M52 0V16L115 48V407H37V454H115V480Q115 531 132 579T182 666T262 727T370 750Q460 750 506 712T553 620Q553 587 540 563T507 519T467 480T434 438T421 385Q421 362 434 346T472 314T529 256 - 273Q581 235 599 204T617 132Q617 92 595 60T535 9T454 -10Q405 -10 371 -1T302 25V140H317L351 86Q366 61 389 46T444 31Q479 31 501 49T523 100Q523 126 509 144T469 179T412 217Q378 240 355 266T331 341Q331 371 343 393T372 435T407 477T436 529T448 602Q448 257 - 646 423 676T348 706Q283 706 257 663T231 546V0H52Z" /> 258 - <glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 464 259 - 367 433T410 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126ZM246 530H229L48 689V707H168L246 530Z" /> 260 - <glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 464 261 - 367 433T410 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126ZM231 530L309 707H429V689L249 530H231Z" /> 262 - <glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 263 - 464 367 433T410 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126ZM83 530L217 707H257L392 530H374L237 264 - 618L100 530H83Z" /> 265 - <glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 464 266 - 367 433T410 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126ZM78 552Q96 610 111 638T143 675T179 684Q206 267 - 684 230 668T275 636T318 620Q336 620 349 632T378 684H397Q378 626 363 598T331 561T295 552Q268 552 244 568T199 600T156 616Q138 616 125 604T96 552H78Z" /> 268 - <glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 269 - 464 367 433T410 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126ZM141 563Q117 563 102 578T86 617Q86 640 270 - 101 655T141 671Q164 671 179 656T195 617Q195 594 180 579T141 563ZM333 563Q309 563 294 578T279 617Q279 640 294 655T333 671Q357 671 372 656T387 617Q387 594 372 579T333 563Z" /> 271 - <glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="504" d="M153 -10Q102 -10 71 20T39 100Q39 152 73 185T197 241L294 265V331Q294 368 271 391T212 414Q198 414 184 411T153 400V302H80Q63 302 57 310T50 338Q50 367 77 396T148 444T246 464Q324 464 272 - 367 433T410 344V71Q417 64 429 60T461 55H494L497 52V43Q485 23 460 7T396 -10Q359 -10 336 7T301 55H294Q267 25 231 8T153 -10ZM149 126Q149 95 167 79T219 63Q254 63 294 80V227Q231 214 200 200T159 167T149 126ZM237 702Q276 702 300 678T325 618Q325 582 273 - 301 558T237 534Q198 534 174 557T149 618Q149 654 173 678T237 702ZM233 678Q218 678 210 666T202 625Q202 558 242 558Q273 558 273 611Q273 678 233 678Z" /> 274 - <glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="743" d="M154 -10Q106 -10 73 19T40 101Q40 153 74 186T200 242L295 265V331Q295 368 272 391T212 414Q198 414 185 411T154 400V302H81Q63 302 57 310T51 338Q51 367 78 396T149 444T247 464Q347 464 386 275 - 411Q416 436 452 450T529 464Q609 464 654 409T700 254L695 249H408Q408 205 424 168T475 107T570 84Q599 84 630 92T698 119H701V105Q677 56 628 23T512 -10Q453 -10 408 12T334 73H327Q299 38 255 14T154 -10ZM508 419Q468 419 443 387T410 294H603Q594 363 570 276 - 391T508 419ZM150 126Q150 95 168 79T220 63Q247 63 271 71T321 93Q295 142 295 208V227Q233 215 202 201T160 168T150 126Z" /> 277 - <glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="482" d="M244 -209Q273 -209 286 -199T299 -171Q299 -149 279 -135T200 -103L242 -10Q152 -5 98 53T43 206Q43 282 76 340T168 431T298 464Q346 464 378 449T426 415T443 382Q443 366 424 352L386 278 - 321L301 421Q294 422 288 422Q247 422 217 399T170 338T154 253Q154 173 195 129T312 84Q341 84 372 92T440 119H443V105Q421 61 379 29T280 -9L262 -48Q319 -65 342 -88T365 -151Q365 -189 338 -214T264 -240Q209 -240 182 -214V-198H185Q210 -209 244 -209Z" 279 - /> 280 - <glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="491" d="M260 -10Q159 -10 101 49T43 206Q43 282 74 340T159 431T276 464Q356 464 401 409T447 254L443 249H155Q155 205 171 168T222 107T318 84Q346 84 378 92T445 119H448V105Q424 56 375 23T260 281 - -10ZM256 419Q216 419 191 387T158 294H350Q341 363 318 391T256 419ZM272 530H255L74 689V707H194L272 530Z" /> 282 - <glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="491" d="M260 -10Q159 -10 101 49T43 206Q43 282 74 340T159 431T276 464Q356 464 401 409T447 254L443 249H155Q155 205 171 168T222 107T318 84Q346 84 378 92T445 119H448V105Q424 56 375 23T260 283 - -10ZM256 419Q216 419 191 387T158 294H350Q341 363 318 391T256 419ZM258 530L336 707H456V689L276 530H258Z" /> 284 - <glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="491" d="M260 -10Q159 -10 101 49T43 206Q43 282 74 340T159 431T276 464Q356 464 401 409T447 254L443 249H155Q155 205 171 168T222 107T318 84Q346 84 378 92T445 119H448V105Q424 56 375 23T260 285 - -10ZM256 419Q216 419 191 387T158 294H350Q341 363 318 391T256 419ZM110 530L244 707H284L419 530H401L264 618L127 530H110Z" /> 286 - <glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="491" d="M260 -10Q159 -10 101 49T43 206Q43 282 74 340T159 431T276 464Q356 464 401 409T447 254L443 249H155Q155 205 171 168T222 107T318 84Q346 84 378 92T445 119H448V105Q424 56 375 23T260 287 - -10ZM256 419Q216 419 191 387T158 294H350Q341 363 318 391T256 419ZM168 563Q144 563 129 578T113 617Q113 640 128 655T168 671Q191 671 206 656T222 617Q222 594 207 579T168 563ZM360 563Q336 563 321 578T306 617Q306 640 321 655T360 671Q384 671 399 656T414 288 - 617Q414 594 399 579T360 563Z" /> 289 - <glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="325" d="M42 0V16L107 48V350L45 398V409L213 464H223V48L284 16V0H42ZM171 530H154L-27 689V707H93L171 530Z" /> 290 - <glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="325" d="M42 0V16L107 48V350L45 398V409L213 464H223V48L284 16V0H42ZM157 530L235 707H355V689L175 530H157Z" /> 291 - <glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="325" d="M42 0V16L107 48V350L45 398V409L213 464H223V48L284 16V0H42ZM9 530L143 707H183L318 530H300L163 618L26 530H9Z" /> 292 - <glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="325" d="M42 0V16L107 48V350L45 398V409L213 464H223V48L284 16V0H42ZM67 563Q43 563 28 578T12 617Q12 640 27 655T67 671Q90 671 105 656T121 617Q121 594 106 579T67 563ZM259 563Q235 563 220 293 - 578T205 617Q205 640 220 655T259 671Q283 671 298 656T313 617Q313 594 298 579T259 563Z" /> 294 - <glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="549" d="M272 -10Q204 -10 152 21T71 104T41 220Q41 297 73 351T160 435T281 464Q303 464 320 462T353 456Q326 535 274 593L201 523H129L239 627Q178 680 94 710V749Q197 722 281 667L359 741H431L321 295 - 637Q409 567 458 470T508 261Q508 180 478 119T395 24T272 -10ZM163 229Q163 179 175 135T214 64T279 37Q325 37 353 91T382 266Q382 314 376 359Q354 384 331 398T276 413Q225 413 194 370T163 229Z" /> 296 - <glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="603" d="M38 0V16L103 48V350L41 395V405L199 464H209L218 390H223Q260 426 294 445T373 464Q433 464 471 434T510 343V48L575 16V0H335V16L394 48V300Q394 338 371 358T311 379Q288 379 262 371T219 297 - 349V48L278 16V0H38ZM148 552Q166 610 181 638T213 675T249 684Q276 684 300 668T345 636T388 620Q406 620 419 632T448 684H467Q448 626 433 598T401 561T365 552Q338 552 314 568T269 600T226 616Q208 616 195 604T166 552H148Z" /> 298 - <glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="544" d="M272 -10Q203 -10 151 21T70 107T41 227Q41 293 70 346T151 432T272 464Q341 464 393 432T474 347T503 227Q503 161 474 107T393 22T272 -10ZM284 37Q318 37 339 61T371 124T381 207Q381 261 299 - 369 309T331 387T262 418Q228 418 206 394T174 331T163 248Q163 194 175 146T215 67T284 37ZM279 530H262L81 689V707H201L279 530Z" /> 300 - <glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="544" d="M272 -10Q203 -10 151 21T70 107T41 227Q41 293 70 346T151 432T272 464Q341 464 393 432T474 347T503 227Q503 161 474 107T393 22T272 -10ZM284 37Q318 37 339 61T371 124T381 207Q381 261 301 - 369 309T331 387T262 418Q228 418 206 394T174 331T163 248Q163 194 175 146T215 67T284 37ZM265 530L343 707H463V689L283 530H265Z" /> 302 - <glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="544" d="M272 -10Q203 -10 151 21T70 107T41 227Q41 293 70 346T151 432T272 464Q341 464 393 432T474 347T503 227Q503 161 474 107T393 22T272 -10ZM284 37Q318 37 339 61T371 124T381 207Q381 303 - 261 369 309T331 387T262 418Q228 418 206 394T174 331T163 248Q163 194 175 146T215 67T284 37ZM116 530L250 707H290L425 530H407L270 618L133 530H116Z" /> 304 - <glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="544" d="M272 -10Q203 -10 151 21T70 107T41 227Q41 293 70 346T151 432T272 464Q341 464 393 432T474 347T503 227Q503 161 474 107T393 22T272 -10ZM284 37Q318 37 339 61T371 124T381 207Q381 261 305 - 369 309T331 387T262 418Q228 418 206 394T174 331T163 248Q163 194 175 146T215 67T284 37ZM111 552Q129 610 144 638T176 675T212 684Q239 684 263 668T308 636T351 620Q369 620 382 632T411 684H430Q411 626 396 598T364 561T328 552Q301 552 277 568T232 600T189 306 - 616Q171 616 158 604T129 552H111Z" /> 307 - <glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="544" d="M272 -10Q203 -10 151 21T70 107T41 227Q41 293 70 346T151 432T272 464Q341 464 393 432T474 347T503 227Q503 161 474 107T393 22T272 -10ZM284 37Q318 37 339 61T371 124T381 207Q381 308 - 261 369 309T331 387T262 418Q228 418 206 394T174 331T163 248Q163 194 175 146T215 67T284 37ZM174 563Q150 563 135 578T119 617Q119 640 134 655T174 671Q197 671 212 656T228 617Q228 594 213 579T174 563ZM366 563Q342 563 327 578T312 617Q312 640 327 655T366 309 - 671Q390 671 405 656T420 617Q420 594 405 579T366 563Z" /> 310 - <glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="536" d="M234 415V482H302V415H234ZM58 246V298H478V246H58ZM234 62V129H302V62H234Z" /> 311 - <glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="544" d="M41 -10L102 63Q73 94 57 136T41 227Q41 293 70 346T151 432T272 464Q310 464 343 454T403 425L435 464H503L443 391Q472 359 487 317T503 227Q503 161 474 107T393 22T272 -10Q234 -10 201 312 - 0T141 29L109 -10H41ZM163 248Q163 194 174 150L349 360Q335 387 314 402T262 418Q228 418 206 394T174 331T163 248ZM284 37Q318 37 339 61T371 124T381 207Q381 260 370 304L196 94Q211 68 233 53T284 37Z" /> 313 - <glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="578" d="M221 -10Q161 -10 123 20T85 111V406L20 438V454H201V154Q201 115 224 95T284 75Q306 75 331 82T374 105V406L309 438V454H490V46L556 16V0H374V63H370Q333 27 299 9T221 -10ZM293 530H276L95 314 - 689V707H215L293 530Z" /> 315 - <glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="578" d="M221 -10Q161 -10 123 20T85 111V406L20 438V454H201V154Q201 115 224 95T284 75Q306 75 331 82T374 105V406L309 438V454H490V46L556 16V0H374V63H370Q333 27 299 9T221 -10ZM278 530L356 707H476V689L296 316 - 530H278Z" /> 317 - <glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="578" d="M221 -10Q161 -10 123 20T85 111V406L20 438V454H201V154Q201 115 224 95T284 75Q306 75 331 82T374 105V406L309 438V454H490V46L556 16V0H374V63H370Q333 27 299 9T221 -10ZM130 530L264 318 - 707H304L439 530H421L284 618L147 530H130Z" /> 319 - <glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="578" d="M221 -10Q161 -10 123 20T85 111V406L20 438V454H201V154Q201 115 224 95T284 75Q306 75 331 82T374 105V406L309 438V454H490V46L556 16V0H374V63H370Q333 27 299 9T221 -10ZM188 563Q164 320 - 563 149 578T133 617Q133 640 148 655T188 671Q211 671 226 656T242 617Q242 594 227 579T188 563ZM380 563Q356 563 341 578T326 617Q326 640 341 655T380 671Q404 671 419 656T434 617Q434 594 419 579T380 563Z" /> 321 - <glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="478" d="M-31 454H230V438L160 408V404L280 149H285L381 399V404L315 438V454H508V438L436 404L221 -119Q201 -166 183 -192T142 -229T89 -240Q65 -240 57 -233T48 -199V-146H151Q168 -125 183 -96T222 322 - -10L226 1L33 409L-31 438V454ZM268 530L346 707H466V689L286 530H268Z" /> 323 - <glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="578" d="M38 -230V-214L103 -182V636L41 685V695L203 750H219V404H225Q262 436 296 450T370 464Q417 464 455 438T517 363T540 247Q540 166 509 109T425 21T310 -10Q258 -10 219 0V-182L294 -214V-230H38ZM299 324 - 387Q259 387 219 363V77Q258 41 319 41Q346 41 370 57T409 111T425 216Q425 304 387 345T299 387Z" /> 325 - <glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="478" d="M-31 454H230V438L160 408V404L280 149H285L381 399V404L315 438V454H508V438L436 404L221 -119Q201 -166 183 -192T142 -229T89 -240Q65 -240 57 -233T48 -199V-146H151Q168 -125 183 -96T222 326 - -10L226 1L33 409L-31 438V454ZM178 563Q154 563 139 578T123 617Q123 640 138 655T178 671Q201 671 216 656T232 617Q232 594 217 579T178 563ZM370 563Q346 563 331 578T316 617Q316 640 331 655T370 671Q394 671 409 656T424 617Q424 594 409 579T370 563Z" 327 - /> 328 - <glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="500" d="M48 247V297H452V247H48Z" /> 329 - <glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="1000" d="M48 247V297H952V247H48Z" /> 330 - <glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="245" d="M224 744L145 489H17V512L200 744H224Z" /> 331 - <glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="245" d="M22 486L100 740H228V718L46 486H22Z" /> 332 - <glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="245" d="M22 -186L100 68H228V46L46 -186H22Z" /> 333 - <glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="442" d="M224 744L145 489H17V512L200 744H224ZM420 744L341 489H213V512L396 744H420Z" /> 334 - <glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="442" d="M22 486L100 740H228V718L46 486H22ZM218 486L296 740H424V718L242 486H218Z" /> 335 - <glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="442" d="M22 -186L100 68H228V46L46 -186H22ZM218 -186L296 68H424V46L242 -186H218Z" /> 336 - <glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="500" d="M250 150Q197 150 163 185T128 272Q128 325 162 359T250 393Q301 393 336 359T371 272Q371 220 336 185T250 150Z" /> 337 - <glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="264" d="M225 70L24 247L225 424H241L132 247L241 70H225Z" /> 338 - <glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="264" d="M24 70L132 247L24 424H39L241 247L39 70H24Z" /> 339 - </font> 340 - </defs> 341 - </svg>
proxy/static/fonts/spectral-v15-latin-600.ttf

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-600.woff

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-600.woff2

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-700.eot

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-700.ttf

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-700.woff

This is a binary file and will not be displayed.

proxy/static/fonts/spectral-v15-latin-700.woff2

This is a binary file and will not be displayed.

-65
proxy/static/introspect.html
··· 1 - <!DOCTYPE html> 2 - <html> 3 - <head> 4 - <title>GraphQL Introspection</title> 5 - </head> 6 - <body> 7 - <h1>GraphQL Schema Introspection</h1> 8 - <pre id="output">Loading...</pre> 9 - 10 - <script> 11 - const SLICE_ID = '3m3ugigrrz52k'; 12 - const GRAPHQL_ENDPOINT = `https://api.slices.network/graphql?slice=${SLICE_ID}`; 13 - 14 - const INTROSPECTION_QUERY = ` 15 - query IntrospectionQuery { 16 - __schema { 17 - queryType { 18 - fields { 19 - name 20 - description 21 - type { 22 - name 23 - kind 24 - } 25 - } 26 - } 27 - } 28 - } 29 - `; 30 - 31 - async function introspect() { 32 - try { 33 - const response = await fetch(GRAPHQL_ENDPOINT, { 34 - method: 'POST', 35 - headers: { 36 - 'Content-Type': 'application/json', 37 - }, 38 - body: JSON.stringify({ 39 - query: INTROSPECTION_QUERY 40 - }) 41 - }); 42 - 43 - const data = await response.json(); 44 - 45 - // Filter for annotation-related fields 46 - const queryFields = data.data.__schema.queryType.fields; 47 - const annotationFields = queryFields.filter(f => 48 - f.name.toLowerCase().includes('annotation') 49 - ); 50 - 51 - document.getElementById('output').textContent = 52 - 'All Query Fields:\n' + 53 - JSON.stringify(queryFields.map(f => f.name), null, 2) + 54 - '\n\nAnnotation-related fields:\n' + 55 - JSON.stringify(annotationFields, null, 2); 56 - } catch (error) { 57 - document.getElementById('output').textContent = 58 - 'Error: ' + error.message; 59 - } 60 - } 61 - 62 - introspect(); 63 - </script> 64 - </body> 65 - </html>
-498
proxy/static/landing.css
··· 1 - @import url('fonts.css'); 2 - 3 - * { 4 - box-sizing: border-box; 5 - margin: 0; 6 - padding: 0; 7 - } 8 - 9 - :root { 10 - --forest-green: #2d5016; 11 - --forest-green-light: #3d6b1f; 12 - --forest-green-dark: #1f3810; 13 - } 14 - 15 - body { 16 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 17 - background: #fafafa; 18 - color: #1a1a1a; 19 - position: relative; 20 - line-height: 1.6; 21 - margin: 0; 22 - padding: 0; 23 - } 24 - 25 - /* Blueprint grid background */ 26 - body::before { 27 - content: ''; 28 - position: fixed; 29 - inset: 0; 30 - pointer-events: none; 31 - background-image: 32 - radial-gradient(circle, rgba(45, 80, 22, 0.06) 1px, transparent 1px); 33 - background-size: 20px 20px; 34 - z-index: 0; 35 - } 36 - 37 - /* Layout - Sidebar + Main Content */ 38 - .layout { 39 - display: flex; 40 - min-height: 100vh; 41 - position: relative; 42 - z-index: 1; 43 - } 44 - 45 - /* Sidebar */ 46 - .sidebar { 47 - width: 420px; 48 - background: #fff; 49 - border-right: 2px dashed #d0d0d0; 50 - position: sticky; 51 - top: 0; 52 - height: 100vh; 53 - overflow-y: auto; 54 - flex-shrink: 0; 55 - } 56 - 57 - .sidebar-content { 58 - display: flex; 59 - flex-direction: column; 60 - justify-content: space-between; 61 - min-height: 100vh; 62 - padding: 60px 0; 63 - } 64 - 65 - /* Hero Section in Sidebar */ 66 - .hero { 67 - flex: 1; 68 - display: flex; 69 - flex-direction: column; 70 - justify-content: center; 71 - align-items: center; 72 - text-align: center; 73 - padding: 0 48px; 74 - } 75 - 76 - .logo { 77 - font-family: 'Spectral', serif; 78 - font-size: 16px; 79 - font-weight: 700; 80 - letter-spacing: 0.1em; 81 - text-transform: uppercase; 82 - color: #666; 83 - margin-bottom: 24px; 84 - } 85 - 86 - .hero h1 { 87 - font-family: 'Fraunces', serif; 88 - font-size: clamp(28px, 3vw, 40px); 89 - font-weight: 600; 90 - margin-bottom: 24px; 91 - color: #1a1a1a; 92 - line-height: 1.2; 93 - letter-spacing: -0.01em; 94 - } 95 - 96 - .tagline { 97 - font-size: 14px; 98 - color: #666; 99 - margin-bottom: 32px; 100 - font-weight: 400; 101 - line-height: 1.6; 102 - } 103 - 104 - /* CTA Buttons */ 105 - .cta-buttons { 106 - display: flex; 107 - gap: 12px; 108 - flex-direction: row; 109 - align-items: center; 110 - } 111 - 112 - .cta-primary, 113 - .cta-secondary { 114 - padding: 10px 20px; 115 - border-radius: 2px; 116 - font-size: 13px; 117 - font-weight: 500; 118 - text-decoration: none; 119 - transition: all 0.2s; 120 - border: 1px dashed; 121 - display: inline-block; 122 - } 123 - 124 - .cta-primary { 125 - background: var(--forest-green); 126 - color: #fff; 127 - border-color: var(--forest-green-dark); 128 - } 129 - 130 - .cta-primary:hover { 131 - background: var(--forest-green-dark); 132 - transform: translateY(-1px); 133 - } 134 - 135 - .cta-secondary { 136 - background: transparent; 137 - color: var(--forest-green); 138 - border-color: var(--forest-green); 139 - } 140 - 141 - .cta-secondary:hover { 142 - border-color: var(--forest-green-dark); 143 - background: rgba(45, 80, 22, 0.05); 144 - } 145 - 146 - /* Main Content Area */ 147 - .main-content { 148 - flex: 1; 149 - background: #fafafa; 150 - overflow-y: auto; 151 - } 152 - 153 - /* Feed Section */ 154 - .feed-section { 155 - padding: 60px 48px; 156 - max-width: 900px; 157 - } 158 - 159 - .annotations-feed { 160 - display: flex; 161 - flex-direction: column; 162 - gap: 24px; 163 - } 164 - 165 - /* Annotation Card */ 166 - .annotation-card { 167 - padding: 24px; 168 - border: 1px dashed #d0d0d0; 169 - border-radius: 2px; 170 - background: #fff; 171 - transition: all 0.2s; 172 - position: relative; 173 - } 174 - 175 - .annotation-card:hover { 176 - border-color: var(--forest-green); 177 - box-shadow: 0 2px 8px rgba(45, 80, 22, 0.08); 178 - } 179 - 180 - .annotation-quote { 181 - margin-bottom: 16px; 182 - padding: 12px 16px; 183 - background: #fafafa; 184 - border-left: 3px solid var(--forest-green); 185 - font-style: italic; 186 - color: #555; 187 - font-size: 15px; 188 - line-height: 1.6; 189 - } 190 - 191 - .annotation-body { 192 - margin-bottom: 16px; 193 - line-height: 1.6; 194 - color: #333; 195 - font-size: 15px; 196 - } 197 - 198 - .annotation-meta { 199 - display: flex; 200 - flex-wrap: wrap; 201 - gap: 12px; 202 - align-items: center; 203 - padding-top: 12px; 204 - border-top: 1px dashed #e0e0e0; 205 - font-size: 13px; 206 - color: #666; 207 - } 208 - 209 - .annotation-source { 210 - color: #1a1a1a; 211 - text-decoration: none; 212 - font-weight: 500; 213 - display: inline-flex; 214 - align-items: center; 215 - gap: 4px; 216 - border-bottom: 1px dashed transparent; 217 - transition: border-color 0.2s; 218 - } 219 - 220 - .annotation-source:hover { 221 - border-bottom-color: #1a1a1a; 222 - } 223 - 224 - .annotation-author { 225 - color: #666; 226 - display: inline-flex; 227 - align-items: center; 228 - gap: 8px; 229 - } 230 - 231 - .annotation-author .author-avatar { 232 - width: 24px; 233 - height: 24px; 234 - border-radius: 50%; 235 - object-fit: cover; 236 - border: 1px dashed #d0d0d0; 237 - } 238 - 239 - .annotation-author a { 240 - color: #1a1a1a; 241 - text-decoration: none; 242 - font-weight: 500; 243 - border-bottom: 1px dashed transparent; 244 - transition: border-color 0.2s; 245 - } 246 - 247 - .annotation-author a:hover { 248 - border-bottom-color: #1a1a1a; 249 - } 250 - 251 - .annotation-time { 252 - color: #999; 253 - } 254 - 255 - /* Loading & Empty States */ 256 - .loading, 257 - .empty, 258 - .error { 259 - text-align: center; 260 - padding: 60px 20px; 261 - color: #999; 262 - font-style: italic; 263 - } 264 - 265 - .error { 266 - color: #d93025; 267 - font-style: normal; 268 - } 269 - 270 - /* Load More */ 271 - .load-more { 272 - text-align: center; 273 - margin-top: 40px; 274 - } 275 - 276 - #load-more-btn { 277 - background: var(--forest-green); 278 - color: white; 279 - border: 1px dashed var(--forest-green-dark); 280 - padding: 12px 32px; 281 - border-radius: 2px; 282 - cursor: pointer; 283 - font-size: 14px; 284 - font-weight: 500; 285 - transition: all 0.2s; 286 - } 287 - 288 - #load-more-btn:hover { 289 - background: var(--forest-green-dark); 290 - transform: translateY(-1px); 291 - } 292 - 293 - #load-more-btn:disabled { 294 - background: #ccc; 295 - border-color: #aaa; 296 - cursor: not-allowed; 297 - transform: none; 298 - } 299 - 300 - /* Footer in Sidebar */ 301 - .footer { 302 - padding-top: 40px; 303 - color: #999; 304 - font-size: 13px; 305 - text-align: center; 306 - margin: 0; 307 - border-top: 2px dashed #d0d0d0; 308 - } 309 - 310 - .mobile-footer { 311 - display: none; 312 - } 313 - 314 - .desktop-footer { 315 - display: block; 316 - } 317 - 318 - .footer-icons { 319 - display: flex; 320 - gap: 20px; 321 - justify-content: center; 322 - align-items: center; 323 - } 324 - 325 - .footer-icons a { 326 - color: #1a1a1a; 327 - text-decoration: none; 328 - transition: all 0.2s; 329 - display: flex; 330 - align-items: center; 331 - justify-content: center; 332 - } 333 - 334 - .footer-icons a img, 335 - .footer-icons a svg { 336 - width: 32px; 337 - height: 32px; 338 - opacity: 0.6; 339 - transition: opacity 0.2s; 340 - } 341 - 342 - .footer-icons a:hover img, 343 - .footer-icons a:hover svg { 344 - opacity: 1; 345 - } 346 - 347 - /* Responsive */ 348 - @media (max-width: 1024px) { 349 - .layout { 350 - flex-direction: column; 351 - } 352 - 353 - .sidebar { 354 - width: 100%; 355 - height: auto; 356 - position: relative; 357 - border-right: none; 358 - border-bottom: 2px dashed #d0d0d0; 359 - } 360 - 361 - .sidebar-content { 362 - min-height: auto; 363 - padding: 40px 0; 364 - } 365 - 366 - .hero { 367 - justify-content: flex-start; 368 - padding: 0 32px; 369 - } 370 - 371 - .desktop-footer { 372 - display: none; 373 - } 374 - 375 - .mobile-footer { 376 - display: block; 377 - padding: 40px 32px; 378 - margin: 0; 379 - border-top: 2px dashed #d0d0d0; 380 - background: #fafafa; 381 - } 382 - 383 - .feed-section { 384 - padding: 48px 32px; 385 - } 386 - } 387 - 388 - @media (max-width: 640px) { 389 - .sidebar-content { 390 - padding: 32px 0; 391 - } 392 - 393 - .hero { 394 - padding: 0 24px; 395 - } 396 - 397 - .hero h1 { 398 - font-size: 28px; 399 - } 400 - 401 - .mobile-footer { 402 - padding: 32px 24px; 403 - font-size: 12px; 404 - } 405 - 406 - .feed-section { 407 - padding: 32px 24px; 408 - } 409 - 410 - .annotation-card { 411 - padding: 20px; 412 - } 413 - } 414 - 415 - /* Search Form */ 416 - .search-container { 417 - margin-bottom: 40px; 418 - } 419 - 420 - .url-form { 421 - display: flex; 422 - gap: 10px; 423 - width: 100%; 424 - } 425 - 426 - .url-form input[type="url"] { 427 - flex: 1; 428 - padding: 14px 18px; 429 - border: 2px solid #ddd; 430 - border-radius: 2px; 431 - font-size: 16px; 432 - transition: border-color 0.2s; 433 - font-family: inherit; 434 - background: #fff; 435 - } 436 - 437 - .url-form input[type="url"]:focus { 438 - outline: none; 439 - border-color: var(--forest-green); 440 - } 441 - 442 - .url-form button[type="submit"] { 443 - padding: 14px 32px; 444 - background: var(--forest-green); 445 - color: white; 446 - border: 1px dashed var(--forest-green-dark); 447 - border-radius: 2px; 448 - font-size: 16px; 449 - font-weight: 500; 450 - cursor: pointer; 451 - transition: all 0.2s; 452 - white-space: nowrap; 453 - font-family: inherit; 454 - } 455 - 456 - .url-form button[type="submit"]:hover { 457 - background: var(--forest-green-dark); 458 - transform: translateY(-1px); 459 - } 460 - 461 - @media (max-width: 640px) { 462 - .url-form { 463 - flex-direction: column; 464 - } 465 - .url-form button[type="submit"] { 466 - width: 100%; 467 - } 468 - } 469 - 470 - /* Sidebar Logo */ 471 - .sidebar { 472 - overflow-x: hidden; 473 - } 474 - 475 - .sidebar-bg-logo { 476 - position: absolute; 477 - right: -22%; 478 - top: 50%; 479 - transform: translateY(-50%); 480 - height: 70%; 481 - width: auto; 482 - opacity: 0.05; 483 - z-index: 0; 484 - pointer-events: none; 485 - /* Filter to make it monochrome if needed, or use opacity */ 486 - } 487 - 488 - .sidebar-content { 489 - position: relative; 490 - z-index: 1; 491 - } 492 - 493 - @media (max-width: 1024px) { 494 - .sidebar-bg-logo { 495 - right: -10%; 496 - height: 60%; 497 - } 498 - }
-96
proxy/static/landing/index.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams - Wisdom is made Together</title> 7 - <script type="module" crossorigin src="/static/seams-index.js"></script> 8 - <link rel="modulepreload" crossorigin href="/static/assets/modulepreload-polyfill-B5Qt9EMX.js"> 9 - <link rel="stylesheet" crossorigin href="/static/assets/index-B7JXvTVO.css"> 10 - </head> 11 - <body> 12 - <div class="layout"> 13 - <aside class="sidebar"> 14 - <div class="sidebar-content"> 15 - <header class="hero"> 16 - <div class="logo">Seams</div> 17 - <h1><span style="white-space: nowrap;">Wisdom is Made</span> <br>Together</h1> 18 - <p class="tagline">Annotations in the Atmosphere</p> 19 - <div class="cta-buttons"> 20 - <a href="https://addons.mozilla.org/en-US/firefox/addon/seams/" class="cta-primary" target="_blank">Install Extension</a> 21 - <a href="/about.html" class="cta-secondary">About</a> 22 - </div> 23 - </header> 24 - 25 - <footer class="footer desktop-footer"> 26 - <div class="footer-icons"> 27 - <a href="https://tangled.org/@sealight.xyz/seams.so" target="_blank" aria-label="Tangled"> 28 - <img src="https://semble.so/_next/static/media/tangled-icon.b95d4d65.svg" alt="Tangled" /> 29 - </a> 30 - <a href="https://bsky.app" target="_blank" aria-label="Bluesky"> 31 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"> 32 - <path fill="currentColor" d="M180 142c-16.3-31.7-60.7-90.8-102-120C38.5-5.9 23.4-1 13.5 3.4 2.1 8.6 0 26.2 0 36.5c0 10.4 5.7 84.8 9.4 97.2 12.2 41 55.7 55 95.7 50.5-58.7 8.6-110.8 30-42.4 106.1 75.1 77.9 103-16.7 117.3-64.6 14.3 48 30.8 139 116 64.6 64-64.6 17.6-97.5-41.1-106.1 40 4.4 83.5-9.5 95.7-50.5 3.7-12.4 9.4-86.8 9.4-97.2 0-10.3-2-27.9-13.5-33C336.5-1 321.5-6 282 22c-41.3 29.2-85.7 88.3-102 120Z"/> 33 - </svg> 34 - </a> 35 - </div> 36 - </footer> 37 - </div> 38 - </aside> 39 - 40 - <main class="main-content"> 41 - <div class="feed-section" id="feed"> 42 - <div id="annotations-feed" class="annotations-feed"> 43 - <div class="loading">Tending the garden...</div> 44 - </div> 45 - <div id="load-more" class="load-more" style="display: none;"> 46 - <button id="load-more-btn">Nurture More</button> 47 - </div> 48 - </div> 49 - </main> 50 - 51 - <footer class="footer mobile-footer"> 52 - <div class="footer-icons"> 53 - <a href="https://tangled.org/@sealight.xyz/seams.so" target="_blank" aria-label="Tangled"> 54 - <img src="https://semble.so/_next/static/media/tangled-icon.b95d4d65.svg" alt="Tangled" /> 55 - </a> 56 - <a href="https://bsky.app" target="_blank" aria-label="Bluesky"> 57 - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"> 58 - <path fill="currentColor" d="M180 142c-16.3-31.7-60.7-90.8-102-120C38.5-5.9 23.4-1 13.5 3.4 2.1 8.6 0 26.2 0 36.5c0 10.4 5.7 84.8 9.4 97.2 12.2 41 55.7 55 95.7 50.5-58.7 8.6-110.8 30-42.4 106.1 75.1 77.9 103-16.7 117.3-64.6 14.3 48 30.8 139 116 64.6 64-64.6 17.6-97.5-41.1-106.1 40 4.4 83.5-9.5 95.7-50.5 3.7-12.4 9.4-86.8 9.4-97.2 0-10.3-2-27.9-13.5-33C336.5-1 321.5-6 282 22c-41.3 29.2-85.7 88.3-102 120Z"/> 59 - </svg> 60 - </a> 61 - </div> 62 - </footer> 63 - </div> 64 - 65 - <script> 66 - // Backend URL defaults to same origin (production) or can be overridden for development 67 - // window.BACKEND_URL = 'http://localhost:8080'; 68 - 69 - // Detect browser and set appropriate extension URL 70 - function getBrowserExtensionUrl() { 71 - const ua = navigator.userAgent; 72 - 73 - // Check Chrome (also works for Edge since it's Chromium-based) 74 - if (ua.includes('Chrome')) { 75 - return 'https://chromewebstore.google.com/detail/seams/dmkgcehijkfpalmplnallinblhimageb'; 76 - } 77 - 78 - // Firefox 79 - if (ua.includes('Firefox')) { 80 - return 'https://addons.mozilla.org/en-US/firefox/addon/seams/'; 81 - } 82 - 83 - // Default fallback to Firefox 84 - return 'https://addons.mozilla.org/en-US/firefox/addon/seams/'; 85 - } 86 - 87 - // Update button href when page loads 88 - document.addEventListener('DOMContentLoaded', function() { 89 - const installButton = document.querySelector('.cta-primary'); 90 - if (installButton) { 91 - installButton.href = getBrowserExtensionUrl(); 92 - } 93 - }); 94 - </script> 95 - </body> 96 - </html>
-72
proxy/static/oauth-callback.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams OAuth Callback</title> 7 - <link rel="stylesheet" href="/landing.css"> 8 - <style> 9 - body { 10 - display: flex; 11 - align-items: center; 12 - justify-content: center; 13 - height: 100vh; 14 - margin: 0; 15 - overflow: hidden; 16 - } 17 - .callback-container { 18 - background: white; 19 - padding: 48px; 20 - border: 2px dashed #d0d0d0; 21 - border-radius: 2px; 22 - text-align: center; 23 - max-width: 400px; 24 - width: 90%; 25 - box-shadow: 0 4px 12px rgba(45, 80, 22, 0.05); 26 - } 27 - .logo { 28 - font-family: 'Spectral', serif; 29 - font-size: 16px; 30 - font-weight: 700; 31 - letter-spacing: 0.1em; 32 - text-transform: uppercase; 33 - color: #666; 34 - margin-bottom: 16px; 35 - } 36 - h2 { 37 - font-family: 'Fraunces', serif; 38 - font-size: 24px; 39 - color: #1a1a1a; 40 - margin-bottom: 16px; 41 - } 42 - .spinner { 43 - border: 3px solid #f3f3f3; 44 - border-top: 3px solid var(--forest-green); 45 - border-radius: 50%; 46 - width: 32px; 47 - height: 32px; 48 - animation: spin 1s linear infinite; 49 - margin: 0 auto 24px; 50 - } 51 - @keyframes spin { 52 - 0% { transform: rotate(0deg); } 53 - 100% { transform: rotate(360deg); } 54 - } 55 - #status { 56 - color: #666; 57 - font-size: 14px; 58 - } 59 - </style> 60 - <script type="module" crossorigin src="/static/seams-oauth-callback.js"></script> 61 - <link rel="modulepreload" crossorigin href="/static/assets/modulepreload-polyfill-Elc7_Ely.js"> 62 - <link rel="modulepreload" crossorigin href="/static/assets/index-BKdQD0EM.js"> 63 - </head> 64 - <body> 65 - <div class="callback-container"> 66 - <div class="logo">Seams</div> 67 - <div class="spinner"></div> 68 - <h2>Connecting...</h2> 69 - <p id="status">Completing authentication</p> 70 - </div> 71 - </body> 72 - </html>
-17
proxy/static/oauth/callback.html
··· 1 - <!DOCTYPE html> 2 - <html> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <title>OAuth Callback</title> 6 - </head> 7 - <body> 8 - <p>Redirecting...</p> 9 - <script> 10 - // Relay to Chromium extension callback 11 - // The extension ID is deterministic based on the manifest key 12 - const extensionId = 'kjdnjfgcikmlbloojphbkmknfpmfofio'; 13 - const extRedirect = `https://${extensionId}.chromiumapp.org/extension-callback.html`; 14 - window.location.href = extRedirect + window.location.search + window.location.hash; 15 - </script> 16 - </body> 17 - </html>
-24
proxy/static/oauth/client-metadata.json
··· 1 - { 2 - "client_id": "https://synthes-is.netlify.app/oauth/client-metadata.json", 3 - "client_uri": "https://synthes-is.netlify.app", 4 - "redirect_uris": [ 5 - "https://synthes-is.netlify.app", 6 - "https://synthes-is.netlify.app/oauth/callback", 7 - "https://synthes-is.netlify.app/oauth/ff/callback", 8 - "https://e7a0b7703dc3d21c8ef60539da3ed68d27b48e8c.extensions.allizom.org/", 9 - "https://synthesis@seams.so/oauth/ff/callback", 10 - "https://dmkgcehijkfpalmplnallinblhimageb.chromium.org/oauth/callback.html" 11 - ], 12 - "application_type": "web", 13 - "client_name": "Seams", 14 - "dpop_bound_access_tokens": true, 15 - "grant_types": [ 16 - "authorization_code", 17 - "refresh_token" 18 - ], 19 - "response_types": [ 20 - "code" 21 - ], 22 - "scope": "atproto transition:generic", 23 - "token_endpoint_auth_method": "none" 24 - }
-16
proxy/static/oauth/ff/callback.html
··· 1 - <!DOCTYPE html> 2 - <html> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <title>OAuth Callback</title> 6 - </head> 7 - <body> 8 - <p>Redirecting...</p> 9 - <script> 10 - // Relay to Firefox extension callback 11 - // The extension ID is synthesis@seams.so, which Firefox hashes to this subdomain 12 - const extRedirect = 'https://e7a0b7703dc3d21c8ef60539da3ed68d27b48e8c.extensions.allizom.org/'; 13 - window.location.href = extRedirect + window.location.search + window.location.hash; 14 - </script> 15 - </body> 16 - </html>
-15
proxy/static/seams-sidebar.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams Sidebar</title> 7 - <script type="module" crossorigin src="/static/seams-seams-sidebar.js"></script> 8 - <link rel="modulepreload" crossorigin href="/static/assets/modulepreload-polyfill-Elc7_Ely.js"> 9 - <link rel="modulepreload" crossorigin href="/static/assets/index-BKdQD0EM.js"> 10 - <link rel="stylesheet" crossorigin href="/static/assets/seams-sidebar-gO3IQ7ah.css"> 11 - </head> 12 - <body> 13 - <div id="app"></div> 14 - </body> 15 - </html>
-1
proxy/static/sidebar-BBEPW7gD.css
··· 1 - *{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:14px;line-height:1.5;color:#333}.sidebar{display:flex;flex-direction:column;height:100vh;background:#fff}.sidebar-header{padding:16px;border-bottom:1px solid #e0e0e0;background:#f5f5f5}.sidebar-header h1{font-size:20px;font-weight:600;margin-bottom:4px}.sidebar-header p{font-size:12px;color:#666}.sidebar-content{flex:1;overflow-y:auto;padding:16px}
-127
proxy/static/static/assets/annotation-card-C6T0kbHB.js
··· 1 - class Ue{constructor(s="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(s),this.channel.onmessage=g=>{this.listeners.forEach(c=>c(g.data))}}async get(s){if(typeof s=="string"){const c=localStorage.getItem(s);return c?JSON.parse(c):null}const g={};return s.forEach(c=>{const h=localStorage.getItem(c);g[c]=h?JSON.parse(h):null}),g}async set(s,g){const c=await this.get(s);localStorage.setItem(s,JSON.stringify(g));const h={key:s,newValue:g,oldValue:c};this.channel.postMessage(h)}onChange(s){this.listeners.push(s)}close(){this.channel.close()}}var k={},J={exports:{}};(function(f){var s=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},g=-1,c=1,h=0;s.Diff=function(e,r){return[e,r]},s.prototype.diff_main=function(e,r,n,t){typeof t>"u"&&(this.Diff_Timeout<=0?t=Number.MAX_VALUE:t=new Date().getTime()+this.Diff_Timeout*1e3);var a=t;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new s.Diff(h,e)]:[];typeof n>"u"&&(n=!0);var i=n,o=this.diff_commonPrefix(e,r),l=e.substring(0,o);e=e.substring(o),r=r.substring(o),o=this.diff_commonSuffix(e,r);var u=e.substring(e.length-o);e=e.substring(0,e.length-o),r=r.substring(0,r.length-o);var v=this.diff_compute_(e,r,i,a);return l&&v.unshift(new s.Diff(h,l)),u&&v.push(new s.Diff(h,u)),this.diff_cleanupMerge(v),v},s.prototype.diff_compute_=function(e,r,n,t){var a;if(!e)return[new s.Diff(c,r)];if(!r)return[new s.Diff(g,e)];var i=e.length>r.length?e:r,o=e.length>r.length?r:e,l=i.indexOf(o);if(l!=-1)return a=[new s.Diff(c,i.substring(0,l)),new s.Diff(h,o),new s.Diff(c,i.substring(l+o.length))],e.length>r.length&&(a[0][0]=a[2][0]=g),a;if(o.length==1)return[new s.Diff(g,e),new s.Diff(c,r)];var u=this.diff_halfMatch_(e,r);if(u){var v=u[0],d=u[1],m=u[2],_=u[3],p=u[4],w=this.diff_main(v,m,n,t),b=this.diff_main(d,_,n,t);return w.concat([new s.Diff(h,p)],b)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,t):this.diff_bisect_(e,r,t)},s.prototype.diff_lineMode_=function(e,r,n){var t=this.diff_linesToChars_(e,r);e=t.chars1,r=t.chars2;var a=t.lineArray,i=this.diff_main(e,r,!1,n);this.diff_charsToLines_(i,a),this.diff_cleanupSemantic(i),i.push(new s.Diff(h,""));for(var o=0,l=0,u=0,v="",d="";o<i.length;){switch(i[o][0]){case c:u++,d+=i[o][1];break;case g:l++,v+=i[o][1];break;case h:if(l>=1&&u>=1){i.splice(o-l-u,l+u),o=o-l-u;for(var m=this.diff_main(v,d,!1,n),_=m.length-1;_>=0;_--)i.splice(o,0,m[_]);o=o+m.length}u=0,l=0,v="",d="";break}o++}return i.pop(),i},s.prototype.diff_bisect_=function(e,r,n){for(var t=e.length,a=r.length,i=Math.ceil((t+a)/2),o=i,l=2*i,u=new Array(l),v=new Array(l),d=0;d<l;d++)u[d]=-1,v[d]=-1;u[o+1]=0,v[o+1]=0;for(var m=t-a,_=m%2!=0,p=0,w=0,b=0,E=0,N=0;N<i&&!(new Date().getTime()>n);N++){for(var M=-N+p;M<=N-w;M+=2){var D=o+M,T;M==-N||M!=N&&u[D-1]<u[D+1]?T=u[D+1]:T=u[D-1]+1;for(var R=T-M;T<t&&R<a&&e.charAt(T)==r.charAt(R);)T++,R++;if(u[D]=T,T>t)w+=2;else if(R>a)p+=2;else if(_){var y=o+m-M;if(y>=0&&y<l&&v[y]!=-1){var S=t-v[y];if(T>=S)return this.diff_bisectSplit_(e,r,T,R,n)}}}for(var C=-N+b;C<=N-E;C+=2){var y=o+C,S;C==-N||C!=N&&v[y-1]<v[y+1]?S=v[y+1]:S=v[y-1]+1;for(var I=S-C;S<t&&I<a&&e.charAt(t-S-1)==r.charAt(a-I-1);)S++,I++;if(v[y]=S,S>t)E+=2;else if(I>a)b+=2;else if(!_){var D=o+m-C;if(D>=0&&D<l&&u[D]!=-1){var T=u[D],R=o+T-D;if(S=t-S,T>=S)return this.diff_bisectSplit_(e,r,T,R,n)}}}}return[new s.Diff(g,e),new s.Diff(c,r)]},s.prototype.diff_bisectSplit_=function(e,r,n,t,a){var i=e.substring(0,n),o=r.substring(0,t),l=e.substring(n),u=r.substring(t),v=this.diff_main(i,o,!1,a),d=this.diff_main(l,u,!1,a);return v.concat(d)},s.prototype.diff_linesToChars_=function(e,r){var n=[],t={};n[0]="";function a(u){for(var v="",d=0,m=-1,_=n.length;m<u.length-1;){m=u.indexOf(` 2 - `,d),m==-1&&(m=u.length-1);var p=u.substring(d,m+1);(t.hasOwnProperty?t.hasOwnProperty(p):t[p]!==void 0)?v+=String.fromCharCode(t[p]):(_==i&&(p=u.substring(d),m=u.length),v+=String.fromCharCode(_),t[p]=_,n[_++]=p),d=m+1}return v}var i=4e4,o=a(e);i=65535;var l=a(r);return{chars1:o,chars2:l,lineArray:n}},s.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var t=e[n][1],a=[],i=0;i<t.length;i++)a[i]=r[t.charCodeAt(i)];e[n][1]=a.join("")}},s.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,t=Math.min(e.length,r.length),a=t,i=0;n<a;)e.substring(i,a)==r.substring(i,a)?(n=a,i=n):t=a,a=Math.floor((t-n)/2+n);return a},s.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,t=Math.min(e.length,r.length),a=t,i=0;n<a;)e.substring(e.length-a,e.length-i)==r.substring(r.length-a,r.length-i)?(n=a,i=n):t=a,a=Math.floor((t-n)/2+n);return a},s.prototype.diff_commonOverlap_=function(e,r){var n=e.length,t=r.length;if(n==0||t==0)return 0;n>t?e=e.substring(n-t):n<t&&(r=r.substring(0,n));var a=Math.min(n,t);if(e==r)return a;for(var i=0,o=1;;){var l=e.substring(a-o),u=r.indexOf(l);if(u==-1)return i;o+=u,(u==0||e.substring(a-o)==r.substring(0,o))&&(i=o,o++)}},s.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,t=e.length>r.length?r:e;if(n.length<4||t.length*2<n.length)return null;var a=this;function i(w,b,E){for(var N=w.substring(E,E+Math.floor(w.length/4)),M=-1,D="",T,R,y,S;(M=b.indexOf(N,M+1))!=-1;){var C=a.diff_commonPrefix(w.substring(E),b.substring(M)),I=a.diff_commonSuffix(w.substring(0,E),b.substring(0,M));D.length<I+C&&(D=b.substring(M-I,M)+b.substring(M,M+C),T=w.substring(0,E-I),R=w.substring(E+C),y=b.substring(0,M-I),S=b.substring(M+C))}return D.length*2>=w.length?[T,R,y,S,D]:null}var o=i(n,t,Math.ceil(n.length/4)),l=i(n,t,Math.ceil(n.length/2)),u;if(!o&&!l)return null;l?o?u=o[4].length>l[4].length?o:l:u=l:u=o;var v,d,m,_;e.length>r.length?(v=u[0],d=u[1],m=u[2],_=u[3]):(m=u[0],_=u[1],v=u[2],d=u[3]);var p=u[4];return[v,d,m,_,p]},s.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],t=0,a=null,i=0,o=0,l=0,u=0,v=0;i<e.length;)e[i][0]==h?(n[t++]=i,o=u,l=v,u=0,v=0,a=e[i][1]):(e[i][0]==c?u+=e[i][1].length:v+=e[i][1].length,a&&a.length<=Math.max(o,l)&&a.length<=Math.max(u,v)&&(e.splice(n[t-1],0,new s.Diff(g,a)),e[n[t-1]+1][0]=c,t--,t--,i=t>0?n[t-1]:-1,o=0,l=0,u=0,v=0,a=null,r=!0)),i++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),i=1;i<e.length;){if(e[i-1][0]==g&&e[i][0]==c){var d=e[i-1][1],m=e[i][1],_=this.diff_commonOverlap_(d,m),p=this.diff_commonOverlap_(m,d);_>=p?(_>=d.length/2||_>=m.length/2)&&(e.splice(i,0,new s.Diff(h,m.substring(0,_))),e[i-1][1]=d.substring(0,d.length-_),e[i+1][1]=m.substring(_),i++):(p>=d.length/2||p>=m.length/2)&&(e.splice(i,0,new s.Diff(h,d.substring(0,p))),e[i-1][0]=c,e[i-1][1]=m.substring(0,m.length-p),e[i+1][0]=g,e[i+1][1]=d.substring(p),i++),i++}i++}},s.prototype.diff_cleanupSemanticLossless=function(e){function r(p,w){if(!p||!w)return 6;var b=p.charAt(p.length-1),E=w.charAt(0),N=b.match(s.nonAlphaNumericRegex_),M=E.match(s.nonAlphaNumericRegex_),D=N&&b.match(s.whitespaceRegex_),T=M&&E.match(s.whitespaceRegex_),R=D&&b.match(s.linebreakRegex_),y=T&&E.match(s.linebreakRegex_),S=R&&p.match(s.blanklineEndRegex_),C=y&&w.match(s.blanklineStartRegex_);return S||C?5:R||y?4:N&&!D&&T?3:D||T?2:N||M?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==h&&e[n+1][0]==h){var t=e[n-1][1],a=e[n][1],i=e[n+1][1],o=this.diff_commonSuffix(t,a);if(o){var l=a.substring(a.length-o);t=t.substring(0,t.length-o),a=l+a.substring(0,a.length-o),i=l+i}for(var u=t,v=a,d=i,m=r(t,a)+r(a,i);a.charAt(0)===i.charAt(0);){t+=a.charAt(0),a=a.substring(1)+i.charAt(0),i=i.substring(1);var _=r(t,a)+r(a,i);_>=m&&(m=_,u=t,v=a,d=i)}e[n-1][1]!=u&&(u?e[n-1][1]=u:(e.splice(n-1,1),n--),e[n][1]=v,d?e[n+1][1]=d:(e.splice(n+1,1),n--))}n++}},s.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,s.whitespaceRegex_=/\s/,s.linebreakRegex_=/[\r\n]/,s.blanklineEndRegex_=/\n\r?\n$/,s.blanklineStartRegex_=/^\r?\n\r?\n/,s.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],t=0,a=null,i=0,o=!1,l=!1,u=!1,v=!1;i<e.length;)e[i][0]==h?(e[i][1].length<this.Diff_EditCost&&(u||v)?(n[t++]=i,o=u,l=v,a=e[i][1]):(t=0,a=null),u=v=!1):(e[i][0]==g?v=!0:u=!0,a&&(o&&l&&u&&v||a.length<this.Diff_EditCost/2&&o+l+u+v==3)&&(e.splice(n[t-1],0,new s.Diff(g,a)),e[n[t-1]+1][0]=c,t--,a=null,o&&l?(u=v=!0,t=0):(t--,i=t>0?n[t-1]:-1,u=v=!1),r=!0)),i++;r&&this.diff_cleanupMerge(e)},s.prototype.diff_cleanupMerge=function(e){e.push(new s.Diff(h,""));for(var r=0,n=0,t=0,a="",i="",o;r<e.length;)switch(e[r][0]){case c:t++,i+=e[r][1],r++;break;case g:n++,a+=e[r][1],r++;break;case h:n+t>1?(n!==0&&t!==0&&(o=this.diff_commonPrefix(i,a),o!==0&&(r-n-t>0&&e[r-n-t-1][0]==h?e[r-n-t-1][1]+=i.substring(0,o):(e.splice(0,0,new s.Diff(h,i.substring(0,o))),r++),i=i.substring(o),a=a.substring(o)),o=this.diff_commonSuffix(i,a),o!==0&&(e[r][1]=i.substring(i.length-o)+e[r][1],i=i.substring(0,i.length-o),a=a.substring(0,a.length-o))),r-=n+t,e.splice(r,n+t),a.length&&(e.splice(r,0,new s.Diff(g,a)),r++),i.length&&(e.splice(r,0,new s.Diff(c,i)),r++),r++):r!==0&&e[r-1][0]==h?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,t=0,n=0,a="",i="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==h&&e[r+1][0]==h&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},s.prototype.diff_xIndex=function(e,r){var n=0,t=0,a=0,i=0,o;for(o=0;o<e.length&&(e[o][0]!==c&&(n+=e[o][1].length),e[o][0]!==g&&(t+=e[o][1].length),!(n>r));o++)a=n,i=t;return e.length!=o&&e[o][0]===g?i:i+(r-a)},s.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,t=/</g,a=/>/g,i=/\n/g,o=0;o<e.length;o++){var l=e[o][0],u=e[o][1],v=u.replace(n,"&amp;").replace(t,"&lt;").replace(a,"&gt;").replace(i,"&para;<br>");switch(l){case c:r[o]='<ins style="background:#e6ffe6;">'+v+"</ins>";break;case g:r[o]='<del style="background:#ffe6e6;">'+v+"</del>";break;case h:r[o]="<span>"+v+"</span>";break}}return r.join("")},s.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==c&&(r[n]=e[n][1]);return r.join("")},s.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==g&&(r[n]=e[n][1]);return r.join("")},s.prototype.diff_levenshtein=function(e){for(var r=0,n=0,t=0,a=0;a<e.length;a++){var i=e[a][0],o=e[a][1];switch(i){case c:n+=o.length;break;case g:t+=o.length;break;case h:r+=Math.max(n,t),n=0,t=0;break}}return r+=Math.max(n,t),r},s.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case c:r[n]="+"+encodeURI(e[n][1]);break;case g:r[n]="-"+e[n][1].length;break;case h:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},s.prototype.diff_fromDelta=function(e,r){for(var n=[],t=0,a=0,i=r.split(/\t/g),o=0;o<i.length;o++){var l=i[o].substring(1);switch(i[o].charAt(0)){case"+":try{n[t++]=new s.Diff(c,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var u=parseInt(l,10);if(isNaN(u)||u<0)throw new Error("Invalid number in diff_fromDelta: "+l);var v=e.substring(a,a+=u);i[o].charAt(0)=="="?n[t++]=new s.Diff(h,v):n[t++]=new s.Diff(g,v);break;default:if(i[o])throw new Error("Invalid diff operation in diff_fromDelta: "+i[o])}}if(a!=e.length)throw new Error("Delta length ("+a+") does not equal source text length ("+e.length+").");return n},s.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},s.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var t=this.match_alphabet_(r),a=this;function i(T,R){var y=T/r.length,S=Math.abs(n-R);return a.Match_Distance?y+S/a.Match_Distance:S?1:y}var o=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(o=Math.min(i(0,l),o),l=e.lastIndexOf(r,n+r.length),l!=-1&&(o=Math.min(i(0,l),o)));var u=1<<r.length-1;l=-1;for(var v,d,m=r.length+e.length,_,p=0;p<r.length;p++){for(v=0,d=m;v<d;)i(p,n+d)<=o?v=d:m=d,d=Math.floor((m-v)/2+v);m=d;var w=Math.max(1,n-d+1),b=Math.min(n+d,e.length)+r.length,E=Array(b+2);E[b+1]=(1<<p)-1;for(var N=b;N>=w;N--){var M=t[e.charAt(N-1)];if(p===0?E[N]=(E[N+1]<<1|1)&M:E[N]=(E[N+1]<<1|1)&M|((_[N+1]|_[N])<<1|1)|_[N+1],E[N]&u){var D=i(p,N-1);if(D<=o)if(o=D,l=N-1,l>n)w=Math.max(1,2*n-l);else break}}if(i(p+1,n)>o)break;_=E}return l},s.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},s.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),t=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)t+=this.Patch_Margin,n=r.substring(e.start2-t,e.start2+e.length1+t);t+=this.Patch_Margin;var a=r.substring(e.start2-t,e.start2);a&&e.diffs.unshift(new s.Diff(h,a));var i=r.substring(e.start2+e.length1,e.start2+e.length1+t);i&&e.diffs.push(new s.Diff(h,i)),e.start1-=a.length,e.start2-=a.length,e.length1+=a.length+i.length,e.length2+=a.length+i.length}},s.prototype.patch_make=function(e,r,n){var t,a;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")t=e,a=this.diff_main(t,r,!0),a.length>2&&(this.diff_cleanupSemantic(a),this.diff_cleanupEfficiency(a));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")a=e,t=this.diff_text1(a);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")t=e,a=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")t=e,a=n;else throw new Error("Unknown call format to patch_make.");if(a.length===0)return[];for(var i=[],o=new s.patch_obj,l=0,u=0,v=0,d=t,m=t,_=0;_<a.length;_++){var p=a[_][0],w=a[_][1];switch(!l&&p!==h&&(o.start1=u,o.start2=v),p){case c:o.diffs[l++]=a[_],o.length2+=w.length,m=m.substring(0,v)+w+m.substring(v);break;case g:o.length1+=w.length,o.diffs[l++]=a[_],m=m.substring(0,v)+m.substring(v+w.length);break;case h:w.length<=2*this.Patch_Margin&&l&&a.length!=_+1?(o.diffs[l++]=a[_],o.length1+=w.length,o.length2+=w.length):w.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(o,d),i.push(o),o=new s.patch_obj,l=0,d=m,u=v);break}p!==c&&(u+=w.length),p!==g&&(v+=w.length)}return l&&(this.patch_addContext_(o,d),i.push(o)),i},s.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var t=e[n],a=new s.patch_obj;a.diffs=[];for(var i=0;i<t.diffs.length;i++)a.diffs[i]=new s.Diff(t.diffs[i][0],t.diffs[i][1]);a.start1=t.start1,a.start2=t.start2,a.length1=t.length1,a.length2=t.length2,r[n]=a}return r},s.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var t=0,a=[],i=0;i<e.length;i++){var o=e[i].start2+t,l=this.diff_text1(e[i].diffs),u,v=-1;if(l.length>this.Match_MaxBits?(u=this.match_main(r,l.substring(0,this.Match_MaxBits),o),u!=-1&&(v=this.match_main(r,l.substring(l.length-this.Match_MaxBits),o+l.length-this.Match_MaxBits),(v==-1||u>=v)&&(u=-1))):u=this.match_main(r,l,o),u==-1)a[i]=!1,t-=e[i].length2-e[i].length1;else{a[i]=!0,t=u-o;var d;if(v==-1?d=r.substring(u,u+l.length):d=r.substring(u,v+this.Match_MaxBits),l==d)r=r.substring(0,u)+this.diff_text2(e[i].diffs)+r.substring(u+l.length);else{var m=this.diff_main(l,d,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(m)/l.length>this.Patch_DeleteThreshold)a[i]=!1;else{this.diff_cleanupSemanticLossless(m);for(var _=0,p,w=0;w<e[i].diffs.length;w++){var b=e[i].diffs[w];b[0]!==h&&(p=this.diff_xIndex(m,_)),b[0]===c?r=r.substring(0,u+p)+b[1]+r.substring(u+p):b[0]===g&&(r=r.substring(0,u+p)+r.substring(u+this.diff_xIndex(m,_+b[1].length))),b[0]!==g&&(_+=b[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,a]},s.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",t=1;t<=r;t++)n+=String.fromCharCode(t);for(var t=0;t<e.length;t++)e[t].start1+=r,e[t].start2+=r;var a=e[0],i=a.diffs;if(i.length==0||i[0][0]!=h)i.unshift(new s.Diff(h,n)),a.start1-=r,a.start2-=r,a.length1+=r,a.length2+=r;else if(r>i[0][1].length){var o=r-i[0][1].length;i[0][1]=n.substring(i[0][1].length)+i[0][1],a.start1-=o,a.start2-=o,a.length1+=o,a.length2+=o}if(a=e[e.length-1],i=a.diffs,i.length==0||i[i.length-1][0]!=h)i.push(new s.Diff(h,n)),a.length1+=r,a.length2+=r;else if(r>i[i.length-1][1].length){var o=r-i[i.length-1][1].length;i[i.length-1][1]+=n.substring(0,o),a.length1+=o,a.length2+=o}return n},s.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var t=e[n];e.splice(n--,1);for(var a=t.start1,i=t.start2,o="";t.diffs.length!==0;){var l=new s.patch_obj,u=!0;for(l.start1=a-o.length,l.start2=i-o.length,o!==""&&(l.length1=l.length2=o.length,l.diffs.push(new s.Diff(h,o)));t.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var v=t.diffs[0][0],d=t.diffs[0][1];v===c?(l.length2+=d.length,i+=d.length,l.diffs.push(t.diffs.shift()),u=!1):v===g&&l.diffs.length==1&&l.diffs[0][0]==h&&d.length>2*r?(l.length1+=d.length,a+=d.length,u=!1,l.diffs.push(new s.Diff(v,d)),t.diffs.shift()):(d=d.substring(0,r-l.length1-this.Patch_Margin),l.length1+=d.length,a+=d.length,v===h?(l.length2+=d.length,i+=d.length):u=!1,l.diffs.push(new s.Diff(v,d)),d==t.diffs[0][1]?t.diffs.shift():t.diffs[0][1]=t.diffs[0][1].substring(d.length))}o=this.diff_text2(l.diffs),o=o.substring(o.length-this.Patch_Margin);var m=this.diff_text1(t.diffs).substring(0,this.Patch_Margin);m!==""&&(l.length1+=m.length,l.length2+=m.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===h?l.diffs[l.diffs.length-1][1]+=m:l.diffs.push(new s.Diff(h,m))),u||e.splice(++n,0,l)}}},s.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},s.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(` 3 - `),t=0,a=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;t<n.length;){var i=n[t].match(a);if(!i)throw new Error("Invalid patch string: "+n[t]);var o=new s.patch_obj;for(r.push(o),o.start1=parseInt(i[1],10),i[2]===""?(o.start1--,o.length1=1):i[2]=="0"?o.length1=0:(o.start1--,o.length1=parseInt(i[2],10)),o.start2=parseInt(i[3],10),i[4]===""?(o.start2--,o.length2=1):i[4]=="0"?o.length2=0:(o.start2--,o.length2=parseInt(i[4],10)),t++;t<n.length;){var l=n[t].charAt(0);try{var u=decodeURI(n[t].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+u)}if(l=="-")o.diffs.push(new s.Diff(g,u));else if(l=="+")o.diffs.push(new s.Diff(c,u));else if(l==" ")o.diffs.push(new s.Diff(h,u));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+u)}t++}}return r},s.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},s.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@ 4 - `],t,a=0;a<this.diffs.length;a++){switch(this.diffs[a][0]){case c:t="+";break;case g:t="-";break;case h:t=" ";break}n[a+1]=t+encodeURI(this.diffs[a][1])+` 5 - `}return n.join("").replace(/%20/g," ")},f.exports=s,f.exports.diff_match_patch=s,f.exports.DIFF_DELETE=g,f.exports.DIFF_INSERT=c,f.exports.DIFF_EQUAL=h})(J);var ae=J.exports,A={},O={exports:{}},Y={},P={},Q={};(function(f){f.__esModule=!0;function s(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}f.default=g;function g(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2],n=h.nodeType==9||h.ownerDocument,t=n.createNodeIterator(h,e,r,!1);return new c(t,h,e,r)}var c=function(){function h(e,r,n,t){s(this,h),this.root=r,this.whatToShow=n,this.filter=t,this.referenceNode=r,this.pointerBeforeReferenceNode=!0,this._iter=e}return h.prototype.nextNode=function(){var r=this._iter.nextNode();return this.pointerBeforeReferenceNode=!1,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.previousNode=function(){var r=this._iter.previousNode();return this.pointerBeforeReferenceNode=!0,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(Q);var B={};(function(f){f.__esModule=!0,f.default=s;function s(g){var c=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],h=arguments.length<=2||arguments[2]===void 0?null:arguments[2],e=g.ownerDocument;return e.createNodeIterator.call(e,g,c,h)}})(B);var $={};(function(f){f.__esModule=!0;function s(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}f.default=g;function g(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2];return new c(h,e,r)}var c=function(){function h(e,r,n){s(this,h),this.root=e,this.whatToShow=r,this.filter=n,this.referenceNode=e,this.pointerBeforeReferenceNode=!0,this._filter=function(t){return n?n(t)===1:!0},this._show=function(t){return r>>t.nodeType-1&!0}}return h.prototype.nextNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!1;var n=this.referenceNode;if(r&&this._show(n)&&this._filter(n))return n;do{if(n.firstChild){n=n.firstChild;continue}do{if(n===this.root)return null;if(n.nextSibling)break;n=n.parentNode}while(n);n=n.nextSibling}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!1,n},h.prototype.previousNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!0;var n=this.referenceNode;if(!r&&this._show(n)&&this._filter(n))return n;do{if(n===this.root)return null;if(n.previousSibling){for(n=n.previousSibling;n.lastChild;)n=n.lastChild;continue}n=n.parentNode}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!0,n},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})($);(function(f){f.__esModule=!0,f.default=t;var s=Q,g=n(s),c=B,h=n(c),e=$,r=n(e);function n(a){return a&&a.__esModule?a:{default:a}}function t(){try{var a=typeof document>"u"?{}:document,i=(0,h.default)(a,4294967295,null,!1);return i.referenceNode===a?h.default:g.default}catch{return r.default}}})(P);var L={};(function(f){f.__esModule=!0,f.default=r;var s=B,g=e(s),c=P,h=e(c);function e(n){return n&&n.__esModule?n:{default:n}}function r(){var n=typeof document>"u"?{}:document,t=(0,h.default)();return t!==g.default&&(n.createNodeIterator=t),t}})(L);(function(f){f.__esModule=!0;var s=P,g=n(s),c=$,h=n(c),e=L,r=n(e);function n(a){return a&&a.__esModule?a:{default:a}}var t=(0,g.default)();t.implementation=h.default,t.shim=r.default,f.default=t})(Y);var ie=P.default,se=$.default,oe=L.default;O.exports=Y.default;O.exports.getPolyfill=ie;O.exports.implementation=se;O.exports.shim=oe;var le=O.exports,Z={},fe=ue;function ue(f,s){var g=[];s=s||he;do g.push(f),f=f.parentNode;while(f&&f.tagName&&s(f));return g.slice(1)}function he(f){return!0}/*! 6 - * index-of <https://github.com/jonschlinkert/index-of> 7 - * 8 - * Copyright (c) 2014-2015 Jon Schlinkert. 9 - * Licensed under the MIT license. 10 - */var ge=function(s,g,c){c=c||0;var h=-1;if(s==null)return h;var e=s.length,r=c<0?e+c:c;if(r>=s.length)return-1;for(;r<e;){if(s[r]===g)return r;r++}return-1};(function(f){f.__esModule=!0,f.default=i;var s=fe,g=e(s),c=ge,h=e(c);function e(v){return v&&v.__esModule?v:{default:v}}var r="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",n="Argument 2 of seek must be a number or a Text Node.",t=4,a=3;function i(v,d){if(v.whatToShow!==t)throw new Error(r);var m=0,_=v.referenceNode,p=null;if(o(d))p={forward:function(){return m<d},backward:function(){return m>d}};else if(l(d)){var w=u(_,d)?function(){return!1}:function(){return _!==d},b=function(){return _!=d||!v.pointerBeforeReferenceNode};p={forward:w,backward:b}}else throw new Error(n);for(;p.forward()&&(_=v.nextNode())!==null;)m+=_.nodeValue.length;for(;p.backward()&&(_=v.previousNode())!==null;)m-=_.nodeValue.length;return m}function o(v){return!isNaN(parseInt(v))&&isFinite(v)}function l(v){return v.nodeType===a}function u(v,d){if(v===d)return!1;for(var m=null,_=[v].concat((0,g.default)(v)).reverse(),p=[d].concat((0,g.default)(d)).reverse();_[0]===p[0];)m=_.shift(),p.shift();_=_[0],p=p[0];var w=(0,h.default)(m.childNodes,_),b=(0,h.default)(m.childNodes,p);return w>b}})(Z);var ve=Z.default,H={};Object.defineProperty(H,"__esModule",{value:!0});H.default=_e;function F(f,s){if(!s&&f.firstChild)return f.firstChild;do{if(f.nextSibling)return f.nextSibling;f=f.parentNode}while(f);return f}function ce(f){if(f.startContainer.nodeType===Node.ELEMENT_NODE){var s=f.startContainer.childNodes[f.startOffset];return s||F(f.startContainer,!0)}return f.startContainer}function de(f){if(f.endContainer.nodeType===Node.ELEMENT_NODE){var s=f.endContainer.childNodes[f.endOffset];return s||F(f.endContainer,!0)}return F(f.endContainer)}function me(f,s){for(var g=ce(f),c=de(f);g!==c;)s(g),g=F(g)}function _e(f){var s="";return me(f,function(g){if(g.nodeType===Node.TEXT_NODE){var c=g===f.startContainer?f.startOffset:0,h=g===f.endContainer?f.endOffset:g.textContent.length;s+=g.textContent.slice(c,h)}}),s}Object.defineProperty(A,"__esModule",{value:!0});A.fromRange=Me;A.toRange=De;var pe=le,we=U(pe),be=ve,W=U(be),Ne=H,X=U(Ne);function U(f){return f&&f.__esModule?f:{default:f}}var Ee=4;function Me(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=f.ownerDocument,c=g.createRange(),h=s.startContainer,e=s.startOffset;c.setStart(f,0),c.setEnd(h,e);var r=(0,X.default)(c).length,n=r+(0,X.default)(s).length;return{start:r,end:n}}function De(f){var s=arguments.length<=1||arguments[1]===void 0?{}:arguments[1];if(f===void 0)throw new Error('missing required parameter "root"');var g=f.ownerDocument,c=g.createRange(),h=(0,we.default)(f,Ee),e=s.start||0,r=s.end||e,n=(0,W.default)(h,e),t=e-n;h.pointerBeforeReferenceNode?c.setStart(h.referenceNode,t):(c.setStart(h.nextNode(),t),h.previousNode());var a=r-e+t;return n=(0,W.default)(h,a),t=a-n,h.pointerBeforeReferenceNode?c.setEnd(h.referenceNode,t):c.setEnd(h.nextNode(),t),c}var Te=A;Object.defineProperty(k,"__esModule",{value:!0});k.fromRange=Oe;k.fromTextPosition=x;k.toRange=Fe;k.toTextPosition=ee;var Se=ae,ye=Ie(Se),Re=Te,K=Ce(Re);function Ce(f){if(f&&f.__esModule)return f;var s={};if(f!=null)for(var g in f)Object.prototype.hasOwnProperty.call(f,g)&&(s[g]=f[g]);return s.default=f,s}function Ie(f){return f&&f.__esModule?f:{default:f}}var j=32,ke=new RegExp(`(.|[\r 11 - ]){1,`+String(j)+"}","g"),V=j;function Oe(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=K.fromRange(f,s);return x(f,g)}function x(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "selector"');var g=s.start;if(g===void 0)throw new Error('selector missing required property "start"');if(g<0)throw new Error('property "start" must be a non-negative integer');var c=s.end;if(c===void 0)throw new Error('selector missing required property "end"');if(c<0)throw new Error('property "end" must be a non-negative integer');var h=f.textContent.substr(g,c-g),e=Math.max(0,g-V),r=f.textContent.substr(e,g-e),n=Math.min(f.textContent.length,c+V),t=f.textContent.substr(c,n-c);return{exact:h,prefix:r,suffix:t}}function Fe(f,s){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},c=ee(f,s,g);return c===null?null:K.toRange(f,c)}function ee(f,s){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "selector"');var c=s.exact;if(c===void 0)throw new Error('selector missing required property "exact"');var h=s.prefix,e=s.suffix,r=g.hint,n=new ye.default;n.Match_Distance=f.textContent.length*2;var t=c.match(ke),a=r===void 0?f.textContent.length/2|0:r,i=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=-1,u=h!==void 0,v=e!==void 0,d=!1;u&&(l=n.match_main(f.textContent,h,a),l>-1&&(a=l+h.length,d=!0)),v&&!d&&(l=n.match_main(f.textContent,e,a+c.length),l>-1&&(a=l-c.length));var m=t.shift();if(l=n.match_main(f.textContent,m,a),l>-1)i=l,a=o=i+m.length;else return null;var _=function(b,E){if(!b)return null;var N=n.match_main(f.textContent,E,b.loc);return N===-1?null:(b.loc=N+E.length,b.start=Math.min(b.start,N),b.end=Math.max(b.end,N+E.length),b)};n.Match_Distance=64;var p=t.reduce(_,{start:i,end:o,loc:a});return p?{start:p.start,end:p.end}:null}var q={},re={};(function(f){Object.defineProperty(f,"__esModule",{value:!0}),f.default=n;var s="Iterator exhausted before seek ended.",g="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",c="Argument 2 of seek must be an integer or a Text Node.",h=2,e=4,r=3;function n(o,l){if(o.whatToShow!==e){var u;try{u=new DOMException(g,"InvalidStateError")}catch{u=new Error(g),u.code=11,u.name="InvalidStateError",u.toString=function(){return"InvalidStateError: ".concat(g)}}throw u}var v=0,d=o.referenceNode,m=null;if(t(l))m={forward:function(){return v<l},backward:function(){return v>l||!o.pointerBeforeReferenceNode}};else if(a(l)){var _=i(d,l)?function(){return!1}:function(){return d!==l},p=function(){return d!==l||!o.pointerBeforeReferenceNode};m={forward:_,backward:p}}else throw new TypeError(c);for(;m.forward();){if(d=o.nextNode(),d===null)throw new RangeError(s);v+=d.nodeValue.length}for(o.nextNode()&&(d=o.previousNode());m.backward();){if(d=o.previousNode(),d===null)throw new RangeError(s);v-=d.nodeValue.length}if(!a(o.referenceNode))throw new RangeError(s);return v}function t(o){return typeof o!="number"?!1:isFinite(o)&&Math.floor(o)===o}function a(o){return o.nodeType===r}function i(o,l){return o.compareDocumentPosition(l)&h}})(re);var Ae=re.default,ne={};(function(f){Object.defineProperty(f,"__esModule",{value:!0}),f.default=e;function s(r,n){if(!n&&r.firstChild)return r.firstChild;do{if(r.nextSibling)return r.nextSibling;r=r.parentNode}while(r);return r}function g(r){if(r.startContainer.nodeType===Node.ELEMENT_NODE){var n=r.startContainer.childNodes[r.startOffset];return n||s(r.startContainer,!0)}return r.startContainer}function c(r){if(r.endContainer.nodeType===Node.ELEMENT_NODE){var n=r.endContainer.childNodes[r.endOffset];return n||s(r.endContainer,!0)}return s(r.endContainer)}function h(r,n){for(var t=g(r),a=c(r);t!==a;)n(t),t=s(t)}function e(r){var n="";return h(r,function(t){if(t.nodeType===Node.TEXT_NODE){var a=t===r.startContainer?r.startOffset:0,i=t===r.endContainer?r.endOffset:t.textContent.length;n+=t.textContent.slice(a,i)}}),n}})(ne);Object.defineProperty(q,"__esModule",{value:!0});q.fromRange=$e;q.toRange=Be;var z=te(Ae),G=te(ne);function te(f){return f&&f.__esModule?f:{default:f}}var Pe=4;function $e(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=f.ownerDocument,c=g.createRange(),h=s.startContainer,e=s.startOffset;c.setStart(f,0),c.setEnd(h,e);var r=(0,G.default)(c).length,n=r+(0,G.default)(s).length;return{start:r,end:n}}function Be(f){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(f===void 0)throw new Error('missing required parameter "root"');var g=f.ownerDocument,c=g.createRange(),h=g.createNodeIterator(f,Pe),e=s.start||0,r=s.end||e,n=e-(0,z.default)(h,e),t=h.referenceNode,a=r-e+n,i=a-(0,z.default)(h,a),o=h.referenceNode;return c.setStart(t,n),c.setEnd(o,i),c}function Le(f){const s=new Date(f),c=new Date().getTime()-s.getTime(),h=Math.floor(c/1e3),e=Math.floor(h/60),r=Math.floor(e/60),n=Math.floor(r/24);return h<60?"just now":e<60?`${e}m ago`:r<24?`${r}h ago`:n<7?`${n}d ago`:s.toLocaleDateString()}class He extends HTMLElement{constructor(){super(),this._annotation=null,this.attachShadow({mode:"open"})}static get observedAttributes(){return[]}set annotation(s){this._annotation=s,this.render()}get annotation(){return this._annotation}connectedCallback(){this.render()}async render(){var v;if(!this._annotation||!this.shadowRoot)return;const{value:s,author:g}=this._annotation,c=s.target,h=s.body,e=s.createdAt,r=(v=c.selector)==null?void 0:v.find(d=>d.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),n=r==null?void 0:r.exact,t=c.url,a=t?this.getDomain(t):"",i=this.buildTextFragmentUrl(t,n),o=(g==null?void 0:g.did)||"unknown",l=(g==null?void 0:g.handle)||(o.includes(":")?o.split(":").pop():o),u=(g==null?void 0:g.avatar)||`https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(l)}`;this.shadowRoot.innerHTML=` 12 - <style> 13 - :host { 14 - display: block; 15 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; 16 - } 17 - 18 - .card { 19 - background: white; 20 - border: 1px solid #e0e0e0; 21 - border-radius: 12px; 22 - padding: 16px; 23 - margin-bottom: 16px; 24 - box-shadow: 0 2px 4px rgba(0,0,0,0.05); 25 - transition: transform 0.2s, box-shadow 0.2s; 26 - } 27 - 28 - .card:hover { 29 - transform: translateY(-1px); 30 - box-shadow: 0 4px 8px rgba(0,0,0,0.1); 31 - } 32 - 33 - .quote { 34 - margin: 0 0 12px 0; 35 - padding-left: 12px; 36 - border-left: 3px solid #FFD700; 37 - color: #444; 38 - font-style: italic; 39 - font-size: 0.95em; 40 - line-height: 1.5; 41 - } 42 - 43 - .body { 44 - color: #1a1a1a; 45 - font-size: 1em; 46 - line-height: 1.6; 47 - margin-bottom: 16px; 48 - white-space: pre-wrap; 49 - } 50 - 51 - .meta { 52 - display: flex; 53 - align-items: center; 54 - justify-content: space-between; 55 - font-size: 0.85em; 56 - color: #666; 57 - border-top: 1px solid #f0f0f0; 58 - padding-top: 12px; 59 - } 60 - 61 - .author { 62 - display: flex; 63 - align-items: center; 64 - gap: 8px; 65 - text-decoration: none; 66 - color: inherit; 67 - } 68 - 69 - .author:hover { 70 - color: #2E7D32; 71 - } 72 - 73 - .avatar { 74 - width: 24px; 75 - height: 24px; 76 - border-radius: 50%; 77 - object-fit: cover; 78 - background: #eee; 79 - } 80 - 81 - .handle { 82 - font-weight: 500; 83 - } 84 - 85 - .source-link { 86 - color: #666; 87 - text-decoration: none; 88 - display: flex; 89 - align-items: center; 90 - gap: 4px; 91 - } 92 - 93 - .source-link:hover { 94 - color: #2E7D32; 95 - text-decoration: underline; 96 - } 97 - 98 - .time { 99 - color: #999; 100 - } 101 - </style> 102 - 103 - <article class="card"> 104 - ${n?`<blockquote class="quote">"${n}"</blockquote>`:""} 105 - ${h?`<div class="body">${this.escapeHtml(h)}</div>`:""} 106 - 107 - <div class="meta"> 108 - <div class="left"> 109 - <a href="https://bsky.app/profile/${o}" target="_blank" rel="noopener noreferrer" class="author"> 110 - <img class="avatar" src="${u}" alt="${l}'s avatar" loading="lazy" /> 111 - <span class="handle">@${l}</span> 112 - </a> 113 - </div> 114 - 115 - <div class="right"> 116 - <span class="time">${Le(e)}</span> 117 - ${a?` 118 - <span style="margin: 0 6px;">•</span> 119 - <a href="${i}" target="_blank" rel="noopener noreferrer" class="source-link"> 120 - ${a} ↗ 121 - </a> 122 - `:""} 123 - </div> 124 - </div> 125 - </article> 126 - `}getDomain(s){try{return new URL(s).hostname}catch{return s}}buildTextFragmentUrl(s,g){if(!s||!g)return s;try{const c=new URL(s);return c.hash=`:~:text=${encodeURIComponent(g)}`,c.toString()}catch{return s}}escapeHtml(s){const g=document.createElement("div");return g.textContent=s,g.innerHTML}}customElements.get("seams-annotation-card")||customElements.define("seams-annotation-card",He);export{Ue as W,q as a,k as l}; 127 - //# sourceMappingURL=annotation-card-C6T0kbHB.js.map
-1
proxy/static/static/assets/annotation-card-C6T0kbHB.js.map
··· 1 - {"version":3,"file":"annotation-card-C6T0kbHB.js","sources":["../../../packages/core/src/storage/web.ts","../../../node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/adapter.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/builtin.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/index.js","../../../node_modules/.pnpm/ancestors@0.0.3/node_modules/ancestors/index.js","../../../node_modules/.pnpm/index-of@0.2.0/node_modules/index-of/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/index.js","../../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../packages/core/src/components/annotation-card.ts"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(keys: string | string[]): Promise<any> {\n if (typeof keys === 'string') {\n const value = localStorage.getItem(keys);\n return value ? JSON.parse(value) : null;\n }\n \n const result: Record<string, any> = {};\n keys.forEach(key => {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n });\n return result;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.nodeType == 9 || root.ownerDocument;\n var iter = doc.createNodeIterator(root, whatToShow, filter, false);\n return new NodeIterator(iter, root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(iter, root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._iter = iter;\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var result = this._iter.nextNode();\n this.pointerBeforeReferenceNode = false;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var result = this._iter.previousNode();\n this.pointerBeforeReferenceNode = true;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwibm9kZVR5cGUiLCJvd25lckRvY3VtZW50IiwiaXRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9pdGVyIiwibmV4dE5vZGUiLCJyZXN1bHQiLCJwcmV2aW91c05vZGUiLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFlQSxrQjs7O0FBR2YsU0FBU0Esa0JBQVQsQ0FBNEJDLElBQTVCLEVBQTBFO0FBQUEsTUFBeENDLFVBQXdDLHlEQUEzQixVQUEyQjtBQUFBLE1BQWZDLE1BQWUseURBQU4sSUFBTTs7QUFDeEUsTUFBTUMsTUFBT0gsS0FBS0ksUUFBTCxJQUFpQixDQUFsQixJQUF3QkosS0FBS0ssYUFBekM7QUFDQSxNQUFNQyxPQUFPSCxJQUFJSixrQkFBSixDQUF1QkMsSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRCxLQUFqRCxDQUFiO0FBQ0EsU0FBTyxJQUFJSyxZQUFKLENBQWlCRCxJQUFqQixFQUF1Qk4sSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxDQUFQO0FBQ0Q7O0lBR0tLLFk7QUFDSix3QkFBWUQsSUFBWixFQUFrQk4sSUFBbEIsRUFBd0JDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUFBOztBQUMxQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLGFBQUwsR0FBcUJSLElBQXJCO0FBQ0EsU0FBS1MsMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLElBQWI7QUFDRDs7eUJBRURLLFEsdUJBQVc7QUFDVCxRQUFNQyxTQUFTLEtBQUtGLEtBQUwsQ0FBV0MsUUFBWCxFQUFmO0FBQ0EsU0FBS0YsMEJBQUwsR0FBa0MsS0FBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURLLFksMkJBQWU7QUFDYixRQUFNRCxTQUFTLEtBQUtGLEtBQUwsQ0FBV0csWUFBWCxFQUFmO0FBQ0EsU0FBS0osMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURNLFEsdUJBQVc7QUFDVCxXQUFPLHVCQUFQO0FBQ0QsRyIsImZpbGUiOiJhZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY3JlYXRlTm9kZUl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QsIHdoYXRUb1Nob3cgPSAweEZGRkZGRkZGLCBmaWx0ZXIgPSBudWxsKSB7XG4gIGNvbnN0IGRvYyA9IChyb290Lm5vZGVUeXBlID09IDkpIHx8IHJvb3Qub3duZXJEb2N1bWVudFxuICBjb25zdCBpdGVyID0gZG9jLmNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGZhbHNlKVxuICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihpdGVyLCByb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpXG59XG5cblxuY2xhc3MgTm9kZUl0ZXJhdG9yIHtcbiAgY29uc3RydWN0b3IoaXRlciwgcm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgdGhpcy5yb290ID0gcm9vdFxuICAgIHRoaXMud2hhdFRvU2hvdyA9IHdoYXRUb1Nob3dcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlclxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJvb3RcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHRoaXMuX2l0ZXIgPSBpdGVyXG4gIH1cblxuICBuZXh0Tm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLm5leHROb2RlKClcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHByZXZpb3VzTm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLnByZXZpb3VzTm9kZSgpXG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBOb2RlSXRlcmF0b3JdJ1xuICB9XG59XG4iXX0=","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.ownerDocument;\n return doc.createNodeIterator.call(doc, root, whatToShow, filter);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsdGluLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwib3duZXJEb2N1bWVudCIsImNhbGwiXSwibWFwcGluZ3MiOiI7OztxQkFBZUEsa0I7OztBQUdmLFNBQVNBLGtCQUFULENBQTRCQyxJQUE1QixFQUEwRTtBQUFBLE1BQXhDQyxVQUF3Qyx5REFBM0IsVUFBMkI7QUFBQSxNQUFmQyxNQUFlLHlEQUFOLElBQU07O0FBQ3hFLE1BQU1DLE1BQU1ILEtBQUtJLGFBQWpCO0FBQ0EsU0FBT0QsSUFBSUosa0JBQUosQ0FBdUJNLElBQXZCLENBQTRCRixHQUE1QixFQUFpQ0gsSUFBakMsRUFBdUNDLFVBQXZDLEVBQW1EQyxNQUFuRCxDQUFQO0FBQ0QiLCJmaWxlIjoiYnVpbHRpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyZWF0ZU5vZGVJdGVyYXRvclxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93ID0gMHhGRkZGRkZGRiwgZmlsdGVyID0gbnVsbCkge1xuICBjb25zdCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgcmV0dXJuIGRvYy5jcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChkb2MsIHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcilcbn1cbiJdfQ==","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n return new NodeIterator(root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._filter = function (node) {\n return filter ? filter(node) === 1 : true;\n };\n this._show = function (node) {\n return whatToShow >> node.nodeType - 1 & 1 === 1;\n };\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = false;\n\n var node = this.referenceNode;\n if (before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node.firstChild) {\n node = node.firstChild;\n continue;\n }\n\n do {\n if (node === this.root) return null;\n if (node.nextSibling) break;\n node = node.parentNode;\n } while (node);\n\n node = node.nextSibling;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = false;\n return node;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = true;\n\n var node = this.referenceNode;\n if (!before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node === this.root) return null;\n\n if (node.previousSibling) {\n node = node.previousSibling;\n while (node.lastChild) {\n node = node.lastChild;\n }continue;\n }\n\n node = node.parentNode;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = true;\n return node;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBsZW1lbnRhdGlvbi5qcyJdLCJuYW1lcyI6WyJjcmVhdGVOb2RlSXRlcmF0b3IiLCJyb290Iiwid2hhdFRvU2hvdyIsImZpbHRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9maWx0ZXIiLCJub2RlIiwiX3Nob3ciLCJub2RlVHlwZSIsIm5leHROb2RlIiwiYmVmb3JlIiwiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInByZXZpb3VzTm9kZSIsInByZXZpb3VzU2libGluZyIsImxhc3RDaGlsZCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQWVBLGtCOzs7QUFHZixTQUFTQSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBMEU7QUFBQSxNQUF4Q0MsVUFBd0MseURBQTNCLFVBQTJCO0FBQUEsTUFBZkMsTUFBZSx5REFBTixJQUFNOztBQUN4RSxTQUFPLElBQUlDLFlBQUosQ0FBaUJILElBQWpCLEVBQXVCQyxVQUF2QixFQUFtQ0MsTUFBbkMsQ0FBUDtBQUNEOztJQUdLQyxZO0FBQ0osd0JBQVlILElBQVosRUFBa0JDLFVBQWxCLEVBQThCQyxNQUE5QixFQUFzQztBQUFBOztBQUNwQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtFLGFBQUwsR0FBcUJKLElBQXJCO0FBQ0EsU0FBS0ssMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxPQUFMLEdBQWUsVUFBQ0MsSUFBRDtBQUFBLGFBQVVMLFNBQVNBLE9BQU9LLElBQVAsTUFBaUIsQ0FBMUIsR0FBOEIsSUFBeEM7QUFBQSxLQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLFVBQUNELElBQUQ7QUFBQSxhQUFVTixjQUFjTSxLQUFLRSxRQUFMLEdBQWdCLENBQTlCLEdBQWtDLE1BQU0sQ0FBbEQ7QUFBQSxLQUFiO0FBQ0Q7O3lCQUVEQyxRLHVCQUFXO0FBQ1QsUUFBTUMsU0FBUyxLQUFLTiwwQkFBcEI7QUFDQSxTQUFLQSwwQkFBTCxHQUFrQyxLQUFsQzs7QUFFQSxRQUFJRSxPQUFPLEtBQUtILGFBQWhCO0FBQ0EsUUFBSU8sVUFBVSxLQUFLSCxLQUFMLENBQVdELElBQVgsQ0FBVixJQUE4QixLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FBbEMsRUFBc0QsT0FBT0EsSUFBUDs7QUFFdEQsT0FBRztBQUNELFVBQUlBLEtBQUtLLFVBQVQsRUFBcUI7QUFDbkJMLGVBQU9BLEtBQUtLLFVBQVo7QUFDQTtBQUNEOztBQUVELFNBQUc7QUFDRCxZQUFJTCxTQUFTLEtBQUtQLElBQWxCLEVBQXdCLE9BQU8sSUFBUDtBQUN4QixZQUFJTyxLQUFLTSxXQUFULEVBQXNCO0FBQ3RCTixlQUFPQSxLQUFLTyxVQUFaO0FBQ0QsT0FKRCxRQUlTUCxJQUpUOztBQU1BQSxhQUFPQSxLQUFLTSxXQUFaO0FBQ0QsS0FiRCxRQWFRLENBQUMsS0FBS0wsS0FBTCxDQUFXRCxJQUFYLENBQUQsSUFBcUIsQ0FBQyxLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FiOUI7O0FBZUEsU0FBS0gsYUFBTCxHQUFxQkcsSUFBckI7QUFDQSxTQUFLRiwwQkFBTCxHQUFrQyxLQUFsQztBQUNBLFdBQU9FLElBQVA7QUFDRCxHOzt5QkFFRFEsWSwyQkFBZTtBQUNiLFFBQU1KLFNBQVMsS0FBS04sMEJBQXBCO0FBQ0EsU0FBS0EsMEJBQUwsR0FBa0MsSUFBbEM7O0FBRUEsUUFBSUUsT0FBTyxLQUFLSCxhQUFoQjtBQUNBLFFBQUksQ0FBQ08sTUFBRCxJQUFXLEtBQUtILEtBQUwsQ0FBV0QsSUFBWCxDQUFYLElBQStCLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQUFuQyxFQUF1RCxPQUFPQSxJQUFQOztBQUV2RCxPQUFHO0FBQ0QsVUFBSUEsU0FBUyxLQUFLUCxJQUFsQixFQUF3QixPQUFPLElBQVA7O0FBRXhCLFVBQUlPLEtBQUtTLGVBQVQsRUFBMEI7QUFDeEJULGVBQU9BLEtBQUtTLGVBQVo7QUFDQSxlQUFPVCxLQUFLVSxTQUFaO0FBQXVCVixpQkFBT0EsS0FBS1UsU0FBWjtBQUF2QixTQUNBO0FBQ0Q7O0FBRURWLGFBQU9BLEtBQUtPLFVBQVo7QUFDRCxLQVZELFFBVVEsQ0FBQyxLQUFLTixLQUFMLENBQVdELElBQVgsQ0FBRCxJQUFxQixDQUFDLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQVY5Qjs7QUFZQSxTQUFLSCxhQUFMLEdBQXFCRyxJQUFyQjtBQUNBLFNBQUtGLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0EsV0FBT0UsSUFBUDtBQUNELEc7O3lCQUVEVyxRLHVCQUFXO0FBQ1QsV0FBTyx1QkFBUDtBQUNELEciLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjcmVhdGVOb2RlSXRlcmF0b3JcblxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdyA9IDB4RkZGRkZGRkYsIGZpbHRlciA9IG51bGwpIHtcbiAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKVxufVxuXG5cbmNsYXNzIE5vZGVJdGVyYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcikge1xuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcbiAgICB0aGlzLnJlZmVyZW5jZU5vZGUgPSByb290XG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICB0aGlzLl9maWx0ZXIgPSAobm9kZSkgPT4gZmlsdGVyID8gZmlsdGVyKG5vZGUpID09PSAxIDogdHJ1ZVxuICAgIHRoaXMuX3Nob3cgPSAobm9kZSkgPT4gd2hhdFRvU2hvdyA+PiBub2RlLm5vZGVUeXBlIC0gMSAmIDEgPT09IDFcbiAgfVxuXG4gIG5leHROb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcblxuICAgIGxldCBub2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlXG4gICAgaWYgKGJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG4gICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSBicmVha1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgICB9IHdoaWxlIChub2RlKVxuXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZ1xuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJldmlvdXNOb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgICBpZiAoIWJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG5cbiAgICAgIGlmIChub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUl0ZXJhdG9yXSdcbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = getPolyfill;\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction getPolyfill() {\n try {\n var doc = typeof document === 'undefined' ? {} : document;\n var iter = (0, _builtin2['default'])(doc, 0xFFFFFFFF, null, false);\n if (iter.referenceNode === doc) return _builtin2['default'];\n return _adapter2['default'];\n } catch (_) {\n return _implementation2['default'];\n }\n} /*global document*/\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wb2x5ZmlsbC5qcyJdLCJuYW1lcyI6WyJnZXRQb2x5ZmlsbCIsImRvYyIsImRvY3VtZW50IiwiaXRlciIsInJlZmVyZW5jZU5vZGUiLCJfIl0sIm1hcHBpbmdzIjoiOzs7cUJBTXdCQSxXOztBQUx4Qjs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUdlLFNBQVNBLFdBQVQsR0FBdUI7QUFDcEMsTUFBSTtBQUNGLFFBQU1DLE1BQU0sT0FBT0MsUUFBUCxLQUFxQixXQUFyQixHQUFtQyxFQUFuQyxHQUF3Q0EsUUFBcEQ7QUFDQSxRQUFNQyxPQUFPLDBCQUFRRixHQUFSLEVBQWEsVUFBYixFQUF5QixJQUF6QixFQUErQixLQUEvQixDQUFiO0FBQ0EsUUFBSUUsS0FBS0MsYUFBTCxLQUF1QkgsR0FBM0IsRUFBZ0M7QUFDaEM7QUFDRCxHQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1Y7QUFDRDtBQUNGLEMsQ0FmRCIsImZpbGUiOiJwb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBpbXBsZW1lbnRhdGlvbiBmcm9tICcuL2ltcGxlbWVudGF0aW9uJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICAgIGNvbnN0IGl0ZXIgPSBidWlsdGluKGRvYywgMHhGRkZGRkZGRiwgbnVsbCwgZmFsc2UpXG4gICAgaWYgKGl0ZXIucmVmZXJlbmNlTm9kZSA9PT0gZG9jKSByZXR1cm4gYnVpbHRpblxuICAgIHJldHVybiBhZGFwdGVyXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shim;\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/*global document*/\nfunction shim() {\n var doc = typeof document === 'undefined' ? {} : document;\n var polyfill = (0, _polyfill2['default'])();\n if (polyfill !== _builtin2['default']) doc.createNodeIterator = polyfill;\n return polyfill;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGltLmpzIl0sIm5hbWVzIjpbInNoaW0iLCJkb2MiLCJkb2N1bWVudCIsInBvbHlmaWxsIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIl0sIm1hcHBpbmdzIjoiOzs7cUJBS3dCQSxJOztBQUp4Qjs7OztBQUNBOzs7Ozs7QUFGQTtBQUtlLFNBQVNBLElBQVQsR0FBZ0I7QUFDN0IsTUFBTUMsTUFBTSxPQUFPQyxRQUFQLEtBQXFCLFdBQXJCLEdBQW1DLEVBQW5DLEdBQXdDQSxRQUFwRDtBQUNBLE1BQU1DLFdBQVcsNEJBQWpCO0FBQ0EsTUFBSUEsaUNBQUosRUFBMEJGLElBQUlHLGtCQUFKLEdBQXlCRCxRQUF6QjtBQUMxQixTQUFPQSxRQUFQO0FBQ0QiLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBnZXRQb2x5ZmlsbCBmcm9tICcuL3BvbHlmaWxsJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoaW0oKSB7XG4gIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICBjb25zdCBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKClcbiAgaWYgKHBvbHlmaWxsICE9PSBidWlsdGluKSBkb2MuY3JlYXRlTm9kZUl0ZXJhdG9yID0gcG9seWZpbGxcbiAgcmV0dXJuIHBvbHlmaWxsXG59XG4iXX0=","'use strict';\n\nexports.__esModule = true;\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nvar _shim = require('./shim');\n\nvar _shim2 = _interopRequireDefault(_shim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar polyfill = (0, _polyfill2['default'])();\npolyfill.implementation = _implementation2['default'];\npolyfill.shim = _shim2['default'];\n\nexports['default'] = polyfill;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwb2x5ZmlsbCIsImltcGxlbWVudGF0aW9uIiwic2hpbSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyw0QkFBakI7QUFDQUEsU0FBU0MsY0FBVDtBQUNBRCxTQUFTRSxJQUFUOztxQkFFZUYsUSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UG9seWZpbGwgfSBmcm9tICcuL3BvbHlmaWxsJ1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBpbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNoaW0gfSBmcm9tICcuL3NoaW0nXG5cbmNvbnN0IHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKVxucG9seWZpbGwuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvblxucG9seWZpbGwuc2hpbSA9IHNoaW1cblxuZXhwb3J0IGRlZmF1bHQgcG9seWZpbGxcbiJdfQ==","module.exports = require('./lib/polyfill')['default'];\n","module.exports = require('./lib/implementation')['default'];\n","module.exports = require('./lib/shim')['default'];\n","module.exports = require('./lib')['default'];\nmodule.exports.getPolyfill = require('./polyfill');\nmodule.exports.implementation = require('./implementation');\nmodule.exports.shim = require('./shim');\n","module.exports = parents\n\nfunction parents(node, filter) {\n var out = []\n\n filter = filter || noop\n\n do {\n out.push(node)\n node = node.parentNode\n } while(node && node.tagName && filter(node))\n\n return out.slice(1)\n}\n\nfunction noop(n) {\n return true\n}\n","/*!\n * index-of <https://github.com/jonschlinkert/index-of>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function indexOf(arr, ele, start) {\n start = start || 0;\n var idx = -1;\n\n if (arr == null) return idx;\n var len = arr.length;\n var i = start < 0\n ? (len + start)\n : start;\n\n if (i >= arr.length) {\n return -1;\n }\n\n while (i < len) {\n if (arr[i] === ele) {\n return i;\n }\n i++;\n }\n\n return -1;\n};\n","'use strict';\n\nexports.__esModule = true;\nexports['default'] = seek;\n\nvar _ancestors = require('ancestors');\n\nvar _ancestors2 = _interopRequireDefault(_ancestors);\n\nvar _indexOf = require('index-of');\n\nvar _indexOf2 = _interopRequireDefault(_indexOf);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be a number or a Text Node.';\n\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n throw new Error(E_SHOW);\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isNumber(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n var backward = function backward() {\n return node != where || !iter.pointerBeforeReferenceNode;\n };\n predicates = { forward: forward, backward: backward };\n } else {\n throw new Error(E_WHERE);\n }\n\n while (predicates.forward() && (node = iter.nextNode()) !== null) {\n count += node.nodeValue.length;\n }\n\n while (predicates.backward() && (node = iter.previousNode()) !== null) {\n count -= node.nodeValue.length;\n }\n\n return count;\n}\n\nfunction isNumber(n) {\n return !isNaN(parseInt(n)) && isFinite(n);\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n if (ref === node) return false;\n\n var common = null;\n var left = [ref].concat((0, _ancestors2['default'])(ref)).reverse();\n var right = [node].concat((0, _ancestors2['default'])(node)).reverse();\n\n while (left[0] === right[0]) {\n common = left.shift();\n right.shift();\n }\n\n left = left[0];\n right = right[0];\n\n var l = (0, _indexOf2['default'])(common.childNodes, left);\n var r = (0, _indexOf2['default'])(common.childNodes, right);\n\n return l > r;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzZWVrIiwiRV9TSE9XIiwiRV9XSEVSRSIsIlNIT1dfVEVYVCIsIlRFWFRfTk9ERSIsIml0ZXIiLCJ3aGVyZSIsIndoYXRUb1Nob3ciLCJFcnJvciIsImNvdW50Iiwibm9kZSIsInJlZmVyZW5jZU5vZGUiLCJwcmVkaWNhdGVzIiwiaXNOdW1iZXIiLCJmb3J3YXJkIiwiYmFja3dhcmQiLCJpc1RleHQiLCJiZWZvcmUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIm5leHROb2RlIiwibm9kZVZhbHVlIiwibGVuZ3RoIiwicHJldmlvdXNOb2RlIiwibiIsImlzTmFOIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsIm5vZGVUeXBlIiwicmVmIiwiY29tbW9uIiwibGVmdCIsImNvbmNhdCIsInJldmVyc2UiLCJyaWdodCIsInNoaWZ0IiwibCIsImNoaWxkTm9kZXMiLCJyIl0sIm1hcHBpbmdzIjoiOzs7cUJBVXdCQSxJOztBQVZ4Qjs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQyxTQUFTLDBEQUFmO0FBQ0EsSUFBTUMsVUFBVSxxREFBaEI7O0FBRUEsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLFlBQVksQ0FBbEI7O0FBR2UsU0FBU0osSUFBVCxDQUFjSyxJQUFkLEVBQW9CQyxLQUFwQixFQUEyQjtBQUN4QyxNQUFJRCxLQUFLRSxVQUFMLEtBQW9CSixTQUF4QixFQUFtQztBQUNqQyxVQUFNLElBQUlLLEtBQUosQ0FBVVAsTUFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSVEsUUFBUSxDQUFaO0FBQ0EsTUFBSUMsT0FBT0wsS0FBS00sYUFBaEI7QUFDQSxNQUFJQyxhQUFhLElBQWpCOztBQUVBLE1BQUlDLFNBQVNQLEtBQVQsQ0FBSixFQUFxQjtBQUNuQk0saUJBQWE7QUFDWEUsZUFBUztBQUFBLGVBQU1MLFFBQVFILEtBQWQ7QUFBQSxPQURFO0FBRVhTLGdCQUFVO0FBQUEsZUFBTU4sUUFBUUgsS0FBZDtBQUFBO0FBRkMsS0FBYjtBQUlELEdBTEQsTUFLTyxJQUFJVSxPQUFPVixLQUFQLENBQUosRUFBbUI7QUFDeEIsUUFBSVEsVUFBVUcsT0FBT1AsSUFBUCxFQUFhSixLQUFiLElBQXNCO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FBdEIsR0FBb0M7QUFBQSxhQUFNSSxTQUFTSixLQUFmO0FBQUEsS0FBbEQ7QUFDQSxRQUFJUyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxhQUFNTCxRQUFRSixLQUFSLElBQWlCLENBQUNELEtBQUthLDBCQUE3QjtBQUFBLEtBQWY7QUFDQU4saUJBQWEsRUFBQ0UsZ0JBQUQsRUFBVUMsa0JBQVYsRUFBYjtBQUNELEdBSk0sTUFJQTtBQUNMLFVBQU0sSUFBSVAsS0FBSixDQUFVTixPQUFWLENBQU47QUFDRDs7QUFFRCxTQUFPVSxXQUFXRSxPQUFYLE1BQXdCLENBQUNKLE9BQU9MLEtBQUtjLFFBQUwsRUFBUixNQUE2QixJQUE1RCxFQUFrRTtBQUNoRVYsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9ULFdBQVdHLFFBQVgsTUFBeUIsQ0FBQ0wsT0FBT0wsS0FBS2lCLFlBQUwsRUFBUixNQUFpQyxJQUFqRSxFQUF1RTtBQUNyRWIsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9aLEtBQVA7QUFDRDs7QUFHRCxTQUFTSSxRQUFULENBQWtCVSxDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNDLE1BQU1DLFNBQVNGLENBQVQsQ0FBTixDQUFELElBQXVCRyxTQUFTSCxDQUFULENBQTlCO0FBQ0Q7O0FBR0QsU0FBU1AsTUFBVCxDQUFnQk4sSUFBaEIsRUFBc0I7QUFDcEIsU0FBT0EsS0FBS2lCLFFBQUwsS0FBa0J2QixTQUF6QjtBQUNEOztBQUdELFNBQVNhLE1BQVQsQ0FBZ0JXLEdBQWhCLEVBQXFCbEIsSUFBckIsRUFBMkI7QUFDekIsTUFBSWtCLFFBQVFsQixJQUFaLEVBQWtCLE9BQU8sS0FBUDs7QUFFbEIsTUFBSW1CLFNBQVMsSUFBYjtBQUNBLE1BQUlDLE9BQU8sQ0FBQ0YsR0FBRCxFQUFNRyxNQUFOLENBQWEsNEJBQVVILEdBQVYsQ0FBYixFQUE2QkksT0FBN0IsRUFBWDtBQUNBLE1BQUlDLFFBQVEsQ0FBQ3ZCLElBQUQsRUFBT3FCLE1BQVAsQ0FBYyw0QkFBVXJCLElBQVYsQ0FBZCxFQUErQnNCLE9BQS9CLEVBQVo7O0FBRUEsU0FBT0YsS0FBSyxDQUFMLE1BQVlHLE1BQU0sQ0FBTixDQUFuQixFQUE2QjtBQUMzQkosYUFBU0MsS0FBS0ksS0FBTCxFQUFUO0FBQ0FELFVBQU1DLEtBQU47QUFDRDs7QUFFREosU0FBT0EsS0FBSyxDQUFMLENBQVA7QUFDQUcsVUFBUUEsTUFBTSxDQUFOLENBQVI7O0FBRUEsTUFBSUUsSUFBSSwwQkFBUU4sT0FBT08sVUFBZixFQUEyQk4sSUFBM0IsQ0FBUjtBQUNBLE1BQUlPLElBQUksMEJBQVFSLE9BQU9PLFVBQWYsRUFBMkJILEtBQTNCLENBQVI7O0FBRUEsU0FBT0UsSUFBSUUsQ0FBWDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFuY2VzdG9ycyBmcm9tICdhbmNlc3RvcnMnXG5pbXBvcnQgaW5kZXhPZiBmcm9tICdpbmRleC1vZidcblxuY29uc3QgRV9TSE9XID0gJ0FyZ3VtZW50IDEgb2Ygc2VlayBtdXN0IHVzZSBmaWx0ZXIgTm9kZUZpbHRlci5TSE9XX1RFWFQuJ1xuY29uc3QgRV9XSEVSRSA9ICdBcmd1bWVudCAyIG9mIHNlZWsgbXVzdCBiZSBhIG51bWJlciBvciBhIFRleHQgTm9kZS4nXG5cbmNvbnN0IFNIT1dfVEVYVCA9IDRcbmNvbnN0IFRFWFRfTk9ERSA9IDNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWVrKGl0ZXIsIHdoZXJlKSB7XG4gIGlmIChpdGVyLndoYXRUb1Nob3cgIT09IFNIT1dfVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1NIT1cpXG4gIH1cblxuICBsZXQgY291bnQgPSAwXG4gIGxldCBub2RlID0gaXRlci5yZWZlcmVuY2VOb2RlXG4gIGxldCBwcmVkaWNhdGVzID0gbnVsbFxuXG4gIGlmIChpc051bWJlcih3aGVyZSkpIHtcbiAgICBwcmVkaWNhdGVzID0ge1xuICAgICAgZm9yd2FyZDogKCkgPT4gY291bnQgPCB3aGVyZSxcbiAgICAgIGJhY2t3YXJkOiAoKSA9PiBjb3VudCA+IHdoZXJlLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHQod2hlcmUpKSB7XG4gICAgbGV0IGZvcndhcmQgPSBiZWZvcmUobm9kZSwgd2hlcmUpID8gKCkgPT4gZmFsc2UgOiAoKSA9PiBub2RlICE9PSB3aGVyZVxuICAgIGxldCBiYWNrd2FyZCA9ICgpID0+IG5vZGUgIT0gd2hlcmUgfHwgIWl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICBwcmVkaWNhdGVzID0ge2ZvcndhcmQsIGJhY2t3YXJkfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1dIRVJFKVxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuZm9yd2FyZCgpICYmIChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCkge1xuICAgIGNvdW50ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aFxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuYmFja3dhcmQoKSAmJiAobm9kZSA9IGl0ZXIucHJldmlvdXNOb2RlKCkpICE9PSBudWxsKSB7XG4gICAgY291bnQgLT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuXG5mdW5jdGlvbiBpc051bWJlcihuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobikpICYmIGlzRmluaXRlKG4pXG59XG5cblxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZShyZWYsIG5vZGUpIHtcbiAgaWYgKHJlZiA9PT0gbm9kZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNvbW1vbiA9IG51bGxcbiAgbGV0IGxlZnQgPSBbcmVmXS5jb25jYXQoYW5jZXN0b3JzKHJlZikpLnJldmVyc2UoKVxuICBsZXQgcmlnaHQgPSBbbm9kZV0uY29uY2F0KGFuY2VzdG9ycyhub2RlKSkucmV2ZXJzZSgpXG5cbiAgd2hpbGUgKGxlZnRbMF0gPT09IHJpZ2h0WzBdKSB7XG4gICAgY29tbW9uID0gbGVmdC5zaGlmdCgpXG4gICAgcmlnaHQuc2hpZnQoKVxuICB9XG5cbiAgbGVmdCA9IGxlZnRbMF1cbiAgcmlnaHQgPSByaWdodFswXVxuXG4gIGxldCBsID0gaW5kZXhPZihjb21tb24uY2hpbGROb2RlcywgbGVmdClcbiAgbGV0IHIgPSBpbmRleE9mKGNvbW1vbi5jaGlsZE5vZGVzLCByaWdodClcblxuICByZXR1cm4gbCA+IHJcbn1cbiJdfQ==","module.exports = require('./lib')['default'];\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rangeToString;\n/* global Node */\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n } while (node);\n\n /* istanbul ignore next */\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true /* skip children */);\n }\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true /* skip children */);\n }\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS10by1zdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBcUR3QixhO0FBckR4Qjs7QUFFQTs7O0FBR0EsU0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCLFlBQXhCLEVBQXNDO0FBQ3BDLE1BQUksQ0FBQyxZQUFELElBQWlCLEtBQUssVUFBMUIsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFFRCxLQUFHO0FBQ0QsUUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsYUFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELFdBQU8sS0FBSyxVQUFaO0FBQ0QsR0FMRCxRQUtTLElBTFQ7O0FBT0E7QUFDQSxTQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFDeEIsTUFBSSxNQUFNLGNBQU4sQ0FBcUIsUUFBckIsS0FBa0MsS0FBSyxZQUEzQyxFQUF5RDtBQUN2RCxRQUFNLE9BQU8sTUFBTSxjQUFOLENBQXFCLFVBQXJCLENBQWdDLE1BQU0sV0FBdEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sY0FBZixFQUErQixJQUEvQixDQUFvQyxtQkFBcEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxNQUFNLGNBQWI7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsS0FBeEIsRUFBK0I7QUFDN0IsTUFBSSxNQUFNLFlBQU4sQ0FBbUIsUUFBbkIsS0FBZ0MsS0FBSyxZQUF6QyxFQUF1RDtBQUNyRCxRQUFNLE9BQU8sTUFBTSxZQUFOLENBQW1CLFVBQW5CLENBQThCLE1BQU0sU0FBcEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sWUFBZixFQUE2QixJQUE3QixDQUFrQyxtQkFBbEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxTQUFTLE1BQU0sWUFBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxFQUF1QztBQUNyQyxNQUFJLE9BQU8sVUFBVSxLQUFWLENBQVg7QUFDQSxNQUFNLFVBQVUsZUFBZSxLQUFmLENBQWhCO0FBQ0EsU0FBTyxTQUFTLE9BQWhCLEVBQXlCO0FBQ3ZCLE9BQUcsSUFBSDtBQUNBLFdBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNGOztBQUVEOzs7Ozs7O0FBT2UsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCO0FBQzNDO0FBQ0E7QUFDQSxNQUFJLE9BQU8sRUFBWDtBQUNBLHFCQUFtQixLQUFuQixFQUEwQixVQUFDLElBQUQsRUFBVTtBQUNsQyxRQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFNBQTNCLEVBQXNDO0FBQ3BDO0FBQ0Q7QUFDRCxRQUFNLFFBQVEsU0FBUyxNQUFNLGNBQWYsR0FBZ0MsTUFBTSxXQUF0QyxHQUFvRCxDQUFsRTtBQUNBLFFBQU0sTUFBTSxTQUFTLE1BQU0sWUFBZixHQUE4QixNQUFNLFNBQXBDLEdBQWdELEtBQUssV0FBTCxDQUFpQixNQUE3RTtBQUNBLFlBQVEsS0FBSyxXQUFMLENBQWlCLEtBQWpCLENBQXVCLEtBQXZCLEVBQThCLEdBQTlCLENBQVI7QUFDRCxHQVBEO0FBUUEsU0FBTyxJQUFQO0FBQ0QiLCJmaWxlIjoicmFuZ2UtdG8tc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIE5vZGUgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgbm9kZSBhZnRlciBgbm9kZWAgaW4gYSB0cmVlIG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG5leHROb2RlKG5vZGUsIHNraXBDaGlsZHJlbikge1xuICBpZiAoIXNraXBDaGlsZHJlbiAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkXG4gIH1cblxuICBkbyB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgfSB3aGlsZSAobm9kZSlcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiBmaXJzdE5vZGUocmFuZ2UpIHtcbiAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XVxuICAgIHJldHVybiBub2RlIHx8IG5leHROb2RlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0cnVlIC8qIHNraXAgY2hpbGRyZW4gKi8pXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnN0YXJ0Q29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGZpcnN0Tm9kZUFmdGVyKHJhbmdlKSB7XG4gIGlmIChyYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF1cbiAgICByZXR1cm4gbm9kZSB8fCBuZXh0Tm9kZShyYW5nZS5lbmRDb250YWluZXIsIHRydWUgLyogc2tpcCBjaGlsZHJlbiAqLylcbiAgfVxuICByZXR1cm4gbmV4dE5vZGUocmFuZ2UuZW5kQ29udGFpbmVyKVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIGNiKSB7XG4gIGxldCBub2RlID0gZmlyc3ROb2RlKHJhbmdlKVxuICBjb25zdCBwYXN0RW5kID0gZmlyc3ROb2RlQWZ0ZXIocmFuZ2UpXG4gIHdoaWxlIChub2RlICE9PSBwYXN0RW5kKSB7XG4gICAgY2Iobm9kZSlcbiAgICBub2RlID0gbmV4dE5vZGUobm9kZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgcG9ueWZpbGwgZm9yIFJhbmdlLnRvU3RyaW5nKCkuXG4gKiBTcGVjOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yYW5nZS1zdHJpbmdpZmllclxuICpcbiAqIFdvcmtzIGFyb3VuZCB0aGUgYnVnZ3kgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBpbiBJRSBhbmQgRWRnZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGlsZ292aS9kb20tYW5jaG9yLXRleHQtcG9zaXRpb24vaXNzdWVzLzRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhyYW5nZSkge1xuICAvLyBUaGlzIGlzIGEgZmFpcmx5IGRpcmVjdCB0cmFuc2xhdGlvbiBvZiB0aGUgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvblxuICAvLyBpbiBCbGluay5cbiAgbGV0IHRleHQgPSAnJ1xuICBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlID09PSByYW5nZS5zdGFydENvbnRhaW5lciA/IHJhbmdlLnN0YXJ0T2Zmc2V0IDogMFxuICAgIGNvbnN0IGVuZCA9IG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lciA/IHJhbmdlLmVuZE9mZnNldCA6IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoXG4gICAgdGV4dCArPSBub2RlLnRleHRDb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0pXG4gIHJldHVybiB0ZXh0XG59XG5cbiJdfQ==","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domNodeIterator = require('dom-node-iterator');\n\nvar _domNodeIterator2 = _interopRequireDefault(_domNodeIterator);\n\nvar _domSeek = require('dom-seek');\n\nvar _domSeek2 = _interopRequireDefault(_domSeek);\n\nvar _rangeToString = require('./range-to-string');\n\nvar _rangeToString2 = _interopRequireDefault(_rangeToString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n\n var start = (0, _rangeToString2.default)(prefix).length;\n var end = start + (0, _rangeToString2.default)(range).length;\n\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = (0, _domNodeIterator2.default)(root, SHOW_TEXT);\n\n var start = selector.start || 0;\n var end = selector.end || start;\n var count = (0, _domSeek2.default)(iter, start);\n var remainder = start - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setStart(iter.referenceNode, remainder);\n } else {\n range.setStart(iter.nextNode(), remainder);\n iter.previousNode();\n }\n\n var length = end - start + remainder;\n count = (0, _domSeek2.default)(iter, length);\n remainder = length - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setEnd(iter.referenceNode, remainder);\n } else {\n range.setEnd(iter.nextNode(), remainder);\n }\n\n return range;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQU9nQixTLEdBQUEsUztRQTJCQSxPLEdBQUEsTzs7QUFsQ2hCOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxZQUFZLENBQWxCOztBQUVPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxNQUFJLFNBQVMsU0FBYixFQUF3QjtBQUN0QixVQUFNLElBQUksS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUksVUFBVSxTQUFkLEVBQXlCO0FBQ3ZCLFVBQU0sSUFBSSxLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxTQUFTLFNBQVMsV0FBVCxFQUFiOztBQUVBLE1BQUksWUFBWSxNQUFNLGNBQXRCO0FBQ0EsTUFBSSxjQUFjLE1BQU0sV0FBeEI7O0FBRUEsU0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLENBQXRCO0FBQ0EsU0FBTyxNQUFQLENBQWMsU0FBZCxFQUF5QixXQUF6Qjs7QUFFQSxNQUFJLFFBQVEsNkJBQWMsTUFBZCxFQUFzQixNQUFsQztBQUNBLE1BQUksTUFBTSxRQUFRLDZCQUFjLEtBQWQsRUFBcUIsTUFBdkM7O0FBRUEsU0FBTztBQUNMLFdBQU8sS0FERjtBQUVMLFNBQUs7QUFGQSxHQUFQO0FBSUQ7O0FBR00sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXNDO0FBQUEsTUFBZixRQUFlLHlEQUFKLEVBQUk7O0FBQzNDLE1BQUksU0FBUyxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSSxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxRQUFRLFNBQVMsV0FBVCxFQUFaO0FBQ0EsTUFBSSxPQUFPLCtCQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFYOztBQUVBLE1BQUksUUFBUSxTQUFTLEtBQVQsSUFBa0IsQ0FBOUI7QUFDQSxNQUFJLE1BQU0sU0FBUyxHQUFULElBQWdCLEtBQTFCO0FBQ0EsTUFBSSxRQUFRLHVCQUFLLElBQUwsRUFBVyxLQUFYLENBQVo7QUFDQSxNQUFJLFlBQVksUUFBUSxLQUF4Qjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxRQUFOLENBQWUsS0FBSyxhQUFwQixFQUFtQyxTQUFuQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sUUFBTixDQUFlLEtBQUssUUFBTCxFQUFmLEVBQWdDLFNBQWhDO0FBQ0EsU0FBSyxZQUFMO0FBQ0Q7O0FBRUQsTUFBSSxTQUFVLE1BQU0sS0FBUCxHQUFnQixTQUE3QjtBQUNBLFVBQVEsdUJBQUssSUFBTCxFQUFXLE1BQVgsQ0FBUjtBQUNBLGNBQVksU0FBUyxLQUFyQjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxNQUFOLENBQWEsS0FBSyxhQUFsQixFQUFpQyxTQUFqQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sTUFBTixDQUFhLEtBQUssUUFBTCxFQUFiLEVBQThCLFNBQTlCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTm9kZUl0ZXJhdG9yIGZyb20gJ2RvbS1ub2RlLWl0ZXJhdG9yJ1xuaW1wb3J0IHNlZWsgZnJvbSAnZG9tLXNlZWsnXG5cbmltcG9ydCByYW5nZVRvU3RyaW5nIGZyb20gJy4vcmFuZ2UtdG8tc3RyaW5nJ1xuXG5jb25zdCBTSE9XX1RFWFQgPSA0XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IGRvY3VtZW50ID0gcm9vdC5vd25lckRvY3VtZW50XG4gIGxldCBwcmVmaXggPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG5cbiAgbGV0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGxldCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG5cbiAgcHJlZml4LnNldFN0YXJ0KHJvb3QsIDApXG4gIHByZWZpeC5zZXRFbmQoc3RhcnROb2RlLCBzdGFydE9mZnNldClcblxuICBsZXQgc3RhcnQgPSByYW5nZVRvU3RyaW5nKHByZWZpeCkubGVuZ3RoXG4gIGxldCBlbmQgPSBzdGFydCArIHJhbmdlVG9TdHJpbmcocmFuZ2UpLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFuZ2Uocm9vdCwgc2VsZWN0b3IgPSB7fSkge1xuICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJvb3RcIicpXG4gIH1cblxuICBsZXQgZG9jdW1lbnQgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICBsZXQgaXRlciA9IGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCBTSE9XX1RFWFQpXG5cbiAgbGV0IHN0YXJ0ID0gc2VsZWN0b3Iuc3RhcnQgfHwgMFxuICBsZXQgZW5kID0gc2VsZWN0b3IuZW5kIHx8IHN0YXJ0XG4gIGxldCBjb3VudCA9IHNlZWsoaXRlciwgc3RhcnQpXG4gIGxldCByZW1haW5kZXIgPSBzdGFydCAtIGNvdW50XG5cbiAgaWYgKGl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGUpIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLnJlZmVyZW5jZU5vZGUsIHJlbWFpbmRlcilcbiAgfSBlbHNlIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgICBpdGVyLnByZXZpb3VzTm9kZSgpXG4gIH1cblxuICBsZXQgbGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSArIHJlbWFpbmRlclxuICBjb3VudCA9IHNlZWsoaXRlciwgbGVuZ3RoKVxuICByZW1haW5kZXIgPSBsZW5ndGggLSBjb3VudFxuXG4gIGlmIChpdGVyLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgcmFuZ2Uuc2V0RW5kKGl0ZXIucmVmZXJlbmNlTm9kZSwgcmVtYWluZGVyKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlLnNldEVuZChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgfVxuXG4gIHJldHVybiByYW5nZVxufVxuIl19","module.exports = require('./lib')\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.fromTextPosition = fromTextPosition;\nexports.toRange = toRange;\nexports.toTextPosition = toTextPosition;\n\nvar _diffMatchPatch = require('diff-match-patch');\n\nvar _diffMatchPatch2 = _interopRequireDefault(_diffMatchPatch);\n\nvar _domAnchorTextPosition = require('dom-anchor-text-position');\n\nvar textPosition = _interopRequireWildcard(_domAnchorTextPosition);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The DiffMatchPatch bitap has a hard 32-character pattern length limit.\nvar SLICE_LENGTH = 32;\nvar SLICE_RE = new RegExp('(.|[\\r\\n]){1,' + String(SLICE_LENGTH) + '}', 'g');\nvar CONTEXT_LENGTH = SLICE_LENGTH;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var position = textPosition.fromRange(root, range);\n return fromTextPosition(root, position);\n}\n\nfunction fromTextPosition(root, selector) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var start = selector.start;\n\n if (start === undefined) {\n throw new Error('selector missing required property \"start\"');\n }\n if (start < 0) {\n throw new Error('property \"start\" must be a non-negative integer');\n }\n\n var end = selector.end;\n\n if (end === undefined) {\n throw new Error('selector missing required property \"end\"');\n }\n if (end < 0) {\n throw new Error('property \"end\" must be a non-negative integer');\n }\n\n var exact = root.textContent.substr(start, end - start);\n\n var prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n var prefix = root.textContent.substr(prefixStart, start - prefixStart);\n\n var suffixEnd = Math.min(root.textContent.length, end + CONTEXT_LENGTH);\n var suffix = root.textContent.substr(end, suffixEnd - end);\n\n return { exact: exact, prefix: prefix, suffix: suffix };\n}\n\nfunction toRange(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var position = toTextPosition(root, selector, options);\n if (position === null) {\n return null;\n } else {\n return textPosition.toRange(root, position);\n }\n}\n\nfunction toTextPosition(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var exact = selector.exact;\n\n if (exact === undefined) {\n throw new Error('selector missing required property \"exact\"');\n }\n\n var prefix = selector.prefix,\n suffix = selector.suffix;\n var hint = options.hint;\n\n var dmp = new _diffMatchPatch2.default();\n\n dmp.Match_Distance = root.textContent.length * 2;\n\n // Work around a hard limit of the DiffMatchPatch bitap implementation.\n // The search pattern must be no more than SLICE_LENGTH characters.\n var slices = exact.match(SLICE_RE);\n var loc = hint === undefined ? root.textContent.length / 2 | 0 : hint;\n var start = Number.POSITIVE_INFINITY;\n var end = Number.NEGATIVE_INFINITY;\n var result = -1;\n var havePrefix = prefix !== undefined;\n var haveSuffix = suffix !== undefined;\n var foundPrefix = false;\n\n // If the prefix is known then search for that first.\n if (havePrefix) {\n result = dmp.match_main(root.textContent, prefix, loc);\n if (result > -1) {\n loc = result + prefix.length;\n foundPrefix = true;\n }\n }\n\n // If we have a suffix, and the prefix wasn't found, then search for it.\n if (haveSuffix && !foundPrefix) {\n result = dmp.match_main(root.textContent, suffix, loc + exact.length);\n if (result > -1) {\n loc = result - exact.length;\n }\n }\n\n // Search for the first slice.\n var firstSlice = slices.shift();\n result = dmp.match_main(root.textContent, firstSlice, loc);\n if (result > -1) {\n start = result;\n loc = end = start + firstSlice.length;\n } else {\n return null;\n }\n\n // Create a fold function that will reduce slices to positional extents.\n var foldSlices = function foldSlices(acc, slice) {\n if (!acc) {\n // A search for an earlier slice of the pattern failed to match.\n return null;\n }\n\n var result = dmp.match_main(root.textContent, slice, acc.loc);\n if (result === -1) {\n return null;\n }\n\n // The next slice should follow this one closely.\n acc.loc = result + slice.length;\n\n // Expand the start and end to a quote that includes all the slices.\n acc.start = Math.min(acc.start, result);\n acc.end = Math.max(acc.end, result + slice.length);\n\n return acc;\n };\n\n // Use the fold function to establish the full quote extents.\n // Expect the slices to be close to one another.\n // This distance is deliberately generous for now.\n dmp.Match_Distance = 64;\n var acc = slices.reduce(foldSlices, { start: start, end: end, loc: loc });\n if (!acc) {\n return null;\n }\n\n return { start: acc.start, end: acc.end };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JD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ZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/ICgocm9vdC50ZXh0Q29udGVudC5sZW5ndGggLyAyKSB8IDApIDogaGludFxuICBsZXQgc3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IGVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICBsZXQgcmVzdWx0ID0gLTFcbiAgbGV0IGhhdmVQcmVmaXggPSBwcmVmaXggIT09IHVuZGVmaW5lZFxuICBsZXQgaGF2ZVN1ZmZpeCA9IHN1ZmZpeCAhPT0gdW5kZWZpbmVkXG4gIGxldCBmb3VuZFByZWZpeCA9IGZhbHNlXG5cbiAgLy8gSWYgdGhlIHByZWZpeCBpcyBrbm93biB0aGVuIHNlYXJjaCBmb3IgdGhhdCBmaXJzdC5cbiAgaWYgKGhhdmVQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBwcmVmaXgsIGxvYylcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCArIHByZWZpeC5sZW5ndGhcbiAgICAgIGZvdW5kUHJlZml4ID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSBzdWZmaXgsIGFuZCB0aGUgcHJlZml4IHdhc24ndCBmb3VuZCwgdGhlbiBzZWFyY2ggZm9yIGl0LlxuICBpZiAoaGF2ZVN1ZmZpeCAmJiAhZm91bmRQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBzdWZmaXgsIGxvYyArIGV4YWN0Lmxlbmd0aClcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCAtIGV4YWN0Lmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsaWNlLlxuICBsZXQgZmlyc3RTbGljZSA9IHNsaWNlcy5zaGlmdCgpXG4gIHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIGZpcnN0U2xpY2UsIGxvYylcbiAgaWYgKHJlc3VsdCA+IC0xKSB7XG4gICAgc3RhcnQgPSByZXN1bHRcbiAgICBsb2MgPSBlbmQgPSBzdGFydCArIGZpcnN0U2xpY2UubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGZvbGQgZnVuY3Rpb24gdGhhdCB3aWxsIHJlZHVjZSBzbGljZXMgdG8gcG9zaXRpb25hbCBleHRlbnRzLlxuICBsZXQgZm9sZFNsaWNlcyA9IChhY2MsIHNsaWNlKSA9PiB7XG4gICAgaWYgKCFhY2MpIHtcbiAgICAgIC8vIEEgc2VhcmNoIGZvciBhbiBlYXJsaWVyIHNsaWNlIG9mIHRoZSBwYXR0ZXJuIGZhaWxlZCB0byBtYXRjaC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIHNsaWNlLCBhY2MubG9jKVxuICAgIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHNsaWNlIHNob3VsZCBmb2xsb3cgdGhpcyBvbmUgY2xvc2VseS5cbiAgICBhY2MubG9jID0gcmVzdWx0ICsgc2xpY2UubGVuZ3RoXG5cbiAgICAvLyBFeHBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgdG8gYSBxdW90ZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgc2xpY2VzLlxuICAgIGFjYy5zdGFydCA9IE1hdGgubWluKGFjYy5zdGFydCwgcmVzdWx0KVxuICAgIGFjYy5lbmQgPSBNYXRoLm1heChhY2MuZW5kLCByZXN1bHQgKyBzbGljZS5sZW5ndGgpXG5cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICAvLyBVc2UgdGhlIGZvbGQgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBmdWxsIHF1b3RlIGV4dGVudHMuXG4gIC8vIEV4cGVjdCB0aGUgc2xpY2VzIHRvIGJlIGNsb3NlIHRvIG9uZSBhbm90aGVyLlxuICAvLyBUaGlzIGRpc3RhbmNlIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3Igbm93LlxuICBkbXAuTWF0Y2hfRGlzdGFuY2UgPSA2NFxuICBjb25zdCBhY2MgPSBzbGljZXMucmVkdWNlKGZvbGRTbGljZXMsIHtzdGFydCwgZW5kLCBsb2N9KVxuICBpZiAoIWFjYykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge3N0YXJ0OiBhY2Muc3RhcnQsIGVuZDogYWNjLmVuZH1cbn1cbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = seek;\nvar E_END = 'Iterator exhausted before seek ended.';\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.';\nvar DOCUMENT_POSITION_PRECEDING = 2;\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n var error; // istanbul ignore next\n\n try {\n error = new DOMException(E_SHOW, 'InvalidStateError');\n } catch (_unused) {\n error = new Error(E_SHOW);\n error.code = 11;\n error.name = 'InvalidStateError';\n\n error.toString = function () {\n return \"InvalidStateError: \".concat(E_SHOW);\n };\n }\n\n throw error;\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isInteger(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where || !iter.pointerBeforeReferenceNode;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n\n var backward = function backward() {\n return node !== where || !iter.pointerBeforeReferenceNode;\n };\n\n predicates = {\n forward: forward,\n backward: backward\n };\n } else {\n throw new TypeError(E_WHERE);\n }\n\n while (predicates.forward()) {\n node = iter.nextNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count += node.nodeValue.length;\n }\n\n if (iter.nextNode()) {\n node = iter.previousNode();\n }\n\n while (predicates.backward()) {\n node = iter.previousNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count -= node.nodeValue.length;\n }\n\n if (!isText(iter.referenceNode)) {\n throw new RangeError(E_END);\n }\n\n return count;\n}\n\nfunction isInteger(n) {\n if (typeof n !== 'number') return false;\n return isFinite(n) && Math.floor(n) === n;\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING;\n}\n//# sourceMappingURL=index.js.map","module.exports = require('./lib')['default'];\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = rangeToString;\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n\n node = node.parentNode;\n } while (node);\n /* istanbul ignore next */\n\n\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true\n /* skip children */\n );\n }\n\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true\n /* skip children */\n );\n }\n\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\n\n\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=range-to-string.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domSeek = _interopRequireDefault(require(\"dom-seek\"));\n\nvar _rangeToString = _interopRequireDefault(require(\"./range-to-string\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n var start = (0, _rangeToString[\"default\"])(prefix).length;\n var end = start + (0, _rangeToString[\"default\"])(range).length;\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = document.createNodeIterator(root, SHOW_TEXT);\n var start = selector.start || 0;\n var end = selector.end || start;\n var startOffset = start - (0, _domSeek[\"default\"])(iter, start);\n var startNode = iter.referenceNode;\n var remainder = end - start + startOffset;\n var endOffset = remainder - (0, _domSeek[\"default\"])(iter, remainder);\n var endNode = iter.referenceNode;\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n return range;\n}\n//# sourceMappingURL=index.js.map","import { normalizeUrl } from '../utils';\n\n// Format relative time\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n \n return date.toLocaleDateString();\n}\n\nexport class SeamsAnnotationCard extends HTMLElement {\n private _annotation: any = null;\n\n static get observedAttributes() {\n return [];\n }\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n set annotation(data: any) {\n this._annotation = data;\n this.render();\n }\n\n get annotation() {\n return this._annotation;\n }\n\n connectedCallback() {\n this.render();\n }\n\n async render() {\n if (!this._annotation || !this.shadowRoot) return;\n\n const { value, author } = this._annotation;\n const target = value.target;\n const body = value.body;\n const createdAt = value.createdAt;\n \n // Extract quote\n const textQuoteSelector = target.selector?.find(\n (s: any) => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector'\n );\n const quotedText = textQuoteSelector?.exact;\n\n const sourceUrl = target.url;\n const domain = sourceUrl ? this.getDomain(sourceUrl) : '';\n const fragmentUrl = this.buildTextFragmentUrl(sourceUrl, quotedText);\n\n // Author details\n const authorDid = author?.did || 'unknown';\n const authorHandle = author?.handle || (authorDid.includes(':') ? authorDid.split(':').pop() : authorDid);\n const avatarSrc = author?.avatar || `https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(authorHandle)}`;\n\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n \n .card {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .card:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n }\n\n .quote {\n margin: 0 0 12px 0;\n padding-left: 12px;\n border-left: 3px solid #FFD700;\n color: #444;\n font-style: italic;\n font-size: 0.95em;\n line-height: 1.5;\n }\n\n .body {\n color: #1a1a1a;\n font-size: 1em;\n line-height: 1.6;\n margin-bottom: 16px;\n white-space: pre-wrap;\n }\n\n .meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.85em;\n color: #666;\n border-top: 1px solid #f0f0f0;\n padding-top: 12px;\n }\n\n .author {\n display: flex;\n align-items: center;\n gap: 8px;\n text-decoration: none;\n color: inherit;\n }\n\n .author:hover {\n color: #2E7D32;\n }\n\n .avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n background: #eee;\n }\n\n .handle {\n font-weight: 500;\n }\n\n .source-link {\n color: #666;\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .source-link:hover {\n color: #2E7D32;\n text-decoration: underline;\n }\n\n .time {\n color: #999;\n }\n </style>\n\n <article class=\"card\">\n ${quotedText ? `<blockquote class=\"quote\">\"${quotedText}\"</blockquote>` : ''}\n ${body ? `<div class=\"body\">${this.escapeHtml(body)}</div>` : ''}\n \n <div class=\"meta\">\n <div class=\"left\">\n <a href=\"https://bsky.app/profile/${authorDid}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"author\">\n <img class=\"avatar\" src=\"${avatarSrc}\" alt=\"${authorHandle}'s avatar\" loading=\"lazy\" />\n <span class=\"handle\">@${authorHandle}</span>\n </a>\n </div>\n \n <div class=\"right\">\n <span class=\"time\">${formatRelativeTime(createdAt)}</span>\n ${domain ? `\n <span style=\"margin: 0 6px;\">•</span>\n <a href=\"${fragmentUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"source-link\">\n ${domain} ↗\n </a>\n ` : ''}\n </div>\n </div>\n </article>\n `;\n }\n\n private getDomain(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return url;\n }\n }\n\n private buildTextFragmentUrl(sourceUrl: string, exactText?: string): string {\n if (!sourceUrl || !exactText) return sourceUrl;\n try {\n const url = new URL(sourceUrl);\n url.hash = `:~:text=${encodeURIComponent(exactText)}`;\n return url.toString();\n } catch {\n return sourceUrl;\n }\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n\n// Register component if not already registered\nif (!customElements.get('seams-annotation-card')) {\n customElements.define('seams-annotation-card', SeamsAnnotationCard);\n}\n"],"names":["WebStorageAdapter","channelName","event","callback","keys","value","result","key","oldValue","change","diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","i","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","a","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","j","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","delta","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","chars","lineStart","lineEnd","lineArrayLength","line","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","length","pattern","found","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","html","pattern_amp","pattern_lt","pattern_gt","pattern_para","data","levenshtein","insertions","deletions","diffsLength","tokens","param","n","s","match_bitapScore_","e","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","start","finish","rd","charMatch","patch","padding","prefix","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","mod","paddingLength","extraLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","m","sign","coords1","coords2","module","exports","_classCallCheck","instance","Constructor","createNodeIterator","root","whatToShow","filter","doc","iter","NodeIterator","node","before","getPolyfill","_adapter","require$$0","_adapter2","_interopRequireDefault","_builtin","require$$1","_builtin2","_implementation","require$$2","_implementation2","obj","shim","_polyfill","_polyfill2","polyfill","_shim","_shim2","implementation","domNodeIteratorModule","require$$3","ancestors","parents","out","noop","indexOf","arr","ele","idx","len","seek","_ancestors","_ancestors2","_indexOf","_indexOf2","E_SHOW","E_WHERE","SHOW_TEXT","TEXT_NODE","where","count","predicates","isNumber","isText","forward","backward","ref","common","left","right","l","r","domSeek","rangeToString_1","rangeToString","nextNode","skipChildren","firstNode","range","firstNodeAfter","forEachNodeInRange","cb","pastEnd","end","lib","fromRange","toRange","_domNodeIterator","_domNodeIterator2","_domSeek","_domSeek2","_rangeToString","_rangeToString2","document","startNode","startOffset","selector","remainder","domAnchorTextPosition","fromTextPosition","toTextPosition","_diffMatchPatch","_diffMatchPatch2","_domAnchorTextPosition","textPosition","_interopRequireWildcard","newObj","SLICE_LENGTH","SLICE_RE","CONTEXT_LENGTH","position","exact","prefixStart","suffixEnd","options","hint","slices","havePrefix","haveSuffix","foundPrefix","firstSlice","foldSlices","acc","slice","E_END","DOCUMENT_POSITION_PRECEDING","error","isInteger","endOffset","endNode","formatRelativeTime","dateString","date","diffMs","diffSecs","diffMins","diffHours","diffDays","SeamsAnnotationCard","_a","author","target","body","createdAt","textQuoteSelector","quotedText","sourceUrl","domain","fragmentUrl","authorDid","authorHandle","avatarSrc","url","exactText","div"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
-127
proxy/static/static/assets/annotation-card-DaLDEZbU.js
··· 1 - class Ue{constructor(s="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(s),this.channel.onmessage=g=>{this.listeners.forEach(c=>c(g.data))}}async get(s){if(typeof s=="string"){const c=localStorage.getItem(s);return c?JSON.parse(c):null}const g={};return s.forEach(c=>{const h=localStorage.getItem(c);g[c]=h?JSON.parse(h):null}),g}async set(s,g){const c=await this.get(s);localStorage.setItem(s,JSON.stringify(g));const h={key:s,newValue:g,oldValue:c};this.channel.postMessage(h),this.listeners.forEach(e=>e(h))}onChange(s){this.listeners.push(s)}close(){this.channel.close()}}var k={},J={exports:{}};(function(f){var s=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},g=-1,c=1,h=0;s.Diff=function(e,r){return[e,r]},s.prototype.diff_main=function(e,r,n,t){typeof t>"u"&&(this.Diff_Timeout<=0?t=Number.MAX_VALUE:t=new Date().getTime()+this.Diff_Timeout*1e3);var a=t;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new s.Diff(h,e)]:[];typeof n>"u"&&(n=!0);var i=n,o=this.diff_commonPrefix(e,r),l=e.substring(0,o);e=e.substring(o),r=r.substring(o),o=this.diff_commonSuffix(e,r);var u=e.substring(e.length-o);e=e.substring(0,e.length-o),r=r.substring(0,r.length-o);var v=this.diff_compute_(e,r,i,a);return l&&v.unshift(new s.Diff(h,l)),u&&v.push(new s.Diff(h,u)),this.diff_cleanupMerge(v),v},s.prototype.diff_compute_=function(e,r,n,t){var a;if(!e)return[new s.Diff(c,r)];if(!r)return[new s.Diff(g,e)];var i=e.length>r.length?e:r,o=e.length>r.length?r:e,l=i.indexOf(o);if(l!=-1)return a=[new s.Diff(c,i.substring(0,l)),new s.Diff(h,o),new s.Diff(c,i.substring(l+o.length))],e.length>r.length&&(a[0][0]=a[2][0]=g),a;if(o.length==1)return[new s.Diff(g,e),new s.Diff(c,r)];var u=this.diff_halfMatch_(e,r);if(u){var v=u[0],d=u[1],m=u[2],_=u[3],p=u[4],w=this.diff_main(v,m,n,t),b=this.diff_main(d,_,n,t);return w.concat([new s.Diff(h,p)],b)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,t):this.diff_bisect_(e,r,t)},s.prototype.diff_lineMode_=function(e,r,n){var t=this.diff_linesToChars_(e,r);e=t.chars1,r=t.chars2;var a=t.lineArray,i=this.diff_main(e,r,!1,n);this.diff_charsToLines_(i,a),this.diff_cleanupSemantic(i),i.push(new s.Diff(h,""));for(var o=0,l=0,u=0,v="",d="";o<i.length;){switch(i[o][0]){case c:u++,d+=i[o][1];break;case g:l++,v+=i[o][1];break;case h:if(l>=1&&u>=1){i.splice(o-l-u,l+u),o=o-l-u;for(var m=this.diff_main(v,d,!1,n),_=m.length-1;_>=0;_--)i.splice(o,0,m[_]);o=o+m.length}u=0,l=0,v="",d="";break}o++}return i.pop(),i},s.prototype.diff_bisect_=function(e,r,n){for(var t=e.length,a=r.length,i=Math.ceil((t+a)/2),o=i,l=2*i,u=new Array(l),v=new Array(l),d=0;d<l;d++)u[d]=-1,v[d]=-1;u[o+1]=0,v[o+1]=0;for(var m=t-a,_=m%2!=0,p=0,w=0,b=0,E=0,N=0;N<i&&!(new Date().getTime()>n);N++){for(var M=-N+p;M<=N-w;M+=2){var D=o+M,T;M==-N||M!=N&&u[D-1]<u[D+1]?T=u[D+1]:T=u[D-1]+1;for(var R=T-M;T<t&&R<a&&e.charAt(T)==r.charAt(R);)T++,R++;if(u[D]=T,T>t)w+=2;else if(R>a)p+=2;else if(_){var y=o+m-M;if(y>=0&&y<l&&v[y]!=-1){var S=t-v[y];if(T>=S)return this.diff_bisectSplit_(e,r,T,R,n)}}}for(var C=-N+b;C<=N-E;C+=2){var y=o+C,S;C==-N||C!=N&&v[y-1]<v[y+1]?S=v[y+1]:S=v[y-1]+1;for(var I=S-C;S<t&&I<a&&e.charAt(t-S-1)==r.charAt(a-I-1);)S++,I++;if(v[y]=S,S>t)E+=2;else if(I>a)b+=2;else if(!_){var D=o+m-C;if(D>=0&&D<l&&u[D]!=-1){var T=u[D],R=o+T-D;if(S=t-S,T>=S)return this.diff_bisectSplit_(e,r,T,R,n)}}}}return[new s.Diff(g,e),new s.Diff(c,r)]},s.prototype.diff_bisectSplit_=function(e,r,n,t,a){var i=e.substring(0,n),o=r.substring(0,t),l=e.substring(n),u=r.substring(t),v=this.diff_main(i,o,!1,a),d=this.diff_main(l,u,!1,a);return v.concat(d)},s.prototype.diff_linesToChars_=function(e,r){var n=[],t={};n[0]="";function a(u){for(var v="",d=0,m=-1,_=n.length;m<u.length-1;){m=u.indexOf(` 2 - `,d),m==-1&&(m=u.length-1);var p=u.substring(d,m+1);(t.hasOwnProperty?t.hasOwnProperty(p):t[p]!==void 0)?v+=String.fromCharCode(t[p]):(_==i&&(p=u.substring(d),m=u.length),v+=String.fromCharCode(_),t[p]=_,n[_++]=p),d=m+1}return v}var i=4e4,o=a(e);i=65535;var l=a(r);return{chars1:o,chars2:l,lineArray:n}},s.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var t=e[n][1],a=[],i=0;i<t.length;i++)a[i]=r[t.charCodeAt(i)];e[n][1]=a.join("")}},s.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,t=Math.min(e.length,r.length),a=t,i=0;n<a;)e.substring(i,a)==r.substring(i,a)?(n=a,i=n):t=a,a=Math.floor((t-n)/2+n);return a},s.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,t=Math.min(e.length,r.length),a=t,i=0;n<a;)e.substring(e.length-a,e.length-i)==r.substring(r.length-a,r.length-i)?(n=a,i=n):t=a,a=Math.floor((t-n)/2+n);return a},s.prototype.diff_commonOverlap_=function(e,r){var n=e.length,t=r.length;if(n==0||t==0)return 0;n>t?e=e.substring(n-t):n<t&&(r=r.substring(0,n));var a=Math.min(n,t);if(e==r)return a;for(var i=0,o=1;;){var l=e.substring(a-o),u=r.indexOf(l);if(u==-1)return i;o+=u,(u==0||e.substring(a-o)==r.substring(0,o))&&(i=o,o++)}},s.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,t=e.length>r.length?r:e;if(n.length<4||t.length*2<n.length)return null;var a=this;function i(w,b,E){for(var N=w.substring(E,E+Math.floor(w.length/4)),M=-1,D="",T,R,y,S;(M=b.indexOf(N,M+1))!=-1;){var C=a.diff_commonPrefix(w.substring(E),b.substring(M)),I=a.diff_commonSuffix(w.substring(0,E),b.substring(0,M));D.length<I+C&&(D=b.substring(M-I,M)+b.substring(M,M+C),T=w.substring(0,E-I),R=w.substring(E+C),y=b.substring(0,M-I),S=b.substring(M+C))}return D.length*2>=w.length?[T,R,y,S,D]:null}var o=i(n,t,Math.ceil(n.length/4)),l=i(n,t,Math.ceil(n.length/2)),u;if(!o&&!l)return null;l?o?u=o[4].length>l[4].length?o:l:u=l:u=o;var v,d,m,_;e.length>r.length?(v=u[0],d=u[1],m=u[2],_=u[3]):(m=u[0],_=u[1],v=u[2],d=u[3]);var p=u[4];return[v,d,m,_,p]},s.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],t=0,a=null,i=0,o=0,l=0,u=0,v=0;i<e.length;)e[i][0]==h?(n[t++]=i,o=u,l=v,u=0,v=0,a=e[i][1]):(e[i][0]==c?u+=e[i][1].length:v+=e[i][1].length,a&&a.length<=Math.max(o,l)&&a.length<=Math.max(u,v)&&(e.splice(n[t-1],0,new s.Diff(g,a)),e[n[t-1]+1][0]=c,t--,t--,i=t>0?n[t-1]:-1,o=0,l=0,u=0,v=0,a=null,r=!0)),i++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),i=1;i<e.length;){if(e[i-1][0]==g&&e[i][0]==c){var d=e[i-1][1],m=e[i][1],_=this.diff_commonOverlap_(d,m),p=this.diff_commonOverlap_(m,d);_>=p?(_>=d.length/2||_>=m.length/2)&&(e.splice(i,0,new s.Diff(h,m.substring(0,_))),e[i-1][1]=d.substring(0,d.length-_),e[i+1][1]=m.substring(_),i++):(p>=d.length/2||p>=m.length/2)&&(e.splice(i,0,new s.Diff(h,d.substring(0,p))),e[i-1][0]=c,e[i-1][1]=m.substring(0,m.length-p),e[i+1][0]=g,e[i+1][1]=d.substring(p),i++),i++}i++}},s.prototype.diff_cleanupSemanticLossless=function(e){function r(p,w){if(!p||!w)return 6;var b=p.charAt(p.length-1),E=w.charAt(0),N=b.match(s.nonAlphaNumericRegex_),M=E.match(s.nonAlphaNumericRegex_),D=N&&b.match(s.whitespaceRegex_),T=M&&E.match(s.whitespaceRegex_),R=D&&b.match(s.linebreakRegex_),y=T&&E.match(s.linebreakRegex_),S=R&&p.match(s.blanklineEndRegex_),C=y&&w.match(s.blanklineStartRegex_);return S||C?5:R||y?4:N&&!D&&T?3:D||T?2:N||M?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==h&&e[n+1][0]==h){var t=e[n-1][1],a=e[n][1],i=e[n+1][1],o=this.diff_commonSuffix(t,a);if(o){var l=a.substring(a.length-o);t=t.substring(0,t.length-o),a=l+a.substring(0,a.length-o),i=l+i}for(var u=t,v=a,d=i,m=r(t,a)+r(a,i);a.charAt(0)===i.charAt(0);){t+=a.charAt(0),a=a.substring(1)+i.charAt(0),i=i.substring(1);var _=r(t,a)+r(a,i);_>=m&&(m=_,u=t,v=a,d=i)}e[n-1][1]!=u&&(u?e[n-1][1]=u:(e.splice(n-1,1),n--),e[n][1]=v,d?e[n+1][1]=d:(e.splice(n+1,1),n--))}n++}},s.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,s.whitespaceRegex_=/\s/,s.linebreakRegex_=/[\r\n]/,s.blanklineEndRegex_=/\n\r?\n$/,s.blanklineStartRegex_=/^\r?\n\r?\n/,s.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],t=0,a=null,i=0,o=!1,l=!1,u=!1,v=!1;i<e.length;)e[i][0]==h?(e[i][1].length<this.Diff_EditCost&&(u||v)?(n[t++]=i,o=u,l=v,a=e[i][1]):(t=0,a=null),u=v=!1):(e[i][0]==g?v=!0:u=!0,a&&(o&&l&&u&&v||a.length<this.Diff_EditCost/2&&o+l+u+v==3)&&(e.splice(n[t-1],0,new s.Diff(g,a)),e[n[t-1]+1][0]=c,t--,a=null,o&&l?(u=v=!0,t=0):(t--,i=t>0?n[t-1]:-1,u=v=!1),r=!0)),i++;r&&this.diff_cleanupMerge(e)},s.prototype.diff_cleanupMerge=function(e){e.push(new s.Diff(h,""));for(var r=0,n=0,t=0,a="",i="",o;r<e.length;)switch(e[r][0]){case c:t++,i+=e[r][1],r++;break;case g:n++,a+=e[r][1],r++;break;case h:n+t>1?(n!==0&&t!==0&&(o=this.diff_commonPrefix(i,a),o!==0&&(r-n-t>0&&e[r-n-t-1][0]==h?e[r-n-t-1][1]+=i.substring(0,o):(e.splice(0,0,new s.Diff(h,i.substring(0,o))),r++),i=i.substring(o),a=a.substring(o)),o=this.diff_commonSuffix(i,a),o!==0&&(e[r][1]=i.substring(i.length-o)+e[r][1],i=i.substring(0,i.length-o),a=a.substring(0,a.length-o))),r-=n+t,e.splice(r,n+t),a.length&&(e.splice(r,0,new s.Diff(g,a)),r++),i.length&&(e.splice(r,0,new s.Diff(c,i)),r++),r++):r!==0&&e[r-1][0]==h?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,t=0,n=0,a="",i="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==h&&e[r+1][0]==h&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},s.prototype.diff_xIndex=function(e,r){var n=0,t=0,a=0,i=0,o;for(o=0;o<e.length&&(e[o][0]!==c&&(n+=e[o][1].length),e[o][0]!==g&&(t+=e[o][1].length),!(n>r));o++)a=n,i=t;return e.length!=o&&e[o][0]===g?i:i+(r-a)},s.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,t=/</g,a=/>/g,i=/\n/g,o=0;o<e.length;o++){var l=e[o][0],u=e[o][1],v=u.replace(n,"&amp;").replace(t,"&lt;").replace(a,"&gt;").replace(i,"&para;<br>");switch(l){case c:r[o]='<ins style="background:#e6ffe6;">'+v+"</ins>";break;case g:r[o]='<del style="background:#ffe6e6;">'+v+"</del>";break;case h:r[o]="<span>"+v+"</span>";break}}return r.join("")},s.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==c&&(r[n]=e[n][1]);return r.join("")},s.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==g&&(r[n]=e[n][1]);return r.join("")},s.prototype.diff_levenshtein=function(e){for(var r=0,n=0,t=0,a=0;a<e.length;a++){var i=e[a][0],o=e[a][1];switch(i){case c:n+=o.length;break;case g:t+=o.length;break;case h:r+=Math.max(n,t),n=0,t=0;break}}return r+=Math.max(n,t),r},s.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case c:r[n]="+"+encodeURI(e[n][1]);break;case g:r[n]="-"+e[n][1].length;break;case h:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},s.prototype.diff_fromDelta=function(e,r){for(var n=[],t=0,a=0,i=r.split(/\t/g),o=0;o<i.length;o++){var l=i[o].substring(1);switch(i[o].charAt(0)){case"+":try{n[t++]=new s.Diff(c,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var u=parseInt(l,10);if(isNaN(u)||u<0)throw new Error("Invalid number in diff_fromDelta: "+l);var v=e.substring(a,a+=u);i[o].charAt(0)=="="?n[t++]=new s.Diff(h,v):n[t++]=new s.Diff(g,v);break;default:if(i[o])throw new Error("Invalid diff operation in diff_fromDelta: "+i[o])}}if(a!=e.length)throw new Error("Delta length ("+a+") does not equal source text length ("+e.length+").");return n},s.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},s.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var t=this.match_alphabet_(r),a=this;function i(T,R){var y=T/r.length,S=Math.abs(n-R);return a.Match_Distance?y+S/a.Match_Distance:S?1:y}var o=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(o=Math.min(i(0,l),o),l=e.lastIndexOf(r,n+r.length),l!=-1&&(o=Math.min(i(0,l),o)));var u=1<<r.length-1;l=-1;for(var v,d,m=r.length+e.length,_,p=0;p<r.length;p++){for(v=0,d=m;v<d;)i(p,n+d)<=o?v=d:m=d,d=Math.floor((m-v)/2+v);m=d;var w=Math.max(1,n-d+1),b=Math.min(n+d,e.length)+r.length,E=Array(b+2);E[b+1]=(1<<p)-1;for(var N=b;N>=w;N--){var M=t[e.charAt(N-1)];if(p===0?E[N]=(E[N+1]<<1|1)&M:E[N]=(E[N+1]<<1|1)&M|((_[N+1]|_[N])<<1|1)|_[N+1],E[N]&u){var D=i(p,N-1);if(D<=o)if(o=D,l=N-1,l>n)w=Math.max(1,2*n-l);else break}}if(i(p+1,n)>o)break;_=E}return l},s.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},s.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),t=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)t+=this.Patch_Margin,n=r.substring(e.start2-t,e.start2+e.length1+t);t+=this.Patch_Margin;var a=r.substring(e.start2-t,e.start2);a&&e.diffs.unshift(new s.Diff(h,a));var i=r.substring(e.start2+e.length1,e.start2+e.length1+t);i&&e.diffs.push(new s.Diff(h,i)),e.start1-=a.length,e.start2-=a.length,e.length1+=a.length+i.length,e.length2+=a.length+i.length}},s.prototype.patch_make=function(e,r,n){var t,a;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")t=e,a=this.diff_main(t,r,!0),a.length>2&&(this.diff_cleanupSemantic(a),this.diff_cleanupEfficiency(a));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")a=e,t=this.diff_text1(a);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")t=e,a=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")t=e,a=n;else throw new Error("Unknown call format to patch_make.");if(a.length===0)return[];for(var i=[],o=new s.patch_obj,l=0,u=0,v=0,d=t,m=t,_=0;_<a.length;_++){var p=a[_][0],w=a[_][1];switch(!l&&p!==h&&(o.start1=u,o.start2=v),p){case c:o.diffs[l++]=a[_],o.length2+=w.length,m=m.substring(0,v)+w+m.substring(v);break;case g:o.length1+=w.length,o.diffs[l++]=a[_],m=m.substring(0,v)+m.substring(v+w.length);break;case h:w.length<=2*this.Patch_Margin&&l&&a.length!=_+1?(o.diffs[l++]=a[_],o.length1+=w.length,o.length2+=w.length):w.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(o,d),i.push(o),o=new s.patch_obj,l=0,d=m,u=v);break}p!==c&&(u+=w.length),p!==g&&(v+=w.length)}return l&&(this.patch_addContext_(o,d),i.push(o)),i},s.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var t=e[n],a=new s.patch_obj;a.diffs=[];for(var i=0;i<t.diffs.length;i++)a.diffs[i]=new s.Diff(t.diffs[i][0],t.diffs[i][1]);a.start1=t.start1,a.start2=t.start2,a.length1=t.length1,a.length2=t.length2,r[n]=a}return r},s.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var t=0,a=[],i=0;i<e.length;i++){var o=e[i].start2+t,l=this.diff_text1(e[i].diffs),u,v=-1;if(l.length>this.Match_MaxBits?(u=this.match_main(r,l.substring(0,this.Match_MaxBits),o),u!=-1&&(v=this.match_main(r,l.substring(l.length-this.Match_MaxBits),o+l.length-this.Match_MaxBits),(v==-1||u>=v)&&(u=-1))):u=this.match_main(r,l,o),u==-1)a[i]=!1,t-=e[i].length2-e[i].length1;else{a[i]=!0,t=u-o;var d;if(v==-1?d=r.substring(u,u+l.length):d=r.substring(u,v+this.Match_MaxBits),l==d)r=r.substring(0,u)+this.diff_text2(e[i].diffs)+r.substring(u+l.length);else{var m=this.diff_main(l,d,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(m)/l.length>this.Patch_DeleteThreshold)a[i]=!1;else{this.diff_cleanupSemanticLossless(m);for(var _=0,p,w=0;w<e[i].diffs.length;w++){var b=e[i].diffs[w];b[0]!==h&&(p=this.diff_xIndex(m,_)),b[0]===c?r=r.substring(0,u+p)+b[1]+r.substring(u+p):b[0]===g&&(r=r.substring(0,u+p)+r.substring(u+this.diff_xIndex(m,_+b[1].length))),b[0]!==g&&(_+=b[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,a]},s.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",t=1;t<=r;t++)n+=String.fromCharCode(t);for(var t=0;t<e.length;t++)e[t].start1+=r,e[t].start2+=r;var a=e[0],i=a.diffs;if(i.length==0||i[0][0]!=h)i.unshift(new s.Diff(h,n)),a.start1-=r,a.start2-=r,a.length1+=r,a.length2+=r;else if(r>i[0][1].length){var o=r-i[0][1].length;i[0][1]=n.substring(i[0][1].length)+i[0][1],a.start1-=o,a.start2-=o,a.length1+=o,a.length2+=o}if(a=e[e.length-1],i=a.diffs,i.length==0||i[i.length-1][0]!=h)i.push(new s.Diff(h,n)),a.length1+=r,a.length2+=r;else if(r>i[i.length-1][1].length){var o=r-i[i.length-1][1].length;i[i.length-1][1]+=n.substring(0,o),a.length1+=o,a.length2+=o}return n},s.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var t=e[n];e.splice(n--,1);for(var a=t.start1,i=t.start2,o="";t.diffs.length!==0;){var l=new s.patch_obj,u=!0;for(l.start1=a-o.length,l.start2=i-o.length,o!==""&&(l.length1=l.length2=o.length,l.diffs.push(new s.Diff(h,o)));t.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var v=t.diffs[0][0],d=t.diffs[0][1];v===c?(l.length2+=d.length,i+=d.length,l.diffs.push(t.diffs.shift()),u=!1):v===g&&l.diffs.length==1&&l.diffs[0][0]==h&&d.length>2*r?(l.length1+=d.length,a+=d.length,u=!1,l.diffs.push(new s.Diff(v,d)),t.diffs.shift()):(d=d.substring(0,r-l.length1-this.Patch_Margin),l.length1+=d.length,a+=d.length,v===h?(l.length2+=d.length,i+=d.length):u=!1,l.diffs.push(new s.Diff(v,d)),d==t.diffs[0][1]?t.diffs.shift():t.diffs[0][1]=t.diffs[0][1].substring(d.length))}o=this.diff_text2(l.diffs),o=o.substring(o.length-this.Patch_Margin);var m=this.diff_text1(t.diffs).substring(0,this.Patch_Margin);m!==""&&(l.length1+=m.length,l.length2+=m.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===h?l.diffs[l.diffs.length-1][1]+=m:l.diffs.push(new s.Diff(h,m))),u||e.splice(++n,0,l)}}},s.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},s.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(` 3 - `),t=0,a=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;t<n.length;){var i=n[t].match(a);if(!i)throw new Error("Invalid patch string: "+n[t]);var o=new s.patch_obj;for(r.push(o),o.start1=parseInt(i[1],10),i[2]===""?(o.start1--,o.length1=1):i[2]=="0"?o.length1=0:(o.start1--,o.length1=parseInt(i[2],10)),o.start2=parseInt(i[3],10),i[4]===""?(o.start2--,o.length2=1):i[4]=="0"?o.length2=0:(o.start2--,o.length2=parseInt(i[4],10)),t++;t<n.length;){var l=n[t].charAt(0);try{var u=decodeURI(n[t].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+u)}if(l=="-")o.diffs.push(new s.Diff(g,u));else if(l=="+")o.diffs.push(new s.Diff(c,u));else if(l==" ")o.diffs.push(new s.Diff(h,u));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+u)}t++}}return r},s.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},s.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@ 4 - `],t,a=0;a<this.diffs.length;a++){switch(this.diffs[a][0]){case c:t="+";break;case g:t="-";break;case h:t=" ";break}n[a+1]=t+encodeURI(this.diffs[a][1])+` 5 - `}return n.join("").replace(/%20/g," ")},f.exports=s,f.exports.diff_match_patch=s,f.exports.DIFF_DELETE=g,f.exports.DIFF_INSERT=c,f.exports.DIFF_EQUAL=h})(J);var ae=J.exports,A={},O={exports:{}},Y={},P={},Q={};(function(f){f.__esModule=!0;function s(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}f.default=g;function g(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2],n=h.nodeType==9||h.ownerDocument,t=n.createNodeIterator(h,e,r,!1);return new c(t,h,e,r)}var c=function(){function h(e,r,n,t){s(this,h),this.root=r,this.whatToShow=n,this.filter=t,this.referenceNode=r,this.pointerBeforeReferenceNode=!0,this._iter=e}return h.prototype.nextNode=function(){var r=this._iter.nextNode();return this.pointerBeforeReferenceNode=!1,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.previousNode=function(){var r=this._iter.previousNode();return this.pointerBeforeReferenceNode=!0,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(Q);var B={};(function(f){f.__esModule=!0,f.default=s;function s(g){var c=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],h=arguments.length<=2||arguments[2]===void 0?null:arguments[2],e=g.ownerDocument;return e.createNodeIterator.call(e,g,c,h)}})(B);var $={};(function(f){f.__esModule=!0;function s(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}f.default=g;function g(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2];return new c(h,e,r)}var c=function(){function h(e,r,n){s(this,h),this.root=e,this.whatToShow=r,this.filter=n,this.referenceNode=e,this.pointerBeforeReferenceNode=!0,this._filter=function(t){return n?n(t)===1:!0},this._show=function(t){return r>>t.nodeType-1&!0}}return h.prototype.nextNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!1;var n=this.referenceNode;if(r&&this._show(n)&&this._filter(n))return n;do{if(n.firstChild){n=n.firstChild;continue}do{if(n===this.root)return null;if(n.nextSibling)break;n=n.parentNode}while(n);n=n.nextSibling}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!1,n},h.prototype.previousNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!0;var n=this.referenceNode;if(!r&&this._show(n)&&this._filter(n))return n;do{if(n===this.root)return null;if(n.previousSibling){for(n=n.previousSibling;n.lastChild;)n=n.lastChild;continue}n=n.parentNode}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!0,n},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})($);(function(f){f.__esModule=!0,f.default=t;var s=Q,g=n(s),c=B,h=n(c),e=$,r=n(e);function n(a){return a&&a.__esModule?a:{default:a}}function t(){try{var a=typeof document>"u"?{}:document,i=(0,h.default)(a,4294967295,null,!1);return i.referenceNode===a?h.default:g.default}catch{return r.default}}})(P);var L={};(function(f){f.__esModule=!0,f.default=r;var s=B,g=e(s),c=P,h=e(c);function e(n){return n&&n.__esModule?n:{default:n}}function r(){var n=typeof document>"u"?{}:document,t=(0,h.default)();return t!==g.default&&(n.createNodeIterator=t),t}})(L);(function(f){f.__esModule=!0;var s=P,g=n(s),c=$,h=n(c),e=L,r=n(e);function n(a){return a&&a.__esModule?a:{default:a}}var t=(0,g.default)();t.implementation=h.default,t.shim=r.default,f.default=t})(Y);var ie=P.default,se=$.default,oe=L.default;O.exports=Y.default;O.exports.getPolyfill=ie;O.exports.implementation=se;O.exports.shim=oe;var le=O.exports,Z={},fe=ue;function ue(f,s){var g=[];s=s||he;do g.push(f),f=f.parentNode;while(f&&f.tagName&&s(f));return g.slice(1)}function he(f){return!0}/*! 6 - * index-of <https://github.com/jonschlinkert/index-of> 7 - * 8 - * Copyright (c) 2014-2015 Jon Schlinkert. 9 - * Licensed under the MIT license. 10 - */var ge=function(s,g,c){c=c||0;var h=-1;if(s==null)return h;var e=s.length,r=c<0?e+c:c;if(r>=s.length)return-1;for(;r<e;){if(s[r]===g)return r;r++}return-1};(function(f){f.__esModule=!0,f.default=i;var s=fe,g=e(s),c=ge,h=e(c);function e(v){return v&&v.__esModule?v:{default:v}}var r="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",n="Argument 2 of seek must be a number or a Text Node.",t=4,a=3;function i(v,d){if(v.whatToShow!==t)throw new Error(r);var m=0,_=v.referenceNode,p=null;if(o(d))p={forward:function(){return m<d},backward:function(){return m>d}};else if(l(d)){var w=u(_,d)?function(){return!1}:function(){return _!==d},b=function(){return _!=d||!v.pointerBeforeReferenceNode};p={forward:w,backward:b}}else throw new Error(n);for(;p.forward()&&(_=v.nextNode())!==null;)m+=_.nodeValue.length;for(;p.backward()&&(_=v.previousNode())!==null;)m-=_.nodeValue.length;return m}function o(v){return!isNaN(parseInt(v))&&isFinite(v)}function l(v){return v.nodeType===a}function u(v,d){if(v===d)return!1;for(var m=null,_=[v].concat((0,g.default)(v)).reverse(),p=[d].concat((0,g.default)(d)).reverse();_[0]===p[0];)m=_.shift(),p.shift();_=_[0],p=p[0];var w=(0,h.default)(m.childNodes,_),b=(0,h.default)(m.childNodes,p);return w>b}})(Z);var ve=Z.default,H={};Object.defineProperty(H,"__esModule",{value:!0});H.default=_e;function F(f,s){if(!s&&f.firstChild)return f.firstChild;do{if(f.nextSibling)return f.nextSibling;f=f.parentNode}while(f);return f}function ce(f){if(f.startContainer.nodeType===Node.ELEMENT_NODE){var s=f.startContainer.childNodes[f.startOffset];return s||F(f.startContainer,!0)}return f.startContainer}function de(f){if(f.endContainer.nodeType===Node.ELEMENT_NODE){var s=f.endContainer.childNodes[f.endOffset];return s||F(f.endContainer,!0)}return F(f.endContainer)}function me(f,s){for(var g=ce(f),c=de(f);g!==c;)s(g),g=F(g)}function _e(f){var s="";return me(f,function(g){if(g.nodeType===Node.TEXT_NODE){var c=g===f.startContainer?f.startOffset:0,h=g===f.endContainer?f.endOffset:g.textContent.length;s+=g.textContent.slice(c,h)}}),s}Object.defineProperty(A,"__esModule",{value:!0});A.fromRange=Me;A.toRange=De;var pe=le,we=U(pe),be=ve,W=U(be),Ne=H,X=U(Ne);function U(f){return f&&f.__esModule?f:{default:f}}var Ee=4;function Me(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=f.ownerDocument,c=g.createRange(),h=s.startContainer,e=s.startOffset;c.setStart(f,0),c.setEnd(h,e);var r=(0,X.default)(c).length,n=r+(0,X.default)(s).length;return{start:r,end:n}}function De(f){var s=arguments.length<=1||arguments[1]===void 0?{}:arguments[1];if(f===void 0)throw new Error('missing required parameter "root"');var g=f.ownerDocument,c=g.createRange(),h=(0,we.default)(f,Ee),e=s.start||0,r=s.end||e,n=(0,W.default)(h,e),t=e-n;h.pointerBeforeReferenceNode?c.setStart(h.referenceNode,t):(c.setStart(h.nextNode(),t),h.previousNode());var a=r-e+t;return n=(0,W.default)(h,a),t=a-n,h.pointerBeforeReferenceNode?c.setEnd(h.referenceNode,t):c.setEnd(h.nextNode(),t),c}var Te=A;Object.defineProperty(k,"__esModule",{value:!0});k.fromRange=Oe;k.fromTextPosition=x;k.toRange=Fe;k.toTextPosition=ee;var Se=ae,ye=Ie(Se),Re=Te,K=Ce(Re);function Ce(f){if(f&&f.__esModule)return f;var s={};if(f!=null)for(var g in f)Object.prototype.hasOwnProperty.call(f,g)&&(s[g]=f[g]);return s.default=f,s}function Ie(f){return f&&f.__esModule?f:{default:f}}var j=32,ke=new RegExp(`(.|[\r 11 - ]){1,`+String(j)+"}","g"),V=j;function Oe(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=K.fromRange(f,s);return x(f,g)}function x(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "selector"');var g=s.start;if(g===void 0)throw new Error('selector missing required property "start"');if(g<0)throw new Error('property "start" must be a non-negative integer');var c=s.end;if(c===void 0)throw new Error('selector missing required property "end"');if(c<0)throw new Error('property "end" must be a non-negative integer');var h=f.textContent.substr(g,c-g),e=Math.max(0,g-V),r=f.textContent.substr(e,g-e),n=Math.min(f.textContent.length,c+V),t=f.textContent.substr(c,n-c);return{exact:h,prefix:r,suffix:t}}function Fe(f,s){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},c=ee(f,s,g);return c===null?null:K.toRange(f,c)}function ee(f,s){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "selector"');var c=s.exact;if(c===void 0)throw new Error('selector missing required property "exact"');var h=s.prefix,e=s.suffix,r=g.hint,n=new ye.default;n.Match_Distance=f.textContent.length*2;var t=c.match(ke),a=r===void 0?f.textContent.length/2|0:r,i=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=-1,u=h!==void 0,v=e!==void 0,d=!1;u&&(l=n.match_main(f.textContent,h,a),l>-1&&(a=l+h.length,d=!0)),v&&!d&&(l=n.match_main(f.textContent,e,a+c.length),l>-1&&(a=l-c.length));var m=t.shift();if(l=n.match_main(f.textContent,m,a),l>-1)i=l,a=o=i+m.length;else return null;var _=function(b,E){if(!b)return null;var N=n.match_main(f.textContent,E,b.loc);return N===-1?null:(b.loc=N+E.length,b.start=Math.min(b.start,N),b.end=Math.max(b.end,N+E.length),b)};n.Match_Distance=64;var p=t.reduce(_,{start:i,end:o,loc:a});return p?{start:p.start,end:p.end}:null}var q={},re={};(function(f){Object.defineProperty(f,"__esModule",{value:!0}),f.default=n;var s="Iterator exhausted before seek ended.",g="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",c="Argument 2 of seek must be an integer or a Text Node.",h=2,e=4,r=3;function n(o,l){if(o.whatToShow!==e){var u;try{u=new DOMException(g,"InvalidStateError")}catch{u=new Error(g),u.code=11,u.name="InvalidStateError",u.toString=function(){return"InvalidStateError: ".concat(g)}}throw u}var v=0,d=o.referenceNode,m=null;if(t(l))m={forward:function(){return v<l},backward:function(){return v>l||!o.pointerBeforeReferenceNode}};else if(a(l)){var _=i(d,l)?function(){return!1}:function(){return d!==l},p=function(){return d!==l||!o.pointerBeforeReferenceNode};m={forward:_,backward:p}}else throw new TypeError(c);for(;m.forward();){if(d=o.nextNode(),d===null)throw new RangeError(s);v+=d.nodeValue.length}for(o.nextNode()&&(d=o.previousNode());m.backward();){if(d=o.previousNode(),d===null)throw new RangeError(s);v-=d.nodeValue.length}if(!a(o.referenceNode))throw new RangeError(s);return v}function t(o){return typeof o!="number"?!1:isFinite(o)&&Math.floor(o)===o}function a(o){return o.nodeType===r}function i(o,l){return o.compareDocumentPosition(l)&h}})(re);var Ae=re.default,ne={};(function(f){Object.defineProperty(f,"__esModule",{value:!0}),f.default=e;function s(r,n){if(!n&&r.firstChild)return r.firstChild;do{if(r.nextSibling)return r.nextSibling;r=r.parentNode}while(r);return r}function g(r){if(r.startContainer.nodeType===Node.ELEMENT_NODE){var n=r.startContainer.childNodes[r.startOffset];return n||s(r.startContainer,!0)}return r.startContainer}function c(r){if(r.endContainer.nodeType===Node.ELEMENT_NODE){var n=r.endContainer.childNodes[r.endOffset];return n||s(r.endContainer,!0)}return s(r.endContainer)}function h(r,n){for(var t=g(r),a=c(r);t!==a;)n(t),t=s(t)}function e(r){var n="";return h(r,function(t){if(t.nodeType===Node.TEXT_NODE){var a=t===r.startContainer?r.startOffset:0,i=t===r.endContainer?r.endOffset:t.textContent.length;n+=t.textContent.slice(a,i)}}),n}})(ne);Object.defineProperty(q,"__esModule",{value:!0});q.fromRange=$e;q.toRange=Be;var z=te(Ae),G=te(ne);function te(f){return f&&f.__esModule?f:{default:f}}var Pe=4;function $e(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=f.ownerDocument,c=g.createRange(),h=s.startContainer,e=s.startOffset;c.setStart(f,0),c.setEnd(h,e);var r=(0,G.default)(c).length,n=r+(0,G.default)(s).length;return{start:r,end:n}}function Be(f){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(f===void 0)throw new Error('missing required parameter "root"');var g=f.ownerDocument,c=g.createRange(),h=g.createNodeIterator(f,Pe),e=s.start||0,r=s.end||e,n=e-(0,z.default)(h,e),t=h.referenceNode,a=r-e+n,i=a-(0,z.default)(h,a),o=h.referenceNode;return c.setStart(t,n),c.setEnd(o,i),c}function Le(f){const s=new Date(f),c=new Date().getTime()-s.getTime(),h=Math.floor(c/1e3),e=Math.floor(h/60),r=Math.floor(e/60),n=Math.floor(r/24);return h<60?"just now":e<60?`${e}m ago`:r<24?`${r}h ago`:n<7?`${n}d ago`:s.toLocaleDateString()}class He extends HTMLElement{constructor(){super(),this._annotation=null,this.attachShadow({mode:"open"})}static get observedAttributes(){return[]}set annotation(s){this._annotation=s,this.render()}get annotation(){return this._annotation}connectedCallback(){this.render()}async render(){var v;if(!this._annotation||!this.shadowRoot)return;const{value:s,author:g}=this._annotation,c=s.target,h=s.body,e=s.createdAt,r=(v=c.selector)==null?void 0:v.find(d=>d.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),n=r==null?void 0:r.exact,t=c.url,a=t?this.getDomain(t):"",i=this.buildTextFragmentUrl(t,n),o=(g==null?void 0:g.did)||"unknown",l=(g==null?void 0:g.handle)||(o.includes(":")?o.split(":").pop():o),u=(g==null?void 0:g.avatar)||`https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(l)}`;this.shadowRoot.innerHTML=` 12 - <style> 13 - :host { 14 - display: block; 15 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; 16 - } 17 - 18 - .card { 19 - background: white; 20 - border: 1px solid #e0e0e0; 21 - border-radius: 12px; 22 - padding: 16px; 23 - margin-bottom: 16px; 24 - box-shadow: 0 2px 4px rgba(0,0,0,0.05); 25 - transition: transform 0.2s, box-shadow 0.2s; 26 - } 27 - 28 - .card:hover { 29 - transform: translateY(-1px); 30 - box-shadow: 0 4px 8px rgba(0,0,0,0.1); 31 - } 32 - 33 - .quote { 34 - margin: 0 0 12px 0; 35 - padding-left: 12px; 36 - border-left: 3px solid #FFD700; 37 - color: #444; 38 - font-style: italic; 39 - font-size: 0.95em; 40 - line-height: 1.5; 41 - } 42 - 43 - .body { 44 - color: #1a1a1a; 45 - font-size: 1em; 46 - line-height: 1.6; 47 - margin-bottom: 16px; 48 - white-space: pre-wrap; 49 - } 50 - 51 - .meta { 52 - display: flex; 53 - align-items: center; 54 - justify-content: space-between; 55 - font-size: 0.85em; 56 - color: #666; 57 - border-top: 1px solid #f0f0f0; 58 - padding-top: 12px; 59 - } 60 - 61 - .author { 62 - display: flex; 63 - align-items: center; 64 - gap: 8px; 65 - text-decoration: none; 66 - color: inherit; 67 - } 68 - 69 - .author:hover { 70 - color: #2E7D32; 71 - } 72 - 73 - .avatar { 74 - width: 24px; 75 - height: 24px; 76 - border-radius: 50%; 77 - object-fit: cover; 78 - background: #eee; 79 - } 80 - 81 - .handle { 82 - font-weight: 500; 83 - } 84 - 85 - .source-link { 86 - color: #666; 87 - text-decoration: none; 88 - display: flex; 89 - align-items: center; 90 - gap: 4px; 91 - } 92 - 93 - .source-link:hover { 94 - color: #2E7D32; 95 - text-decoration: underline; 96 - } 97 - 98 - .time { 99 - color: #999; 100 - } 101 - </style> 102 - 103 - <article class="card"> 104 - ${n?`<blockquote class="quote">"${n}"</blockquote>`:""} 105 - ${h?`<div class="body">${this.escapeHtml(h)}</div>`:""} 106 - 107 - <div class="meta"> 108 - <div class="left"> 109 - <a href="https://bsky.app/profile/${o}" target="_blank" rel="noopener noreferrer" class="author"> 110 - <img class="avatar" src="${u}" alt="${l}'s avatar" loading="lazy" /> 111 - <span class="handle">@${l}</span> 112 - </a> 113 - </div> 114 - 115 - <div class="right"> 116 - <span class="time">${Le(e)}</span> 117 - ${a?` 118 - <span style="margin: 0 6px;">•</span> 119 - <a href="${i}" target="_blank" rel="noopener noreferrer" class="source-link"> 120 - ${a} ↗ 121 - </a> 122 - `:""} 123 - </div> 124 - </div> 125 - </article> 126 - `}getDomain(s){try{return new URL(s).hostname}catch{return s}}buildTextFragmentUrl(s,g){if(!s||!g)return s;try{const c=new URL(s);return c.hash=`:~:text=${encodeURIComponent(g)}`,c.toString()}catch{return s}}escapeHtml(s){const g=document.createElement("div");return g.textContent=s,g.innerHTML}}customElements.get("seams-annotation-card")||customElements.define("seams-annotation-card",He);export{Ue as W,q as a,k as l}; 127 - //# sourceMappingURL=annotation-card-DaLDEZbU.js.map
-1
proxy/static/static/assets/annotation-card-DaLDEZbU.js.map
··· 1 - {"version":3,"file":"annotation-card-DaLDEZbU.js","sources":["../../../packages/core/src/storage/web.ts","../../../node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/adapter.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/builtin.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/index.js","../../../node_modules/.pnpm/ancestors@0.0.3/node_modules/ancestors/index.js","../../../node_modules/.pnpm/index-of@0.2.0/node_modules/index-of/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/index.js","../../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../packages/core/src/components/annotation-card.ts"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(keys: string | string[]): Promise<any> {\n if (typeof keys === 'string') {\n const value = localStorage.getItem(keys);\n return value ? JSON.parse(value) : null;\n }\n \n const result: Record<string, any> = {};\n keys.forEach(key => {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n });\n return result;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n \n // Also notify local listeners (for other components in the same window sharing this adapter)\n this.listeners.forEach(callback => callback(change));\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.nodeType == 9 || root.ownerDocument;\n var iter = doc.createNodeIterator(root, whatToShow, filter, false);\n return new NodeIterator(iter, root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(iter, root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._iter = iter;\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var result = this._iter.nextNode();\n this.pointerBeforeReferenceNode = false;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var result = this._iter.previousNode();\n this.pointerBeforeReferenceNode = true;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwibm9kZVR5cGUiLCJvd25lckRvY3VtZW50IiwiaXRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9pdGVyIiwibmV4dE5vZGUiLCJyZXN1bHQiLCJwcmV2aW91c05vZGUiLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFlQSxrQjs7O0FBR2YsU0FBU0Esa0JBQVQsQ0FBNEJDLElBQTVCLEVBQTBFO0FBQUEsTUFBeENDLFVBQXdDLHlEQUEzQixVQUEyQjtBQUFBLE1BQWZDLE1BQWUseURBQU4sSUFBTTs7QUFDeEUsTUFBTUMsTUFBT0gsS0FBS0ksUUFBTCxJQUFpQixDQUFsQixJQUF3QkosS0FBS0ssYUFBekM7QUFDQSxNQUFNQyxPQUFPSCxJQUFJSixrQkFBSixDQUF1QkMsSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRCxLQUFqRCxDQUFiO0FBQ0EsU0FBTyxJQUFJSyxZQUFKLENBQWlCRCxJQUFqQixFQUF1Qk4sSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxDQUFQO0FBQ0Q7O0lBR0tLLFk7QUFDSix3QkFBWUQsSUFBWixFQUFrQk4sSUFBbEIsRUFBd0JDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUFBOztBQUMxQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLGFBQUwsR0FBcUJSLElBQXJCO0FBQ0EsU0FBS1MsMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLElBQWI7QUFDRDs7eUJBRURLLFEsdUJBQVc7QUFDVCxRQUFNQyxTQUFTLEtBQUtGLEtBQUwsQ0FBV0MsUUFBWCxFQUFmO0FBQ0EsU0FBS0YsMEJBQUwsR0FBa0MsS0FBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURLLFksMkJBQWU7QUFDYixRQUFNRCxTQUFTLEtBQUtGLEtBQUwsQ0FBV0csWUFBWCxFQUFmO0FBQ0EsU0FBS0osMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURNLFEsdUJBQVc7QUFDVCxXQUFPLHVCQUFQO0FBQ0QsRyIsImZpbGUiOiJhZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY3JlYXRlTm9kZUl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QsIHdoYXRUb1Nob3cgPSAweEZGRkZGRkZGLCBmaWx0ZXIgPSBudWxsKSB7XG4gIGNvbnN0IGRvYyA9IChyb290Lm5vZGVUeXBlID09IDkpIHx8IHJvb3Qub3duZXJEb2N1bWVudFxuICBjb25zdCBpdGVyID0gZG9jLmNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGZhbHNlKVxuICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihpdGVyLCByb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpXG59XG5cblxuY2xhc3MgTm9kZUl0ZXJhdG9yIHtcbiAgY29uc3RydWN0b3IoaXRlciwgcm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgdGhpcy5yb290ID0gcm9vdFxuICAgIHRoaXMud2hhdFRvU2hvdyA9IHdoYXRUb1Nob3dcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlclxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJvb3RcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHRoaXMuX2l0ZXIgPSBpdGVyXG4gIH1cblxuICBuZXh0Tm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLm5leHROb2RlKClcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHByZXZpb3VzTm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLnByZXZpb3VzTm9kZSgpXG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBOb2RlSXRlcmF0b3JdJ1xuICB9XG59XG4iXX0=","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.ownerDocument;\n return doc.createNodeIterator.call(doc, root, whatToShow, filter);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsdGluLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwib3duZXJEb2N1bWVudCIsImNhbGwiXSwibWFwcGluZ3MiOiI7OztxQkFBZUEsa0I7OztBQUdmLFNBQVNBLGtCQUFULENBQTRCQyxJQUE1QixFQUEwRTtBQUFBLE1BQXhDQyxVQUF3Qyx5REFBM0IsVUFBMkI7QUFBQSxNQUFmQyxNQUFlLHlEQUFOLElBQU07O0FBQ3hFLE1BQU1DLE1BQU1ILEtBQUtJLGFBQWpCO0FBQ0EsU0FBT0QsSUFBSUosa0JBQUosQ0FBdUJNLElBQXZCLENBQTRCRixHQUE1QixFQUFpQ0gsSUFBakMsRUFBdUNDLFVBQXZDLEVBQW1EQyxNQUFuRCxDQUFQO0FBQ0QiLCJmaWxlIjoiYnVpbHRpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyZWF0ZU5vZGVJdGVyYXRvclxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93ID0gMHhGRkZGRkZGRiwgZmlsdGVyID0gbnVsbCkge1xuICBjb25zdCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgcmV0dXJuIGRvYy5jcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChkb2MsIHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcilcbn1cbiJdfQ==","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n return new NodeIterator(root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._filter = function (node) {\n return filter ? filter(node) === 1 : true;\n };\n this._show = function (node) {\n return whatToShow >> node.nodeType - 1 & 1 === 1;\n };\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = false;\n\n var node = this.referenceNode;\n if (before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node.firstChild) {\n node = node.firstChild;\n continue;\n }\n\n do {\n if (node === this.root) return null;\n if (node.nextSibling) break;\n node = node.parentNode;\n } while (node);\n\n node = node.nextSibling;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = false;\n return node;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = true;\n\n var node = this.referenceNode;\n if (!before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node === this.root) return null;\n\n if (node.previousSibling) {\n node = node.previousSibling;\n while (node.lastChild) {\n node = node.lastChild;\n }continue;\n }\n\n node = node.parentNode;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = true;\n return node;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBsZW1lbnRhdGlvbi5qcyJdLCJuYW1lcyI6WyJjcmVhdGVOb2RlSXRlcmF0b3IiLCJyb290Iiwid2hhdFRvU2hvdyIsImZpbHRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9maWx0ZXIiLCJub2RlIiwiX3Nob3ciLCJub2RlVHlwZSIsIm5leHROb2RlIiwiYmVmb3JlIiwiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInByZXZpb3VzTm9kZSIsInByZXZpb3VzU2libGluZyIsImxhc3RDaGlsZCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQWVBLGtCOzs7QUFHZixTQUFTQSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBMEU7QUFBQSxNQUF4Q0MsVUFBd0MseURBQTNCLFVBQTJCO0FBQUEsTUFBZkMsTUFBZSx5REFBTixJQUFNOztBQUN4RSxTQUFPLElBQUlDLFlBQUosQ0FBaUJILElBQWpCLEVBQXVCQyxVQUF2QixFQUFtQ0MsTUFBbkMsQ0FBUDtBQUNEOztJQUdLQyxZO0FBQ0osd0JBQVlILElBQVosRUFBa0JDLFVBQWxCLEVBQThCQyxNQUE5QixFQUFzQztBQUFBOztBQUNwQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtFLGFBQUwsR0FBcUJKLElBQXJCO0FBQ0EsU0FBS0ssMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxPQUFMLEdBQWUsVUFBQ0MsSUFBRDtBQUFBLGFBQVVMLFNBQVNBLE9BQU9LLElBQVAsTUFBaUIsQ0FBMUIsR0FBOEIsSUFBeEM7QUFBQSxLQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLFVBQUNELElBQUQ7QUFBQSxhQUFVTixjQUFjTSxLQUFLRSxRQUFMLEdBQWdCLENBQTlCLEdBQWtDLE1BQU0sQ0FBbEQ7QUFBQSxLQUFiO0FBQ0Q7O3lCQUVEQyxRLHVCQUFXO0FBQ1QsUUFBTUMsU0FBUyxLQUFLTiwwQkFBcEI7QUFDQSxTQUFLQSwwQkFBTCxHQUFrQyxLQUFsQzs7QUFFQSxRQUFJRSxPQUFPLEtBQUtILGFBQWhCO0FBQ0EsUUFBSU8sVUFBVSxLQUFLSCxLQUFMLENBQVdELElBQVgsQ0FBVixJQUE4QixLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FBbEMsRUFBc0QsT0FBT0EsSUFBUDs7QUFFdEQsT0FBRztBQUNELFVBQUlBLEtBQUtLLFVBQVQsRUFBcUI7QUFDbkJMLGVBQU9BLEtBQUtLLFVBQVo7QUFDQTtBQUNEOztBQUVELFNBQUc7QUFDRCxZQUFJTCxTQUFTLEtBQUtQLElBQWxCLEVBQXdCLE9BQU8sSUFBUDtBQUN4QixZQUFJTyxLQUFLTSxXQUFULEVBQXNCO0FBQ3RCTixlQUFPQSxLQUFLTyxVQUFaO0FBQ0QsT0FKRCxRQUlTUCxJQUpUOztBQU1BQSxhQUFPQSxLQUFLTSxXQUFaO0FBQ0QsS0FiRCxRQWFRLENBQUMsS0FBS0wsS0FBTCxDQUFXRCxJQUFYLENBQUQsSUFBcUIsQ0FBQyxLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FiOUI7O0FBZUEsU0FBS0gsYUFBTCxHQUFxQkcsSUFBckI7QUFDQSxTQUFLRiwwQkFBTCxHQUFrQyxLQUFsQztBQUNBLFdBQU9FLElBQVA7QUFDRCxHOzt5QkFFRFEsWSwyQkFBZTtBQUNiLFFBQU1KLFNBQVMsS0FBS04sMEJBQXBCO0FBQ0EsU0FBS0EsMEJBQUwsR0FBa0MsSUFBbEM7O0FBRUEsUUFBSUUsT0FBTyxLQUFLSCxhQUFoQjtBQUNBLFFBQUksQ0FBQ08sTUFBRCxJQUFXLEtBQUtILEtBQUwsQ0FBV0QsSUFBWCxDQUFYLElBQStCLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQUFuQyxFQUF1RCxPQUFPQSxJQUFQOztBQUV2RCxPQUFHO0FBQ0QsVUFBSUEsU0FBUyxLQUFLUCxJQUFsQixFQUF3QixPQUFPLElBQVA7O0FBRXhCLFVBQUlPLEtBQUtTLGVBQVQsRUFBMEI7QUFDeEJULGVBQU9BLEtBQUtTLGVBQVo7QUFDQSxlQUFPVCxLQUFLVSxTQUFaO0FBQXVCVixpQkFBT0EsS0FBS1UsU0FBWjtBQUF2QixTQUNBO0FBQ0Q7O0FBRURWLGFBQU9BLEtBQUtPLFVBQVo7QUFDRCxLQVZELFFBVVEsQ0FBQyxLQUFLTixLQUFMLENBQVdELElBQVgsQ0FBRCxJQUFxQixDQUFDLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQVY5Qjs7QUFZQSxTQUFLSCxhQUFMLEdBQXFCRyxJQUFyQjtBQUNBLFNBQUtGLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0EsV0FBT0UsSUFBUDtBQUNELEc7O3lCQUVEVyxRLHVCQUFXO0FBQ1QsV0FBTyx1QkFBUDtBQUNELEciLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjcmVhdGVOb2RlSXRlcmF0b3JcblxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdyA9IDB4RkZGRkZGRkYsIGZpbHRlciA9IG51bGwpIHtcbiAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKVxufVxuXG5cbmNsYXNzIE5vZGVJdGVyYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcikge1xuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcbiAgICB0aGlzLnJlZmVyZW5jZU5vZGUgPSByb290XG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICB0aGlzLl9maWx0ZXIgPSAobm9kZSkgPT4gZmlsdGVyID8gZmlsdGVyKG5vZGUpID09PSAxIDogdHJ1ZVxuICAgIHRoaXMuX3Nob3cgPSAobm9kZSkgPT4gd2hhdFRvU2hvdyA+PiBub2RlLm5vZGVUeXBlIC0gMSAmIDEgPT09IDFcbiAgfVxuXG4gIG5leHROb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcblxuICAgIGxldCBub2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlXG4gICAgaWYgKGJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG4gICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSBicmVha1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgICB9IHdoaWxlIChub2RlKVxuXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZ1xuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJldmlvdXNOb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgICBpZiAoIWJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG5cbiAgICAgIGlmIChub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUl0ZXJhdG9yXSdcbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = getPolyfill;\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction getPolyfill() {\n try {\n var doc = typeof document === 'undefined' ? {} : document;\n var iter = (0, _builtin2['default'])(doc, 0xFFFFFFFF, null, false);\n if (iter.referenceNode === doc) return _builtin2['default'];\n return _adapter2['default'];\n } catch (_) {\n return _implementation2['default'];\n }\n} /*global document*/\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wb2x5ZmlsbC5qcyJdLCJuYW1lcyI6WyJnZXRQb2x5ZmlsbCIsImRvYyIsImRvY3VtZW50IiwiaXRlciIsInJlZmVyZW5jZU5vZGUiLCJfIl0sIm1hcHBpbmdzIjoiOzs7cUJBTXdCQSxXOztBQUx4Qjs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUdlLFNBQVNBLFdBQVQsR0FBdUI7QUFDcEMsTUFBSTtBQUNGLFFBQU1DLE1BQU0sT0FBT0MsUUFBUCxLQUFxQixXQUFyQixHQUFtQyxFQUFuQyxHQUF3Q0EsUUFBcEQ7QUFDQSxRQUFNQyxPQUFPLDBCQUFRRixHQUFSLEVBQWEsVUFBYixFQUF5QixJQUF6QixFQUErQixLQUEvQixDQUFiO0FBQ0EsUUFBSUUsS0FBS0MsYUFBTCxLQUF1QkgsR0FBM0IsRUFBZ0M7QUFDaEM7QUFDRCxHQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1Y7QUFDRDtBQUNGLEMsQ0FmRCIsImZpbGUiOiJwb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBpbXBsZW1lbnRhdGlvbiBmcm9tICcuL2ltcGxlbWVudGF0aW9uJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICAgIGNvbnN0IGl0ZXIgPSBidWlsdGluKGRvYywgMHhGRkZGRkZGRiwgbnVsbCwgZmFsc2UpXG4gICAgaWYgKGl0ZXIucmVmZXJlbmNlTm9kZSA9PT0gZG9jKSByZXR1cm4gYnVpbHRpblxuICAgIHJldHVybiBhZGFwdGVyXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shim;\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/*global document*/\nfunction shim() {\n var doc = typeof document === 'undefined' ? {} : document;\n var polyfill = (0, _polyfill2['default'])();\n if (polyfill !== _builtin2['default']) doc.createNodeIterator = polyfill;\n return polyfill;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGltLmpzIl0sIm5hbWVzIjpbInNoaW0iLCJkb2MiLCJkb2N1bWVudCIsInBvbHlmaWxsIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIl0sIm1hcHBpbmdzIjoiOzs7cUJBS3dCQSxJOztBQUp4Qjs7OztBQUNBOzs7Ozs7QUFGQTtBQUtlLFNBQVNBLElBQVQsR0FBZ0I7QUFDN0IsTUFBTUMsTUFBTSxPQUFPQyxRQUFQLEtBQXFCLFdBQXJCLEdBQW1DLEVBQW5DLEdBQXdDQSxRQUFwRDtBQUNBLE1BQU1DLFdBQVcsNEJBQWpCO0FBQ0EsTUFBSUEsaUNBQUosRUFBMEJGLElBQUlHLGtCQUFKLEdBQXlCRCxRQUF6QjtBQUMxQixTQUFPQSxRQUFQO0FBQ0QiLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBnZXRQb2x5ZmlsbCBmcm9tICcuL3BvbHlmaWxsJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoaW0oKSB7XG4gIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICBjb25zdCBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKClcbiAgaWYgKHBvbHlmaWxsICE9PSBidWlsdGluKSBkb2MuY3JlYXRlTm9kZUl0ZXJhdG9yID0gcG9seWZpbGxcbiAgcmV0dXJuIHBvbHlmaWxsXG59XG4iXX0=","'use strict';\n\nexports.__esModule = true;\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nvar _shim = require('./shim');\n\nvar _shim2 = _interopRequireDefault(_shim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar polyfill = (0, _polyfill2['default'])();\npolyfill.implementation = _implementation2['default'];\npolyfill.shim = _shim2['default'];\n\nexports['default'] = polyfill;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwb2x5ZmlsbCIsImltcGxlbWVudGF0aW9uIiwic2hpbSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyw0QkFBakI7QUFDQUEsU0FBU0MsY0FBVDtBQUNBRCxTQUFTRSxJQUFUOztxQkFFZUYsUSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UG9seWZpbGwgfSBmcm9tICcuL3BvbHlmaWxsJ1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBpbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNoaW0gfSBmcm9tICcuL3NoaW0nXG5cbmNvbnN0IHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKVxucG9seWZpbGwuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvblxucG9seWZpbGwuc2hpbSA9IHNoaW1cblxuZXhwb3J0IGRlZmF1bHQgcG9seWZpbGxcbiJdfQ==","module.exports = require('./lib/polyfill')['default'];\n","module.exports = require('./lib/implementation')['default'];\n","module.exports = require('./lib/shim')['default'];\n","module.exports = require('./lib')['default'];\nmodule.exports.getPolyfill = require('./polyfill');\nmodule.exports.implementation = require('./implementation');\nmodule.exports.shim = require('./shim');\n","module.exports = parents\n\nfunction parents(node, filter) {\n var out = []\n\n filter = filter || noop\n\n do {\n out.push(node)\n node = node.parentNode\n } while(node && node.tagName && filter(node))\n\n return out.slice(1)\n}\n\nfunction noop(n) {\n return true\n}\n","/*!\n * index-of <https://github.com/jonschlinkert/index-of>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function indexOf(arr, ele, start) {\n start = start || 0;\n var idx = -1;\n\n if (arr == null) return idx;\n var len = arr.length;\n var i = start < 0\n ? (len + start)\n : start;\n\n if (i >= arr.length) {\n return -1;\n }\n\n while (i < len) {\n if (arr[i] === ele) {\n return i;\n }\n i++;\n }\n\n return -1;\n};\n","'use strict';\n\nexports.__esModule = true;\nexports['default'] = seek;\n\nvar _ancestors = require('ancestors');\n\nvar _ancestors2 = _interopRequireDefault(_ancestors);\n\nvar _indexOf = require('index-of');\n\nvar _indexOf2 = _interopRequireDefault(_indexOf);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be a number or a Text Node.';\n\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n throw new Error(E_SHOW);\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isNumber(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n var backward = function backward() {\n return node != where || !iter.pointerBeforeReferenceNode;\n };\n predicates = { forward: forward, backward: backward };\n } else {\n throw new Error(E_WHERE);\n }\n\n while (predicates.forward() && (node = iter.nextNode()) !== null) {\n count += node.nodeValue.length;\n }\n\n while (predicates.backward() && (node = iter.previousNode()) !== null) {\n count -= node.nodeValue.length;\n }\n\n return count;\n}\n\nfunction isNumber(n) {\n return !isNaN(parseInt(n)) && isFinite(n);\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n if (ref === node) return false;\n\n var common = null;\n var left = [ref].concat((0, _ancestors2['default'])(ref)).reverse();\n var right = [node].concat((0, _ancestors2['default'])(node)).reverse();\n\n while (left[0] === right[0]) {\n common = left.shift();\n right.shift();\n }\n\n left = left[0];\n right = right[0];\n\n var l = (0, _indexOf2['default'])(common.childNodes, left);\n var r = (0, _indexOf2['default'])(common.childNodes, right);\n\n return l > r;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzZWVrIiwiRV9TSE9XIiwiRV9XSEVSRSIsIlNIT1dfVEVYVCIsIlRFWFRfTk9ERSIsIml0ZXIiLCJ3aGVyZSIsIndoYXRUb1Nob3ciLCJFcnJvciIsImNvdW50Iiwibm9kZSIsInJlZmVyZW5jZU5vZGUiLCJwcmVkaWNhdGVzIiwiaXNOdW1iZXIiLCJmb3J3YXJkIiwiYmFja3dhcmQiLCJpc1RleHQiLCJiZWZvcmUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIm5leHROb2RlIiwibm9kZVZhbHVlIiwibGVuZ3RoIiwicHJldmlvdXNOb2RlIiwibiIsImlzTmFOIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsIm5vZGVUeXBlIiwicmVmIiwiY29tbW9uIiwibGVmdCIsImNvbmNhdCIsInJldmVyc2UiLCJyaWdodCIsInNoaWZ0IiwibCIsImNoaWxkTm9kZXMiLCJyIl0sIm1hcHBpbmdzIjoiOzs7cUJBVXdCQSxJOztBQVZ4Qjs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQyxTQUFTLDBEQUFmO0FBQ0EsSUFBTUMsVUFBVSxxREFBaEI7O0FBRUEsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLFlBQVksQ0FBbEI7O0FBR2UsU0FBU0osSUFBVCxDQUFjSyxJQUFkLEVBQW9CQyxLQUFwQixFQUEyQjtBQUN4QyxNQUFJRCxLQUFLRSxVQUFMLEtBQW9CSixTQUF4QixFQUFtQztBQUNqQyxVQUFNLElBQUlLLEtBQUosQ0FBVVAsTUFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSVEsUUFBUSxDQUFaO0FBQ0EsTUFBSUMsT0FBT0wsS0FBS00sYUFBaEI7QUFDQSxNQUFJQyxhQUFhLElBQWpCOztBQUVBLE1BQUlDLFNBQVNQLEtBQVQsQ0FBSixFQUFxQjtBQUNuQk0saUJBQWE7QUFDWEUsZUFBUztBQUFBLGVBQU1MLFFBQVFILEtBQWQ7QUFBQSxPQURFO0FBRVhTLGdCQUFVO0FBQUEsZUFBTU4sUUFBUUgsS0FBZDtBQUFBO0FBRkMsS0FBYjtBQUlELEdBTEQsTUFLTyxJQUFJVSxPQUFPVixLQUFQLENBQUosRUFBbUI7QUFDeEIsUUFBSVEsVUFBVUcsT0FBT1AsSUFBUCxFQUFhSixLQUFiLElBQXNCO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FBdEIsR0FBb0M7QUFBQSxhQUFNSSxTQUFTSixLQUFmO0FBQUEsS0FBbEQ7QUFDQSxRQUFJUyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxhQUFNTCxRQUFRSixLQUFSLElBQWlCLENBQUNELEtBQUthLDBCQUE3QjtBQUFBLEtBQWY7QUFDQU4saUJBQWEsRUFBQ0UsZ0JBQUQsRUFBVUMsa0JBQVYsRUFBYjtBQUNELEdBSk0sTUFJQTtBQUNMLFVBQU0sSUFBSVAsS0FBSixDQUFVTixPQUFWLENBQU47QUFDRDs7QUFFRCxTQUFPVSxXQUFXRSxPQUFYLE1BQXdCLENBQUNKLE9BQU9MLEtBQUtjLFFBQUwsRUFBUixNQUE2QixJQUE1RCxFQUFrRTtBQUNoRVYsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9ULFdBQVdHLFFBQVgsTUFBeUIsQ0FBQ0wsT0FBT0wsS0FBS2lCLFlBQUwsRUFBUixNQUFpQyxJQUFqRSxFQUF1RTtBQUNyRWIsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9aLEtBQVA7QUFDRDs7QUFHRCxTQUFTSSxRQUFULENBQWtCVSxDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNDLE1BQU1DLFNBQVNGLENBQVQsQ0FBTixDQUFELElBQXVCRyxTQUFTSCxDQUFULENBQTlCO0FBQ0Q7O0FBR0QsU0FBU1AsTUFBVCxDQUFnQk4sSUFBaEIsRUFBc0I7QUFDcEIsU0FBT0EsS0FBS2lCLFFBQUwsS0FBa0J2QixTQUF6QjtBQUNEOztBQUdELFNBQVNhLE1BQVQsQ0FBZ0JXLEdBQWhCLEVBQXFCbEIsSUFBckIsRUFBMkI7QUFDekIsTUFBSWtCLFFBQVFsQixJQUFaLEVBQWtCLE9BQU8sS0FBUDs7QUFFbEIsTUFBSW1CLFNBQVMsSUFBYjtBQUNBLE1BQUlDLE9BQU8sQ0FBQ0YsR0FBRCxFQUFNRyxNQUFOLENBQWEsNEJBQVVILEdBQVYsQ0FBYixFQUE2QkksT0FBN0IsRUFBWDtBQUNBLE1BQUlDLFFBQVEsQ0FBQ3ZCLElBQUQsRUFBT3FCLE1BQVAsQ0FBYyw0QkFBVXJCLElBQVYsQ0FBZCxFQUErQnNCLE9BQS9CLEVBQVo7O0FBRUEsU0FBT0YsS0FBSyxDQUFMLE1BQVlHLE1BQU0sQ0FBTixDQUFuQixFQUE2QjtBQUMzQkosYUFBU0MsS0FBS0ksS0FBTCxFQUFUO0FBQ0FELFVBQU1DLEtBQU47QUFDRDs7QUFFREosU0FBT0EsS0FBSyxDQUFMLENBQVA7QUFDQUcsVUFBUUEsTUFBTSxDQUFOLENBQVI7O0FBRUEsTUFBSUUsSUFBSSwwQkFBUU4sT0FBT08sVUFBZixFQUEyQk4sSUFBM0IsQ0FBUjtBQUNBLE1BQUlPLElBQUksMEJBQVFSLE9BQU9PLFVBQWYsRUFBMkJILEtBQTNCLENBQVI7O0FBRUEsU0FBT0UsSUFBSUUsQ0FBWDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFuY2VzdG9ycyBmcm9tICdhbmNlc3RvcnMnXG5pbXBvcnQgaW5kZXhPZiBmcm9tICdpbmRleC1vZidcblxuY29uc3QgRV9TSE9XID0gJ0FyZ3VtZW50IDEgb2Ygc2VlayBtdXN0IHVzZSBmaWx0ZXIgTm9kZUZpbHRlci5TSE9XX1RFWFQuJ1xuY29uc3QgRV9XSEVSRSA9ICdBcmd1bWVudCAyIG9mIHNlZWsgbXVzdCBiZSBhIG51bWJlciBvciBhIFRleHQgTm9kZS4nXG5cbmNvbnN0IFNIT1dfVEVYVCA9IDRcbmNvbnN0IFRFWFRfTk9ERSA9IDNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWVrKGl0ZXIsIHdoZXJlKSB7XG4gIGlmIChpdGVyLndoYXRUb1Nob3cgIT09IFNIT1dfVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1NIT1cpXG4gIH1cblxuICBsZXQgY291bnQgPSAwXG4gIGxldCBub2RlID0gaXRlci5yZWZlcmVuY2VOb2RlXG4gIGxldCBwcmVkaWNhdGVzID0gbnVsbFxuXG4gIGlmIChpc051bWJlcih3aGVyZSkpIHtcbiAgICBwcmVkaWNhdGVzID0ge1xuICAgICAgZm9yd2FyZDogKCkgPT4gY291bnQgPCB3aGVyZSxcbiAgICAgIGJhY2t3YXJkOiAoKSA9PiBjb3VudCA+IHdoZXJlLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHQod2hlcmUpKSB7XG4gICAgbGV0IGZvcndhcmQgPSBiZWZvcmUobm9kZSwgd2hlcmUpID8gKCkgPT4gZmFsc2UgOiAoKSA9PiBub2RlICE9PSB3aGVyZVxuICAgIGxldCBiYWNrd2FyZCA9ICgpID0+IG5vZGUgIT0gd2hlcmUgfHwgIWl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICBwcmVkaWNhdGVzID0ge2ZvcndhcmQsIGJhY2t3YXJkfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1dIRVJFKVxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuZm9yd2FyZCgpICYmIChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCkge1xuICAgIGNvdW50ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aFxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuYmFja3dhcmQoKSAmJiAobm9kZSA9IGl0ZXIucHJldmlvdXNOb2RlKCkpICE9PSBudWxsKSB7XG4gICAgY291bnQgLT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuXG5mdW5jdGlvbiBpc051bWJlcihuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobikpICYmIGlzRmluaXRlKG4pXG59XG5cblxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZShyZWYsIG5vZGUpIHtcbiAgaWYgKHJlZiA9PT0gbm9kZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNvbW1vbiA9IG51bGxcbiAgbGV0IGxlZnQgPSBbcmVmXS5jb25jYXQoYW5jZXN0b3JzKHJlZikpLnJldmVyc2UoKVxuICBsZXQgcmlnaHQgPSBbbm9kZV0uY29uY2F0KGFuY2VzdG9ycyhub2RlKSkucmV2ZXJzZSgpXG5cbiAgd2hpbGUgKGxlZnRbMF0gPT09IHJpZ2h0WzBdKSB7XG4gICAgY29tbW9uID0gbGVmdC5zaGlmdCgpXG4gICAgcmlnaHQuc2hpZnQoKVxuICB9XG5cbiAgbGVmdCA9IGxlZnRbMF1cbiAgcmlnaHQgPSByaWdodFswXVxuXG4gIGxldCBsID0gaW5kZXhPZihjb21tb24uY2hpbGROb2RlcywgbGVmdClcbiAgbGV0IHIgPSBpbmRleE9mKGNvbW1vbi5jaGlsZE5vZGVzLCByaWdodClcblxuICByZXR1cm4gbCA+IHJcbn1cbiJdfQ==","module.exports = require('./lib')['default'];\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rangeToString;\n/* global Node */\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n } while (node);\n\n /* istanbul ignore next */\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true /* skip children */);\n }\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true /* skip children */);\n }\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS10by1zdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBcUR3QixhO0FBckR4Qjs7QUFFQTs7O0FBR0EsU0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCLFlBQXhCLEVBQXNDO0FBQ3BDLE1BQUksQ0FBQyxZQUFELElBQWlCLEtBQUssVUFBMUIsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFFRCxLQUFHO0FBQ0QsUUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsYUFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELFdBQU8sS0FBSyxVQUFaO0FBQ0QsR0FMRCxRQUtTLElBTFQ7O0FBT0E7QUFDQSxTQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFDeEIsTUFBSSxNQUFNLGNBQU4sQ0FBcUIsUUFBckIsS0FBa0MsS0FBSyxZQUEzQyxFQUF5RDtBQUN2RCxRQUFNLE9BQU8sTUFBTSxjQUFOLENBQXFCLFVBQXJCLENBQWdDLE1BQU0sV0FBdEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sY0FBZixFQUErQixJQUEvQixDQUFvQyxtQkFBcEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxNQUFNLGNBQWI7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsS0FBeEIsRUFBK0I7QUFDN0IsTUFBSSxNQUFNLFlBQU4sQ0FBbUIsUUFBbkIsS0FBZ0MsS0FBSyxZQUF6QyxFQUF1RDtBQUNyRCxRQUFNLE9BQU8sTUFBTSxZQUFOLENBQW1CLFVBQW5CLENBQThCLE1BQU0sU0FBcEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sWUFBZixFQUE2QixJQUE3QixDQUFrQyxtQkFBbEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxTQUFTLE1BQU0sWUFBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxFQUF1QztBQUNyQyxNQUFJLE9BQU8sVUFBVSxLQUFWLENBQVg7QUFDQSxNQUFNLFVBQVUsZUFBZSxLQUFmLENBQWhCO0FBQ0EsU0FBTyxTQUFTLE9BQWhCLEVBQXlCO0FBQ3ZCLE9BQUcsSUFBSDtBQUNBLFdBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNGOztBQUVEOzs7Ozs7O0FBT2UsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCO0FBQzNDO0FBQ0E7QUFDQSxNQUFJLE9BQU8sRUFBWDtBQUNBLHFCQUFtQixLQUFuQixFQUEwQixVQUFDLElBQUQsRUFBVTtBQUNsQyxRQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFNBQTNCLEVBQXNDO0FBQ3BDO0FBQ0Q7QUFDRCxRQUFNLFFBQVEsU0FBUyxNQUFNLGNBQWYsR0FBZ0MsTUFBTSxXQUF0QyxHQUFvRCxDQUFsRTtBQUNBLFFBQU0sTUFBTSxTQUFTLE1BQU0sWUFBZixHQUE4QixNQUFNLFNBQXBDLEdBQWdELEtBQUssV0FBTCxDQUFpQixNQUE3RTtBQUNBLFlBQVEsS0FBSyxXQUFMLENBQWlCLEtBQWpCLENBQXVCLEtBQXZCLEVBQThCLEdBQTlCLENBQVI7QUFDRCxHQVBEO0FBUUEsU0FBTyxJQUFQO0FBQ0QiLCJmaWxlIjoicmFuZ2UtdG8tc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIE5vZGUgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgbm9kZSBhZnRlciBgbm9kZWAgaW4gYSB0cmVlIG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG5leHROb2RlKG5vZGUsIHNraXBDaGlsZHJlbikge1xuICBpZiAoIXNraXBDaGlsZHJlbiAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkXG4gIH1cblxuICBkbyB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgfSB3aGlsZSAobm9kZSlcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiBmaXJzdE5vZGUocmFuZ2UpIHtcbiAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XVxuICAgIHJldHVybiBub2RlIHx8IG5leHROb2RlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0cnVlIC8qIHNraXAgY2hpbGRyZW4gKi8pXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnN0YXJ0Q29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGZpcnN0Tm9kZUFmdGVyKHJhbmdlKSB7XG4gIGlmIChyYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF1cbiAgICByZXR1cm4gbm9kZSB8fCBuZXh0Tm9kZShyYW5nZS5lbmRDb250YWluZXIsIHRydWUgLyogc2tpcCBjaGlsZHJlbiAqLylcbiAgfVxuICByZXR1cm4gbmV4dE5vZGUocmFuZ2UuZW5kQ29udGFpbmVyKVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIGNiKSB7XG4gIGxldCBub2RlID0gZmlyc3ROb2RlKHJhbmdlKVxuICBjb25zdCBwYXN0RW5kID0gZmlyc3ROb2RlQWZ0ZXIocmFuZ2UpXG4gIHdoaWxlIChub2RlICE9PSBwYXN0RW5kKSB7XG4gICAgY2Iobm9kZSlcbiAgICBub2RlID0gbmV4dE5vZGUobm9kZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgcG9ueWZpbGwgZm9yIFJhbmdlLnRvU3RyaW5nKCkuXG4gKiBTcGVjOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yYW5nZS1zdHJpbmdpZmllclxuICpcbiAqIFdvcmtzIGFyb3VuZCB0aGUgYnVnZ3kgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBpbiBJRSBhbmQgRWRnZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGlsZ292aS9kb20tYW5jaG9yLXRleHQtcG9zaXRpb24vaXNzdWVzLzRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhyYW5nZSkge1xuICAvLyBUaGlzIGlzIGEgZmFpcmx5IGRpcmVjdCB0cmFuc2xhdGlvbiBvZiB0aGUgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvblxuICAvLyBpbiBCbGluay5cbiAgbGV0IHRleHQgPSAnJ1xuICBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlID09PSByYW5nZS5zdGFydENvbnRhaW5lciA/IHJhbmdlLnN0YXJ0T2Zmc2V0IDogMFxuICAgIGNvbnN0IGVuZCA9IG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lciA/IHJhbmdlLmVuZE9mZnNldCA6IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoXG4gICAgdGV4dCArPSBub2RlLnRleHRDb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0pXG4gIHJldHVybiB0ZXh0XG59XG5cbiJdfQ==","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domNodeIterator = require('dom-node-iterator');\n\nvar _domNodeIterator2 = _interopRequireDefault(_domNodeIterator);\n\nvar _domSeek = require('dom-seek');\n\nvar _domSeek2 = _interopRequireDefault(_domSeek);\n\nvar _rangeToString = require('./range-to-string');\n\nvar _rangeToString2 = _interopRequireDefault(_rangeToString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n\n var start = (0, _rangeToString2.default)(prefix).length;\n var end = start + (0, _rangeToString2.default)(range).length;\n\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = (0, _domNodeIterator2.default)(root, SHOW_TEXT);\n\n var start = selector.start || 0;\n var end = selector.end || start;\n var count = (0, _domSeek2.default)(iter, start);\n var remainder = start - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setStart(iter.referenceNode, remainder);\n } else {\n range.setStart(iter.nextNode(), remainder);\n iter.previousNode();\n }\n\n var length = end - start + remainder;\n count = (0, _domSeek2.default)(iter, length);\n remainder = length - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setEnd(iter.referenceNode, remainder);\n } else {\n range.setEnd(iter.nextNode(), remainder);\n }\n\n return range;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQU9nQixTLEdBQUEsUztRQTJCQSxPLEdBQUEsTzs7QUFsQ2hCOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxZQUFZLENBQWxCOztBQUVPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxNQUFJLFNBQVMsU0FBYixFQUF3QjtBQUN0QixVQUFNLElBQUksS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUksVUFBVSxTQUFkLEVBQXlCO0FBQ3ZCLFVBQU0sSUFBSSxLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxTQUFTLFNBQVMsV0FBVCxFQUFiOztBQUVBLE1BQUksWUFBWSxNQUFNLGNBQXRCO0FBQ0EsTUFBSSxjQUFjLE1BQU0sV0FBeEI7O0FBRUEsU0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLENBQXRCO0FBQ0EsU0FBTyxNQUFQLENBQWMsU0FBZCxFQUF5QixXQUF6Qjs7QUFFQSxNQUFJLFFBQVEsNkJBQWMsTUFBZCxFQUFzQixNQUFsQztBQUNBLE1BQUksTUFBTSxRQUFRLDZCQUFjLEtBQWQsRUFBcUIsTUFBdkM7O0FBRUEsU0FBTztBQUNMLFdBQU8sS0FERjtBQUVMLFNBQUs7QUFGQSxHQUFQO0FBSUQ7O0FBR00sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXNDO0FBQUEsTUFBZixRQUFlLHlEQUFKLEVBQUk7O0FBQzNDLE1BQUksU0FBUyxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSSxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxRQUFRLFNBQVMsV0FBVCxFQUFaO0FBQ0EsTUFBSSxPQUFPLCtCQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFYOztBQUVBLE1BQUksUUFBUSxTQUFTLEtBQVQsSUFBa0IsQ0FBOUI7QUFDQSxNQUFJLE1BQU0sU0FBUyxHQUFULElBQWdCLEtBQTFCO0FBQ0EsTUFBSSxRQUFRLHVCQUFLLElBQUwsRUFBVyxLQUFYLENBQVo7QUFDQSxNQUFJLFlBQVksUUFBUSxLQUF4Qjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxRQUFOLENBQWUsS0FBSyxhQUFwQixFQUFtQyxTQUFuQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sUUFBTixDQUFlLEtBQUssUUFBTCxFQUFmLEVBQWdDLFNBQWhDO0FBQ0EsU0FBSyxZQUFMO0FBQ0Q7O0FBRUQsTUFBSSxTQUFVLE1BQU0sS0FBUCxHQUFnQixTQUE3QjtBQUNBLFVBQVEsdUJBQUssSUFBTCxFQUFXLE1BQVgsQ0FBUjtBQUNBLGNBQVksU0FBUyxLQUFyQjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxNQUFOLENBQWEsS0FBSyxhQUFsQixFQUFpQyxTQUFqQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sTUFBTixDQUFhLEtBQUssUUFBTCxFQUFiLEVBQThCLFNBQTlCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTm9kZUl0ZXJhdG9yIGZyb20gJ2RvbS1ub2RlLWl0ZXJhdG9yJ1xuaW1wb3J0IHNlZWsgZnJvbSAnZG9tLXNlZWsnXG5cbmltcG9ydCByYW5nZVRvU3RyaW5nIGZyb20gJy4vcmFuZ2UtdG8tc3RyaW5nJ1xuXG5jb25zdCBTSE9XX1RFWFQgPSA0XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IGRvY3VtZW50ID0gcm9vdC5vd25lckRvY3VtZW50XG4gIGxldCBwcmVmaXggPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG5cbiAgbGV0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGxldCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG5cbiAgcHJlZml4LnNldFN0YXJ0KHJvb3QsIDApXG4gIHByZWZpeC5zZXRFbmQoc3RhcnROb2RlLCBzdGFydE9mZnNldClcblxuICBsZXQgc3RhcnQgPSByYW5nZVRvU3RyaW5nKHByZWZpeCkubGVuZ3RoXG4gIGxldCBlbmQgPSBzdGFydCArIHJhbmdlVG9TdHJpbmcocmFuZ2UpLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFuZ2Uocm9vdCwgc2VsZWN0b3IgPSB7fSkge1xuICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJvb3RcIicpXG4gIH1cblxuICBsZXQgZG9jdW1lbnQgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICBsZXQgaXRlciA9IGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCBTSE9XX1RFWFQpXG5cbiAgbGV0IHN0YXJ0ID0gc2VsZWN0b3Iuc3RhcnQgfHwgMFxuICBsZXQgZW5kID0gc2VsZWN0b3IuZW5kIHx8IHN0YXJ0XG4gIGxldCBjb3VudCA9IHNlZWsoaXRlciwgc3RhcnQpXG4gIGxldCByZW1haW5kZXIgPSBzdGFydCAtIGNvdW50XG5cbiAgaWYgKGl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGUpIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLnJlZmVyZW5jZU5vZGUsIHJlbWFpbmRlcilcbiAgfSBlbHNlIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgICBpdGVyLnByZXZpb3VzTm9kZSgpXG4gIH1cblxuICBsZXQgbGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSArIHJlbWFpbmRlclxuICBjb3VudCA9IHNlZWsoaXRlciwgbGVuZ3RoKVxuICByZW1haW5kZXIgPSBsZW5ndGggLSBjb3VudFxuXG4gIGlmIChpdGVyLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgcmFuZ2Uuc2V0RW5kKGl0ZXIucmVmZXJlbmNlTm9kZSwgcmVtYWluZGVyKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlLnNldEVuZChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgfVxuXG4gIHJldHVybiByYW5nZVxufVxuIl19","module.exports = require('./lib')\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.fromTextPosition = fromTextPosition;\nexports.toRange = toRange;\nexports.toTextPosition = toTextPosition;\n\nvar _diffMatchPatch = require('diff-match-patch');\n\nvar _diffMatchPatch2 = _interopRequireDefault(_diffMatchPatch);\n\nvar _domAnchorTextPosition = require('dom-anchor-text-position');\n\nvar textPosition = _interopRequireWildcard(_domAnchorTextPosition);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The DiffMatchPatch bitap has a hard 32-character pattern length limit.\nvar SLICE_LENGTH = 32;\nvar SLICE_RE = new RegExp('(.|[\\r\\n]){1,' + String(SLICE_LENGTH) + '}', 'g');\nvar CONTEXT_LENGTH = SLICE_LENGTH;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var position = textPosition.fromRange(root, range);\n return fromTextPosition(root, position);\n}\n\nfunction fromTextPosition(root, selector) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var start = selector.start;\n\n if (start === undefined) {\n throw new Error('selector missing required property \"start\"');\n }\n if (start < 0) {\n throw new Error('property \"start\" must be a non-negative integer');\n }\n\n var end = selector.end;\n\n if (end === undefined) {\n throw new Error('selector missing required property \"end\"');\n }\n if (end < 0) {\n throw new Error('property \"end\" must be a non-negative integer');\n }\n\n var exact = root.textContent.substr(start, end - start);\n\n var prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n var prefix = root.textContent.substr(prefixStart, start - prefixStart);\n\n var suffixEnd = Math.min(root.textContent.length, end + CONTEXT_LENGTH);\n var suffix = root.textContent.substr(end, suffixEnd - end);\n\n return { exact: exact, prefix: prefix, suffix: suffix };\n}\n\nfunction toRange(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var position = toTextPosition(root, selector, options);\n if (position === null) {\n return null;\n } else {\n return textPosition.toRange(root, position);\n }\n}\n\nfunction toTextPosition(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var exact = selector.exact;\n\n if (exact === undefined) {\n throw new Error('selector missing required property \"exact\"');\n }\n\n var prefix = selector.prefix,\n suffix = selector.suffix;\n var hint = options.hint;\n\n var dmp = new _diffMatchPatch2.default();\n\n dmp.Match_Distance = root.textContent.length * 2;\n\n // Work around a hard limit of the DiffMatchPatch bitap implementation.\n // The search pattern must be no more than SLICE_LENGTH characters.\n var slices = exact.match(SLICE_RE);\n var loc = hint === undefined ? root.textContent.length / 2 | 0 : hint;\n var start = Number.POSITIVE_INFINITY;\n var end = Number.NEGATIVE_INFINITY;\n var result = -1;\n var havePrefix = prefix !== undefined;\n var haveSuffix = suffix !== undefined;\n var foundPrefix = false;\n\n // If the prefix is known then search for that first.\n if (havePrefix) {\n result = dmp.match_main(root.textContent, prefix, loc);\n if (result > -1) {\n loc = result + prefix.length;\n foundPrefix = true;\n }\n }\n\n // If we have a suffix, and the prefix wasn't found, then search for it.\n if (haveSuffix && !foundPrefix) {\n result = dmp.match_main(root.textContent, suffix, loc + exact.length);\n if (result > -1) {\n loc = result - exact.length;\n }\n }\n\n // Search for the first slice.\n var firstSlice = slices.shift();\n result = dmp.match_main(root.textContent, firstSlice, loc);\n if (result > -1) {\n start = result;\n loc = end = start + firstSlice.length;\n } else {\n return null;\n }\n\n // Create a fold function that will reduce slices to positional extents.\n var foldSlices = function foldSlices(acc, slice) {\n if (!acc) {\n // A search for an earlier slice of the pattern failed to match.\n return null;\n }\n\n var result = dmp.match_main(root.textContent, slice, acc.loc);\n if (result === -1) {\n return null;\n }\n\n // The next slice should follow this one closely.\n acc.loc = result + slice.length;\n\n // Expand the start and end to a quote that includes all the slices.\n acc.start = Math.min(acc.start, result);\n acc.end = Math.max(acc.end, result + slice.length);\n\n return acc;\n };\n\n // Use the fold function to establish the full quote extents.\n // Expect the slices to be close to one another.\n // This distance is deliberately generous for now.\n dmp.Match_Distance = 64;\n var acc = slices.reduce(foldSlices, { start: start, end: end, loc: loc });\n if (!acc) {\n return null;\n }\n\n return { start: acc.start, end: acc.end };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JD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ZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/ICgocm9vdC50ZXh0Q29udGVudC5sZW5ndGggLyAyKSB8IDApIDogaGludFxuICBsZXQgc3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IGVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICBsZXQgcmVzdWx0ID0gLTFcbiAgbGV0IGhhdmVQcmVmaXggPSBwcmVmaXggIT09IHVuZGVmaW5lZFxuICBsZXQgaGF2ZVN1ZmZpeCA9IHN1ZmZpeCAhPT0gdW5kZWZpbmVkXG4gIGxldCBmb3VuZFByZWZpeCA9IGZhbHNlXG5cbiAgLy8gSWYgdGhlIHByZWZpeCBpcyBrbm93biB0aGVuIHNlYXJjaCBmb3IgdGhhdCBmaXJzdC5cbiAgaWYgKGhhdmVQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBwcmVmaXgsIGxvYylcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCArIHByZWZpeC5sZW5ndGhcbiAgICAgIGZvdW5kUHJlZml4ID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSBzdWZmaXgsIGFuZCB0aGUgcHJlZml4IHdhc24ndCBmb3VuZCwgdGhlbiBzZWFyY2ggZm9yIGl0LlxuICBpZiAoaGF2ZVN1ZmZpeCAmJiAhZm91bmRQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBzdWZmaXgsIGxvYyArIGV4YWN0Lmxlbmd0aClcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCAtIGV4YWN0Lmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsaWNlLlxuICBsZXQgZmlyc3RTbGljZSA9IHNsaWNlcy5zaGlmdCgpXG4gIHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIGZpcnN0U2xpY2UsIGxvYylcbiAgaWYgKHJlc3VsdCA+IC0xKSB7XG4gICAgc3RhcnQgPSByZXN1bHRcbiAgICBsb2MgPSBlbmQgPSBzdGFydCArIGZpcnN0U2xpY2UubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGZvbGQgZnVuY3Rpb24gdGhhdCB3aWxsIHJlZHVjZSBzbGljZXMgdG8gcG9zaXRpb25hbCBleHRlbnRzLlxuICBsZXQgZm9sZFNsaWNlcyA9IChhY2MsIHNsaWNlKSA9PiB7XG4gICAgaWYgKCFhY2MpIHtcbiAgICAgIC8vIEEgc2VhcmNoIGZvciBhbiBlYXJsaWVyIHNsaWNlIG9mIHRoZSBwYXR0ZXJuIGZhaWxlZCB0byBtYXRjaC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIHNsaWNlLCBhY2MubG9jKVxuICAgIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHNsaWNlIHNob3VsZCBmb2xsb3cgdGhpcyBvbmUgY2xvc2VseS5cbiAgICBhY2MubG9jID0gcmVzdWx0ICsgc2xpY2UubGVuZ3RoXG5cbiAgICAvLyBFeHBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgdG8gYSBxdW90ZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgc2xpY2VzLlxuICAgIGFjYy5zdGFydCA9IE1hdGgubWluKGFjYy5zdGFydCwgcmVzdWx0KVxuICAgIGFjYy5lbmQgPSBNYXRoLm1heChhY2MuZW5kLCByZXN1bHQgKyBzbGljZS5sZW5ndGgpXG5cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICAvLyBVc2UgdGhlIGZvbGQgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBmdWxsIHF1b3RlIGV4dGVudHMuXG4gIC8vIEV4cGVjdCB0aGUgc2xpY2VzIHRvIGJlIGNsb3NlIHRvIG9uZSBhbm90aGVyLlxuICAvLyBUaGlzIGRpc3RhbmNlIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3Igbm93LlxuICBkbXAuTWF0Y2hfRGlzdGFuY2UgPSA2NFxuICBjb25zdCBhY2MgPSBzbGljZXMucmVkdWNlKGZvbGRTbGljZXMsIHtzdGFydCwgZW5kLCBsb2N9KVxuICBpZiAoIWFjYykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge3N0YXJ0OiBhY2Muc3RhcnQsIGVuZDogYWNjLmVuZH1cbn1cbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = seek;\nvar E_END = 'Iterator exhausted before seek ended.';\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.';\nvar DOCUMENT_POSITION_PRECEDING = 2;\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n var error; // istanbul ignore next\n\n try {\n error = new DOMException(E_SHOW, 'InvalidStateError');\n } catch (_unused) {\n error = new Error(E_SHOW);\n error.code = 11;\n error.name = 'InvalidStateError';\n\n error.toString = function () {\n return \"InvalidStateError: \".concat(E_SHOW);\n };\n }\n\n throw error;\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isInteger(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where || !iter.pointerBeforeReferenceNode;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n\n var backward = function backward() {\n return node !== where || !iter.pointerBeforeReferenceNode;\n };\n\n predicates = {\n forward: forward,\n backward: backward\n };\n } else {\n throw new TypeError(E_WHERE);\n }\n\n while (predicates.forward()) {\n node = iter.nextNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count += node.nodeValue.length;\n }\n\n if (iter.nextNode()) {\n node = iter.previousNode();\n }\n\n while (predicates.backward()) {\n node = iter.previousNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count -= node.nodeValue.length;\n }\n\n if (!isText(iter.referenceNode)) {\n throw new RangeError(E_END);\n }\n\n return count;\n}\n\nfunction isInteger(n) {\n if (typeof n !== 'number') return false;\n return isFinite(n) && Math.floor(n) === n;\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING;\n}\n//# sourceMappingURL=index.js.map","module.exports = require('./lib')['default'];\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = rangeToString;\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n\n node = node.parentNode;\n } while (node);\n /* istanbul ignore next */\n\n\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true\n /* skip children */\n );\n }\n\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true\n /* skip children */\n );\n }\n\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\n\n\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=range-to-string.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domSeek = _interopRequireDefault(require(\"dom-seek\"));\n\nvar _rangeToString = _interopRequireDefault(require(\"./range-to-string\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n var start = (0, _rangeToString[\"default\"])(prefix).length;\n var end = start + (0, _rangeToString[\"default\"])(range).length;\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = document.createNodeIterator(root, SHOW_TEXT);\n var start = selector.start || 0;\n var end = selector.end || start;\n var startOffset = start - (0, _domSeek[\"default\"])(iter, start);\n var startNode = iter.referenceNode;\n var remainder = end - start + startOffset;\n var endOffset = remainder - (0, _domSeek[\"default\"])(iter, remainder);\n var endNode = iter.referenceNode;\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n return range;\n}\n//# sourceMappingURL=index.js.map","import { normalizeUrl } from '../utils';\n\n// Format relative time\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n \n return date.toLocaleDateString();\n}\n\nexport class SeamsAnnotationCard extends HTMLElement {\n private _annotation: any = null;\n\n static get observedAttributes() {\n return [];\n }\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n set annotation(data: any) {\n this._annotation = data;\n this.render();\n }\n\n get annotation() {\n return this._annotation;\n }\n\n connectedCallback() {\n this.render();\n }\n\n async render() {\n if (!this._annotation || !this.shadowRoot) return;\n\n const { value, author } = this._annotation;\n const target = value.target;\n const body = value.body;\n const createdAt = value.createdAt;\n \n // Extract quote\n const textQuoteSelector = target.selector?.find(\n (s: any) => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector'\n );\n const quotedText = textQuoteSelector?.exact;\n\n const sourceUrl = target.url;\n const domain = sourceUrl ? this.getDomain(sourceUrl) : '';\n const fragmentUrl = this.buildTextFragmentUrl(sourceUrl, quotedText);\n\n // Author details\n const authorDid = author?.did || 'unknown';\n const authorHandle = author?.handle || (authorDid.includes(':') ? authorDid.split(':').pop() : authorDid);\n const avatarSrc = author?.avatar || `https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(authorHandle)}`;\n\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n \n .card {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .card:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n }\n\n .quote {\n margin: 0 0 12px 0;\n padding-left: 12px;\n border-left: 3px solid #FFD700;\n color: #444;\n font-style: italic;\n font-size: 0.95em;\n line-height: 1.5;\n }\n\n .body {\n color: #1a1a1a;\n font-size: 1em;\n line-height: 1.6;\n margin-bottom: 16px;\n white-space: pre-wrap;\n }\n\n .meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.85em;\n color: #666;\n border-top: 1px solid #f0f0f0;\n padding-top: 12px;\n }\n\n .author {\n display: flex;\n align-items: center;\n gap: 8px;\n text-decoration: none;\n color: inherit;\n }\n\n .author:hover {\n color: #2E7D32;\n }\n\n .avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n background: #eee;\n }\n\n .handle {\n font-weight: 500;\n }\n\n .source-link {\n color: #666;\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .source-link:hover {\n color: #2E7D32;\n text-decoration: underline;\n }\n\n .time {\n color: #999;\n }\n </style>\n\n <article class=\"card\">\n ${quotedText ? `<blockquote class=\"quote\">\"${quotedText}\"</blockquote>` : ''}\n ${body ? `<div class=\"body\">${this.escapeHtml(body)}</div>` : ''}\n \n <div class=\"meta\">\n <div class=\"left\">\n <a href=\"https://bsky.app/profile/${authorDid}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"author\">\n <img class=\"avatar\" src=\"${avatarSrc}\" alt=\"${authorHandle}'s avatar\" loading=\"lazy\" />\n <span class=\"handle\">@${authorHandle}</span>\n </a>\n </div>\n \n <div class=\"right\">\n <span class=\"time\">${formatRelativeTime(createdAt)}</span>\n ${domain ? `\n <span style=\"margin: 0 6px;\">•</span>\n <a href=\"${fragmentUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"source-link\">\n ${domain} ↗\n </a>\n ` : ''}\n </div>\n </div>\n </article>\n `;\n }\n\n private getDomain(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return url;\n }\n }\n\n private buildTextFragmentUrl(sourceUrl: string, exactText?: string): string {\n if (!sourceUrl || !exactText) return sourceUrl;\n try {\n const url = new URL(sourceUrl);\n url.hash = `:~:text=${encodeURIComponent(exactText)}`;\n return url.toString();\n } catch {\n return sourceUrl;\n }\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n\n// Register component if not already registered\nif (!customElements.get('seams-annotation-card')) {\n customElements.define('seams-annotation-card', SeamsAnnotationCard);\n}\n"],"names":["WebStorageAdapter","channelName","event","callback","keys","value","result","key","oldValue","change","diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","i","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","a","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","j","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","delta","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","chars","lineStart","lineEnd","lineArrayLength","line","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","length","pattern","found","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","html","pattern_amp","pattern_lt","pattern_gt","pattern_para","data","levenshtein","insertions","deletions","diffsLength","tokens","param","n","s","match_bitapScore_","e","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","start","finish","rd","charMatch","patch","padding","prefix","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","mod","paddingLength","extraLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","m","sign","coords1","coords2","module","exports","_classCallCheck","instance","Constructor","createNodeIterator","root","whatToShow","filter","doc","iter","NodeIterator","node","before","getPolyfill","_adapter","require$$0","_adapter2","_interopRequireDefault","_builtin","require$$1","_builtin2","_implementation","require$$2","_implementation2","obj","shim","_polyfill","_polyfill2","polyfill","_shim","_shim2","implementation","domNodeIteratorModule","require$$3","ancestors","parents","out","noop","indexOf","arr","ele","idx","len","seek","_ancestors","_ancestors2","_indexOf","_indexOf2","E_SHOW","E_WHERE","SHOW_TEXT","TEXT_NODE","where","count","predicates","isNumber","isText","forward","backward","ref","common","left","right","l","r","domSeek","rangeToString_1","rangeToString","nextNode","skipChildren","firstNode","range","firstNodeAfter","forEachNodeInRange","cb","pastEnd","end","lib","fromRange","toRange","_domNodeIterator","_domNodeIterator2","_domSeek","_domSeek2","_rangeToString","_rangeToString2","document","startNode","startOffset","selector","remainder","domAnchorTextPosition","fromTextPosition","toTextPosition","_diffMatchPatch","_diffMatchPatch2","_domAnchorTextPosition","textPosition","_interopRequireWildcard","newObj","SLICE_LENGTH","SLICE_RE","CONTEXT_LENGTH","position","exact","prefixStart","suffixEnd","options","hint","slices","havePrefix","haveSuffix","foundPrefix","firstSlice","foldSlices","acc","slice","E_END","DOCUMENT_POSITION_PRECEDING","error","isInteger","endOffset","endNode","formatRelativeTime","dateString","date","diffMs","diffSecs","diffMins","diffHours","diffDays","SeamsAnnotationCard","_a","author","target","body","createdAt","textQuoteSelector","quotedText","sourceUrl","domain","fragmentUrl","authorDid","authorHandle","avatarSrc","url","exactText","div"],"mappings":"AAGO,MAAMA,EAA4C,CAIvD,YAAYC,EAAsB,gBAAiB,CAFnD,KAAQ,UAAoD,CAAA,EAG1D,KAAK,QAAU,IAAI,iBAAiBA,CAAW,EAE/C,KAAK,QAAQ,UAAaC,GAAU,CAClC,KAAK,UAAU,QAAQC,GAAYA,EAASD,EAAM,IAAI,CAAC,CACzD,CACF,CAEA,MAAM,IAAIE,EAAuC,CAC/C,GAAI,OAAOA,GAAS,SAAU,CAC5B,MAAMC,EAAQ,aAAa,QAAQD,CAAI,EACvC,OAAOC,EAAQ,KAAK,MAAMA,CAAK,EAAI,IACrC,CAEA,MAAMC,EAA8B,CAAA,EACpC,OAAAF,EAAK,QAAQG,GAAO,CAClB,MAAMF,EAAQ,aAAa,QAAQE,CAAG,EACtCD,EAAOC,CAAG,EAAIF,EAAQ,KAAK,MAAMA,CAAK,EAAI,IAC5C,CAAC,EACMC,CACT,CAEA,MAAM,IAAIC,EAAaF,EAA2B,CAChD,MAAMG,EAAW,MAAM,KAAK,IAAID,CAAG,EACnC,aAAa,QAAQA,EAAK,KAAK,UAAUF,CAAK,CAAC,EAE/C,MAAMI,EAAwB,CAAE,IAAAF,EAAK,SAAUF,EAAO,SAAAG,CAAA,EACtD,KAAK,QAAQ,YAAYC,CAAM,EAG/B,KAAK,UAAU,QAAQN,GAAYA,EAASM,CAAM,CAAC,CACrD,CAEA,SAASN,EAAiD,CACxD,KAAK,UAAU,KAAKA,CAAQ,CAC9B,CAEA,OAAc,CACZ,KAAK,QAAQ,MAAA,CACf,CACF,sCCnBA,IAAIO,EAAmB,UAAW,CAMhC,KAAK,aAAe,EAEpB,KAAK,cAAgB,EAErB,KAAK,gBAAkB,GAIvB,KAAK,eAAiB,IAKtB,KAAK,sBAAwB,GAE7B,KAAK,aAAe,EAGpB,KAAK,cAAgB,EACvB,EAWIC,EAAc,GACdC,EAAc,EACdC,EAAa,EAWjBH,EAAiB,KAAO,SAASI,EAAIC,EAAM,CACzC,MAAO,CAACD,EAAIC,CAAI,CAClB,EAeAL,EAAiB,UAAU,UAAY,SAASM,EAAOC,EAAOC,EAC1DC,EAAc,CAEZ,OAAOA,EAAgB,MACrB,KAAK,cAAgB,EACvBA,EAAe,OAAO,UAEtBA,EAAgB,IAAI,OAAM,QAAO,EAAK,KAAK,aAAe,KAG9D,IAAIC,EAAWD,EAGf,GAAIH,GAAS,MAAQC,GAAS,KAC5B,MAAM,IAAI,MAAM,yBAAyB,EAI3C,GAAID,GAASC,EACX,OAAID,EACK,CAAC,IAAIN,EAAiB,KAAKG,EAAYG,CAAK,CAAC,EAE/C,CAAA,EAGL,OAAOE,EAAkB,MAC3BA,EAAiB,IAEnB,IAAIG,EAAaH,EAGbI,EAAe,KAAK,kBAAkBN,EAAOC,CAAK,EAClDM,EAAeP,EAAM,UAAU,EAAGM,CAAY,EAClDN,EAAQA,EAAM,UAAUM,CAAY,EACpCL,EAAQA,EAAM,UAAUK,CAAY,EAGpCA,EAAe,KAAK,kBAAkBN,EAAOC,CAAK,EAClD,IAAIO,EAAeR,EAAM,UAAUA,EAAM,OAASM,CAAY,EAC9DN,EAAQA,EAAM,UAAU,EAAGA,EAAM,OAASM,CAAY,EACtDL,EAAQA,EAAM,UAAU,EAAGA,EAAM,OAASK,CAAY,EAGtD,IAAIG,EAAQ,KAAK,cAAcT,EAAOC,EAAOI,EAAYD,CAAQ,EAGjE,OAAIG,GACFE,EAAM,QAAQ,IAAIf,EAAiB,KAAKG,EAAYU,CAAY,CAAC,EAE/DC,GACFC,EAAM,KAAK,IAAIf,EAAiB,KAAKG,EAAYW,CAAY,CAAC,EAEhE,KAAK,kBAAkBC,CAAK,EACrBA,CACT,EAeAf,EAAiB,UAAU,cAAgB,SAASM,EAAOC,EAAOI,EAC9DD,EAAU,CACZ,IAAIK,EAEJ,GAAI,CAACT,EAEH,MAAO,CAAC,IAAIN,EAAiB,KAAKE,EAAaK,CAAK,CAAC,EAGvD,GAAI,CAACA,EAEH,MAAO,CAAC,IAAIP,EAAiB,KAAKC,EAAaK,CAAK,CAAC,EAGvD,IAAIU,EAAWV,EAAM,OAASC,EAAM,OAASD,EAAQC,EACjDU,EAAYX,EAAM,OAASC,EAAM,OAASA,EAAQD,EAClDY,EAAIF,EAAS,QAAQC,CAAS,EAClC,GAAIC,GAAK,GAEP,OAAAH,EAAQ,CAAC,IAAIf,EAAiB,KAAKE,EAAac,EAAS,UAAU,EAAGE,CAAC,CAAC,EAC/D,IAAIlB,EAAiB,KAAKG,EAAYc,CAAS,EAC/C,IAAIjB,EAAiB,KAAKE,EACtBc,EAAS,UAAUE,EAAID,EAAU,MAAM,CAAC,CAAC,EAElDX,EAAM,OAASC,EAAM,SACvBQ,EAAM,CAAC,EAAE,CAAC,EAAIA,EAAM,CAAC,EAAE,CAAC,EAAId,GAEvBc,EAGT,GAAIE,EAAU,QAAU,EAGtB,MAAO,CAAC,IAAIjB,EAAiB,KAAKC,EAAaK,CAAK,EAC5C,IAAIN,EAAiB,KAAKE,EAAaK,CAAK,CAAC,EAIvD,IAAIY,EAAK,KAAK,gBAAgBb,EAAOC,CAAK,EAC1C,GAAIY,EAAI,CAEN,IAAIC,EAAUD,EAAG,CAAC,EACdE,EAAUF,EAAG,CAAC,EACdG,EAAUH,EAAG,CAAC,EACdI,EAAUJ,EAAG,CAAC,EACdK,EAAaL,EAAG,CAAC,EAEjBM,EAAU,KAAK,UAAUL,EAASE,EAASX,EAAYD,CAAQ,EAC/DgB,EAAU,KAAK,UAAUL,EAASE,EAASZ,EAAYD,CAAQ,EAEnE,OAAOe,EAAQ,OAAO,CAAC,IAAIzB,EAAiB,KAAKG,EAAYqB,CAAU,CAAC,EAClDE,CAAO,CACjC,CAEE,OAAIf,GAAcL,EAAM,OAAS,KAAOC,EAAM,OAAS,IAC9C,KAAK,eAAeD,EAAOC,EAAOG,CAAQ,EAG5C,KAAK,aAAaJ,EAAOC,EAAOG,CAAQ,CACjD,EAaAV,EAAiB,UAAU,eAAiB,SAASM,EAAOC,EAAOG,EAAU,CAE3E,IAAIiB,EAAI,KAAK,mBAAmBrB,EAAOC,CAAK,EAC5CD,EAAQqB,EAAE,OACVpB,EAAQoB,EAAE,OACV,IAAIC,EAAYD,EAAE,UAEdZ,EAAQ,KAAK,UAAUT,EAAOC,EAAO,GAAOG,CAAQ,EAGxD,KAAK,mBAAmBK,EAAOa,CAAS,EAExC,KAAK,qBAAqBb,CAAK,EAI/BA,EAAM,KAAK,IAAIf,EAAiB,KAAKG,EAAY,EAAE,CAAC,EAMpD,QALI0B,EAAU,EACVC,EAAe,EACfC,EAAe,EACfC,EAAc,GACdC,EAAc,GACXJ,EAAUd,EAAM,QAAQ,CAC7B,OAAQA,EAAMc,CAAO,EAAE,CAAC,EAAC,CACvB,KAAK3B,EACH6B,IACAE,GAAelB,EAAMc,CAAO,EAAE,CAAC,EAC/B,MACF,KAAK5B,EACH6B,IACAE,GAAejB,EAAMc,CAAO,EAAE,CAAC,EAC/B,MACF,KAAK1B,EAEH,GAAI2B,GAAgB,GAAKC,GAAgB,EAAG,CAE1ChB,EAAM,OAAOc,EAAUC,EAAeC,EACzBD,EAAeC,CAAY,EACxCF,EAAUA,EAAUC,EAAeC,EAGnC,QAFIG,EACA,KAAK,UAAUF,EAAaC,EAAa,GAAOvB,CAAQ,EACnDyB,EAAID,EAAQ,OAAS,EAAGC,GAAK,EAAGA,IACvCpB,EAAM,OAAOc,EAAS,EAAGK,EAAQC,CAAC,CAAC,EAErCN,EAAUA,EAAUK,EAAQ,MACtC,CACQH,EAAe,EACfD,EAAe,EACfE,EAAc,GACdC,EAAc,GACd,MAEJJ,GACJ,CACE,OAAAd,EAAM,IAAG,EAEFA,CACT,EAaAf,EAAiB,UAAU,aAAe,SAASM,EAAOC,EAAOG,EAAU,CAWzE,QATI0B,EAAe9B,EAAM,OACrB+B,EAAe9B,EAAM,OACrB+B,EAAQ,KAAK,MAAMF,EAAeC,GAAgB,CAAC,EACnDE,EAAWD,EACXE,EAAW,EAAIF,EACfG,EAAK,IAAI,MAAMD,CAAQ,EACvBE,EAAK,IAAI,MAAMF,CAAQ,EAGlBG,EAAI,EAAGA,EAAIH,EAAUG,IAC5BF,EAAGE,CAAC,EAAI,GACRD,EAAGC,CAAC,EAAI,GAEVF,EAAGF,EAAW,CAAC,EAAI,EACnBG,EAAGH,EAAW,CAAC,EAAI,EAWnB,QAVIK,EAAQR,EAAeC,EAGvBQ,EAASD,EAAQ,GAAK,EAGtBE,EAAU,EACVC,EAAQ,EACRC,EAAU,EACVC,EAAQ,EACHC,EAAI,EAAGA,EAAIZ,GAEb,MAAI,KAAI,EAAI,QAAO,EAAK5B,GAFJwC,IAAK,CAO9B,QAASC,EAAK,CAACD,EAAIJ,EAASK,GAAMD,EAAIH,EAAOI,GAAM,EAAG,CACpD,IAAIC,EAAYb,EAAWY,EACvBE,EACAF,GAAM,CAACD,GAAMC,GAAMD,GAAKT,EAAGW,EAAY,CAAC,EAAIX,EAAGW,EAAY,CAAC,EAC9DC,EAAKZ,EAAGW,EAAY,CAAC,EAErBC,EAAKZ,EAAGW,EAAY,CAAC,EAAI,EAG3B,QADIE,EAAKD,EAAKF,EACPE,EAAKjB,GAAgBkB,EAAKjB,GAC1B/B,EAAM,OAAO+C,CAAE,GAAK9C,EAAM,OAAO+C,CAAE,GACxCD,IACAC,IAGF,GADAb,EAAGW,CAAS,EAAIC,EACZA,EAAKjB,EAEPW,GAAS,UACAO,EAAKjB,EAEdS,GAAW,UACFD,EAAO,CAChB,IAAIU,EAAYhB,EAAWK,EAAQO,EACnC,GAAII,GAAa,GAAKA,EAAYf,GAAYE,EAAGa,CAAS,GAAK,GAAI,CAEjE,IAAIC,EAAKpB,EAAeM,EAAGa,CAAS,EACpC,GAAIF,GAAMG,EAER,OAAO,KAAK,kBAAkBlD,EAAOC,EAAO8C,EAAIC,EAAI5C,CAAQ,CAExE,CACA,CACA,CAGI,QAAS+C,EAAK,CAACP,EAAIF,EAASS,GAAMP,EAAID,EAAOQ,GAAM,EAAG,CACpD,IAAIF,EAAYhB,EAAWkB,EACvBD,EACAC,GAAM,CAACP,GAAMO,GAAMP,GAAKR,EAAGa,EAAY,CAAC,EAAIb,EAAGa,EAAY,CAAC,EAC9DC,EAAKd,EAAGa,EAAY,CAAC,EAErBC,EAAKd,EAAGa,EAAY,CAAC,EAAI,EAG3B,QADIG,EAAKF,EAAKC,EACPD,EAAKpB,GAAgBsB,EAAKrB,GAC1B/B,EAAM,OAAO8B,EAAeoB,EAAK,CAAC,GAClCjD,EAAM,OAAO8B,EAAeqB,EAAK,CAAC,GACvCF,IACAE,IAGF,GADAhB,EAAGa,CAAS,EAAIC,EACZA,EAAKpB,EAEPa,GAAS,UACAS,EAAKrB,EAEdW,GAAW,UACF,CAACH,EAAO,CACjB,IAAIO,EAAYb,EAAWK,EAAQa,EACnC,GAAIL,GAAa,GAAKA,EAAYZ,GAAYC,EAAGW,CAAS,GAAK,GAAI,CACjE,IAAIC,EAAKZ,EAAGW,CAAS,EACjBE,EAAKf,EAAWc,EAAKD,EAGzB,GADAI,EAAKpB,EAAeoB,EAChBH,GAAMG,EAER,OAAO,KAAK,kBAAkBlD,EAAOC,EAAO8C,EAAIC,EAAI5C,CAAQ,CAExE,CACA,CACA,CACA,CAGE,MAAO,CAAC,IAAIV,EAAiB,KAAKC,EAAaK,CAAK,EAC5C,IAAIN,EAAiB,KAAKE,EAAaK,CAAK,CAAC,CACvD,EAcAP,EAAiB,UAAU,kBAAoB,SAASM,EAAOC,EAAOoC,EAAGgB,EACrEjD,EAAU,CACZ,IAAIkD,EAAStD,EAAM,UAAU,EAAGqC,CAAC,EAC7BkB,EAAStD,EAAM,UAAU,EAAGoD,CAAC,EAC7BG,EAASxD,EAAM,UAAUqC,CAAC,EAC1BoB,EAASxD,EAAM,UAAUoD,CAAC,EAG1B5C,EAAQ,KAAK,UAAU6C,EAAQC,EAAQ,GAAOnD,CAAQ,EACtDsD,EAAS,KAAK,UAAUF,EAAQC,EAAQ,GAAOrD,CAAQ,EAE3D,OAAOK,EAAM,OAAOiD,CAAM,CAC5B,EAcAhE,EAAiB,UAAU,mBAAqB,SAASM,EAAOC,EAAO,CACrE,IAAI0D,EAAY,CAAA,EACZC,EAAW,CAAA,EAIfD,EAAU,CAAC,EAAI,GAUf,SAASE,EAAwB9D,EAAM,CASrC,QARI+D,EAAQ,GAIRC,EAAY,EACZC,EAAU,GAEVC,EAAkBN,EAAU,OACzBK,EAAUjE,EAAK,OAAS,GAAG,CAChCiE,EAAUjE,EAAK,QAAQ;AAAA,EAAMgE,CAAS,EAClCC,GAAW,KACbA,EAAUjE,EAAK,OAAS,GAE1B,IAAImE,EAAOnE,EAAK,UAAUgE,EAAWC,EAAU,CAAC,GAE5CJ,EAAS,eAAiBA,EAAS,eAAeM,CAAI,EACrDN,EAASM,CAAI,IAAM,QACtBJ,GAAS,OAAO,aAAaF,EAASM,CAAI,CAAC,GAEvCD,GAAmBE,IAGrBD,EAAOnE,EAAK,UAAUgE,CAAS,EAC/BC,EAAUjE,EAAK,QAEjB+D,GAAS,OAAO,aAAaG,CAAe,EAC5CL,EAASM,CAAI,EAAID,EACjBN,EAAUM,GAAiB,EAAIC,GAEjCH,EAAYC,EAAU,CAC5B,CACI,OAAOF,CACX,CAEE,IAAIK,EAAW,IACXC,EAASP,EAAwB7D,CAAK,EAC1CmE,EAAW,MACX,IAAIE,EAASR,EAAwB5D,CAAK,EAC1C,MAAO,CAAC,OAAQmE,EAAQ,OAAQC,EAAQ,UAAWV,CAAS,CAC9D,EAUAjE,EAAiB,UAAU,mBAAqB,SAASe,EAAOkD,EAAW,CACzE,QAAS/C,EAAI,EAAGA,EAAIH,EAAM,OAAQG,IAAK,CAGrC,QAFIkD,EAAQrD,EAAMG,CAAC,EAAE,CAAC,EAClBb,EAAO,CAAA,EACF8B,EAAI,EAAGA,EAAIiC,EAAM,OAAQjC,IAChC9B,EAAK8B,CAAC,EAAI8B,EAAUG,EAAM,WAAWjC,CAAC,CAAC,EAEzCpB,EAAMG,CAAC,EAAE,CAAC,EAAIb,EAAK,KAAK,EAAE,CAC9B,CACA,EAUAL,EAAiB,UAAU,kBAAoB,SAASM,EAAOC,EAAO,CAEpE,GAAI,CAACD,GAAS,CAACC,GAASD,EAAM,OAAO,CAAC,GAAKC,EAAM,OAAO,CAAC,EACvD,MAAO,GAQT,QAJIqE,EAAa,EACbC,EAAa,KAAK,IAAIvE,EAAM,OAAQC,EAAM,MAAM,EAChDuE,EAAaD,EACbE,EAAe,EACZH,EAAaE,GACdxE,EAAM,UAAUyE,EAAcD,CAAU,GACxCvE,EAAM,UAAUwE,EAAcD,CAAU,GAC1CF,EAAaE,EACbC,EAAeH,GAEfC,EAAaC,EAEfA,EAAa,KAAK,OAAOD,EAAaD,GAAc,EAAIA,CAAU,EAEpE,OAAOE,CACT,EASA9E,EAAiB,UAAU,kBAAoB,SAASM,EAAOC,EAAO,CAEpE,GAAI,CAACD,GAAS,CAACC,GACXD,EAAM,OAAOA,EAAM,OAAS,CAAC,GAAKC,EAAM,OAAOA,EAAM,OAAS,CAAC,EACjE,MAAO,GAQT,QAJIqE,EAAa,EACbC,EAAa,KAAK,IAAIvE,EAAM,OAAQC,EAAM,MAAM,EAChDuE,EAAaD,EACbG,EAAa,EACVJ,EAAaE,GACdxE,EAAM,UAAUA,EAAM,OAASwE,EAAYxE,EAAM,OAAS0E,CAAU,GACpEzE,EAAM,UAAUA,EAAM,OAASuE,EAAYvE,EAAM,OAASyE,CAAU,GACtEJ,EAAaE,EACbE,EAAaJ,GAEbC,EAAaC,EAEfA,EAAa,KAAK,OAAOD,EAAaD,GAAc,EAAIA,CAAU,EAEpE,OAAOE,CACT,EAWA9E,EAAiB,UAAU,oBAAsB,SAASM,EAAOC,EAAO,CAEtE,IAAI6B,EAAe9B,EAAM,OACrB+B,EAAe9B,EAAM,OAEzB,GAAI6B,GAAgB,GAAKC,GAAgB,EACvC,MAAO,GAGLD,EAAeC,EACjB/B,EAAQA,EAAM,UAAU8B,EAAeC,CAAY,EAC1CD,EAAeC,IACxB9B,EAAQA,EAAM,UAAU,EAAG6B,CAAY,GAEzC,IAAI6C,EAAc,KAAK,IAAI7C,EAAcC,CAAY,EAErD,GAAI/B,GAASC,EACX,OAAO0E,EAQT,QAFIC,EAAO,EACPC,EAAS,IACA,CACX,IAAIC,EAAU9E,EAAM,UAAU2E,EAAcE,CAAM,EAC9CE,EAAQ9E,EAAM,QAAQ6E,CAAO,EACjC,GAAIC,GAAS,GACX,OAAOH,EAETC,GAAUE,GACNA,GAAS,GAAK/E,EAAM,UAAU2E,EAAcE,CAAM,GAClD5E,EAAM,UAAU,EAAG4E,CAAM,KAC3BD,EAAOC,EACPA,IAEN,CACA,EAcAnF,EAAiB,UAAU,gBAAkB,SAASM,EAAOC,EAAO,CAClE,GAAI,KAAK,cAAgB,EAEvB,OAAO,KAET,IAAIS,EAAWV,EAAM,OAASC,EAAM,OAASD,EAAQC,EACjDU,EAAYX,EAAM,OAASC,EAAM,OAASA,EAAQD,EACtD,GAAIU,EAAS,OAAS,GAAKC,EAAU,OAAS,EAAID,EAAS,OACzD,OAAO,KAET,IAAIsE,EAAM,KAcV,SAASC,EAAiBvE,EAAUC,EAAWC,EAAG,CAMhD,QAJIsE,EAAOxE,EAAS,UAAUE,EAAGA,EAAI,KAAK,MAAMF,EAAS,OAAS,CAAC,CAAC,EAChEmB,EAAI,GACJsD,EAAc,GACdC,EAAiBC,EAAiBC,EAAkBC,GAChD1D,EAAIlB,EAAU,QAAQuE,EAAMrD,EAAI,CAAC,IAAM,IAAI,CACjD,IAAI2D,EAAeR,EAAI,kBAAkBtE,EAAS,UAAUE,CAAC,EACpBD,EAAU,UAAUkB,CAAC,CAAC,EAC3D4D,EAAeT,EAAI,kBAAkBtE,EAAS,UAAU,EAAGE,CAAC,EACvBD,EAAU,UAAU,EAAGkB,CAAC,CAAC,EAC9DsD,EAAY,OAASM,EAAeD,IACtCL,EAAcxE,EAAU,UAAUkB,EAAI4D,EAAc5D,CAAC,EACjDlB,EAAU,UAAUkB,EAAGA,EAAI2D,CAAY,EAC3CJ,EAAkB1E,EAAS,UAAU,EAAGE,EAAI6E,CAAY,EACxDJ,EAAkB3E,EAAS,UAAUE,EAAI4E,CAAY,EACrDF,EAAmB3E,EAAU,UAAU,EAAGkB,EAAI4D,CAAY,EAC1DF,EAAmB5E,EAAU,UAAUkB,EAAI2D,CAAY,EAE/D,CACI,OAAIL,EAAY,OAAS,GAAKzE,EAAS,OAC9B,CAAC0E,EAAiBC,EACjBC,EAAkBC,EAAkBJ,CAAW,EAEhD,IAEb,CAGE,IAAIO,EAAMT,EAAiBvE,EAAUC,EACV,KAAK,KAAKD,EAAS,OAAS,CAAC,CAAC,EAErDiF,EAAMV,EAAiBvE,EAAUC,EACV,KAAK,KAAKD,EAAS,OAAS,CAAC,CAAC,EACrDG,EACJ,GAAI,CAAC6E,GAAO,CAACC,EACX,OAAO,KACGA,EAEAD,EAIV7E,EAAK6E,EAAI,CAAC,EAAE,OAASC,EAAI,CAAC,EAAE,OAASD,EAAMC,EAH3C9E,EAAK8E,EAFL9E,EAAK6E,EASP,IAAI5E,EAASC,EAASC,EAASC,EAC3BjB,EAAM,OAASC,EAAM,QACvBa,EAAUD,EAAG,CAAC,EACdE,EAAUF,EAAG,CAAC,EACdG,EAAUH,EAAG,CAAC,EACdI,EAAUJ,EAAG,CAAC,IAEdG,EAAUH,EAAG,CAAC,EACdI,EAAUJ,EAAG,CAAC,EACdC,EAAUD,EAAG,CAAC,EACdE,EAAUF,EAAG,CAAC,GAEhB,IAAIK,EAAaL,EAAG,CAAC,EACrB,MAAO,CAACC,EAASC,EAASC,EAASC,EAASC,CAAU,CACxD,EAOAxB,EAAiB,UAAU,qBAAuB,SAASe,EAAO,CAchE,QAbImF,EAAU,GACVC,EAAa,CAAA,EACbC,EAAmB,EAEnBC,EAAe,KAEfxE,EAAU,EAEVyE,EAAqB,EACrBC,EAAoB,EAEpBC,EAAqB,EACrBC,EAAoB,EACjB5E,EAAUd,EAAM,QACjBA,EAAMc,CAAO,EAAE,CAAC,GAAK1B,GACvBgG,EAAWC,GAAkB,EAAIvE,EACjCyE,EAAqBE,EACrBD,EAAoBE,EACpBD,EAAqB,EACrBC,EAAoB,EACpBJ,EAAetF,EAAMc,CAAO,EAAE,CAAC,IAE3Bd,EAAMc,CAAO,EAAE,CAAC,GAAK3B,EACvBsG,GAAsBzF,EAAMc,CAAO,EAAE,CAAC,EAAE,OAExC4E,GAAqB1F,EAAMc,CAAO,EAAE,CAAC,EAAE,OAIrCwE,GAAiBA,EAAa,QAC9B,KAAK,IAAIC,EAAoBC,CAAiB,GAC7CF,EAAa,QAAU,KAAK,IAAIG,EACAC,CAAiB,IAEpD1F,EAAM,OAAOoF,EAAWC,EAAmB,CAAC,EAAG,EAClC,IAAIpG,EAAiB,KAAKC,EAAaoG,CAAY,CAAC,EAEjEtF,EAAMoF,EAAWC,EAAmB,CAAC,EAAI,CAAC,EAAE,CAAC,EAAIlG,EAEjDkG,IAEAA,IACAvE,EAAUuE,EAAmB,EAAID,EAAWC,EAAmB,CAAC,EAAI,GACpEE,EAAqB,EACrBC,EAAoB,EACpBC,EAAqB,EACrBC,EAAoB,EACpBJ,EAAe,KACfH,EAAU,KAGdrE,IAgBF,IAZIqE,GACF,KAAK,kBAAkBnF,CAAK,EAE9B,KAAK,6BAA6BA,CAAK,EAQvCc,EAAU,EACHA,EAAUd,EAAM,QAAQ,CAC7B,GAAIA,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAK5B,GACzBc,EAAMc,CAAO,EAAE,CAAC,GAAK3B,EAAa,CACpC,IAAIwG,EAAW3F,EAAMc,EAAU,CAAC,EAAE,CAAC,EAC/B8E,EAAY5F,EAAMc,CAAO,EAAE,CAAC,EAC5B+E,EAAkB,KAAK,oBAAoBF,EAAUC,CAAS,EAC9DE,EAAkB,KAAK,oBAAoBF,EAAWD,CAAQ,EAC9DE,GAAmBC,GACjBD,GAAmBF,EAAS,OAAS,GACrCE,GAAmBD,EAAU,OAAS,KAExC5F,EAAM,OAAOc,EAAS,EAAG,IAAI7B,EAAiB,KAAKG,EAC/CwG,EAAU,UAAU,EAAGC,CAAe,CAAC,CAAC,EAC5C7F,EAAMc,EAAU,CAAC,EAAE,CAAC,EAChB6E,EAAS,UAAU,EAAGA,EAAS,OAASE,CAAe,EAC3D7F,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAI8E,EAAU,UAAUC,CAAe,EAC3D/E,MAGEgF,GAAmBH,EAAS,OAAS,GACrCG,GAAmBF,EAAU,OAAS,KAGxC5F,EAAM,OAAOc,EAAS,EAAG,IAAI7B,EAAiB,KAAKG,EAC/CuG,EAAS,UAAU,EAAGG,CAAe,CAAC,CAAC,EAC3C9F,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAI3B,EACxBa,EAAMc,EAAU,CAAC,EAAE,CAAC,EAChB8E,EAAU,UAAU,EAAGA,EAAU,OAASE,CAAe,EAC7D9F,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAI5B,EACxBc,EAAMc,EAAU,CAAC,EAAE,CAAC,EAChB6E,EAAS,UAAUG,CAAe,EACtChF,KAGJA,GACN,CACIA,GACJ,CACA,EASA7B,EAAiB,UAAU,6BAA+B,SAASe,EAAO,CAWxE,SAAS+F,EAA2BC,EAAKC,EAAK,CAC5C,GAAI,CAACD,GAAO,CAACC,EAEX,MAAO,GAQT,IAAIC,EAAQF,EAAI,OAAOA,EAAI,OAAS,CAAC,EACjCG,EAAQF,EAAI,OAAO,CAAC,EACpBG,EAAmBF,EAAM,MAAMjH,EAAiB,qBAAqB,EACrEoH,EAAmBF,EAAM,MAAMlH,EAAiB,qBAAqB,EACrEqH,EAAcF,GACdF,EAAM,MAAMjH,EAAiB,gBAAgB,EAC7CsH,EAAcF,GACdF,EAAM,MAAMlH,EAAiB,gBAAgB,EAC7CuH,EAAaF,GACbJ,EAAM,MAAMjH,EAAiB,eAAe,EAC5CwH,EAAaF,GACbJ,EAAM,MAAMlH,EAAiB,eAAe,EAC5CyH,EAAaF,GACbR,EAAI,MAAM/G,EAAiB,kBAAkB,EAC7C0H,EAAaF,GACbR,EAAI,MAAMhH,EAAiB,oBAAoB,EAEnD,OAAIyH,GAAcC,EAET,EACEH,GAAcC,EAEhB,EACEL,GAAoB,CAACE,GAAeC,EAEtC,EACED,GAAeC,EAEjB,EACEH,GAAoBC,EAEtB,EAEF,CACX,CAIE,QAFIvF,EAAU,EAEPA,EAAUd,EAAM,OAAS,GAAG,CACjC,GAAIA,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAK1B,GACzBY,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAK1B,EAAY,CAEvC,IAAIwH,EAAY5G,EAAMc,EAAU,CAAC,EAAE,CAAC,EAChC+F,EAAO7G,EAAMc,CAAO,EAAE,CAAC,EACvBgG,EAAY9G,EAAMc,EAAU,CAAC,EAAE,CAAC,EAGhCiG,EAAe,KAAK,kBAAkBH,EAAWC,CAAI,EACzD,GAAIE,EAAc,CAChB,IAAIC,EAAeH,EAAK,UAAUA,EAAK,OAASE,CAAY,EAC5DH,EAAYA,EAAU,UAAU,EAAGA,EAAU,OAASG,CAAY,EAClEF,EAAOG,EAAeH,EAAK,UAAU,EAAGA,EAAK,OAASE,CAAY,EAClED,EAAYE,EAAeF,CACnC,CAQM,QALIG,EAAgBL,EAChBM,EAAWL,EACXM,EAAgBL,EAChBM,EAAYrB,EAA2Ba,EAAWC,CAAI,EACtDd,EAA2Bc,EAAMC,CAAS,EACvCD,EAAK,OAAO,CAAC,IAAMC,EAAU,OAAO,CAAC,GAAG,CAC7CF,GAAaC,EAAK,OAAO,CAAC,EAC1BA,EAAOA,EAAK,UAAU,CAAC,EAAIC,EAAU,OAAO,CAAC,EAC7CA,EAAYA,EAAU,UAAU,CAAC,EACjC,IAAIO,EAAQtB,EAA2Ba,EAAWC,CAAI,EAClDd,EAA2Bc,EAAMC,CAAS,EAE1CO,GAASD,IACXA,EAAYC,EACZJ,EAAgBL,EAChBM,EAAWL,EACXM,EAAgBL,EAE1B,CAEU9G,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAKmG,IAEvBA,EACFjH,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAImG,GAExBjH,EAAM,OAAOc,EAAU,EAAG,CAAC,EAC3BA,KAEFd,EAAMc,CAAO,EAAE,CAAC,EAAIoG,EAChBC,EACFnH,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAIqG,GAExBnH,EAAM,OAAOc,EAAU,EAAG,CAAC,EAC3BA,KAGV,CACIA,GACJ,CACA,EAGA7B,EAAiB,sBAAwB,eACzCA,EAAiB,iBAAmB,KACpCA,EAAiB,gBAAkB,SACnCA,EAAiB,mBAAqB,WACtCA,EAAiB,qBAAuB,cAMxCA,EAAiB,UAAU,uBAAyB,SAASe,EAAO,CAgBlE,QAfImF,EAAU,GACVC,EAAa,CAAA,EACbC,EAAmB,EAEnBC,EAAe,KAEfxE,EAAU,EAEVwG,EAAU,GAEVC,EAAU,GAEVC,EAAW,GAEXC,EAAW,GACR3G,EAAUd,EAAM,QACjBA,EAAMc,CAAO,EAAE,CAAC,GAAK1B,GACnBY,EAAMc,CAAO,EAAE,CAAC,EAAE,OAAS,KAAK,gBAC/B0G,GAAYC,IAEfrC,EAAWC,GAAkB,EAAIvE,EACjCwG,EAAUE,EACVD,EAAUE,EACVnC,EAAetF,EAAMc,CAAO,EAAE,CAAC,IAG/BuE,EAAmB,EACnBC,EAAe,MAEjBkC,EAAWC,EAAW,KAElBzH,EAAMc,CAAO,EAAE,CAAC,GAAK5B,EACvBuI,EAAW,GAEXD,EAAW,GAUTlC,IAAkBgC,GAAWC,GAAWC,GAAYC,GACjCnC,EAAa,OAAS,KAAK,cAAgB,GAC3CgC,EAAUC,EAAUC,EAAWC,GAAa,KAEjEzH,EAAM,OAAOoF,EAAWC,EAAmB,CAAC,EAAG,EAClC,IAAIpG,EAAiB,KAAKC,EAAaoG,CAAY,CAAC,EAEjEtF,EAAMoF,EAAWC,EAAmB,CAAC,EAAI,CAAC,EAAE,CAAC,EAAIlG,EACjDkG,IACAC,EAAe,KACXgC,GAAWC,GAEbC,EAAWC,EAAW,GACtBpC,EAAmB,IAEnBA,IACAvE,EAAUuE,EAAmB,EACzBD,EAAWC,EAAmB,CAAC,EAAI,GACvCmC,EAAWC,EAAW,IAExBtC,EAAU,KAGdrE,IAGEqE,GACF,KAAK,kBAAkBnF,CAAK,CAEhC,EAQAf,EAAiB,UAAU,kBAAoB,SAASe,EAAO,CAE7DA,EAAM,KAAK,IAAIf,EAAiB,KAAKG,EAAY,EAAE,CAAC,EAOpD,QANI0B,EAAU,EACVC,EAAe,EACfC,EAAe,EACfC,EAAc,GACdC,EAAc,GACdrB,EACGiB,EAAUd,EAAM,QACrB,OAAQA,EAAMc,CAAO,EAAE,CAAC,EAAC,CACvB,KAAK3B,EACH6B,IACAE,GAAelB,EAAMc,CAAO,EAAE,CAAC,EAC/BA,IACA,MACF,KAAK5B,EACH6B,IACAE,GAAejB,EAAMc,CAAO,EAAE,CAAC,EAC/BA,IACA,MACF,KAAK1B,EAEC2B,EAAeC,EAAe,GAC5BD,IAAiB,GAAKC,IAAiB,IAEzCnB,EAAe,KAAK,kBAAkBqB,EAAaD,CAAW,EAC1DpB,IAAiB,IACdiB,EAAUC,EAAeC,EAAgB,GAC1ChB,EAAMc,EAAUC,EAAeC,EAAe,CAAC,EAAE,CAAC,GAClD5B,EACFY,EAAMc,EAAUC,EAAeC,EAAe,CAAC,EAAE,CAAC,GAC9CE,EAAY,UAAU,EAAGrB,CAAY,GAEzCG,EAAM,OAAO,EAAG,EAAG,IAAIf,EAAiB,KAAKG,EACzC8B,EAAY,UAAU,EAAGrB,CAAY,CAAC,CAAC,EAC3CiB,KAEFI,EAAcA,EAAY,UAAUrB,CAAY,EAChDoB,EAAcA,EAAY,UAAUpB,CAAY,GAGlDA,EAAe,KAAK,kBAAkBqB,EAAaD,CAAW,EAC1DpB,IAAiB,IACnBG,EAAMc,CAAO,EAAE,CAAC,EAAII,EAAY,UAAUA,EAAY,OAClDrB,CAAY,EAAIG,EAAMc,CAAO,EAAE,CAAC,EACpCI,EAAcA,EAAY,UAAU,EAAGA,EAAY,OAC/CrB,CAAY,EAChBoB,EAAcA,EAAY,UAAU,EAAGA,EAAY,OAC/CpB,CAAY,IAIpBiB,GAAWC,EAAeC,EAC1BhB,EAAM,OAAOc,EAASC,EAAeC,CAAY,EAC7CC,EAAY,SACdjB,EAAM,OAAOc,EAAS,EAClB,IAAI7B,EAAiB,KAAKC,EAAa+B,CAAW,CAAC,EACvDH,KAEEI,EAAY,SACdlB,EAAM,OAAOc,EAAS,EAClB,IAAI7B,EAAiB,KAAKE,EAAa+B,CAAW,CAAC,EACvDJ,KAEFA,KACSA,IAAY,GAAKd,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAK1B,GAEnDY,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAKd,EAAMc,CAAO,EAAE,CAAC,EACzCd,EAAM,OAAOc,EAAS,CAAC,GAEvBA,IAEFE,EAAe,EACfD,EAAe,EACfE,EAAc,GACdC,EAAc,GACd,MAGFlB,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,IAAM,IACjCA,EAAM,IAAG,EAMX,IAAImF,EAAU,GAGd,IAFArE,EAAU,EAEHA,EAAUd,EAAM,OAAS,GAC1BA,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAK1B,GACzBY,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAK1B,IAEvBY,EAAMc,CAAO,EAAE,CAAC,EAAE,UAAUd,EAAMc,CAAO,EAAE,CAAC,EAAE,OAC9Cd,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAE,MAAM,GAAKd,EAAMc,EAAU,CAAC,EAAE,CAAC,GAEvDd,EAAMc,CAAO,EAAE,CAAC,EAAId,EAAMc,EAAU,CAAC,EAAE,CAAC,EACpCd,EAAMc,CAAO,EAAE,CAAC,EAAE,UAAU,EAAGd,EAAMc,CAAO,EAAE,CAAC,EAAE,OACrBd,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAE,MAAM,EAC5Dd,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAId,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAId,EAAMc,EAAU,CAAC,EAAE,CAAC,EACpEd,EAAM,OAAOc,EAAU,EAAG,CAAC,EAC3BqE,EAAU,IACDnF,EAAMc,CAAO,EAAE,CAAC,EAAE,UAAU,EAAGd,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAE,MAAM,GAClEd,EAAMc,EAAU,CAAC,EAAE,CAAC,IAEtBd,EAAMc,EAAU,CAAC,EAAE,CAAC,GAAKd,EAAMc,EAAU,CAAC,EAAE,CAAC,EAC7Cd,EAAMc,CAAO,EAAE,CAAC,EACZd,EAAMc,CAAO,EAAE,CAAC,EAAE,UAAUd,EAAMc,EAAU,CAAC,EAAE,CAAC,EAAE,MAAM,EACxDd,EAAMc,EAAU,CAAC,EAAE,CAAC,EACxBd,EAAM,OAAOc,EAAU,EAAG,CAAC,EAC3BqE,EAAU,KAGdrE,IAGEqE,GACF,KAAK,kBAAkBnF,CAAK,CAEhC,EAWAf,EAAiB,UAAU,YAAc,SAASe,EAAO0H,EAAK,CAC5D,IAAI/D,EAAS,EACTC,EAAS,EACT+D,EAAc,EACdC,EAAc,EACdhG,EACJ,IAAKA,EAAI,EAAGA,EAAI5B,EAAM,SAChBA,EAAM4B,CAAC,EAAE,CAAC,IAAMzC,IAClBwE,GAAU3D,EAAM4B,CAAC,EAAE,CAAC,EAAE,QAEpB5B,EAAM4B,CAAC,EAAE,CAAC,IAAM1C,IAClB0E,GAAU5D,EAAM4B,CAAC,EAAE,CAAC,EAAE,QAEpB,EAAA+B,EAAS+D,IAPe9F,IAU5B+F,EAAchE,EACdiE,EAAchE,EAGhB,OAAI5D,EAAM,QAAU4B,GAAK5B,EAAM4B,CAAC,EAAE,CAAC,IAAM1C,EAChC0I,EAGFA,GAAeF,EAAMC,EAC9B,EAQA1I,EAAiB,UAAU,gBAAkB,SAASe,EAAO,CAM3D,QALI6H,EAAO,CAAA,EACPC,EAAc,KACdC,EAAa,KACbC,EAAa,KACbC,EAAe,MACVrG,EAAI,EAAGA,EAAI5B,EAAM,OAAQ4B,IAAK,CACrC,IAAIvC,EAAKW,EAAM4B,CAAC,EAAE,CAAC,EACfsG,EAAOlI,EAAM4B,CAAC,EAAE,CAAC,EACjBtC,EAAO4I,EAAK,QAAQJ,EAAa,OAAO,EAAE,QAAQC,EAAY,MAAM,EACnE,QAAQC,EAAY,MAAM,EAAE,QAAQC,EAAc,YAAY,EACnE,OAAQ5I,EAAE,CACR,KAAKF,EACH0I,EAAKjG,CAAC,EAAI,oCAAsCtC,EAAO,SACvD,MACF,KAAKJ,EACH2I,EAAKjG,CAAC,EAAI,oCAAsCtC,EAAO,SACvD,MACF,KAAKF,EACHyI,EAAKjG,CAAC,EAAI,SAAWtC,EAAO,UAC5B,MAER,CACE,OAAOuI,EAAK,KAAK,EAAE,CACrB,EAQA5I,EAAiB,UAAU,WAAa,SAASe,EAAO,CAEtD,QADIV,EAAO,CAAA,EACFsC,EAAI,EAAGA,EAAI5B,EAAM,OAAQ4B,IAC5B5B,EAAM4B,CAAC,EAAE,CAAC,IAAMzC,IAClBG,EAAKsC,CAAC,EAAI5B,EAAM4B,CAAC,EAAE,CAAC,GAGxB,OAAOtC,EAAK,KAAK,EAAE,CACrB,EAQAL,EAAiB,UAAU,WAAa,SAASe,EAAO,CAEtD,QADIV,EAAO,CAAA,EACFsC,EAAI,EAAGA,EAAI5B,EAAM,OAAQ4B,IAC5B5B,EAAM4B,CAAC,EAAE,CAAC,IAAM1C,IAClBI,EAAKsC,CAAC,EAAI5B,EAAM4B,CAAC,EAAE,CAAC,GAGxB,OAAOtC,EAAK,KAAK,EAAE,CACrB,EASAL,EAAiB,UAAU,iBAAmB,SAASe,EAAO,CAI5D,QAHImI,EAAc,EACdC,EAAa,EACbC,EAAY,EACPzG,EAAI,EAAGA,EAAI5B,EAAM,OAAQ4B,IAAK,CACrC,IAAIvC,EAAKW,EAAM4B,CAAC,EAAE,CAAC,EACfsG,EAAOlI,EAAM4B,CAAC,EAAE,CAAC,EACrB,OAAQvC,EAAE,CACR,KAAKF,EACHiJ,GAAcF,EAAK,OACnB,MACF,KAAKhJ,EACHmJ,GAAaH,EAAK,OAClB,MACF,KAAK9I,EAEH+I,GAAe,KAAK,IAAIC,EAAYC,CAAS,EAC7CD,EAAa,EACbC,EAAY,EACZ,MAER,CACE,OAAAF,GAAe,KAAK,IAAIC,EAAYC,CAAS,EACtCF,CACT,EAWAlJ,EAAiB,UAAU,aAAe,SAASe,EAAO,CAExD,QADIV,EAAO,CAAA,EACFsC,EAAI,EAAGA,EAAI5B,EAAM,OAAQ4B,IAChC,OAAQ5B,EAAM4B,CAAC,EAAE,CAAC,EAAC,CACjB,KAAKzC,EACHG,EAAKsC,CAAC,EAAI,IAAM,UAAU5B,EAAM4B,CAAC,EAAE,CAAC,CAAC,EACrC,MACF,KAAK1C,EACHI,EAAKsC,CAAC,EAAI,IAAM5B,EAAM4B,CAAC,EAAE,CAAC,EAAE,OAC5B,MACF,KAAKxC,EACHE,EAAKsC,CAAC,EAAI,IAAM5B,EAAM4B,CAAC,EAAE,CAAC,EAAE,OAC5B,MAGN,OAAOtC,EAAK,KAAK,GAAI,EAAE,QAAQ,OAAQ,GAAG,CAC5C,EAWAL,EAAiB,UAAU,eAAiB,SAASM,EAAOsC,EAAO,CAKjE,QAJI7B,EAAQ,CAAA,EACRsI,EAAc,EACdxH,EAAU,EACVyH,EAAS1G,EAAM,MAAM,KAAK,EACrBD,EAAI,EAAGA,EAAI2G,EAAO,OAAQ3G,IAAK,CAGtC,IAAI4G,EAAQD,EAAO3G,CAAC,EAAE,UAAU,CAAC,EACjC,OAAQ2G,EAAO3G,CAAC,EAAE,OAAO,CAAC,EAAC,CACzB,IAAK,IACH,GAAI,CACF5B,EAAMsI,GAAa,EACf,IAAIrJ,EAAiB,KAAKE,EAAa,UAAUqJ,CAAK,CAAC,CACrE,MAAqB,CAEX,MAAM,IAAI,MAAM,qCAAuCA,CAAK,CACtE,CACQ,MACF,IAAK,IAEL,IAAK,IACH,IAAIC,EAAI,SAASD,EAAO,EAAE,EAC1B,GAAI,MAAMC,CAAC,GAAKA,EAAI,EAClB,MAAM,IAAI,MAAM,qCAAuCD,CAAK,EAE9D,IAAIlJ,EAAOC,EAAM,UAAUuB,EAASA,GAAW2H,CAAC,EAC5CF,EAAO3G,CAAC,EAAE,OAAO,CAAC,GAAK,IACzB5B,EAAMsI,GAAa,EAAI,IAAIrJ,EAAiB,KAAKG,EAAYE,CAAI,EAEjEU,EAAMsI,GAAa,EAAI,IAAIrJ,EAAiB,KAAKC,EAAaI,CAAI,EAEpE,MACF,QAGE,GAAIiJ,EAAO3G,CAAC,EACV,MAAM,IAAI,MAAM,6CACA2G,EAAO3G,CAAC,CAAC,EAGnC,CACE,GAAId,GAAWvB,EAAM,OACnB,MAAM,IAAI,MAAM,iBAAmBuB,EAC/B,wCAA0CvB,EAAM,OAAS,IAAI,EAEnE,OAAOS,CACT,EAaAf,EAAiB,UAAU,WAAa,SAASK,EAAM+E,EAASqD,EAAK,CAEnE,GAAIpI,GAAQ,MAAQ+E,GAAW,MAAQqD,GAAO,KAC5C,MAAM,IAAI,MAAM,0BAA0B,EAI5C,OADAA,EAAM,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAKpI,EAAK,MAAM,CAAC,EACxCA,GAAQ+E,EAEH,EACG/E,EAAK,OAGNA,EAAK,UAAUoI,EAAKA,EAAMrD,EAAQ,MAAM,GAAKA,EAE/CqD,EAGA,KAAK,aAAapI,EAAM+E,EAASqD,CAAG,EANpC,EAQX,EAYAzI,EAAiB,UAAU,aAAe,SAASK,EAAM+E,EAASqD,EAAK,CACrE,GAAIrD,EAAQ,OAAS,KAAK,cACxB,MAAM,IAAI,MAAM,oCAAoC,EAItD,IAAIqE,EAAI,KAAK,gBAAgBrE,CAAO,EAEhCE,EAAM,KAUV,SAASoE,EAAkBC,EAAGhH,EAAG,CAC/B,IAAIiH,EAAWD,EAAIvE,EAAQ,OACvByE,EAAY,KAAK,IAAIpB,EAAM9F,CAAC,EAChC,OAAK2C,EAAI,eAIFsE,EAAYC,EAAYvE,EAAI,eAF1BuE,EAAY,EAAMD,CAG/B,CAGE,IAAIE,EAAkB,KAAK,gBAEvBC,EAAW1J,EAAK,QAAQ+E,EAASqD,CAAG,EACpCsB,GAAY,KACdD,EAAkB,KAAK,IAAIJ,EAAkB,EAAGK,CAAQ,EAAGD,CAAe,EAE1EC,EAAW1J,EAAK,YAAY+E,EAASqD,EAAMrD,EAAQ,MAAM,EACrD2E,GAAY,KACdD,EACI,KAAK,IAAIJ,EAAkB,EAAGK,CAAQ,EAAGD,CAAe,IAKhE,IAAIE,EAAY,GAAM5E,EAAQ,OAAS,EACvC2E,EAAW,GAKX,QAHIE,EAASC,EACTC,EAAU/E,EAAQ,OAAS/E,EAAK,OAChC+J,EACKlH,EAAI,EAAGA,EAAIkC,EAAQ,OAAQlC,IAAK,CAMvC,IAFA+G,EAAU,EACVC,EAAUC,EACHF,EAAUC,GACXR,EAAkBxG,EAAGuF,EAAMyB,CAAO,GAAKJ,EACzCG,EAAUC,EAEVC,EAAUD,EAEZA,EAAU,KAAK,OAAOC,EAAUF,GAAW,EAAIA,CAAO,EAGxDE,EAAUD,EACV,IAAIG,EAAQ,KAAK,IAAI,EAAG5B,EAAMyB,EAAU,CAAC,EACrCI,EAAS,KAAK,IAAI7B,EAAMyB,EAAS7J,EAAK,MAAM,EAAI+E,EAAQ,OAExDmF,EAAK,MAAMD,EAAS,CAAC,EACzBC,EAAGD,EAAS,CAAC,GAAK,GAAKpH,GAAK,EAC5B,QAASf,EAAImI,EAAQnI,GAAKkI,EAAOlI,IAAK,CAGpC,IAAIqI,EAAYf,EAAEpJ,EAAK,OAAO8B,EAAI,CAAC,CAAC,EAQpC,GAPIe,IAAM,EACRqH,EAAGpI,CAAC,GAAMoI,EAAGpI,EAAI,CAAC,GAAK,EAAK,GAAKqI,EAEjCD,EAAGpI,CAAC,GAAOoI,EAAGpI,EAAI,CAAC,GAAK,EAAK,GAAKqI,IACvBJ,EAAQjI,EAAI,CAAC,EAAIiI,EAAQjI,CAAC,IAAM,EAAK,GACxCiI,EAAQjI,EAAI,CAAC,EAEnBoI,EAAGpI,CAAC,EAAI6H,EAAW,CACrB,IAAI5B,EAAQsB,EAAkBxG,EAAGf,EAAI,CAAC,EAGtC,GAAIiG,GAAS0B,EAIX,GAFAA,EAAkB1B,EAClB2B,EAAW5H,EAAI,EACX4H,EAAWtB,EAEb4B,EAAQ,KAAK,IAAI,EAAG,EAAI5B,EAAMsB,CAAQ,MAGtC,MAGZ,CACA,CAEI,GAAIL,EAAkBxG,EAAI,EAAGuF,CAAG,EAAIqB,EAClC,MAEFM,EAAUG,CACd,CACE,OAAOR,CACT,EASA/J,EAAiB,UAAU,gBAAkB,SAASoF,EAAS,CAE7D,QADIqE,EAAI,CAAA,EACCvI,EAAI,EAAGA,EAAIkE,EAAQ,OAAQlE,IAClCuI,EAAErE,EAAQ,OAAOlE,CAAC,CAAC,EAAI,EAEzB,QAASA,EAAI,EAAGA,EAAIkE,EAAQ,OAAQlE,IAClCuI,EAAErE,EAAQ,OAAOlE,CAAC,CAAC,GAAK,GAAMkE,EAAQ,OAASlE,EAAI,EAErD,OAAOuI,CACT,EAaAzJ,EAAiB,UAAU,kBAAoB,SAASyK,EAAOpK,EAAM,CACnE,GAAIA,EAAK,QAAU,EAGnB,IAAIoK,EAAM,SAAW,KACnB,MAAM,MAAM,uBAAuB,EAOrC,QALIrF,EAAU/E,EAAK,UAAUoK,EAAM,OAAQA,EAAM,OAASA,EAAM,OAAO,EACnEC,EAAU,EAIPrK,EAAK,QAAQ+E,CAAO,GAAK/E,EAAK,YAAY+E,CAAO,GACjDA,EAAQ,OAAS,KAAK,cAAgB,KAAK,aAC3C,KAAK,cACVsF,GAAW,KAAK,aAChBtF,EAAU/E,EAAK,UAAUoK,EAAM,OAASC,EACfD,EAAM,OAASA,EAAM,QAAUC,CAAO,EAGjEA,GAAW,KAAK,aAGhB,IAAIC,EAAStK,EAAK,UAAUoK,EAAM,OAASC,EAASD,EAAM,MAAM,EAC5DE,GACFF,EAAM,MAAM,QAAQ,IAAIzK,EAAiB,KAAKG,EAAYwK,CAAM,CAAC,EAGnE,IAAIC,EAASvK,EAAK,UAAUoK,EAAM,OAASA,EAAM,QACrBA,EAAM,OAASA,EAAM,QAAUC,CAAO,EAC9DE,GACFH,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKG,EAAYyK,CAAM,CAAC,EAIhEH,EAAM,QAAUE,EAAO,OACvBF,EAAM,QAAUE,EAAO,OAEvBF,EAAM,SAAWE,EAAO,OAASC,EAAO,OACxCH,EAAM,SAAWE,EAAO,OAASC,EAAO,OAC1C,EAyBA5K,EAAiB,UAAU,WAAa,SAAS2B,EAAGkJ,EAAOC,EAAO,CAChE,IAAIxK,EAAOS,EACX,GAAI,OAAOY,GAAK,UAAY,OAAOkJ,GAAS,UACxC,OAAOC,EAAS,IAGlBxK,EAA8BqB,EAC9BZ,EAAQ,KAAK,UAAUT,EAA6BuK,EAAQ,EAAI,EAC5D9J,EAAM,OAAS,IACjB,KAAK,qBAAqBA,CAAK,EAC/B,KAAK,uBAAuBA,CAAK,WAE1BY,GAAK,OAAOA,GAAK,UAAY,OAAOkJ,EAAS,KACpD,OAAOC,EAAS,IAGlB/J,EAAuDY,EACvDrB,EAAQ,KAAK,WAAWS,CAAK,UACpB,OAAOY,GAAK,UAAYkJ,GAAS,OAAOA,GAAS,UACxD,OAAOC,EAAS,IAElBxK,EAA8BqB,EAC9BZ,EAAuD8J,UAC9C,OAAOlJ,GAAK,UAAY,OAAOkJ,GAAS,UAC/CC,GAAS,OAAOA,GAAS,SAG3BxK,EAA8BqB,EAC9BZ,EAAuD+J,MAEvD,OAAM,IAAI,MAAM,oCAAoC,EAGtD,GAAI/J,EAAM,SAAW,EACnB,MAAO,GAYT,QAVIgK,EAAU,CAAA,EACVN,EAAQ,IAAIzK,EAAiB,UAC7BgL,EAAkB,EAClBC,EAAc,EACdC,EAAc,EAIdC,EAAgB7K,EAChB8K,EAAiB9K,EACZqC,EAAI,EAAGA,EAAI5B,EAAM,OAAQ4B,IAAK,CACrC,IAAI0I,EAAYtK,EAAM4B,CAAC,EAAE,CAAC,EACtB2I,EAAYvK,EAAM4B,CAAC,EAAE,CAAC,EAQ1B,OANI,CAACqI,GAAmBK,IAAclL,IAEpCsK,EAAM,OAASQ,EACfR,EAAM,OAASS,GAGTG,EAAS,CACf,KAAKnL,EACHuK,EAAM,MAAMO,GAAiB,EAAIjK,EAAM4B,CAAC,EACxC8H,EAAM,SAAWa,EAAU,OAC3BF,EAAiBA,EAAe,UAAU,EAAGF,CAAW,EAAII,EAC3CF,EAAe,UAAUF,CAAW,EACrD,MACF,KAAKjL,EACHwK,EAAM,SAAWa,EAAU,OAC3Bb,EAAM,MAAMO,GAAiB,EAAIjK,EAAM4B,CAAC,EACxCyI,EAAiBA,EAAe,UAAU,EAAGF,CAAW,EACvCE,EAAe,UAAUF,EACrBI,EAAU,MAAM,EACrC,MACF,KAAKnL,EACCmL,EAAU,QAAU,EAAI,KAAK,cAC7BN,GAAmBjK,EAAM,QAAU4B,EAAI,GAEzC8H,EAAM,MAAMO,GAAiB,EAAIjK,EAAM4B,CAAC,EACxC8H,EAAM,SAAWa,EAAU,OAC3Bb,EAAM,SAAWa,EAAU,QAClBA,EAAU,QAAU,EAAI,KAAK,cAElCN,IACF,KAAK,kBAAkBP,EAAOU,CAAa,EAC3CJ,EAAQ,KAAKN,CAAK,EAClBA,EAAQ,IAAIzK,EAAiB,UAC7BgL,EAAkB,EAKlBG,EAAgBC,EAChBH,EAAcC,GAGlB,MAIAG,IAAcnL,IAChB+K,GAAeK,EAAU,QAEvBD,IAAcpL,IAChBiL,GAAeI,EAAU,OAE/B,CAEE,OAAIN,IACF,KAAK,kBAAkBP,EAAOU,CAAa,EAC3CJ,EAAQ,KAAKN,CAAK,GAGbM,CACT,EAQA/K,EAAiB,UAAU,eAAiB,SAAS+K,EAAS,CAG5D,QADIQ,EAAc,CAAA,EACT5I,EAAI,EAAGA,EAAIoI,EAAQ,OAAQpI,IAAK,CACvC,IAAI8H,EAAQM,EAAQpI,CAAC,EACjB6I,EAAY,IAAIxL,EAAiB,UACrCwL,EAAU,MAAQ,CAAA,EAClB,QAAS7H,EAAI,EAAGA,EAAI8G,EAAM,MAAM,OAAQ9G,IACtC6H,EAAU,MAAM7H,CAAC,EACb,IAAI3D,EAAiB,KAAKyK,EAAM,MAAM9G,CAAC,EAAE,CAAC,EAAG8G,EAAM,MAAM9G,CAAC,EAAE,CAAC,CAAC,EAEpE6H,EAAU,OAASf,EAAM,OACzBe,EAAU,OAASf,EAAM,OACzBe,EAAU,QAAUf,EAAM,QAC1Be,EAAU,QAAUf,EAAM,QAC1Bc,EAAY5I,CAAC,EAAI6I,CACrB,CACE,OAAOD,CACT,EAWAvL,EAAiB,UAAU,YAAc,SAAS+K,EAAS1K,EAAM,CAC/D,GAAI0K,EAAQ,QAAU,EACpB,MAAO,CAAC1K,EAAM,EAAE,EAIlB0K,EAAU,KAAK,eAAeA,CAAO,EAErC,IAAIU,EAAc,KAAK,iBAAiBV,CAAO,EAC/C1K,EAAOoL,EAAcpL,EAAOoL,EAE5B,KAAK,eAAeV,CAAO,EAO3B,QAFInI,EAAQ,EACR8I,EAAU,CAAA,EACL/I,EAAI,EAAGA,EAAIoI,EAAQ,OAAQpI,IAAK,CACvC,IAAIgJ,EAAeZ,EAAQpI,CAAC,EAAE,OAASC,EACnCtC,EAAQ,KAAK,WAAWyK,EAAQpI,CAAC,EAAE,KAAK,EACxCiJ,EACAC,EAAU,GAkBd,GAjBIvL,EAAM,OAAS,KAAK,eAGtBsL,EAAY,KAAK,WAAWvL,EAAMC,EAAM,UAAU,EAAG,KAAK,aAAa,EAC3CqL,CAAY,EACpCC,GAAa,KACfC,EAAU,KAAK,WAAWxL,EACtBC,EAAM,UAAUA,EAAM,OAAS,KAAK,aAAa,EACjDqL,EAAerL,EAAM,OAAS,KAAK,aAAa,GAChDuL,GAAW,IAAMD,GAAaC,KAEhCD,EAAY,MAIhBA,EAAY,KAAK,WAAWvL,EAAMC,EAAOqL,CAAY,EAEnDC,GAAa,GAEfF,EAAQ/I,CAAC,EAAI,GAEbC,GAASmI,EAAQpI,CAAC,EAAE,QAAUoI,EAAQpI,CAAC,EAAE,YACpC,CAEL+I,EAAQ/I,CAAC,EAAI,GACbC,EAAQgJ,EAAYD,EACpB,IAAIpL,EAMJ,GALIsL,GAAW,GACbtL,EAAQF,EAAK,UAAUuL,EAAWA,EAAYtL,EAAM,MAAM,EAE1DC,EAAQF,EAAK,UAAUuL,EAAWC,EAAU,KAAK,aAAa,EAE5DvL,GAASC,EAEXF,EAAOA,EAAK,UAAU,EAAGuL,CAAS,EAC3B,KAAK,WAAWb,EAAQpI,CAAC,EAAE,KAAK,EAChCtC,EAAK,UAAUuL,EAAYtL,EAAM,MAAM,MACzC,CAGL,IAAIS,EAAQ,KAAK,UAAUT,EAAOC,EAAO,EAAK,EAC9C,GAAID,EAAM,OAAS,KAAK,eACpB,KAAK,iBAAiBS,CAAK,EAAIT,EAAM,OACrC,KAAK,sBAEPoL,EAAQ/I,CAAC,EAAI,OACR,CACL,KAAK,6BAA6B5B,CAAK,EAGvC,QAFI+K,EAAS,EACTC,EACKpI,EAAI,EAAGA,EAAIoH,EAAQpI,CAAC,EAAE,MAAM,OAAQgB,IAAK,CAChD,IAAIqI,EAAMjB,EAAQpI,CAAC,EAAE,MAAMgB,CAAC,EACxBqI,EAAI,CAAC,IAAM7L,IACb4L,EAAS,KAAK,YAAYhL,EAAO+K,CAAM,GAErCE,EAAI,CAAC,IAAM9L,EACbG,EAAOA,EAAK,UAAU,EAAGuL,EAAYG,CAAM,EAAIC,EAAI,CAAC,EAC7C3L,EAAK,UAAUuL,EAAYG,CAAM,EAC/BC,EAAI,CAAC,IAAM/L,IACpBI,EAAOA,EAAK,UAAU,EAAGuL,EAAYG,CAAM,EACpC1L,EAAK,UAAUuL,EAAY,KAAK,YAAY7K,EACxC+K,EAASE,EAAI,CAAC,EAAE,MAAM,CAAC,GAEhCA,EAAI,CAAC,IAAM/L,IACb6L,GAAUE,EAAI,CAAC,EAAE,OAE/B,CACA,CACA,CACA,CACA,CAEE,OAAA3L,EAAOA,EAAK,UAAUoL,EAAY,OAAQpL,EAAK,OAASoL,EAAY,MAAM,EACnE,CAACpL,EAAMqL,CAAO,CACvB,EASA1L,EAAiB,UAAU,iBAAmB,SAAS+K,EAAS,CAG9D,QAFIkB,EAAgB,KAAK,aACrBR,EAAc,GACT9I,EAAI,EAAGA,GAAKsJ,EAAetJ,IAClC8I,GAAe,OAAO,aAAa9I,CAAC,EAItC,QAASA,EAAI,EAAGA,EAAIoI,EAAQ,OAAQpI,IAClCoI,EAAQpI,CAAC,EAAE,QAAUsJ,EACrBlB,EAAQpI,CAAC,EAAE,QAAUsJ,EAIvB,IAAIxB,EAAQM,EAAQ,CAAC,EACjBhK,EAAQ0J,EAAM,MAClB,GAAI1J,EAAM,QAAU,GAAKA,EAAM,CAAC,EAAE,CAAC,GAAKZ,EAEtCY,EAAM,QAAQ,IAAIf,EAAiB,KAAKG,EAAYsL,CAAW,CAAC,EAChEhB,EAAM,QAAUwB,EAChBxB,EAAM,QAAUwB,EAChBxB,EAAM,SAAWwB,EACjBxB,EAAM,SAAWwB,UACRA,EAAgBlL,EAAM,CAAC,EAAE,CAAC,EAAE,OAAQ,CAE7C,IAAImL,EAAcD,EAAgBlL,EAAM,CAAC,EAAE,CAAC,EAAE,OAC9CA,EAAM,CAAC,EAAE,CAAC,EAAI0K,EAAY,UAAU1K,EAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAIA,EAAM,CAAC,EAAE,CAAC,EACpE0J,EAAM,QAAUyB,EAChBzB,EAAM,QAAUyB,EAChBzB,EAAM,SAAWyB,EACjBzB,EAAM,SAAWyB,CACrB,CAKE,GAFAzB,EAAQM,EAAQA,EAAQ,OAAS,CAAC,EAClChK,EAAQ0J,EAAM,MACV1J,EAAM,QAAU,GAAKA,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,GAAKZ,EAErDY,EAAM,KAAK,IAAIf,EAAiB,KAAKG,EAAYsL,CAAW,CAAC,EAC7DhB,EAAM,SAAWwB,EACjBxB,EAAM,SAAWwB,UACRA,EAAgBlL,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,EAAE,OAAQ,CAE5D,IAAImL,EAAcD,EAAgBlL,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,EAAE,OAC7DA,EAAMA,EAAM,OAAS,CAAC,EAAE,CAAC,GAAK0K,EAAY,UAAU,EAAGS,CAAW,EAClEzB,EAAM,SAAWyB,EACjBzB,EAAM,SAAWyB,CACrB,CAEE,OAAOT,CACT,EASAzL,EAAiB,UAAU,eAAiB,SAAS+K,EAAS,CAE5D,QADIoB,EAAa,KAAK,cACbxJ,EAAI,EAAGA,EAAIoI,EAAQ,OAAQpI,IAClC,GAAI,EAAAoI,EAAQpI,CAAC,EAAE,SAAWwJ,GAG1B,KAAIC,EAAWrB,EAAQpI,CAAC,EAExBoI,EAAQ,OAAOpI,IAAK,CAAC,EAIrB,QAHI0J,EAASD,EAAS,OAClBE,EAASF,EAAS,OAClBG,EAAa,GACVH,EAAS,MAAM,SAAW,GAAG,CAElC,IAAI3B,EAAQ,IAAIzK,EAAiB,UAC7BwM,EAAQ,GAOZ,IANA/B,EAAM,OAAS4B,EAASE,EAAW,OACnC9B,EAAM,OAAS6B,EAASC,EAAW,OAC/BA,IAAe,KACjB9B,EAAM,QAAUA,EAAM,QAAU8B,EAAW,OAC3C9B,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKG,EAAYoM,CAAU,CAAC,GAE7DH,EAAS,MAAM,SAAW,GAC1B3B,EAAM,QAAU0B,EAAa,KAAK,cAAc,CACrD,IAAId,EAAYe,EAAS,MAAM,CAAC,EAAE,CAAC,EAC/Bd,EAAYc,EAAS,MAAM,CAAC,EAAE,CAAC,EAC/Bf,IAAcnL,GAEhBuK,EAAM,SAAWa,EAAU,OAC3BgB,GAAUhB,EAAU,OACpBb,EAAM,MAAM,KAAK2B,EAAS,MAAM,MAAK,CAAE,EACvCI,EAAQ,IACCnB,IAAcpL,GAAewK,EAAM,MAAM,QAAU,GACnDA,EAAM,MAAM,CAAC,EAAE,CAAC,GAAKtK,GACrBmL,EAAU,OAAS,EAAIa,GAEhC1B,EAAM,SAAWa,EAAU,OAC3Be,GAAUf,EAAU,OACpBkB,EAAQ,GACR/B,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKqL,EAAWC,CAAS,CAAC,EAChEc,EAAS,MAAM,MAAK,IAGpBd,EAAYA,EAAU,UAAU,EAC5Ba,EAAa1B,EAAM,QAAU,KAAK,YAAY,EAClDA,EAAM,SAAWa,EAAU,OAC3Be,GAAUf,EAAU,OAChBD,IAAclL,GAChBsK,EAAM,SAAWa,EAAU,OAC3BgB,GAAUhB,EAAU,QAEpBkB,EAAQ,GAEV/B,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKqL,EAAWC,CAAS,CAAC,EAC5DA,GAAac,EAAS,MAAM,CAAC,EAAE,CAAC,EAClCA,EAAS,MAAM,MAAK,EAEpBA,EAAS,MAAM,CAAC,EAAE,CAAC,EACfA,EAAS,MAAM,CAAC,EAAE,CAAC,EAAE,UAAUd,EAAU,MAAM,EAG/D,CAEMiB,EAAa,KAAK,WAAW9B,EAAM,KAAK,EACxC8B,EACIA,EAAW,UAAUA,EAAW,OAAS,KAAK,YAAY,EAE9D,IAAIE,EAAc,KAAK,WAAWL,EAAS,KAAK,EACzB,UAAU,EAAG,KAAK,YAAY,EACjDK,IAAgB,KAClBhC,EAAM,SAAWgC,EAAY,OAC7BhC,EAAM,SAAWgC,EAAY,OACzBhC,EAAM,MAAM,SAAW,GACvBA,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,EAAE,CAAC,IAAMtK,EAC7CsK,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,EAAE,CAAC,GAAKgC,EAE1ChC,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKG,EAAYsM,CAAW,CAAC,GAGlED,GACHzB,EAAQ,OAAO,EAAEpI,EAAG,EAAG8H,CAAK,CAEpC,EAEA,EAQAzK,EAAiB,UAAU,aAAe,SAAS+K,EAAS,CAE1D,QADI1K,EAAO,CAAA,EACFsC,EAAI,EAAGA,EAAIoI,EAAQ,OAAQpI,IAClCtC,EAAKsC,CAAC,EAAIoI,EAAQpI,CAAC,EAErB,OAAOtC,EAAK,KAAK,EAAE,CACrB,EASAL,EAAiB,UAAU,eAAiB,SAAS0M,EAAU,CAC7D,IAAI3B,EAAU,CAAA,EACd,GAAI,CAAC2B,EACH,OAAO3B,EAKT,QAHI1K,EAAOqM,EAAS,MAAM;AAAA,CAAI,EAC1BC,EAAc,EACdC,EAAc,uCACXD,EAActM,EAAK,QAAQ,CAChC,IAAIwM,EAAIxM,EAAKsM,CAAW,EAAE,MAAMC,CAAW,EAC3C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,yBAA2BxM,EAAKsM,CAAW,CAAC,EAE9D,IAAIlC,EAAQ,IAAIzK,EAAiB,UAyBjC,IAxBA+K,EAAQ,KAAKN,CAAK,EAClBA,EAAM,OAAS,SAASoC,EAAE,CAAC,EAAG,EAAE,EAC5BA,EAAE,CAAC,IAAM,IACXpC,EAAM,SACNA,EAAM,QAAU,GACPoC,EAAE,CAAC,GAAK,IACjBpC,EAAM,QAAU,GAEhBA,EAAM,SACNA,EAAM,QAAU,SAASoC,EAAE,CAAC,EAAG,EAAE,GAGnCpC,EAAM,OAAS,SAASoC,EAAE,CAAC,EAAG,EAAE,EAC5BA,EAAE,CAAC,IAAM,IACXpC,EAAM,SACNA,EAAM,QAAU,GACPoC,EAAE,CAAC,GAAK,IACjBpC,EAAM,QAAU,GAEhBA,EAAM,SACNA,EAAM,QAAU,SAASoC,EAAE,CAAC,EAAG,EAAE,GAEnCF,IAEOA,EAActM,EAAK,QAAQ,CAChC,IAAIyM,EAAOzM,EAAKsM,CAAW,EAAE,OAAO,CAAC,EACrC,GAAI,CACF,IAAInI,EAAO,UAAUnE,EAAKsM,CAAW,EAAE,UAAU,CAAC,CAAC,CAC3D,MAAmB,CAEX,MAAM,IAAI,MAAM,qCAAuCnI,CAAI,CACnE,CACM,GAAIsI,GAAQ,IAEVrC,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKC,EAAauE,CAAI,CAAC,UACpDsI,GAAQ,IAEjBrC,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKE,EAAasE,CAAI,CAAC,UACpDsI,GAAQ,IAEjBrC,EAAM,MAAM,KAAK,IAAIzK,EAAiB,KAAKG,EAAYqE,CAAI,CAAC,MACvD,IAAIsI,GAAQ,IAEjB,MACK,GAAIA,IAAS,GAIlB,MAAM,IAAI,MAAM,uBAAyBA,EAAO,SAAWtI,CAAI,EAEjEmI,GACN,CACA,CACE,OAAO5B,CACT,EAOA/K,EAAiB,UAAY,UAAW,CAEtC,KAAK,MAAQ,CAAA,EAEb,KAAK,OAAS,KAEd,KAAK,OAAS,KAEd,KAAK,QAAU,EAEf,KAAK,QAAU,CACjB,EASAA,EAAiB,UAAU,UAAU,SAAW,UAAW,CACzD,IAAI+M,EAASC,EACT,KAAK,UAAY,EACnBD,EAAU,KAAK,OAAS,KACf,KAAK,SAAW,EACzBA,EAAU,KAAK,OAAS,EAExBA,EAAW,KAAK,OAAS,EAAK,IAAM,KAAK,QAEvC,KAAK,UAAY,EACnBC,EAAU,KAAK,OAAS,KACf,KAAK,SAAW,EACzBA,EAAU,KAAK,OAAS,EAExBA,EAAW,KAAK,OAAS,EAAK,IAAM,KAAK,QAK3C,QAHI3M,EAAO,CAAC,OAAS0M,EAAU,KAAOC,EAAU;AAAA,CAAO,EACnD5M,EAEKuC,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IAAK,CAC1C,OAAQ,KAAK,MAAMA,CAAC,EAAE,CAAC,EAAC,CACtB,KAAKzC,EACHE,EAAK,IACL,MACF,KAAKH,EACHG,EAAK,IACL,MACF,KAAKD,EACHC,EAAK,IACL,MAEJC,EAAKsC,EAAI,CAAC,EAAIvC,EAAK,UAAU,KAAK,MAAMuC,CAAC,EAAE,CAAC,CAAC,EAAI;AAAA,CACrD,CACE,OAAOtC,EAAK,KAAK,EAAE,EAAE,QAAQ,OAAQ,GAAG,CAC1C,EAIA4M,EAAA,QAAiBjN,EACjBiN,EAAO,QAAQ,iBAAsBjN,EACrCiN,EAAO,QAAQ,YAAiBhN,EAChCgN,EAAO,QAAQ,YAAiB/M,EAChC+M,EAAO,QAAQ,WAAgB9M,wECvqE/B+M,EAAA,WAAqB,GAErB,SAASC,EAAgBC,EAAUC,EAAa,CAAE,GAAI,EAAED,aAAoBC,GAAgB,MAAM,IAAI,UAAU,mCAAmC,CAAI,CAEvJH,EAAQ,QAAaI,EAGrB,SAASA,EAAmBC,EAAM,CAChC,IAAIC,EAAa,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,WAAa,UAAU,CAAC,EAC3FC,EAAS,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,KAAO,UAAU,CAAC,EAEjFC,EAAMH,EAAK,UAAY,GAAKA,EAAK,cACjCI,EAAOD,EAAI,mBAAmBH,EAAMC,EAAYC,EAAQ,EAAK,EACjE,OAAO,IAAIG,EAAaD,EAAMJ,EAAMC,EAAYC,CAAM,CACxD,CAEA,IAAIG,EAAe,UAAY,CAC7B,SAASA,EAAaD,EAAMJ,EAAMC,EAAYC,EAAQ,CACpDN,EAAgB,KAAMS,CAAY,EAElC,KAAK,KAAOL,EACZ,KAAK,WAAaC,EAClB,KAAK,OAASC,EACd,KAAK,cAAgBF,EACrB,KAAK,2BAA6B,GAClC,KAAK,MAAQI,CACjB,CAEE,OAAAC,EAAa,UAAU,SAAW,UAAoB,CACpD,IAAIhO,EAAS,KAAK,MAAM,SAAQ,EAEhC,OADA,KAAK,2BAA6B,GAC9BA,IAAW,KAAa,MAC5B,KAAK,cAAgBA,EACd,KAAK,cAChB,EAEEgO,EAAa,UAAU,aAAe,UAAwB,CAC5D,IAAIhO,EAAS,KAAK,MAAM,aAAY,EAEpC,OADA,KAAK,2BAA6B,GAC9BA,IAAW,KAAa,MAC5B,KAAK,cAAgBA,EACd,KAAK,cAChB,EAEEgO,EAAa,UAAU,SAAW,UAAoB,CACpD,MAAO,uBACX,EAESA,CACT,EAAC,6BCjDDV,EAAA,WAAqB,GACrBA,EAAQ,QAAaI,EAGrB,SAASA,EAAmBC,EAAM,CAChC,IAAIC,EAAa,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,WAAa,UAAU,CAAC,EAC3FC,EAAS,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,KAAO,UAAU,CAAC,EAEjFC,EAAMH,EAAK,cACf,OAAOG,EAAI,mBAAmB,KAAKA,EAAKH,EAAMC,EAAYC,CAAM,CAClE,6BCVAP,EAAA,WAAqB,GAErB,SAASC,EAAgBC,EAAUC,EAAa,CAAE,GAAI,EAAED,aAAoBC,GAAgB,MAAM,IAAI,UAAU,mCAAmC,CAAI,CAEvJH,EAAQ,QAAaI,EAGrB,SAASA,EAAmBC,EAAM,CAChC,IAAIC,EAAa,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,WAAa,UAAU,CAAC,EAC3FC,EAAS,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,KAAO,UAAU,CAAC,EAErF,OAAO,IAAIG,EAAaL,EAAMC,EAAYC,CAAM,CAClD,CAEA,IAAIG,EAAe,UAAY,CAC7B,SAASA,EAAaL,EAAMC,EAAYC,EAAQ,CAC9CN,EAAgB,KAAMS,CAAY,EAElC,KAAK,KAAOL,EACZ,KAAK,WAAaC,EAClB,KAAK,OAASC,EACd,KAAK,cAAgBF,EACrB,KAAK,2BAA6B,GAClC,KAAK,QAAU,SAAUM,EAAM,CAC7B,OAAOJ,EAASA,EAAOI,CAAI,IAAM,EAAI,EAC3C,EACI,KAAK,MAAQ,SAAUA,EAAM,CAC3B,OAAOL,GAAcK,EAAK,SAAW,EAAI,EAC/C,CACA,CAEE,OAAAD,EAAa,UAAU,SAAW,UAAoB,CACpD,IAAIE,EAAS,KAAK,2BAClB,KAAK,2BAA6B,GAElC,IAAID,EAAO,KAAK,cAChB,GAAIC,GAAU,KAAK,MAAMD,CAAI,GAAK,KAAK,QAAQA,CAAI,EAAG,OAAOA,EAE7D,EAAG,CACD,GAAIA,EAAK,WAAY,CACnBA,EAAOA,EAAK,WACZ,QACR,CAEM,EAAG,CACD,GAAIA,IAAS,KAAK,KAAM,OAAO,KAC/B,GAAIA,EAAK,YAAa,MACtBA,EAAOA,EAAK,UACpB,OAAeA,GAETA,EAAOA,EAAK,WAClB,OAAa,CAAC,KAAK,MAAMA,CAAI,GAAK,CAAC,KAAK,QAAQA,CAAI,GAEhD,YAAK,cAAgBA,EACrB,KAAK,2BAA6B,GAC3BA,CACX,EAEED,EAAa,UAAU,aAAe,UAAwB,CAC5D,IAAIE,EAAS,KAAK,2BAClB,KAAK,2BAA6B,GAElC,IAAID,EAAO,KAAK,cAChB,GAAI,CAACC,GAAU,KAAK,MAAMD,CAAI,GAAK,KAAK,QAAQA,CAAI,EAAG,OAAOA,EAE9D,EAAG,CACD,GAAIA,IAAS,KAAK,KAAM,OAAO,KAE/B,GAAIA,EAAK,gBAAiB,CAExB,IADAA,EAAOA,EAAK,gBACLA,EAAK,WACVA,EAAOA,EAAK,UACb,QACT,CAEMA,EAAOA,EAAK,UAClB,OAAa,CAAC,KAAK,MAAMA,CAAI,GAAK,CAAC,KAAK,QAAQA,CAAI,GAEhD,YAAK,cAAgBA,EACrB,KAAK,2BAA6B,GAC3BA,CACX,EAEED,EAAa,UAAU,SAAW,UAAoB,CACpD,MAAO,uBACX,EAESA,CACT,EAAC,oBCxFDV,EAAA,WAAqB,GACrBA,EAAQ,QAAaa,EAErB,IAAIC,EAAWC,EAEXC,EAAYC,EAAuBH,CAAQ,EAE3CI,EAAWC,EAEXC,EAAYH,EAAuBC,CAAQ,EAE3CG,EAAkBC,EAElBC,EAAmBN,EAAuBI,CAAe,EAE7D,SAASJ,EAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAAWA,CAAG,CAAG,CAE/F,SAASX,GAAc,CACrB,GAAI,CACF,IAAIL,EAAM,OAAO,SAAa,IAAc,CAAA,EAAK,SAC7CC,KAAWW,EAAU,SAAYZ,EAAK,WAAY,KAAM,EAAK,EACjE,OAAIC,EAAK,gBAAkBD,EAAYY,EAAU,QAC1CJ,EAAU,OACrB,MAAc,CACV,OAAOO,EAAiB,OAC5B,CACA,6BC1BAvB,EAAA,WAAqB,GACrBA,EAAQ,QAAayB,EAErB,IAAIP,EAAWH,EAEXK,EAAYH,EAAuBC,CAAQ,EAE3CQ,EAAYP,EAEZQ,EAAaV,EAAuBS,CAAS,EAEjD,SAAST,EAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAAWA,CAAG,CAAG,CAG/F,SAASC,GAAO,CACd,IAAIjB,EAAM,OAAO,SAAa,IAAc,CAAA,EAAK,SAC7CoB,KAAeD,EAAW,SAAU,EACxC,OAAIC,IAAaR,EAAU,UAAYZ,EAAI,mBAAqBoB,GACzDA,CACT,oBCnBA5B,EAAA,WAAqB,GAErB,IAAI0B,EAAYX,EAEZY,EAAaV,EAAuBS,CAAS,EAE7CL,EAAkBF,EAElBI,EAAmBN,EAAuBI,CAAe,EAEzDQ,EAAQP,EAERQ,EAASb,EAAuBY,CAAK,EAEzC,SAASZ,EAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAAWA,CAAG,CAAG,CAE/F,IAAII,KAAeD,EAAW,SAAU,EACxCC,EAAS,eAAiBL,EAAiB,QAC3CK,EAAS,KAAOE,EAAO,QAEvB9B,EAAQ,QAAa4B,OCtBrB,IAAAA,GAAiBb,EAA0B,QCA3CgB,GAAiBhB,EAAgC,QCAjDU,GAAiBV,EAAsB,QCAvCiB,EAAA,QAAiBjB,EAAiB,QAClCiB,EAAA,QAAA,YAA6Bb,GAC7Ba,EAAA,QAAA,eAAgCV,GAChCU,EAAA,QAAA,KAAsBC,yBCHtBC,GAAiBC,GAEjB,SAASA,GAAQxB,EAAMJ,EAAQ,CAC7B,IAAI6B,EAAM,CAAA,EAEV7B,EAASA,GAAU8B,GAEnB,GACED,EAAI,KAAKzB,CAAI,EACbA,EAAOA,EAAK,iBACNA,GAAQA,EAAK,SAAWJ,EAAOI,CAAI,GAE3C,OAAOyB,EAAI,MAAM,CAAC,CACpB,CAEA,SAASC,GAAK/F,EAAG,CACf,MAAO,EACT;;;;;OCRAgG,GAAiB,SAAiBC,EAAKC,EAAKrF,EAAO,CACjDA,EAAQA,GAAS,EACjB,IAAIsF,EAAM,GAEV,GAAIF,GAAO,KAAM,OAAOE,EACxB,IAAIC,EAAMH,EAAI,OACVvO,EAAImJ,EAAQ,EACXuF,EAAMvF,EACPA,EAEJ,GAAInJ,GAAKuO,EAAI,OACX,MAAO,GAGT,KAAOvO,EAAI0O,GAAK,CACd,GAAIH,EAAIvO,CAAC,IAAMwO,EACb,OAAOxO,EAETA,GACJ,CAEE,MAAO,EACT,eC7BAgM,EAAA,WAAqB,GACrBA,EAAQ,QAAa2C,EAErB,IAAIC,EAAa7B,GAEb8B,EAAc5B,EAAuB2B,CAAU,EAE/CE,EAAW3B,GAEX4B,EAAY9B,EAAuB6B,CAAQ,EAE/C,SAAS7B,EAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAAWA,CAAG,CAAG,CAE/F,IAAIwB,EAAS,2DACTC,EAAU,sDAEVC,EAAY,EACZC,EAAY,EAEhB,SAASR,EAAKlC,EAAM2C,EAAO,CACzB,GAAI3C,EAAK,aAAeyC,EACtB,MAAM,IAAI,MAAMF,CAAM,EAGxB,IAAIK,EAAQ,EACR1C,EAAOF,EAAK,cACZ6C,EAAa,KAEjB,GAAIC,EAASH,CAAK,EAChBE,EAAa,CACX,QAAS,UAAmB,CAC1B,OAAOD,EAAQD,CACvB,EACM,SAAU,UAAoB,CAC5B,OAAOC,EAAQD,CACvB,CACA,UACaI,EAAOJ,CAAK,EAAG,CACxB,IAAIK,EAAU7C,EAAOD,EAAMyC,CAAK,EAAI,UAAY,CAC9C,MAAO,EACb,EAAQ,UAAY,CACd,OAAOzC,IAASyC,CACtB,EACQM,EAAW,UAAoB,CACjC,OAAO/C,GAAQyC,GAAS,CAAC3C,EAAK,0BACpC,EACI6C,EAAa,CAAE,QAASG,EAAS,SAAUC,CAAQ,CACvD,KACI,OAAM,IAAI,MAAMT,CAAO,EAGzB,KAAOK,EAAW,YAAc3C,EAAOF,EAAK,SAAQ,KAAQ,MAC1D4C,GAAS1C,EAAK,UAAU,OAG1B,KAAO2C,EAAW,aAAe3C,EAAOF,EAAK,aAAY,KAAQ,MAC/D4C,GAAS1C,EAAK,UAAU,OAG1B,OAAO0C,CACT,CAEA,SAASE,EAASjH,EAAG,CACnB,MAAO,CAAC,MAAM,SAASA,CAAC,CAAC,GAAK,SAASA,CAAC,CAC1C,CAEA,SAASkH,EAAO7C,EAAM,CACpB,OAAOA,EAAK,WAAawC,CAC3B,CAEA,SAASvC,EAAO+C,EAAKhD,EAAM,CACzB,GAAIgD,IAAQhD,EAAM,MAAO,GAMzB,QAJIiD,EAAS,KACTC,EAAO,CAACF,CAAG,EAAE,UAAWd,EAAY,SAAYc,CAAG,CAAC,EAAE,QAAO,EAC7DG,EAAQ,CAACnD,CAAI,EAAE,UAAWkC,EAAY,SAAYlC,CAAI,CAAC,EAAE,QAAO,EAE7DkD,EAAK,CAAC,IAAMC,EAAM,CAAC,GACxBF,EAASC,EAAK,MAAK,EACnBC,EAAM,MAAK,EAGbD,EAAOA,EAAK,CAAC,EACbC,EAAQA,EAAM,CAAC,EAEf,IAAIC,KAAQhB,EAAU,SAAYa,EAAO,WAAYC,CAAI,EACrDG,KAAQjB,EAAU,SAAYa,EAAO,WAAYE,CAAK,EAE1D,OAAOC,EAAIC,CACb,OC3FA,IAAAC,GAAiBlD,EAAiB,aCElC,OAAO,eAAemD,EAAS,aAAc,CAC3C,MAAO,EACT,CAAC,EACDA,EAAA,QAAkBC,GAMlB,SAASC,EAASzD,EAAM0D,EAAc,CACpC,GAAI,CAACA,GAAgB1D,EAAK,WACxB,OAAOA,EAAK,WAGd,EAAG,CACD,GAAIA,EAAK,YACP,OAAOA,EAAK,YAEdA,EAAOA,EAAK,UAChB,OAAWA,GAGT,OAAOA,CACT,CAEA,SAAS2D,GAAUC,EAAO,CACxB,GAAIA,EAAM,eAAe,WAAa,KAAK,aAAc,CACvD,IAAI5D,EAAO4D,EAAM,eAAe,WAAWA,EAAM,WAAW,EAC5D,OAAO5D,GAAQyD,EAASG,EAAM,eAAgB,EAAI,CACtD,CACE,OAAOA,EAAM,cACf,CAEA,SAASC,GAAeD,EAAO,CAC7B,GAAIA,EAAM,aAAa,WAAa,KAAK,aAAc,CACrD,IAAI5D,EAAO4D,EAAM,aAAa,WAAWA,EAAM,SAAS,EACxD,OAAO5D,GAAQyD,EAASG,EAAM,aAAc,EAAI,CACpD,CACE,OAAOH,EAASG,EAAM,YAAY,CACpC,CAEA,SAASE,GAAmBF,EAAOG,EAAI,CAGrC,QAFI/D,EAAO2D,GAAUC,CAAK,EACtBI,EAAUH,GAAeD,CAAK,EAC3B5D,IAASgE,GACdD,EAAG/D,CAAI,EACPA,EAAOyD,EAASzD,CAAI,CAExB,CASA,SAASwD,GAAcI,EAAO,CAG5B,IAAIpR,EAAO,GACX,OAAAsR,GAAmBF,EAAO,SAAU5D,EAAM,CACxC,GAAIA,EAAK,WAAa,KAAK,UAG3B,KAAIxD,EAAQwD,IAAS4D,EAAM,eAAiBA,EAAM,YAAc,EAC5DK,EAAMjE,IAAS4D,EAAM,aAAeA,EAAM,UAAY5D,EAAK,YAAY,OAC3ExN,GAAQwN,EAAK,YAAY,MAAMxD,EAAOyH,CAAG,EAC7C,CAAG,EACMzR,CACT,CCtEA,OAAO,eAAe0R,EAAS,aAAc,CAC3C,MAAO,EACT,CAAC,EACDA,EAAA,UAAoBC,GACpBD,EAAA,QAAkBE,GAElB,IAAIC,GAAmBjE,GAEnBkE,GAAoBhE,EAAuB+D,EAAgB,EAE3DE,GAAW/D,GAEXgE,EAAYlE,EAAuBiE,EAAQ,EAE3CE,GAAiB9D,EAEjB+D,EAAkBpE,EAAuBmE,EAAc,EAE3D,SAASnE,EAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAASA,CAAG,CAAG,CAE7F,IAAI0B,GAAY,EAEhB,SAAS4B,GAAUzE,EAAMkE,EAAO,CAC9B,GAAIlE,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAErD,GAAIkE,IAAU,OACZ,MAAM,IAAI,MAAM,oCAAoC,EAGtD,IAAIe,EAAWjF,EAAK,cAChB5C,EAAS6H,EAAS,YAAW,EAE7BC,EAAYhB,EAAM,eAClBiB,EAAcjB,EAAM,YAExB9G,EAAO,SAAS4C,EAAM,CAAC,EACvB5C,EAAO,OAAO8H,EAAWC,CAAW,EAEpC,IAAIrI,KAAYkI,EAAgB,SAAS5H,CAAM,EAAE,OAC7CmH,EAAMzH,KAAYkI,EAAgB,SAASd,CAAK,EAAE,OAEtD,MAAO,CACL,MAAOpH,EACP,IAAKyH,CACT,CACA,CAEA,SAASG,GAAQ1E,EAAM,CACrB,IAAIoF,EAAW,UAAU,QAAU,GAAK,UAAU,CAAC,IAAM,OAAY,GAAK,UAAU,CAAC,EAErF,GAAIpF,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAGrD,IAAIiF,EAAWjF,EAAK,cAChBkE,EAAQe,EAAS,YAAW,EAC5B7E,KAAWwE,GAAkB,SAAS5E,EAAM6C,EAAS,EAErD/F,EAAQsI,EAAS,OAAS,EAC1Bb,EAAMa,EAAS,KAAOtI,EACtBkG,KAAY8B,EAAU,SAAS1E,EAAMtD,CAAK,EAC1CuI,EAAYvI,EAAQkG,EAEpB5C,EAAK,2BACP8D,EAAM,SAAS9D,EAAK,cAAeiF,CAAS,GAE5CnB,EAAM,SAAS9D,EAAK,SAAQ,EAAIiF,CAAS,EACzCjF,EAAK,aAAY,GAGnB,IAAIxI,EAAS2M,EAAMzH,EAAQuI,EAC3B,OAAArC,KAAY8B,EAAU,SAAS1E,EAAMxI,CAAM,EAC3CyN,EAAYzN,EAASoL,EAEjB5C,EAAK,2BACP8D,EAAM,OAAO9D,EAAK,cAAeiF,CAAS,EAE1CnB,EAAM,OAAO9D,EAAK,SAAQ,EAAIiF,CAAS,EAGlCnB,CACT,CCpFA,IAAAoB,GAAiB5E,ECEjB,OAAO,eAAe8D,EAAS,aAAc,CAC3C,MAAO,EACT,CAAC,EACDA,EAAA,UAAoBC,GACpBD,EAAA,iBAA2Be,EAC3Bf,EAAA,QAAkBE,GAClBF,EAAA,eAAyBgB,GAEzB,IAAIC,GAAkB/E,GAElBgF,GAAmB9E,GAAuB6E,EAAe,EAEzDE,GAAyB7E,GAEzB8E,EAAeC,GAAwBF,EAAsB,EAEjE,SAASE,GAAwB1E,EAAK,CAAE,GAAIA,GAAOA,EAAI,WAAc,OAAOA,EAAc,IAAI2E,EAAS,CAAA,EAAI,GAAI3E,GAAO,KAAQ,QAAS7O,KAAO6O,EAAW,OAAO,UAAU,eAAe,KAAKA,EAAK7O,CAAG,IAAGwT,EAAOxT,CAAG,EAAI6O,EAAI7O,CAAG,GAAO,OAAAwT,EAAO,QAAU3E,EAAY2E,CAAS,CAE3Q,SAASlF,GAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAASA,CAAG,CAAG,CAG7F,IAAI4E,EAAe,GACfC,GAAW,IAAI,OAAO;AAAA,OAAkB,OAAOD,CAAY,EAAI,IAAK,GAAG,EACvEE,EAAiBF,EAErB,SAAStB,GAAUzE,EAAMkE,EAAO,CAC9B,GAAIlE,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAErD,GAAIkE,IAAU,OACZ,MAAM,IAAI,MAAM,oCAAoC,EAGtD,IAAIgC,EAAWN,EAAa,UAAU5F,EAAMkE,CAAK,EACjD,OAAOqB,EAAiBvF,EAAMkG,CAAQ,CACxC,CAEA,SAASX,EAAiBvF,EAAMoF,EAAU,CACxC,GAAIpF,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAErD,GAAIoF,IAAa,OACf,MAAM,IAAI,MAAM,uCAAuC,EAGzD,IAAItI,EAAQsI,EAAS,MAErB,GAAItI,IAAU,OACZ,MAAM,IAAI,MAAM,4CAA4C,EAE9D,GAAIA,EAAQ,EACV,MAAM,IAAI,MAAM,iDAAiD,EAGnE,IAAIyH,EAAMa,EAAS,IAEnB,GAAIb,IAAQ,OACV,MAAM,IAAI,MAAM,0CAA0C,EAE5D,GAAIA,EAAM,EACR,MAAM,IAAI,MAAM,+CAA+C,EAGjE,IAAI4B,EAAQnG,EAAK,YAAY,OAAOlD,EAAOyH,EAAMzH,CAAK,EAElDsJ,EAAc,KAAK,IAAI,EAAGtJ,EAAQmJ,CAAc,EAChD7I,EAAS4C,EAAK,YAAY,OAAOoG,EAAatJ,EAAQsJ,CAAW,EAEjEC,EAAY,KAAK,IAAIrG,EAAK,YAAY,OAAQuE,EAAM0B,CAAc,EAClE5I,EAAS2C,EAAK,YAAY,OAAOuE,EAAK8B,EAAY9B,CAAG,EAEzD,MAAO,CAAE,MAAO4B,EAAO,OAAQ/I,EAAQ,OAAQC,CAAM,CACvD,CAEA,SAASqH,GAAQ1E,EAAMoF,EAAU,CAC/B,IAAIkB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAE9EJ,EAAWV,GAAexF,EAAMoF,EAAUkB,CAAO,EACrD,OAAIJ,IAAa,KACR,KAEAN,EAAa,QAAQ5F,EAAMkG,CAAQ,CAE9C,CAEA,SAASV,GAAexF,EAAMoF,EAAU,CACtC,IAAIkB,EAAU,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAElF,GAAItG,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAErD,GAAIoF,IAAa,OACf,MAAM,IAAI,MAAM,uCAAuC,EAGzD,IAAIe,EAAQf,EAAS,MAErB,GAAIe,IAAU,OACZ,MAAM,IAAI,MAAM,4CAA4C,EAG9D,IAAI/I,EAASgI,EAAS,OAClB/H,EAAS+H,EAAS,OAClBmB,EAAOD,EAAQ,KAEfvO,EAAM,IAAI2N,GAAiB,QAE/B3N,EAAI,eAAiBiI,EAAK,YAAY,OAAS,EAI/C,IAAIwG,EAASL,EAAM,MAAMH,EAAQ,EAC7B9K,EAAMqL,IAAS,OAAYvG,EAAK,YAAY,OAAS,EAAI,EAAIuG,EAC7DzJ,EAAQ,OAAO,kBACfyH,EAAM,OAAO,kBACblS,EAAS,GACToU,EAAarJ,IAAW,OACxBsJ,EAAarJ,IAAW,OACxBsJ,EAAc,GAGdF,IACFpU,EAAS0F,EAAI,WAAWiI,EAAK,YAAa5C,EAAQlC,CAAG,EACjD7I,EAAS,KACX6I,EAAM7I,EAAS+K,EAAO,OACtBuJ,EAAc,KAKdD,GAAc,CAACC,IACjBtU,EAAS0F,EAAI,WAAWiI,EAAK,YAAa3C,EAAQnC,EAAMiL,EAAM,MAAM,EAChE9T,EAAS,KACX6I,EAAM7I,EAAS8T,EAAM,SAKzB,IAAIS,EAAaJ,EAAO,MAAK,EAE7B,GADAnU,EAAS0F,EAAI,WAAWiI,EAAK,YAAa4G,EAAY1L,CAAG,EACrD7I,EAAS,GACXyK,EAAQzK,EACR6I,EAAMqJ,EAAMzH,EAAQ8J,EAAW,WAE/B,QAAO,KAIT,IAAIC,EAAa,SAAoBC,EAAKC,EAAO,CAC/C,GAAI,CAACD,EAEH,OAAO,KAGT,IAAIzU,EAAS0F,EAAI,WAAWiI,EAAK,YAAa+G,EAAOD,EAAI,GAAG,EAC5D,OAAIzU,IAAW,GACN,MAITyU,EAAI,IAAMzU,EAAS0U,EAAM,OAGzBD,EAAI,MAAQ,KAAK,IAAIA,EAAI,MAAOzU,CAAM,EACtCyU,EAAI,IAAM,KAAK,IAAIA,EAAI,IAAKzU,EAAS0U,EAAM,MAAM,EAE1CD,EACX,EAKE/O,EAAI,eAAiB,GACrB,IAAI+O,EAAMN,EAAO,OAAOK,EAAY,CAAE,MAAO/J,EAAO,IAAKyH,EAAK,IAAKrJ,CAAG,CAAE,EACxE,OAAK4L,EAIE,CAAE,MAAOA,EAAI,MAAO,IAAKA,EAAI,GAAG,EAH9B,IAIX,6BCnLA,OAAO,eAAcnH,EAAU,aAAc,CAC3C,MAAO,EACT,CAAC,EACDA,EAAQ,QAAa2C,EACrB,IAAI0E,EAAQ,wCACRrE,EAAS,2DACTC,EAAU,wDACVqE,EAA8B,EAC9BpE,EAAY,EACZC,EAAY,EAEhB,SAASR,EAAKlC,EAAM2C,EAAO,CACzB,GAAI3C,EAAK,aAAeyC,EAAW,CACjC,IAAIqE,EAEJ,GAAI,CACFA,EAAQ,IAAI,aAAavE,EAAQ,mBAAmB,CAC1D,MAAsB,CAChBuE,EAAQ,IAAI,MAAMvE,CAAM,EACxBuE,EAAM,KAAO,GACbA,EAAM,KAAO,oBAEbA,EAAM,SAAW,UAAY,CAC3B,MAAO,sBAAsB,OAAOvE,CAAM,CAClD,CACA,CAEI,MAAMuE,CACV,CAEE,IAAIlE,EAAQ,EACR1C,EAAOF,EAAK,cACZ6C,EAAa,KAEjB,GAAIkE,EAAUpE,CAAK,EACjBE,EAAa,CACX,QAAS,UAAmB,CAC1B,OAAOD,EAAQD,CACvB,EACM,SAAU,UAAoB,CAC5B,OAAOC,EAAQD,GAAS,CAAC3C,EAAK,0BACtC,CACA,UACa+C,EAAOJ,CAAK,EAAG,CACxB,IAAIK,EAAU7C,EAAOD,EAAMyC,CAAK,EAAI,UAAY,CAC9C,MAAO,EACb,EAAQ,UAAY,CACd,OAAOzC,IAASyC,CACtB,EAEQM,EAAW,UAAoB,CACjC,OAAO/C,IAASyC,GAAS,CAAC3C,EAAK,0BACrC,EAEI6C,EAAa,CACX,QAASG,EACT,SAAUC,CAChB,CACA,KACI,OAAM,IAAI,UAAUT,CAAO,EAG7B,KAAOK,EAAW,WAAW,CAG3B,GAFA3C,EAAOF,EAAK,SAAQ,EAEhBE,IAAS,KACX,MAAM,IAAI,WAAW0G,CAAK,EAG5BhE,GAAS1C,EAAK,UAAU,MAC5B,CAME,IAJIF,EAAK,aACPE,EAAOF,EAAK,aAAY,GAGnB6C,EAAW,YAAY,CAG5B,GAFA3C,EAAOF,EAAK,aAAY,EAEpBE,IAAS,KACX,MAAM,IAAI,WAAW0G,CAAK,EAG5BhE,GAAS1C,EAAK,UAAU,MAC5B,CAEE,GAAI,CAAC6C,EAAO/C,EAAK,aAAa,EAC5B,MAAM,IAAI,WAAW4G,CAAK,EAG5B,OAAOhE,CACT,CAEA,SAASmE,EAAUlL,EAAG,CACpB,OAAI,OAAOA,GAAM,SAAiB,GAC3B,SAASA,CAAC,GAAK,KAAK,MAAMA,CAAC,IAAMA,CAC1C,CAEA,SAASkH,EAAO7C,EAAM,CACpB,OAAOA,EAAK,WAAawC,CAC3B,CAEA,SAASvC,EAAO+C,EAAKhD,EAAM,CACzB,OAAOgD,EAAI,wBAAwBhD,CAAI,EAAI2G,CAC7C,QC1GA,IAAArD,GAAiBlD,GAAiB,2BCElC,OAAO,eAAcf,EAAU,aAAc,CAC3C,MAAO,EACT,CAAC,EACDA,EAAQ,QAAamE,EAKrB,SAASC,EAASzD,EAAM0D,EAAc,CACpC,GAAI,CAACA,GAAgB1D,EAAK,WACxB,OAAOA,EAAK,WAGd,EAAG,CACD,GAAIA,EAAK,YACP,OAAOA,EAAK,YAGdA,EAAOA,EAAK,UAChB,OAAWA,GAIT,OAAOA,CACT,CAEA,SAAS2D,EAAUC,EAAO,CACxB,GAAIA,EAAM,eAAe,WAAa,KAAK,aAAc,CACvD,IAAI5D,EAAO4D,EAAM,eAAe,WAAWA,EAAM,WAAW,EAC5D,OAAO5D,GAAQyD,EAASG,EAAM,eAAgB,EAElD,CACA,CAEE,OAAOA,EAAM,cACf,CAEA,SAASC,EAAeD,EAAO,CAC7B,GAAIA,EAAM,aAAa,WAAa,KAAK,aAAc,CACrD,IAAI5D,EAAO4D,EAAM,aAAa,WAAWA,EAAM,SAAS,EACxD,OAAO5D,GAAQyD,EAASG,EAAM,aAAc,EAEhD,CACA,CAEE,OAAOH,EAASG,EAAM,YAAY,CACpC,CAEA,SAASE,EAAmBF,EAAOG,EAAI,CAIrC,QAHI/D,EAAO2D,EAAUC,CAAK,EACtBI,EAAUH,EAAeD,CAAK,EAE3B5D,IAASgE,GACdD,EAAG/D,CAAI,EACPA,EAAOyD,EAASzD,CAAI,CAExB,CAUA,SAASwD,EAAcI,EAAO,CAG5B,IAAIpR,EAAO,GACX,OAAAsR,EAAmBF,EAAO,SAAU5D,EAAM,CACxC,GAAIA,EAAK,WAAa,KAAK,UAI3B,KAAIxD,EAAQwD,IAAS4D,EAAM,eAAiBA,EAAM,YAAc,EAC5DK,EAAMjE,IAAS4D,EAAM,aAAeA,EAAM,UAAY5D,EAAK,YAAY,OAC3ExN,GAAQwN,EAAK,YAAY,MAAMxD,EAAOyH,CAAG,EAC7C,CAAG,EACMzR,CACT,QChFA,OAAO,eAAe0R,EAAS,aAAc,CAC3C,MAAO,EACT,CAAC,EACDA,EAAA,UAAoBC,GACpBD,EAAA,QAAkBE,GAElB,IAAIG,EAAWjE,GAAuBF,EAAmB,EAErDqE,EAAiBnE,GAAuBE,EAA4B,EAExE,SAASF,GAAuBO,EAAK,CAAE,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAAWA,CAAG,CAAG,CAE/F,IAAI0B,GAAY,EAEhB,SAAS4B,GAAUzE,EAAMkE,EAAO,CAC9B,GAAIlE,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAGrD,GAAIkE,IAAU,OACZ,MAAM,IAAI,MAAM,oCAAoC,EAGtD,IAAIe,EAAWjF,EAAK,cAChB5C,EAAS6H,EAAS,YAAW,EAC7BC,EAAYhB,EAAM,eAClBiB,EAAcjB,EAAM,YACxB9G,EAAO,SAAS4C,EAAM,CAAC,EACvB5C,EAAO,OAAO8H,EAAWC,CAAW,EACpC,IAAIrI,KAAYiI,EAAe,SAAY3H,CAAM,EAAE,OAC/CmH,EAAMzH,KAAYiI,EAAe,SAAYb,CAAK,EAAE,OACxD,MAAO,CACL,MAAOpH,EACP,IAAKyH,CACT,CACA,CAEA,SAASG,GAAQ1E,EAAM,CACrB,IAAIoF,EAAW,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAA,EAEnF,GAAIpF,IAAS,OACX,MAAM,IAAI,MAAM,mCAAmC,EAGrD,IAAIiF,EAAWjF,EAAK,cAChBkE,EAAQe,EAAS,YAAW,EAC5B7E,EAAO6E,EAAS,mBAAmBjF,EAAM6C,EAAS,EAClD/F,EAAQsI,EAAS,OAAS,EAC1Bb,EAAMa,EAAS,KAAOtI,EACtBqI,EAAcrI,KAAY+H,EAAS,SAAYzE,EAAMtD,CAAK,EAC1DoI,EAAY9E,EAAK,cACjBiF,EAAYd,EAAMzH,EAAQqI,EAC1BiC,EAAY/B,KAAgBR,EAAS,SAAYzE,EAAMiF,CAAS,EAChEgC,EAAUjH,EAAK,cACnB,OAAA8D,EAAM,SAASgB,EAAWC,CAAW,EACrCjB,EAAM,OAAOmD,EAASD,CAAS,EACxBlD,CACT,CCxDA,SAASoD,GAAmBC,EAA4B,CACtD,MAAMC,EAAO,IAAI,KAAKD,CAAU,EAE1BE,MADU,KAAA,EACG,QAAA,EAAYD,EAAK,QAAA,EAC9BE,EAAW,KAAK,MAAMD,EAAS,GAAI,EACnCE,EAAW,KAAK,MAAMD,EAAW,EAAE,EACnCE,EAAY,KAAK,MAAMD,EAAW,EAAE,EACpCE,EAAW,KAAK,MAAMD,EAAY,EAAE,EAE1C,OAAIF,EAAW,GAAW,WACtBC,EAAW,GAAW,GAAGA,CAAQ,QACjCC,EAAY,GAAW,GAAGA,CAAS,QACnCC,EAAW,EAAU,GAAGA,CAAQ,QAE7BL,EAAK,mBAAA,CACd,CAEO,MAAMM,WAA4B,WAAY,CAOnD,aAAc,CACZ,MAAA,EAPF,KAAQ,YAAmB,KAQzB,KAAK,aAAa,CAAE,KAAM,MAAA,CAAQ,CACpC,CAPA,WAAW,oBAAqB,CAC9B,MAAO,CAAA,CACT,CAOA,IAAI,WAAWpM,EAAW,CACxB,KAAK,YAAcA,EACnB,KAAK,OAAA,CACP,CAEA,IAAI,YAAa,CACf,OAAO,KAAK,WACd,CAEA,mBAAoB,CAClB,KAAK,OAAA,CACP,CAEA,MAAM,QAAS,CxB1CV,IAAAqM,EwB2CH,GAAI,CAAC,KAAK,aAAe,CAAC,KAAK,WAAY,OAE3C,KAAM,CAAE,MAAA3V,EAAO,OAAA4V,CAAA,EAAW,KAAK,YACzBC,EAAS7V,EAAM,OACf8V,EAAO9V,EAAM,KACb+V,EAAY/V,EAAM,UAGlBgW,GAAoBL,EAAAE,EAAO,WAAP,YAAAF,EAAiB,KACxC7L,GAAWA,EAAE,QAAU,6DAEpBmM,EAAaD,GAAA,YAAAA,EAAmB,MAEhCE,EAAYL,EAAO,IACnBM,EAASD,EAAY,KAAK,UAAUA,CAAS,EAAI,GACjDE,EAAc,KAAK,qBAAqBF,EAAWD,CAAU,EAG7DI,GAAYT,GAAA,YAAAA,EAAQ,MAAO,UAC3BU,GAAeV,GAAA,YAAAA,EAAQ,UAAWS,EAAU,SAAS,GAAG,EAAIA,EAAU,MAAM,GAAG,EAAE,IAAA,EAAQA,GACzFE,GAAYX,GAAA,YAAAA,EAAQ,SAAU,kDAAkD,mBAAmBU,CAAY,CAAC,GAEtH,KAAK,WAAW,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UA6FtBL,EAAa,8BAA8BA,CAAU,iBAAmB,EAAE;AAAA,UAC1EH,EAAO,qBAAqB,KAAK,WAAWA,CAAI,CAAC,SAAW,EAAE;AAAA;AAAA;AAAA;AAAA,iDAIvBO,CAAS;AAAA,yCACjBE,CAAS,UAAUD,CAAY;AAAA,sCAClCA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKjBpB,GAAmBa,CAAS,CAAC;AAAA,cAChDI,EAAS;AAAA;AAAA,yBAEEC,CAAW;AAAA,kBAClBD,CAAM;AAAA;AAAA,cAER,EAAE;AAAA;AAAA;AAAA;AAAA,KAKhB,CAEQ,UAAUK,EAAqB,CACrC,GAAI,CACF,OAAO,IAAI,IAAIA,CAAG,EAAE,QACtB,MAAQ,CACN,OAAOA,CACT,CACF,CAEQ,qBAAqBN,EAAmBO,EAA4B,CAC1E,GAAI,CAACP,GAAa,CAACO,EAAW,OAAOP,EACrC,GAAI,CACF,MAAMM,EAAM,IAAI,IAAIN,CAAS,EAC7B,OAAAM,EAAI,KAAO,WAAW,mBAAmBC,CAAS,CAAC,GAC5CD,EAAI,SAAA,CACb,MAAQ,CACN,OAAON,CACT,CACF,CAEQ,WAAWxV,EAAsB,CACvC,MAAMgW,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAchW,EACXgW,EAAI,SACb,CACF,CAGK,eAAe,IAAI,uBAAuB,GAC7C,eAAe,OAAO,wBAAyBhB,EAAmB","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
-127
proxy/static/static/assets/annotation-card-lCwGLDVE.js
··· 1 - class Ue{constructor(s="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(s),this.channel.onmessage=g=>{this.listeners.forEach(c=>c(g.data))}}async get(s){if(typeof s=="string"){const c=localStorage.getItem(s);return c?JSON.parse(c):null}const g={};return s.forEach(c=>{const h=localStorage.getItem(c);g[c]=h?JSON.parse(h):null}),g}async set(s,g){const c=await this.get(s);localStorage.setItem(s,JSON.stringify(g));const h={key:s,newValue:g,oldValue:c};this.channel.postMessage(h),this.listeners.forEach(e=>e(h))}onChange(s){this.listeners.push(s)}close(){this.channel.close()}}var k={},J={exports:{}};(function(f){var s=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},g=-1,c=1,h=0;s.Diff=function(e,r){return[e,r]},s.prototype.diff_main=function(e,r,n,t){typeof t>"u"&&(this.Diff_Timeout<=0?t=Number.MAX_VALUE:t=new Date().getTime()+this.Diff_Timeout*1e3);var a=t;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new s.Diff(h,e)]:[];typeof n>"u"&&(n=!0);var i=n,o=this.diff_commonPrefix(e,r),l=e.substring(0,o);e=e.substring(o),r=r.substring(o),o=this.diff_commonSuffix(e,r);var u=e.substring(e.length-o);e=e.substring(0,e.length-o),r=r.substring(0,r.length-o);var v=this.diff_compute_(e,r,i,a);return l&&v.unshift(new s.Diff(h,l)),u&&v.push(new s.Diff(h,u)),this.diff_cleanupMerge(v),v},s.prototype.diff_compute_=function(e,r,n,t){var a;if(!e)return[new s.Diff(c,r)];if(!r)return[new s.Diff(g,e)];var i=e.length>r.length?e:r,o=e.length>r.length?r:e,l=i.indexOf(o);if(l!=-1)return a=[new s.Diff(c,i.substring(0,l)),new s.Diff(h,o),new s.Diff(c,i.substring(l+o.length))],e.length>r.length&&(a[0][0]=a[2][0]=g),a;if(o.length==1)return[new s.Diff(g,e),new s.Diff(c,r)];var u=this.diff_halfMatch_(e,r);if(u){var v=u[0],d=u[1],m=u[2],_=u[3],p=u[4],w=this.diff_main(v,m,n,t),b=this.diff_main(d,_,n,t);return w.concat([new s.Diff(h,p)],b)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,t):this.diff_bisect_(e,r,t)},s.prototype.diff_lineMode_=function(e,r,n){var t=this.diff_linesToChars_(e,r);e=t.chars1,r=t.chars2;var a=t.lineArray,i=this.diff_main(e,r,!1,n);this.diff_charsToLines_(i,a),this.diff_cleanupSemantic(i),i.push(new s.Diff(h,""));for(var o=0,l=0,u=0,v="",d="";o<i.length;){switch(i[o][0]){case c:u++,d+=i[o][1];break;case g:l++,v+=i[o][1];break;case h:if(l>=1&&u>=1){i.splice(o-l-u,l+u),o=o-l-u;for(var m=this.diff_main(v,d,!1,n),_=m.length-1;_>=0;_--)i.splice(o,0,m[_]);o=o+m.length}u=0,l=0,v="",d="";break}o++}return i.pop(),i},s.prototype.diff_bisect_=function(e,r,n){for(var t=e.length,a=r.length,i=Math.ceil((t+a)/2),o=i,l=2*i,u=new Array(l),v=new Array(l),d=0;d<l;d++)u[d]=-1,v[d]=-1;u[o+1]=0,v[o+1]=0;for(var m=t-a,_=m%2!=0,p=0,w=0,b=0,E=0,N=0;N<i&&!(new Date().getTime()>n);N++){for(var M=-N+p;M<=N-w;M+=2){var D=o+M,T;M==-N||M!=N&&u[D-1]<u[D+1]?T=u[D+1]:T=u[D-1]+1;for(var R=T-M;T<t&&R<a&&e.charAt(T)==r.charAt(R);)T++,R++;if(u[D]=T,T>t)w+=2;else if(R>a)p+=2;else if(_){var y=o+m-M;if(y>=0&&y<l&&v[y]!=-1){var S=t-v[y];if(T>=S)return this.diff_bisectSplit_(e,r,T,R,n)}}}for(var C=-N+b;C<=N-E;C+=2){var y=o+C,S;C==-N||C!=N&&v[y-1]<v[y+1]?S=v[y+1]:S=v[y-1]+1;for(var I=S-C;S<t&&I<a&&e.charAt(t-S-1)==r.charAt(a-I-1);)S++,I++;if(v[y]=S,S>t)E+=2;else if(I>a)b+=2;else if(!_){var D=o+m-C;if(D>=0&&D<l&&u[D]!=-1){var T=u[D],R=o+T-D;if(S=t-S,T>=S)return this.diff_bisectSplit_(e,r,T,R,n)}}}}return[new s.Diff(g,e),new s.Diff(c,r)]},s.prototype.diff_bisectSplit_=function(e,r,n,t,a){var i=e.substring(0,n),o=r.substring(0,t),l=e.substring(n),u=r.substring(t),v=this.diff_main(i,o,!1,a),d=this.diff_main(l,u,!1,a);return v.concat(d)},s.prototype.diff_linesToChars_=function(e,r){var n=[],t={};n[0]="";function a(u){for(var v="",d=0,m=-1,_=n.length;m<u.length-1;){m=u.indexOf(` 2 - `,d),m==-1&&(m=u.length-1);var p=u.substring(d,m+1);(t.hasOwnProperty?t.hasOwnProperty(p):t[p]!==void 0)?v+=String.fromCharCode(t[p]):(_==i&&(p=u.substring(d),m=u.length),v+=String.fromCharCode(_),t[p]=_,n[_++]=p),d=m+1}return v}var i=4e4,o=a(e);i=65535;var l=a(r);return{chars1:o,chars2:l,lineArray:n}},s.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var t=e[n][1],a=[],i=0;i<t.length;i++)a[i]=r[t.charCodeAt(i)];e[n][1]=a.join("")}},s.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,t=Math.min(e.length,r.length),a=t,i=0;n<a;)e.substring(i,a)==r.substring(i,a)?(n=a,i=n):t=a,a=Math.floor((t-n)/2+n);return a},s.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,t=Math.min(e.length,r.length),a=t,i=0;n<a;)e.substring(e.length-a,e.length-i)==r.substring(r.length-a,r.length-i)?(n=a,i=n):t=a,a=Math.floor((t-n)/2+n);return a},s.prototype.diff_commonOverlap_=function(e,r){var n=e.length,t=r.length;if(n==0||t==0)return 0;n>t?e=e.substring(n-t):n<t&&(r=r.substring(0,n));var a=Math.min(n,t);if(e==r)return a;for(var i=0,o=1;;){var l=e.substring(a-o),u=r.indexOf(l);if(u==-1)return i;o+=u,(u==0||e.substring(a-o)==r.substring(0,o))&&(i=o,o++)}},s.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,t=e.length>r.length?r:e;if(n.length<4||t.length*2<n.length)return null;var a=this;function i(w,b,E){for(var N=w.substring(E,E+Math.floor(w.length/4)),M=-1,D="",T,R,y,S;(M=b.indexOf(N,M+1))!=-1;){var C=a.diff_commonPrefix(w.substring(E),b.substring(M)),I=a.diff_commonSuffix(w.substring(0,E),b.substring(0,M));D.length<I+C&&(D=b.substring(M-I,M)+b.substring(M,M+C),T=w.substring(0,E-I),R=w.substring(E+C),y=b.substring(0,M-I),S=b.substring(M+C))}return D.length*2>=w.length?[T,R,y,S,D]:null}var o=i(n,t,Math.ceil(n.length/4)),l=i(n,t,Math.ceil(n.length/2)),u;if(!o&&!l)return null;l?o?u=o[4].length>l[4].length?o:l:u=l:u=o;var v,d,m,_;e.length>r.length?(v=u[0],d=u[1],m=u[2],_=u[3]):(m=u[0],_=u[1],v=u[2],d=u[3]);var p=u[4];return[v,d,m,_,p]},s.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],t=0,a=null,i=0,o=0,l=0,u=0,v=0;i<e.length;)e[i][0]==h?(n[t++]=i,o=u,l=v,u=0,v=0,a=e[i][1]):(e[i][0]==c?u+=e[i][1].length:v+=e[i][1].length,a&&a.length<=Math.max(o,l)&&a.length<=Math.max(u,v)&&(e.splice(n[t-1],0,new s.Diff(g,a)),e[n[t-1]+1][0]=c,t--,t--,i=t>0?n[t-1]:-1,o=0,l=0,u=0,v=0,a=null,r=!0)),i++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),i=1;i<e.length;){if(e[i-1][0]==g&&e[i][0]==c){var d=e[i-1][1],m=e[i][1],_=this.diff_commonOverlap_(d,m),p=this.diff_commonOverlap_(m,d);_>=p?(_>=d.length/2||_>=m.length/2)&&(e.splice(i,0,new s.Diff(h,m.substring(0,_))),e[i-1][1]=d.substring(0,d.length-_),e[i+1][1]=m.substring(_),i++):(p>=d.length/2||p>=m.length/2)&&(e.splice(i,0,new s.Diff(h,d.substring(0,p))),e[i-1][0]=c,e[i-1][1]=m.substring(0,m.length-p),e[i+1][0]=g,e[i+1][1]=d.substring(p),i++),i++}i++}},s.prototype.diff_cleanupSemanticLossless=function(e){function r(p,w){if(!p||!w)return 6;var b=p.charAt(p.length-1),E=w.charAt(0),N=b.match(s.nonAlphaNumericRegex_),M=E.match(s.nonAlphaNumericRegex_),D=N&&b.match(s.whitespaceRegex_),T=M&&E.match(s.whitespaceRegex_),R=D&&b.match(s.linebreakRegex_),y=T&&E.match(s.linebreakRegex_),S=R&&p.match(s.blanklineEndRegex_),C=y&&w.match(s.blanklineStartRegex_);return S||C?5:R||y?4:N&&!D&&T?3:D||T?2:N||M?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==h&&e[n+1][0]==h){var t=e[n-1][1],a=e[n][1],i=e[n+1][1],o=this.diff_commonSuffix(t,a);if(o){var l=a.substring(a.length-o);t=t.substring(0,t.length-o),a=l+a.substring(0,a.length-o),i=l+i}for(var u=t,v=a,d=i,m=r(t,a)+r(a,i);a.charAt(0)===i.charAt(0);){t+=a.charAt(0),a=a.substring(1)+i.charAt(0),i=i.substring(1);var _=r(t,a)+r(a,i);_>=m&&(m=_,u=t,v=a,d=i)}e[n-1][1]!=u&&(u?e[n-1][1]=u:(e.splice(n-1,1),n--),e[n][1]=v,d?e[n+1][1]=d:(e.splice(n+1,1),n--))}n++}},s.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,s.whitespaceRegex_=/\s/,s.linebreakRegex_=/[\r\n]/,s.blanklineEndRegex_=/\n\r?\n$/,s.blanklineStartRegex_=/^\r?\n\r?\n/,s.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],t=0,a=null,i=0,o=!1,l=!1,u=!1,v=!1;i<e.length;)e[i][0]==h?(e[i][1].length<this.Diff_EditCost&&(u||v)?(n[t++]=i,o=u,l=v,a=e[i][1]):(t=0,a=null),u=v=!1):(e[i][0]==g?v=!0:u=!0,a&&(o&&l&&u&&v||a.length<this.Diff_EditCost/2&&o+l+u+v==3)&&(e.splice(n[t-1],0,new s.Diff(g,a)),e[n[t-1]+1][0]=c,t--,a=null,o&&l?(u=v=!0,t=0):(t--,i=t>0?n[t-1]:-1,u=v=!1),r=!0)),i++;r&&this.diff_cleanupMerge(e)},s.prototype.diff_cleanupMerge=function(e){e.push(new s.Diff(h,""));for(var r=0,n=0,t=0,a="",i="",o;r<e.length;)switch(e[r][0]){case c:t++,i+=e[r][1],r++;break;case g:n++,a+=e[r][1],r++;break;case h:n+t>1?(n!==0&&t!==0&&(o=this.diff_commonPrefix(i,a),o!==0&&(r-n-t>0&&e[r-n-t-1][0]==h?e[r-n-t-1][1]+=i.substring(0,o):(e.splice(0,0,new s.Diff(h,i.substring(0,o))),r++),i=i.substring(o),a=a.substring(o)),o=this.diff_commonSuffix(i,a),o!==0&&(e[r][1]=i.substring(i.length-o)+e[r][1],i=i.substring(0,i.length-o),a=a.substring(0,a.length-o))),r-=n+t,e.splice(r,n+t),a.length&&(e.splice(r,0,new s.Diff(g,a)),r++),i.length&&(e.splice(r,0,new s.Diff(c,i)),r++),r++):r!==0&&e[r-1][0]==h?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,t=0,n=0,a="",i="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==h&&e[r+1][0]==h&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},s.prototype.diff_xIndex=function(e,r){var n=0,t=0,a=0,i=0,o;for(o=0;o<e.length&&(e[o][0]!==c&&(n+=e[o][1].length),e[o][0]!==g&&(t+=e[o][1].length),!(n>r));o++)a=n,i=t;return e.length!=o&&e[o][0]===g?i:i+(r-a)},s.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,t=/</g,a=/>/g,i=/\n/g,o=0;o<e.length;o++){var l=e[o][0],u=e[o][1],v=u.replace(n,"&amp;").replace(t,"&lt;").replace(a,"&gt;").replace(i,"&para;<br>");switch(l){case c:r[o]='<ins style="background:#e6ffe6;">'+v+"</ins>";break;case g:r[o]='<del style="background:#ffe6e6;">'+v+"</del>";break;case h:r[o]="<span>"+v+"</span>";break}}return r.join("")},s.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==c&&(r[n]=e[n][1]);return r.join("")},s.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==g&&(r[n]=e[n][1]);return r.join("")},s.prototype.diff_levenshtein=function(e){for(var r=0,n=0,t=0,a=0;a<e.length;a++){var i=e[a][0],o=e[a][1];switch(i){case c:n+=o.length;break;case g:t+=o.length;break;case h:r+=Math.max(n,t),n=0,t=0;break}}return r+=Math.max(n,t),r},s.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case c:r[n]="+"+encodeURI(e[n][1]);break;case g:r[n]="-"+e[n][1].length;break;case h:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},s.prototype.diff_fromDelta=function(e,r){for(var n=[],t=0,a=0,i=r.split(/\t/g),o=0;o<i.length;o++){var l=i[o].substring(1);switch(i[o].charAt(0)){case"+":try{n[t++]=new s.Diff(c,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var u=parseInt(l,10);if(isNaN(u)||u<0)throw new Error("Invalid number in diff_fromDelta: "+l);var v=e.substring(a,a+=u);i[o].charAt(0)=="="?n[t++]=new s.Diff(h,v):n[t++]=new s.Diff(g,v);break;default:if(i[o])throw new Error("Invalid diff operation in diff_fromDelta: "+i[o])}}if(a!=e.length)throw new Error("Delta length ("+a+") does not equal source text length ("+e.length+").");return n},s.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},s.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var t=this.match_alphabet_(r),a=this;function i(T,R){var y=T/r.length,S=Math.abs(n-R);return a.Match_Distance?y+S/a.Match_Distance:S?1:y}var o=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(o=Math.min(i(0,l),o),l=e.lastIndexOf(r,n+r.length),l!=-1&&(o=Math.min(i(0,l),o)));var u=1<<r.length-1;l=-1;for(var v,d,m=r.length+e.length,_,p=0;p<r.length;p++){for(v=0,d=m;v<d;)i(p,n+d)<=o?v=d:m=d,d=Math.floor((m-v)/2+v);m=d;var w=Math.max(1,n-d+1),b=Math.min(n+d,e.length)+r.length,E=Array(b+2);E[b+1]=(1<<p)-1;for(var N=b;N>=w;N--){var M=t[e.charAt(N-1)];if(p===0?E[N]=(E[N+1]<<1|1)&M:E[N]=(E[N+1]<<1|1)&M|((_[N+1]|_[N])<<1|1)|_[N+1],E[N]&u){var D=i(p,N-1);if(D<=o)if(o=D,l=N-1,l>n)w=Math.max(1,2*n-l);else break}}if(i(p+1,n)>o)break;_=E}return l},s.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},s.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),t=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)t+=this.Patch_Margin,n=r.substring(e.start2-t,e.start2+e.length1+t);t+=this.Patch_Margin;var a=r.substring(e.start2-t,e.start2);a&&e.diffs.unshift(new s.Diff(h,a));var i=r.substring(e.start2+e.length1,e.start2+e.length1+t);i&&e.diffs.push(new s.Diff(h,i)),e.start1-=a.length,e.start2-=a.length,e.length1+=a.length+i.length,e.length2+=a.length+i.length}},s.prototype.patch_make=function(e,r,n){var t,a;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")t=e,a=this.diff_main(t,r,!0),a.length>2&&(this.diff_cleanupSemantic(a),this.diff_cleanupEfficiency(a));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")a=e,t=this.diff_text1(a);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")t=e,a=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")t=e,a=n;else throw new Error("Unknown call format to patch_make.");if(a.length===0)return[];for(var i=[],o=new s.patch_obj,l=0,u=0,v=0,d=t,m=t,_=0;_<a.length;_++){var p=a[_][0],w=a[_][1];switch(!l&&p!==h&&(o.start1=u,o.start2=v),p){case c:o.diffs[l++]=a[_],o.length2+=w.length,m=m.substring(0,v)+w+m.substring(v);break;case g:o.length1+=w.length,o.diffs[l++]=a[_],m=m.substring(0,v)+m.substring(v+w.length);break;case h:w.length<=2*this.Patch_Margin&&l&&a.length!=_+1?(o.diffs[l++]=a[_],o.length1+=w.length,o.length2+=w.length):w.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(o,d),i.push(o),o=new s.patch_obj,l=0,d=m,u=v);break}p!==c&&(u+=w.length),p!==g&&(v+=w.length)}return l&&(this.patch_addContext_(o,d),i.push(o)),i},s.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var t=e[n],a=new s.patch_obj;a.diffs=[];for(var i=0;i<t.diffs.length;i++)a.diffs[i]=new s.Diff(t.diffs[i][0],t.diffs[i][1]);a.start1=t.start1,a.start2=t.start2,a.length1=t.length1,a.length2=t.length2,r[n]=a}return r},s.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var t=0,a=[],i=0;i<e.length;i++){var o=e[i].start2+t,l=this.diff_text1(e[i].diffs),u,v=-1;if(l.length>this.Match_MaxBits?(u=this.match_main(r,l.substring(0,this.Match_MaxBits),o),u!=-1&&(v=this.match_main(r,l.substring(l.length-this.Match_MaxBits),o+l.length-this.Match_MaxBits),(v==-1||u>=v)&&(u=-1))):u=this.match_main(r,l,o),u==-1)a[i]=!1,t-=e[i].length2-e[i].length1;else{a[i]=!0,t=u-o;var d;if(v==-1?d=r.substring(u,u+l.length):d=r.substring(u,v+this.Match_MaxBits),l==d)r=r.substring(0,u)+this.diff_text2(e[i].diffs)+r.substring(u+l.length);else{var m=this.diff_main(l,d,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(m)/l.length>this.Patch_DeleteThreshold)a[i]=!1;else{this.diff_cleanupSemanticLossless(m);for(var _=0,p,w=0;w<e[i].diffs.length;w++){var b=e[i].diffs[w];b[0]!==h&&(p=this.diff_xIndex(m,_)),b[0]===c?r=r.substring(0,u+p)+b[1]+r.substring(u+p):b[0]===g&&(r=r.substring(0,u+p)+r.substring(u+this.diff_xIndex(m,_+b[1].length))),b[0]!==g&&(_+=b[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,a]},s.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",t=1;t<=r;t++)n+=String.fromCharCode(t);for(var t=0;t<e.length;t++)e[t].start1+=r,e[t].start2+=r;var a=e[0],i=a.diffs;if(i.length==0||i[0][0]!=h)i.unshift(new s.Diff(h,n)),a.start1-=r,a.start2-=r,a.length1+=r,a.length2+=r;else if(r>i[0][1].length){var o=r-i[0][1].length;i[0][1]=n.substring(i[0][1].length)+i[0][1],a.start1-=o,a.start2-=o,a.length1+=o,a.length2+=o}if(a=e[e.length-1],i=a.diffs,i.length==0||i[i.length-1][0]!=h)i.push(new s.Diff(h,n)),a.length1+=r,a.length2+=r;else if(r>i[i.length-1][1].length){var o=r-i[i.length-1][1].length;i[i.length-1][1]+=n.substring(0,o),a.length1+=o,a.length2+=o}return n},s.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var t=e[n];e.splice(n--,1);for(var a=t.start1,i=t.start2,o="";t.diffs.length!==0;){var l=new s.patch_obj,u=!0;for(l.start1=a-o.length,l.start2=i-o.length,o!==""&&(l.length1=l.length2=o.length,l.diffs.push(new s.Diff(h,o)));t.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var v=t.diffs[0][0],d=t.diffs[0][1];v===c?(l.length2+=d.length,i+=d.length,l.diffs.push(t.diffs.shift()),u=!1):v===g&&l.diffs.length==1&&l.diffs[0][0]==h&&d.length>2*r?(l.length1+=d.length,a+=d.length,u=!1,l.diffs.push(new s.Diff(v,d)),t.diffs.shift()):(d=d.substring(0,r-l.length1-this.Patch_Margin),l.length1+=d.length,a+=d.length,v===h?(l.length2+=d.length,i+=d.length):u=!1,l.diffs.push(new s.Diff(v,d)),d==t.diffs[0][1]?t.diffs.shift():t.diffs[0][1]=t.diffs[0][1].substring(d.length))}o=this.diff_text2(l.diffs),o=o.substring(o.length-this.Patch_Margin);var m=this.diff_text1(t.diffs).substring(0,this.Patch_Margin);m!==""&&(l.length1+=m.length,l.length2+=m.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===h?l.diffs[l.diffs.length-1][1]+=m:l.diffs.push(new s.Diff(h,m))),u||e.splice(++n,0,l)}}},s.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},s.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(` 3 - `),t=0,a=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;t<n.length;){var i=n[t].match(a);if(!i)throw new Error("Invalid patch string: "+n[t]);var o=new s.patch_obj;for(r.push(o),o.start1=parseInt(i[1],10),i[2]===""?(o.start1--,o.length1=1):i[2]=="0"?o.length1=0:(o.start1--,o.length1=parseInt(i[2],10)),o.start2=parseInt(i[3],10),i[4]===""?(o.start2--,o.length2=1):i[4]=="0"?o.length2=0:(o.start2--,o.length2=parseInt(i[4],10)),t++;t<n.length;){var l=n[t].charAt(0);try{var u=decodeURI(n[t].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+u)}if(l=="-")o.diffs.push(new s.Diff(g,u));else if(l=="+")o.diffs.push(new s.Diff(c,u));else if(l==" ")o.diffs.push(new s.Diff(h,u));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+u)}t++}}return r},s.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},s.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@ 4 - `],t,a=0;a<this.diffs.length;a++){switch(this.diffs[a][0]){case c:t="+";break;case g:t="-";break;case h:t=" ";break}n[a+1]=t+encodeURI(this.diffs[a][1])+` 5 - `}return n.join("").replace(/%20/g," ")},f.exports=s,f.exports.diff_match_patch=s,f.exports.DIFF_DELETE=g,f.exports.DIFF_INSERT=c,f.exports.DIFF_EQUAL=h})(J);var ae=J.exports,A={},O={exports:{}},Y={},P={},Q={};(function(f){f.__esModule=!0;function s(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}f.default=g;function g(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2],n=h.nodeType==9||h.ownerDocument,t=n.createNodeIterator(h,e,r,!1);return new c(t,h,e,r)}var c=function(){function h(e,r,n,t){s(this,h),this.root=r,this.whatToShow=n,this.filter=t,this.referenceNode=r,this.pointerBeforeReferenceNode=!0,this._iter=e}return h.prototype.nextNode=function(){var r=this._iter.nextNode();return this.pointerBeforeReferenceNode=!1,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.previousNode=function(){var r=this._iter.previousNode();return this.pointerBeforeReferenceNode=!0,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(Q);var B={};(function(f){f.__esModule=!0,f.default=s;function s(g){var c=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],h=arguments.length<=2||arguments[2]===void 0?null:arguments[2],e=g.ownerDocument;return e.createNodeIterator.call(e,g,c,h)}})(B);var $={};(function(f){f.__esModule=!0;function s(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}f.default=g;function g(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2];return new c(h,e,r)}var c=function(){function h(e,r,n){s(this,h),this.root=e,this.whatToShow=r,this.filter=n,this.referenceNode=e,this.pointerBeforeReferenceNode=!0,this._filter=function(t){return n?n(t)===1:!0},this._show=function(t){return r>>t.nodeType-1&!0}}return h.prototype.nextNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!1;var n=this.referenceNode;if(r&&this._show(n)&&this._filter(n))return n;do{if(n.firstChild){n=n.firstChild;continue}do{if(n===this.root)return null;if(n.nextSibling)break;n=n.parentNode}while(n);n=n.nextSibling}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!1,n},h.prototype.previousNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!0;var n=this.referenceNode;if(!r&&this._show(n)&&this._filter(n))return n;do{if(n===this.root)return null;if(n.previousSibling){for(n=n.previousSibling;n.lastChild;)n=n.lastChild;continue}n=n.parentNode}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!0,n},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})($);(function(f){f.__esModule=!0,f.default=t;var s=Q,g=n(s),c=B,h=n(c),e=$,r=n(e);function n(a){return a&&a.__esModule?a:{default:a}}function t(){try{var a=typeof document>"u"?{}:document,i=(0,h.default)(a,4294967295,null,!1);return i.referenceNode===a?h.default:g.default}catch{return r.default}}})(P);var L={};(function(f){f.__esModule=!0,f.default=r;var s=B,g=e(s),c=P,h=e(c);function e(n){return n&&n.__esModule?n:{default:n}}function r(){var n=typeof document>"u"?{}:document,t=(0,h.default)();return t!==g.default&&(n.createNodeIterator=t),t}})(L);(function(f){f.__esModule=!0;var s=P,g=n(s),c=$,h=n(c),e=L,r=n(e);function n(a){return a&&a.__esModule?a:{default:a}}var t=(0,g.default)();t.implementation=h.default,t.shim=r.default,f.default=t})(Y);var ie=P.default,se=$.default,oe=L.default;O.exports=Y.default;O.exports.getPolyfill=ie;O.exports.implementation=se;O.exports.shim=oe;var le=O.exports,Z={},fe=ue;function ue(f,s){var g=[];s=s||he;do g.push(f),f=f.parentNode;while(f&&f.tagName&&s(f));return g.slice(1)}function he(f){return!0}/*! 6 - * index-of <https://github.com/jonschlinkert/index-of> 7 - * 8 - * Copyright (c) 2014-2015 Jon Schlinkert. 9 - * Licensed under the MIT license. 10 - */var ge=function(s,g,c){c=c||0;var h=-1;if(s==null)return h;var e=s.length,r=c<0?e+c:c;if(r>=s.length)return-1;for(;r<e;){if(s[r]===g)return r;r++}return-1};(function(f){f.__esModule=!0,f.default=i;var s=fe,g=e(s),c=ge,h=e(c);function e(v){return v&&v.__esModule?v:{default:v}}var r="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",n="Argument 2 of seek must be a number or a Text Node.",t=4,a=3;function i(v,d){if(v.whatToShow!==t)throw new Error(r);var m=0,_=v.referenceNode,p=null;if(o(d))p={forward:function(){return m<d},backward:function(){return m>d}};else if(l(d)){var w=u(_,d)?function(){return!1}:function(){return _!==d},b=function(){return _!=d||!v.pointerBeforeReferenceNode};p={forward:w,backward:b}}else throw new Error(n);for(;p.forward()&&(_=v.nextNode())!==null;)m+=_.nodeValue.length;for(;p.backward()&&(_=v.previousNode())!==null;)m-=_.nodeValue.length;return m}function o(v){return!isNaN(parseInt(v))&&isFinite(v)}function l(v){return v.nodeType===a}function u(v,d){if(v===d)return!1;for(var m=null,_=[v].concat((0,g.default)(v)).reverse(),p=[d].concat((0,g.default)(d)).reverse();_[0]===p[0];)m=_.shift(),p.shift();_=_[0],p=p[0];var w=(0,h.default)(m.childNodes,_),b=(0,h.default)(m.childNodes,p);return w>b}})(Z);var ve=Z.default,H={};Object.defineProperty(H,"__esModule",{value:!0});H.default=_e;function F(f,s){if(!s&&f.firstChild)return f.firstChild;do{if(f.nextSibling)return f.nextSibling;f=f.parentNode}while(f);return f}function ce(f){if(f.startContainer.nodeType===Node.ELEMENT_NODE){var s=f.startContainer.childNodes[f.startOffset];return s||F(f.startContainer,!0)}return f.startContainer}function de(f){if(f.endContainer.nodeType===Node.ELEMENT_NODE){var s=f.endContainer.childNodes[f.endOffset];return s||F(f.endContainer,!0)}return F(f.endContainer)}function me(f,s){for(var g=ce(f),c=de(f);g!==c;)s(g),g=F(g)}function _e(f){var s="";return me(f,function(g){if(g.nodeType===Node.TEXT_NODE){var c=g===f.startContainer?f.startOffset:0,h=g===f.endContainer?f.endOffset:g.textContent.length;s+=g.textContent.slice(c,h)}}),s}Object.defineProperty(A,"__esModule",{value:!0});A.fromRange=Me;A.toRange=De;var pe=le,we=U(pe),be=ve,W=U(be),Ne=H,X=U(Ne);function U(f){return f&&f.__esModule?f:{default:f}}var Ee=4;function Me(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=f.ownerDocument,c=g.createRange(),h=s.startContainer,e=s.startOffset;c.setStart(f,0),c.setEnd(h,e);var r=(0,X.default)(c).length,n=r+(0,X.default)(s).length;return{start:r,end:n}}function De(f){var s=arguments.length<=1||arguments[1]===void 0?{}:arguments[1];if(f===void 0)throw new Error('missing required parameter "root"');var g=f.ownerDocument,c=g.createRange(),h=(0,we.default)(f,Ee),e=s.start||0,r=s.end||e,n=(0,W.default)(h,e),t=e-n;h.pointerBeforeReferenceNode?c.setStart(h.referenceNode,t):(c.setStart(h.nextNode(),t),h.previousNode());var a=r-e+t;return n=(0,W.default)(h,a),t=a-n,h.pointerBeforeReferenceNode?c.setEnd(h.referenceNode,t):c.setEnd(h.nextNode(),t),c}var Te=A;Object.defineProperty(k,"__esModule",{value:!0});k.fromRange=Oe;k.fromTextPosition=x;k.toRange=Fe;k.toTextPosition=ee;var Se=ae,ye=Ie(Se),Re=Te,K=Ce(Re);function Ce(f){if(f&&f.__esModule)return f;var s={};if(f!=null)for(var g in f)Object.prototype.hasOwnProperty.call(f,g)&&(s[g]=f[g]);return s.default=f,s}function Ie(f){return f&&f.__esModule?f:{default:f}}var j=32,ke=new RegExp(`(.|[\r 11 - ]){1,`+String(j)+"}","g"),V=j;function Oe(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=K.fromRange(f,s);return x(f,g)}function x(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "selector"');var g=s.start;if(g===void 0)throw new Error('selector missing required property "start"');if(g<0)throw new Error('property "start" must be a non-negative integer');var c=s.end;if(c===void 0)throw new Error('selector missing required property "end"');if(c<0)throw new Error('property "end" must be a non-negative integer');var h=f.textContent.substr(g,c-g),e=Math.max(0,g-V),r=f.textContent.substr(e,g-e),n=Math.min(f.textContent.length,c+V),t=f.textContent.substr(c,n-c);return{exact:h,prefix:r,suffix:t}}function Fe(f,s){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},c=ee(f,s,g);return c===null?null:K.toRange(f,c)}function ee(f,s){var g=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "selector"');var c=s.exact;if(c===void 0)throw new Error('selector missing required property "exact"');var h=s.prefix,e=s.suffix,r=g.hint,n=new ye.default;n.Match_Distance=f.textContent.length*2;var t=c.match(ke),a=r===void 0?f.textContent.length/2|0:r,i=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=-1,u=h!==void 0,v=e!==void 0,d=!1;u&&(l=n.match_main(f.textContent,h,a),l>-1&&(a=l+h.length,d=!0)),v&&!d&&(l=n.match_main(f.textContent,e,a+c.length),l>-1&&(a=l-c.length));var m=t.shift();if(l=n.match_main(f.textContent,m,a),l>-1)i=l,a=o=i+m.length;else return null;var _=function(b,E){if(!b)return null;var N=n.match_main(f.textContent,E,b.loc);return N===-1?null:(b.loc=N+E.length,b.start=Math.min(b.start,N),b.end=Math.max(b.end,N+E.length),b)};n.Match_Distance=64;var p=t.reduce(_,{start:i,end:o,loc:a});return p?{start:p.start,end:p.end}:null}var q={},re={};(function(f){Object.defineProperty(f,"__esModule",{value:!0}),f.default=n;var s="Iterator exhausted before seek ended.",g="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",c="Argument 2 of seek must be an integer or a Text Node.",h=2,e=4,r=3;function n(o,l){if(o.whatToShow!==e){var u;try{u=new DOMException(g,"InvalidStateError")}catch{u=new Error(g),u.code=11,u.name="InvalidStateError",u.toString=function(){return"InvalidStateError: ".concat(g)}}throw u}var v=0,d=o.referenceNode,m=null;if(t(l))m={forward:function(){return v<l},backward:function(){return v>l||!o.pointerBeforeReferenceNode}};else if(a(l)){var _=i(d,l)?function(){return!1}:function(){return d!==l},p=function(){return d!==l||!o.pointerBeforeReferenceNode};m={forward:_,backward:p}}else throw new TypeError(c);for(;m.forward();){if(d=o.nextNode(),d===null)throw new RangeError(s);v+=d.nodeValue.length}for(o.nextNode()&&(d=o.previousNode());m.backward();){if(d=o.previousNode(),d===null)throw new RangeError(s);v-=d.nodeValue.length}if(!a(o.referenceNode))throw new RangeError(s);return v}function t(o){return typeof o!="number"?!1:isFinite(o)&&Math.floor(o)===o}function a(o){return o.nodeType===r}function i(o,l){return o.compareDocumentPosition(l)&h}})(re);var Ae=re.default,ne={};(function(f){Object.defineProperty(f,"__esModule",{value:!0}),f.default=e;function s(r,n){if(!n&&r.firstChild)return r.firstChild;do{if(r.nextSibling)return r.nextSibling;r=r.parentNode}while(r);return r}function g(r){if(r.startContainer.nodeType===Node.ELEMENT_NODE){var n=r.startContainer.childNodes[r.startOffset];return n||s(r.startContainer,!0)}return r.startContainer}function c(r){if(r.endContainer.nodeType===Node.ELEMENT_NODE){var n=r.endContainer.childNodes[r.endOffset];return n||s(r.endContainer,!0)}return s(r.endContainer)}function h(r,n){for(var t=g(r),a=c(r);t!==a;)n(t),t=s(t)}function e(r){var n="";return h(r,function(t){if(t.nodeType===Node.TEXT_NODE){var a=t===r.startContainer?r.startOffset:0,i=t===r.endContainer?r.endOffset:t.textContent.length;n+=t.textContent.slice(a,i)}}),n}})(ne);Object.defineProperty(q,"__esModule",{value:!0});q.fromRange=$e;q.toRange=Be;var z=te(Ae),G=te(ne);function te(f){return f&&f.__esModule?f:{default:f}}var Pe=4;function $e(f,s){if(f===void 0)throw new Error('missing required parameter "root"');if(s===void 0)throw new Error('missing required parameter "range"');var g=f.ownerDocument,c=g.createRange(),h=s.startContainer,e=s.startOffset;c.setStart(f,0),c.setEnd(h,e);var r=(0,G.default)(c).length,n=r+(0,G.default)(s).length;return{start:r,end:n}}function Be(f){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(f===void 0)throw new Error('missing required parameter "root"');var g=f.ownerDocument,c=g.createRange(),h=g.createNodeIterator(f,Pe),e=s.start||0,r=s.end||e,n=e-(0,z.default)(h,e),t=h.referenceNode,a=r-e+n,i=a-(0,z.default)(h,a),o=h.referenceNode;return c.setStart(t,n),c.setEnd(o,i),c}function Le(f){const s=new Date(f),c=new Date().getTime()-s.getTime(),h=Math.floor(c/1e3),e=Math.floor(h/60),r=Math.floor(e/60),n=Math.floor(r/24);return h<60?"just now":e<60?`${e}m ago`:r<24?`${r}h ago`:n<7?`${n}d ago`:s.toLocaleDateString()}class He extends HTMLElement{constructor(){super(),this._annotation=null,this.attachShadow({mode:"open"})}static get observedAttributes(){return["annotation"]}attributeChangedCallback(s,g,c){if(s==="annotation"&&g!==c)try{this._annotation=JSON.parse(c),this.render()}catch(h){console.error("Failed to parse annotation attribute",h)}}set annotation(s){this._annotation=s,this.render()}get annotation(){return this._annotation}connectedCallback(){this.render()}async render(){var v;if(!this._annotation||!this.shadowRoot)return;const{value:s,author:g}=this._annotation,c=s.target,h=s.body,e=s.createdAt,r=(v=c.selector)==null?void 0:v.find(d=>d.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),n=r==null?void 0:r.exact,t=c.url,a=t?this.getDomain(t):"",i=this.buildTextFragmentUrl(t,n),o=(g==null?void 0:g.did)||"unknown",l=(g==null?void 0:g.handle)||(o.includes(":")?o.split(":").pop():o),u=(g==null?void 0:g.avatar)||`https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(l)}`;this.shadowRoot.innerHTML=` 12 - <style> 13 - :host { 14 - display: block; 15 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; 16 - } 17 - 18 - .card { 19 - background: white; 20 - border: 1px solid #e0e0e0; 21 - border-radius: 12px; 22 - padding: 16px; 23 - margin-bottom: 16px; 24 - box-shadow: 0 2px 4px rgba(0,0,0,0.05); 25 - transition: transform 0.2s, box-shadow 0.2s; 26 - } 27 - 28 - .card:hover { 29 - transform: translateY(-1px); 30 - box-shadow: 0 4px 8px rgba(0,0,0,0.1); 31 - } 32 - 33 - .quote { 34 - margin: 0 0 12px 0; 35 - padding-left: 12px; 36 - border-left: 3px solid #FFD700; 37 - color: #444; 38 - font-style: italic; 39 - font-size: 0.95em; 40 - line-height: 1.5; 41 - } 42 - 43 - .body { 44 - color: #1a1a1a; 45 - font-size: 1em; 46 - line-height: 1.6; 47 - margin-bottom: 16px; 48 - white-space: pre-wrap; 49 - } 50 - 51 - .meta { 52 - display: flex; 53 - align-items: center; 54 - justify-content: space-between; 55 - font-size: 0.85em; 56 - color: #666; 57 - border-top: 1px solid #f0f0f0; 58 - padding-top: 12px; 59 - } 60 - 61 - .author { 62 - display: flex; 63 - align-items: center; 64 - gap: 8px; 65 - text-decoration: none; 66 - color: inherit; 67 - } 68 - 69 - .author:hover { 70 - color: #2E7D32; 71 - } 72 - 73 - .avatar { 74 - width: 24px; 75 - height: 24px; 76 - border-radius: 50%; 77 - object-fit: cover; 78 - background: #eee; 79 - } 80 - 81 - .handle { 82 - font-weight: 500; 83 - } 84 - 85 - .source-link { 86 - color: #666; 87 - text-decoration: none; 88 - display: flex; 89 - align-items: center; 90 - gap: 4px; 91 - } 92 - 93 - .source-link:hover { 94 - color: #2E7D32; 95 - text-decoration: underline; 96 - } 97 - 98 - .time { 99 - color: #999; 100 - } 101 - </style> 102 - 103 - <article class="card"> 104 - ${n?`<blockquote class="quote">"${n}"</blockquote>`:""} 105 - ${h?`<div class="body">${this.escapeHtml(h)}</div>`:""} 106 - 107 - <div class="meta"> 108 - <div class="left"> 109 - <a href="https://bsky.app/profile/${o}" target="_blank" rel="noopener noreferrer" class="author"> 110 - <img class="avatar" src="${u}" alt="${l}'s avatar" loading="lazy" /> 111 - <span class="handle">@${l}</span> 112 - </a> 113 - </div> 114 - 115 - <div class="right"> 116 - <span class="time">${Le(e)}</span> 117 - ${a?` 118 - <span style="margin: 0 6px;">•</span> 119 - <a href="${i}" target="_blank" rel="noopener noreferrer" class="source-link"> 120 - ${a} ↗ 121 - </a> 122 - `:""} 123 - </div> 124 - </div> 125 - </article> 126 - `}getDomain(s){try{return new URL(s).hostname}catch{return s}}buildTextFragmentUrl(s,g){if(!s||!g)return s;try{const c=new URL(s);return c.hash=`:~:text=${encodeURIComponent(g)}`,c.toString()}catch{return s}}escapeHtml(s){const g=document.createElement("div");return g.textContent=s,g.innerHTML}}customElements.get("seams-annotation-card")||customElements.define("seams-annotation-card",He);export{Ue as W,q as a,k as l}; 127 - //# sourceMappingURL=annotation-card-lCwGLDVE.js.map
-1
proxy/static/static/assets/annotation-card-lCwGLDVE.js.map
··· 1 - {"version":3,"file":"annotation-card-lCwGLDVE.js","sources":["../../../packages/core/src/storage/web.ts","../../../node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/adapter.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/builtin.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/index.js","../../../node_modules/.pnpm/ancestors@0.0.3/node_modules/ancestors/index.js","../../../node_modules/.pnpm/index-of@0.2.0/node_modules/index-of/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/index.js","../../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../packages/core/src/components/annotation-card.ts"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(keys: string | string[]): Promise<any> {\n if (typeof keys === 'string') {\n const value = localStorage.getItem(keys);\n return value ? JSON.parse(value) : null;\n }\n \n const result: Record<string, any> = {};\n keys.forEach(key => {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n });\n return result;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n \n // Also notify local listeners (for other components in the same window sharing this adapter)\n this.listeners.forEach(callback => callback(change));\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.nodeType == 9 || root.ownerDocument;\n var iter = doc.createNodeIterator(root, whatToShow, filter, false);\n return new NodeIterator(iter, root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(iter, root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._iter = iter;\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var result = this._iter.nextNode();\n this.pointerBeforeReferenceNode = false;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var result = this._iter.previousNode();\n this.pointerBeforeReferenceNode = true;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwibm9kZVR5cGUiLCJvd25lckRvY3VtZW50IiwiaXRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9pdGVyIiwibmV4dE5vZGUiLCJyZXN1bHQiLCJwcmV2aW91c05vZGUiLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFlQSxrQjs7O0FBR2YsU0FBU0Esa0JBQVQsQ0FBNEJDLElBQTVCLEVBQTBFO0FBQUEsTUFBeENDLFVBQXdDLHlEQUEzQixVQUEyQjtBQUFBLE1BQWZDLE1BQWUseURBQU4sSUFBTTs7QUFDeEUsTUFBTUMsTUFBT0gsS0FBS0ksUUFBTCxJQUFpQixDQUFsQixJQUF3QkosS0FBS0ssYUFBekM7QUFDQSxNQUFNQyxPQUFPSCxJQUFJSixrQkFBSixDQUF1QkMsSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRCxLQUFqRCxDQUFiO0FBQ0EsU0FBTyxJQUFJSyxZQUFKLENBQWlCRCxJQUFqQixFQUF1Qk4sSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxDQUFQO0FBQ0Q7O0lBR0tLLFk7QUFDSix3QkFBWUQsSUFBWixFQUFrQk4sSUFBbEIsRUFBd0JDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUFBOztBQUMxQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLGFBQUwsR0FBcUJSLElBQXJCO0FBQ0EsU0FBS1MsMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLElBQWI7QUFDRDs7eUJBRURLLFEsdUJBQVc7QUFDVCxRQUFNQyxTQUFTLEtBQUtGLEtBQUwsQ0FBV0MsUUFBWCxFQUFmO0FBQ0EsU0FBS0YsMEJBQUwsR0FBa0MsS0FBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURLLFksMkJBQWU7QUFDYixRQUFNRCxTQUFTLEtBQUtGLEtBQUwsQ0FBV0csWUFBWCxFQUFmO0FBQ0EsU0FBS0osMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURNLFEsdUJBQVc7QUFDVCxXQUFPLHVCQUFQO0FBQ0QsRyIsImZpbGUiOiJhZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY3JlYXRlTm9kZUl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QsIHdoYXRUb1Nob3cgPSAweEZGRkZGRkZGLCBmaWx0ZXIgPSBudWxsKSB7XG4gIGNvbnN0IGRvYyA9IChyb290Lm5vZGVUeXBlID09IDkpIHx8IHJvb3Qub3duZXJEb2N1bWVudFxuICBjb25zdCBpdGVyID0gZG9jLmNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGZhbHNlKVxuICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihpdGVyLCByb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpXG59XG5cblxuY2xhc3MgTm9kZUl0ZXJhdG9yIHtcbiAgY29uc3RydWN0b3IoaXRlciwgcm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgdGhpcy5yb290ID0gcm9vdFxuICAgIHRoaXMud2hhdFRvU2hvdyA9IHdoYXRUb1Nob3dcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlclxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJvb3RcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHRoaXMuX2l0ZXIgPSBpdGVyXG4gIH1cblxuICBuZXh0Tm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLm5leHROb2RlKClcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHByZXZpb3VzTm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLnByZXZpb3VzTm9kZSgpXG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBOb2RlSXRlcmF0b3JdJ1xuICB9XG59XG4iXX0=","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.ownerDocument;\n return doc.createNodeIterator.call(doc, root, whatToShow, filter);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsdGluLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwib3duZXJEb2N1bWVudCIsImNhbGwiXSwibWFwcGluZ3MiOiI7OztxQkFBZUEsa0I7OztBQUdmLFNBQVNBLGtCQUFULENBQTRCQyxJQUE1QixFQUEwRTtBQUFBLE1BQXhDQyxVQUF3Qyx5REFBM0IsVUFBMkI7QUFBQSxNQUFmQyxNQUFlLHlEQUFOLElBQU07O0FBQ3hFLE1BQU1DLE1BQU1ILEtBQUtJLGFBQWpCO0FBQ0EsU0FBT0QsSUFBSUosa0JBQUosQ0FBdUJNLElBQXZCLENBQTRCRixHQUE1QixFQUFpQ0gsSUFBakMsRUFBdUNDLFVBQXZDLEVBQW1EQyxNQUFuRCxDQUFQO0FBQ0QiLCJmaWxlIjoiYnVpbHRpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyZWF0ZU5vZGVJdGVyYXRvclxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93ID0gMHhGRkZGRkZGRiwgZmlsdGVyID0gbnVsbCkge1xuICBjb25zdCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgcmV0dXJuIGRvYy5jcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChkb2MsIHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcilcbn1cbiJdfQ==","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n return new NodeIterator(root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._filter = function (node) {\n return filter ? filter(node) === 1 : true;\n };\n this._show = function (node) {\n return whatToShow >> node.nodeType - 1 & 1 === 1;\n };\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = false;\n\n var node = this.referenceNode;\n if (before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node.firstChild) {\n node = node.firstChild;\n continue;\n }\n\n do {\n if (node === this.root) return null;\n if (node.nextSibling) break;\n node = node.parentNode;\n } while (node);\n\n node = node.nextSibling;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = false;\n return node;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = true;\n\n var node = this.referenceNode;\n if (!before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node === this.root) return null;\n\n if (node.previousSibling) {\n node = node.previousSibling;\n while (node.lastChild) {\n node = node.lastChild;\n }continue;\n }\n\n node = node.parentNode;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = true;\n return node;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBsZW1lbnRhdGlvbi5qcyJdLCJuYW1lcyI6WyJjcmVhdGVOb2RlSXRlcmF0b3IiLCJyb290Iiwid2hhdFRvU2hvdyIsImZpbHRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9maWx0ZXIiLCJub2RlIiwiX3Nob3ciLCJub2RlVHlwZSIsIm5leHROb2RlIiwiYmVmb3JlIiwiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInByZXZpb3VzTm9kZSIsInByZXZpb3VzU2libGluZyIsImxhc3RDaGlsZCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQWVBLGtCOzs7QUFHZixTQUFTQSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBMEU7QUFBQSxNQUF4Q0MsVUFBd0MseURBQTNCLFVBQTJCO0FBQUEsTUFBZkMsTUFBZSx5REFBTixJQUFNOztBQUN4RSxTQUFPLElBQUlDLFlBQUosQ0FBaUJILElBQWpCLEVBQXVCQyxVQUF2QixFQUFtQ0MsTUFBbkMsQ0FBUDtBQUNEOztJQUdLQyxZO0FBQ0osd0JBQVlILElBQVosRUFBa0JDLFVBQWxCLEVBQThCQyxNQUE5QixFQUFzQztBQUFBOztBQUNwQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtFLGFBQUwsR0FBcUJKLElBQXJCO0FBQ0EsU0FBS0ssMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxPQUFMLEdBQWUsVUFBQ0MsSUFBRDtBQUFBLGFBQVVMLFNBQVNBLE9BQU9LLElBQVAsTUFBaUIsQ0FBMUIsR0FBOEIsSUFBeEM7QUFBQSxLQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLFVBQUNELElBQUQ7QUFBQSxhQUFVTixjQUFjTSxLQUFLRSxRQUFMLEdBQWdCLENBQTlCLEdBQWtDLE1BQU0sQ0FBbEQ7QUFBQSxLQUFiO0FBQ0Q7O3lCQUVEQyxRLHVCQUFXO0FBQ1QsUUFBTUMsU0FBUyxLQUFLTiwwQkFBcEI7QUFDQSxTQUFLQSwwQkFBTCxHQUFrQyxLQUFsQzs7QUFFQSxRQUFJRSxPQUFPLEtBQUtILGFBQWhCO0FBQ0EsUUFBSU8sVUFBVSxLQUFLSCxLQUFMLENBQVdELElBQVgsQ0FBVixJQUE4QixLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FBbEMsRUFBc0QsT0FBT0EsSUFBUDs7QUFFdEQsT0FBRztBQUNELFVBQUlBLEtBQUtLLFVBQVQsRUFBcUI7QUFDbkJMLGVBQU9BLEtBQUtLLFVBQVo7QUFDQTtBQUNEOztBQUVELFNBQUc7QUFDRCxZQUFJTCxTQUFTLEtBQUtQLElBQWxCLEVBQXdCLE9BQU8sSUFBUDtBQUN4QixZQUFJTyxLQUFLTSxXQUFULEVBQXNCO0FBQ3RCTixlQUFPQSxLQUFLTyxVQUFaO0FBQ0QsT0FKRCxRQUlTUCxJQUpUOztBQU1BQSxhQUFPQSxLQUFLTSxXQUFaO0FBQ0QsS0FiRCxRQWFRLENBQUMsS0FBS0wsS0FBTCxDQUFXRCxJQUFYLENBQUQsSUFBcUIsQ0FBQyxLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FiOUI7O0FBZUEsU0FBS0gsYUFBTCxHQUFxQkcsSUFBckI7QUFDQSxTQUFLRiwwQkFBTCxHQUFrQyxLQUFsQztBQUNBLFdBQU9FLElBQVA7QUFDRCxHOzt5QkFFRFEsWSwyQkFBZTtBQUNiLFFBQU1KLFNBQVMsS0FBS04sMEJBQXBCO0FBQ0EsU0FBS0EsMEJBQUwsR0FBa0MsSUFBbEM7O0FBRUEsUUFBSUUsT0FBTyxLQUFLSCxhQUFoQjtBQUNBLFFBQUksQ0FBQ08sTUFBRCxJQUFXLEtBQUtILEtBQUwsQ0FBV0QsSUFBWCxDQUFYLElBQStCLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQUFuQyxFQUF1RCxPQUFPQSxJQUFQOztBQUV2RCxPQUFHO0FBQ0QsVUFBSUEsU0FBUyxLQUFLUCxJQUFsQixFQUF3QixPQUFPLElBQVA7O0FBRXhCLFVBQUlPLEtBQUtTLGVBQVQsRUFBMEI7QUFDeEJULGVBQU9BLEtBQUtTLGVBQVo7QUFDQSxlQUFPVCxLQUFLVSxTQUFaO0FBQXVCVixpQkFBT0EsS0FBS1UsU0FBWjtBQUF2QixTQUNBO0FBQ0Q7O0FBRURWLGFBQU9BLEtBQUtPLFVBQVo7QUFDRCxLQVZELFFBVVEsQ0FBQyxLQUFLTixLQUFMLENBQVdELElBQVgsQ0FBRCxJQUFxQixDQUFDLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQVY5Qjs7QUFZQSxTQUFLSCxhQUFMLEdBQXFCRyxJQUFyQjtBQUNBLFNBQUtGLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0EsV0FBT0UsSUFBUDtBQUNELEc7O3lCQUVEVyxRLHVCQUFXO0FBQ1QsV0FBTyx1QkFBUDtBQUNELEciLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjcmVhdGVOb2RlSXRlcmF0b3JcblxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdyA9IDB4RkZGRkZGRkYsIGZpbHRlciA9IG51bGwpIHtcbiAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKVxufVxuXG5cbmNsYXNzIE5vZGVJdGVyYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcikge1xuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcbiAgICB0aGlzLnJlZmVyZW5jZU5vZGUgPSByb290XG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICB0aGlzLl9maWx0ZXIgPSAobm9kZSkgPT4gZmlsdGVyID8gZmlsdGVyKG5vZGUpID09PSAxIDogdHJ1ZVxuICAgIHRoaXMuX3Nob3cgPSAobm9kZSkgPT4gd2hhdFRvU2hvdyA+PiBub2RlLm5vZGVUeXBlIC0gMSAmIDEgPT09IDFcbiAgfVxuXG4gIG5leHROb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcblxuICAgIGxldCBub2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlXG4gICAgaWYgKGJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG4gICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSBicmVha1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgICB9IHdoaWxlIChub2RlKVxuXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZ1xuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJldmlvdXNOb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgICBpZiAoIWJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG5cbiAgICAgIGlmIChub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUl0ZXJhdG9yXSdcbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = getPolyfill;\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction getPolyfill() {\n try {\n var doc = typeof document === 'undefined' ? {} : document;\n var iter = (0, _builtin2['default'])(doc, 0xFFFFFFFF, null, false);\n if (iter.referenceNode === doc) return _builtin2['default'];\n return _adapter2['default'];\n } catch (_) {\n return _implementation2['default'];\n }\n} /*global document*/\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wb2x5ZmlsbC5qcyJdLCJuYW1lcyI6WyJnZXRQb2x5ZmlsbCIsImRvYyIsImRvY3VtZW50IiwiaXRlciIsInJlZmVyZW5jZU5vZGUiLCJfIl0sIm1hcHBpbmdzIjoiOzs7cUJBTXdCQSxXOztBQUx4Qjs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUdlLFNBQVNBLFdBQVQsR0FBdUI7QUFDcEMsTUFBSTtBQUNGLFFBQU1DLE1BQU0sT0FBT0MsUUFBUCxLQUFxQixXQUFyQixHQUFtQyxFQUFuQyxHQUF3Q0EsUUFBcEQ7QUFDQSxRQUFNQyxPQUFPLDBCQUFRRixHQUFSLEVBQWEsVUFBYixFQUF5QixJQUF6QixFQUErQixLQUEvQixDQUFiO0FBQ0EsUUFBSUUsS0FBS0MsYUFBTCxLQUF1QkgsR0FBM0IsRUFBZ0M7QUFDaEM7QUFDRCxHQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1Y7QUFDRDtBQUNGLEMsQ0FmRCIsImZpbGUiOiJwb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBpbXBsZW1lbnRhdGlvbiBmcm9tICcuL2ltcGxlbWVudGF0aW9uJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICAgIGNvbnN0IGl0ZXIgPSBidWlsdGluKGRvYywgMHhGRkZGRkZGRiwgbnVsbCwgZmFsc2UpXG4gICAgaWYgKGl0ZXIucmVmZXJlbmNlTm9kZSA9PT0gZG9jKSByZXR1cm4gYnVpbHRpblxuICAgIHJldHVybiBhZGFwdGVyXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shim;\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/*global document*/\nfunction shim() {\n var doc = typeof document === 'undefined' ? {} : document;\n var polyfill = (0, _polyfill2['default'])();\n if (polyfill !== _builtin2['default']) doc.createNodeIterator = polyfill;\n return polyfill;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGltLmpzIl0sIm5hbWVzIjpbInNoaW0iLCJkb2MiLCJkb2N1bWVudCIsInBvbHlmaWxsIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIl0sIm1hcHBpbmdzIjoiOzs7cUJBS3dCQSxJOztBQUp4Qjs7OztBQUNBOzs7Ozs7QUFGQTtBQUtlLFNBQVNBLElBQVQsR0FBZ0I7QUFDN0IsTUFBTUMsTUFBTSxPQUFPQyxRQUFQLEtBQXFCLFdBQXJCLEdBQW1DLEVBQW5DLEdBQXdDQSxRQUFwRDtBQUNBLE1BQU1DLFdBQVcsNEJBQWpCO0FBQ0EsTUFBSUEsaUNBQUosRUFBMEJGLElBQUlHLGtCQUFKLEdBQXlCRCxRQUF6QjtBQUMxQixTQUFPQSxRQUFQO0FBQ0QiLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBnZXRQb2x5ZmlsbCBmcm9tICcuL3BvbHlmaWxsJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoaW0oKSB7XG4gIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICBjb25zdCBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKClcbiAgaWYgKHBvbHlmaWxsICE9PSBidWlsdGluKSBkb2MuY3JlYXRlTm9kZUl0ZXJhdG9yID0gcG9seWZpbGxcbiAgcmV0dXJuIHBvbHlmaWxsXG59XG4iXX0=","'use strict';\n\nexports.__esModule = true;\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nvar _shim = require('./shim');\n\nvar _shim2 = _interopRequireDefault(_shim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar polyfill = (0, _polyfill2['default'])();\npolyfill.implementation = _implementation2['default'];\npolyfill.shim = _shim2['default'];\n\nexports['default'] = polyfill;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwb2x5ZmlsbCIsImltcGxlbWVudGF0aW9uIiwic2hpbSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyw0QkFBakI7QUFDQUEsU0FBU0MsY0FBVDtBQUNBRCxTQUFTRSxJQUFUOztxQkFFZUYsUSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UG9seWZpbGwgfSBmcm9tICcuL3BvbHlmaWxsJ1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBpbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNoaW0gfSBmcm9tICcuL3NoaW0nXG5cbmNvbnN0IHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKVxucG9seWZpbGwuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvblxucG9seWZpbGwuc2hpbSA9IHNoaW1cblxuZXhwb3J0IGRlZmF1bHQgcG9seWZpbGxcbiJdfQ==","module.exports = require('./lib/polyfill')['default'];\n","module.exports = require('./lib/implementation')['default'];\n","module.exports = require('./lib/shim')['default'];\n","module.exports = require('./lib')['default'];\nmodule.exports.getPolyfill = require('./polyfill');\nmodule.exports.implementation = require('./implementation');\nmodule.exports.shim = require('./shim');\n","module.exports = parents\n\nfunction parents(node, filter) {\n var out = []\n\n filter = filter || noop\n\n do {\n out.push(node)\n node = node.parentNode\n } while(node && node.tagName && filter(node))\n\n return out.slice(1)\n}\n\nfunction noop(n) {\n return true\n}\n","/*!\n * index-of <https://github.com/jonschlinkert/index-of>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function indexOf(arr, ele, start) {\n start = start || 0;\n var idx = -1;\n\n if (arr == null) return idx;\n var len = arr.length;\n var i = start < 0\n ? (len + start)\n : start;\n\n if (i >= arr.length) {\n return -1;\n }\n\n while (i < len) {\n if (arr[i] === ele) {\n return i;\n }\n i++;\n }\n\n return -1;\n};\n","'use strict';\n\nexports.__esModule = true;\nexports['default'] = seek;\n\nvar _ancestors = require('ancestors');\n\nvar _ancestors2 = _interopRequireDefault(_ancestors);\n\nvar _indexOf = require('index-of');\n\nvar _indexOf2 = _interopRequireDefault(_indexOf);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be a number or a Text Node.';\n\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n throw new Error(E_SHOW);\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isNumber(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n var backward = function backward() {\n return node != where || !iter.pointerBeforeReferenceNode;\n };\n predicates = { forward: forward, backward: backward };\n } else {\n throw new Error(E_WHERE);\n }\n\n while (predicates.forward() && (node = iter.nextNode()) !== null) {\n count += node.nodeValue.length;\n }\n\n while (predicates.backward() && (node = iter.previousNode()) !== null) {\n count -= node.nodeValue.length;\n }\n\n return count;\n}\n\nfunction isNumber(n) {\n return !isNaN(parseInt(n)) && isFinite(n);\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n if (ref === node) return false;\n\n var common = null;\n var left = [ref].concat((0, _ancestors2['default'])(ref)).reverse();\n var right = [node].concat((0, _ancestors2['default'])(node)).reverse();\n\n while (left[0] === right[0]) {\n common = left.shift();\n right.shift();\n }\n\n left = left[0];\n right = right[0];\n\n var l = (0, _indexOf2['default'])(common.childNodes, left);\n var r = (0, _indexOf2['default'])(common.childNodes, right);\n\n return l > r;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzZWVrIiwiRV9TSE9XIiwiRV9XSEVSRSIsIlNIT1dfVEVYVCIsIlRFWFRfTk9ERSIsIml0ZXIiLCJ3aGVyZSIsIndoYXRUb1Nob3ciLCJFcnJvciIsImNvdW50Iiwibm9kZSIsInJlZmVyZW5jZU5vZGUiLCJwcmVkaWNhdGVzIiwiaXNOdW1iZXIiLCJmb3J3YXJkIiwiYmFja3dhcmQiLCJpc1RleHQiLCJiZWZvcmUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIm5leHROb2RlIiwibm9kZVZhbHVlIiwibGVuZ3RoIiwicHJldmlvdXNOb2RlIiwibiIsImlzTmFOIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsIm5vZGVUeXBlIiwicmVmIiwiY29tbW9uIiwibGVmdCIsImNvbmNhdCIsInJldmVyc2UiLCJyaWdodCIsInNoaWZ0IiwibCIsImNoaWxkTm9kZXMiLCJyIl0sIm1hcHBpbmdzIjoiOzs7cUJBVXdCQSxJOztBQVZ4Qjs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQyxTQUFTLDBEQUFmO0FBQ0EsSUFBTUMsVUFBVSxxREFBaEI7O0FBRUEsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLFlBQVksQ0FBbEI7O0FBR2UsU0FBU0osSUFBVCxDQUFjSyxJQUFkLEVBQW9CQyxLQUFwQixFQUEyQjtBQUN4QyxNQUFJRCxLQUFLRSxVQUFMLEtBQW9CSixTQUF4QixFQUFtQztBQUNqQyxVQUFNLElBQUlLLEtBQUosQ0FBVVAsTUFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSVEsUUFBUSxDQUFaO0FBQ0EsTUFBSUMsT0FBT0wsS0FBS00sYUFBaEI7QUFDQSxNQUFJQyxhQUFhLElBQWpCOztBQUVBLE1BQUlDLFNBQVNQLEtBQVQsQ0FBSixFQUFxQjtBQUNuQk0saUJBQWE7QUFDWEUsZUFBUztBQUFBLGVBQU1MLFFBQVFILEtBQWQ7QUFBQSxPQURFO0FBRVhTLGdCQUFVO0FBQUEsZUFBTU4sUUFBUUgsS0FBZDtBQUFBO0FBRkMsS0FBYjtBQUlELEdBTEQsTUFLTyxJQUFJVSxPQUFPVixLQUFQLENBQUosRUFBbUI7QUFDeEIsUUFBSVEsVUFBVUcsT0FBT1AsSUFBUCxFQUFhSixLQUFiLElBQXNCO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FBdEIsR0FBb0M7QUFBQSxhQUFNSSxTQUFTSixLQUFmO0FBQUEsS0FBbEQ7QUFDQSxRQUFJUyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxhQUFNTCxRQUFRSixLQUFSLElBQWlCLENBQUNELEtBQUthLDBCQUE3QjtBQUFBLEtBQWY7QUFDQU4saUJBQWEsRUFBQ0UsZ0JBQUQsRUFBVUMsa0JBQVYsRUFBYjtBQUNELEdBSk0sTUFJQTtBQUNMLFVBQU0sSUFBSVAsS0FBSixDQUFVTixPQUFWLENBQU47QUFDRDs7QUFFRCxTQUFPVSxXQUFXRSxPQUFYLE1BQXdCLENBQUNKLE9BQU9MLEtBQUtjLFFBQUwsRUFBUixNQUE2QixJQUE1RCxFQUFrRTtBQUNoRVYsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9ULFdBQVdHLFFBQVgsTUFBeUIsQ0FBQ0wsT0FBT0wsS0FBS2lCLFlBQUwsRUFBUixNQUFpQyxJQUFqRSxFQUF1RTtBQUNyRWIsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9aLEtBQVA7QUFDRDs7QUFHRCxTQUFTSSxRQUFULENBQWtCVSxDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNDLE1BQU1DLFNBQVNGLENBQVQsQ0FBTixDQUFELElBQXVCRyxTQUFTSCxDQUFULENBQTlCO0FBQ0Q7O0FBR0QsU0FBU1AsTUFBVCxDQUFnQk4sSUFBaEIsRUFBc0I7QUFDcEIsU0FBT0EsS0FBS2lCLFFBQUwsS0FBa0J2QixTQUF6QjtBQUNEOztBQUdELFNBQVNhLE1BQVQsQ0FBZ0JXLEdBQWhCLEVBQXFCbEIsSUFBckIsRUFBMkI7QUFDekIsTUFBSWtCLFFBQVFsQixJQUFaLEVBQWtCLE9BQU8sS0FBUDs7QUFFbEIsTUFBSW1CLFNBQVMsSUFBYjtBQUNBLE1BQUlDLE9BQU8sQ0FBQ0YsR0FBRCxFQUFNRyxNQUFOLENBQWEsNEJBQVVILEdBQVYsQ0FBYixFQUE2QkksT0FBN0IsRUFBWDtBQUNBLE1BQUlDLFFBQVEsQ0FBQ3ZCLElBQUQsRUFBT3FCLE1BQVAsQ0FBYyw0QkFBVXJCLElBQVYsQ0FBZCxFQUErQnNCLE9BQS9CLEVBQVo7O0FBRUEsU0FBT0YsS0FBSyxDQUFMLE1BQVlHLE1BQU0sQ0FBTixDQUFuQixFQUE2QjtBQUMzQkosYUFBU0MsS0FBS0ksS0FBTCxFQUFUO0FBQ0FELFVBQU1DLEtBQU47QUFDRDs7QUFFREosU0FBT0EsS0FBSyxDQUFMLENBQVA7QUFDQUcsVUFBUUEsTUFBTSxDQUFOLENBQVI7O0FBRUEsTUFBSUUsSUFBSSwwQkFBUU4sT0FBT08sVUFBZixFQUEyQk4sSUFBM0IsQ0FBUjtBQUNBLE1BQUlPLElBQUksMEJBQVFSLE9BQU9PLFVBQWYsRUFBMkJILEtBQTNCLENBQVI7O0FBRUEsU0FBT0UsSUFBSUUsQ0FBWDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFuY2VzdG9ycyBmcm9tICdhbmNlc3RvcnMnXG5pbXBvcnQgaW5kZXhPZiBmcm9tICdpbmRleC1vZidcblxuY29uc3QgRV9TSE9XID0gJ0FyZ3VtZW50IDEgb2Ygc2VlayBtdXN0IHVzZSBmaWx0ZXIgTm9kZUZpbHRlci5TSE9XX1RFWFQuJ1xuY29uc3QgRV9XSEVSRSA9ICdBcmd1bWVudCAyIG9mIHNlZWsgbXVzdCBiZSBhIG51bWJlciBvciBhIFRleHQgTm9kZS4nXG5cbmNvbnN0IFNIT1dfVEVYVCA9IDRcbmNvbnN0IFRFWFRfTk9ERSA9IDNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWVrKGl0ZXIsIHdoZXJlKSB7XG4gIGlmIChpdGVyLndoYXRUb1Nob3cgIT09IFNIT1dfVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1NIT1cpXG4gIH1cblxuICBsZXQgY291bnQgPSAwXG4gIGxldCBub2RlID0gaXRlci5yZWZlcmVuY2VOb2RlXG4gIGxldCBwcmVkaWNhdGVzID0gbnVsbFxuXG4gIGlmIChpc051bWJlcih3aGVyZSkpIHtcbiAgICBwcmVkaWNhdGVzID0ge1xuICAgICAgZm9yd2FyZDogKCkgPT4gY291bnQgPCB3aGVyZSxcbiAgICAgIGJhY2t3YXJkOiAoKSA9PiBjb3VudCA+IHdoZXJlLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHQod2hlcmUpKSB7XG4gICAgbGV0IGZvcndhcmQgPSBiZWZvcmUobm9kZSwgd2hlcmUpID8gKCkgPT4gZmFsc2UgOiAoKSA9PiBub2RlICE9PSB3aGVyZVxuICAgIGxldCBiYWNrd2FyZCA9ICgpID0+IG5vZGUgIT0gd2hlcmUgfHwgIWl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICBwcmVkaWNhdGVzID0ge2ZvcndhcmQsIGJhY2t3YXJkfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1dIRVJFKVxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuZm9yd2FyZCgpICYmIChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCkge1xuICAgIGNvdW50ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aFxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuYmFja3dhcmQoKSAmJiAobm9kZSA9IGl0ZXIucHJldmlvdXNOb2RlKCkpICE9PSBudWxsKSB7XG4gICAgY291bnQgLT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuXG5mdW5jdGlvbiBpc051bWJlcihuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobikpICYmIGlzRmluaXRlKG4pXG59XG5cblxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZShyZWYsIG5vZGUpIHtcbiAgaWYgKHJlZiA9PT0gbm9kZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNvbW1vbiA9IG51bGxcbiAgbGV0IGxlZnQgPSBbcmVmXS5jb25jYXQoYW5jZXN0b3JzKHJlZikpLnJldmVyc2UoKVxuICBsZXQgcmlnaHQgPSBbbm9kZV0uY29uY2F0KGFuY2VzdG9ycyhub2RlKSkucmV2ZXJzZSgpXG5cbiAgd2hpbGUgKGxlZnRbMF0gPT09IHJpZ2h0WzBdKSB7XG4gICAgY29tbW9uID0gbGVmdC5zaGlmdCgpXG4gICAgcmlnaHQuc2hpZnQoKVxuICB9XG5cbiAgbGVmdCA9IGxlZnRbMF1cbiAgcmlnaHQgPSByaWdodFswXVxuXG4gIGxldCBsID0gaW5kZXhPZihjb21tb24uY2hpbGROb2RlcywgbGVmdClcbiAgbGV0IHIgPSBpbmRleE9mKGNvbW1vbi5jaGlsZE5vZGVzLCByaWdodClcblxuICByZXR1cm4gbCA+IHJcbn1cbiJdfQ==","module.exports = require('./lib')['default'];\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rangeToString;\n/* global Node */\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n } while (node);\n\n /* istanbul ignore next */\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true /* skip children */);\n }\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true /* skip children */);\n }\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS10by1zdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBcUR3QixhO0FBckR4Qjs7QUFFQTs7O0FBR0EsU0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCLFlBQXhCLEVBQXNDO0FBQ3BDLE1BQUksQ0FBQyxZQUFELElBQWlCLEtBQUssVUFBMUIsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFFRCxLQUFHO0FBQ0QsUUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsYUFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELFdBQU8sS0FBSyxVQUFaO0FBQ0QsR0FMRCxRQUtTLElBTFQ7O0FBT0E7QUFDQSxTQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFDeEIsTUFBSSxNQUFNLGNBQU4sQ0FBcUIsUUFBckIsS0FBa0MsS0FBSyxZQUEzQyxFQUF5RDtBQUN2RCxRQUFNLE9BQU8sTUFBTSxjQUFOLENBQXFCLFVBQXJCLENBQWdDLE1BQU0sV0FBdEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sY0FBZixFQUErQixJQUEvQixDQUFvQyxtQkFBcEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxNQUFNLGNBQWI7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsS0FBeEIsRUFBK0I7QUFDN0IsTUFBSSxNQUFNLFlBQU4sQ0FBbUIsUUFBbkIsS0FBZ0MsS0FBSyxZQUF6QyxFQUF1RDtBQUNyRCxRQUFNLE9BQU8sTUFBTSxZQUFOLENBQW1CLFVBQW5CLENBQThCLE1BQU0sU0FBcEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sWUFBZixFQUE2QixJQUE3QixDQUFrQyxtQkFBbEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxTQUFTLE1BQU0sWUFBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxFQUF1QztBQUNyQyxNQUFJLE9BQU8sVUFBVSxLQUFWLENBQVg7QUFDQSxNQUFNLFVBQVUsZUFBZSxLQUFmLENBQWhCO0FBQ0EsU0FBTyxTQUFTLE9BQWhCLEVBQXlCO0FBQ3ZCLE9BQUcsSUFBSDtBQUNBLFdBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNGOztBQUVEOzs7Ozs7O0FBT2UsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCO0FBQzNDO0FBQ0E7QUFDQSxNQUFJLE9BQU8sRUFBWDtBQUNBLHFCQUFtQixLQUFuQixFQUEwQixVQUFDLElBQUQsRUFBVTtBQUNsQyxRQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFNBQTNCLEVBQXNDO0FBQ3BDO0FBQ0Q7QUFDRCxRQUFNLFFBQVEsU0FBUyxNQUFNLGNBQWYsR0FBZ0MsTUFBTSxXQUF0QyxHQUFvRCxDQUFsRTtBQUNBLFFBQU0sTUFBTSxTQUFTLE1BQU0sWUFBZixHQUE4QixNQUFNLFNBQXBDLEdBQWdELEtBQUssV0FBTCxDQUFpQixNQUE3RTtBQUNBLFlBQVEsS0FBSyxXQUFMLENBQWlCLEtBQWpCLENBQXVCLEtBQXZCLEVBQThCLEdBQTlCLENBQVI7QUFDRCxHQVBEO0FBUUEsU0FBTyxJQUFQO0FBQ0QiLCJmaWxlIjoicmFuZ2UtdG8tc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIE5vZGUgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgbm9kZSBhZnRlciBgbm9kZWAgaW4gYSB0cmVlIG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG5leHROb2RlKG5vZGUsIHNraXBDaGlsZHJlbikge1xuICBpZiAoIXNraXBDaGlsZHJlbiAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkXG4gIH1cblxuICBkbyB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgfSB3aGlsZSAobm9kZSlcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiBmaXJzdE5vZGUocmFuZ2UpIHtcbiAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XVxuICAgIHJldHVybiBub2RlIHx8IG5leHROb2RlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0cnVlIC8qIHNraXAgY2hpbGRyZW4gKi8pXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnN0YXJ0Q29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGZpcnN0Tm9kZUFmdGVyKHJhbmdlKSB7XG4gIGlmIChyYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF1cbiAgICByZXR1cm4gbm9kZSB8fCBuZXh0Tm9kZShyYW5nZS5lbmRDb250YWluZXIsIHRydWUgLyogc2tpcCBjaGlsZHJlbiAqLylcbiAgfVxuICByZXR1cm4gbmV4dE5vZGUocmFuZ2UuZW5kQ29udGFpbmVyKVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIGNiKSB7XG4gIGxldCBub2RlID0gZmlyc3ROb2RlKHJhbmdlKVxuICBjb25zdCBwYXN0RW5kID0gZmlyc3ROb2RlQWZ0ZXIocmFuZ2UpXG4gIHdoaWxlIChub2RlICE9PSBwYXN0RW5kKSB7XG4gICAgY2Iobm9kZSlcbiAgICBub2RlID0gbmV4dE5vZGUobm9kZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgcG9ueWZpbGwgZm9yIFJhbmdlLnRvU3RyaW5nKCkuXG4gKiBTcGVjOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yYW5nZS1zdHJpbmdpZmllclxuICpcbiAqIFdvcmtzIGFyb3VuZCB0aGUgYnVnZ3kgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBpbiBJRSBhbmQgRWRnZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGlsZ292aS9kb20tYW5jaG9yLXRleHQtcG9zaXRpb24vaXNzdWVzLzRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhyYW5nZSkge1xuICAvLyBUaGlzIGlzIGEgZmFpcmx5IGRpcmVjdCB0cmFuc2xhdGlvbiBvZiB0aGUgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvblxuICAvLyBpbiBCbGluay5cbiAgbGV0IHRleHQgPSAnJ1xuICBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlID09PSByYW5nZS5zdGFydENvbnRhaW5lciA/IHJhbmdlLnN0YXJ0T2Zmc2V0IDogMFxuICAgIGNvbnN0IGVuZCA9IG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lciA/IHJhbmdlLmVuZE9mZnNldCA6IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoXG4gICAgdGV4dCArPSBub2RlLnRleHRDb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0pXG4gIHJldHVybiB0ZXh0XG59XG5cbiJdfQ==","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domNodeIterator = require('dom-node-iterator');\n\nvar _domNodeIterator2 = _interopRequireDefault(_domNodeIterator);\n\nvar _domSeek = require('dom-seek');\n\nvar _domSeek2 = _interopRequireDefault(_domSeek);\n\nvar _rangeToString = require('./range-to-string');\n\nvar _rangeToString2 = _interopRequireDefault(_rangeToString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n\n var start = (0, _rangeToString2.default)(prefix).length;\n var end = start + (0, _rangeToString2.default)(range).length;\n\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = (0, _domNodeIterator2.default)(root, SHOW_TEXT);\n\n var start = selector.start || 0;\n var end = selector.end || start;\n var count = (0, _domSeek2.default)(iter, start);\n var remainder = start - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setStart(iter.referenceNode, remainder);\n } else {\n range.setStart(iter.nextNode(), remainder);\n iter.previousNode();\n }\n\n var length = end - start + remainder;\n count = (0, _domSeek2.default)(iter, length);\n remainder = length - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setEnd(iter.referenceNode, remainder);\n } else {\n range.setEnd(iter.nextNode(), remainder);\n }\n\n return range;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQU9nQixTLEdBQUEsUztRQTJCQSxPLEdBQUEsTzs7QUFsQ2hCOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxZQUFZLENBQWxCOztBQUVPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxNQUFJLFNBQVMsU0FBYixFQUF3QjtBQUN0QixVQUFNLElBQUksS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUksVUFBVSxTQUFkLEVBQXlCO0FBQ3ZCLFVBQU0sSUFBSSxLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxTQUFTLFNBQVMsV0FBVCxFQUFiOztBQUVBLE1BQUksWUFBWSxNQUFNLGNBQXRCO0FBQ0EsTUFBSSxjQUFjLE1BQU0sV0FBeEI7O0FBRUEsU0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLENBQXRCO0FBQ0EsU0FBTyxNQUFQLENBQWMsU0FBZCxFQUF5QixXQUF6Qjs7QUFFQSxNQUFJLFFBQVEsNkJBQWMsTUFBZCxFQUFzQixNQUFsQztBQUNBLE1BQUksTUFBTSxRQUFRLDZCQUFjLEtBQWQsRUFBcUIsTUFBdkM7O0FBRUEsU0FBTztBQUNMLFdBQU8sS0FERjtBQUVMLFNBQUs7QUFGQSxHQUFQO0FBSUQ7O0FBR00sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXNDO0FBQUEsTUFBZixRQUFlLHlEQUFKLEVBQUk7O0FBQzNDLE1BQUksU0FBUyxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSSxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxRQUFRLFNBQVMsV0FBVCxFQUFaO0FBQ0EsTUFBSSxPQUFPLCtCQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFYOztBQUVBLE1BQUksUUFBUSxTQUFTLEtBQVQsSUFBa0IsQ0FBOUI7QUFDQSxNQUFJLE1BQU0sU0FBUyxHQUFULElBQWdCLEtBQTFCO0FBQ0EsTUFBSSxRQUFRLHVCQUFLLElBQUwsRUFBVyxLQUFYLENBQVo7QUFDQSxNQUFJLFlBQVksUUFBUSxLQUF4Qjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxRQUFOLENBQWUsS0FBSyxhQUFwQixFQUFtQyxTQUFuQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sUUFBTixDQUFlLEtBQUssUUFBTCxFQUFmLEVBQWdDLFNBQWhDO0FBQ0EsU0FBSyxZQUFMO0FBQ0Q7O0FBRUQsTUFBSSxTQUFVLE1BQU0sS0FBUCxHQUFnQixTQUE3QjtBQUNBLFVBQVEsdUJBQUssSUFBTCxFQUFXLE1BQVgsQ0FBUjtBQUNBLGNBQVksU0FBUyxLQUFyQjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxNQUFOLENBQWEsS0FBSyxhQUFsQixFQUFpQyxTQUFqQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sTUFBTixDQUFhLEtBQUssUUFBTCxFQUFiLEVBQThCLFNBQTlCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTm9kZUl0ZXJhdG9yIGZyb20gJ2RvbS1ub2RlLWl0ZXJhdG9yJ1xuaW1wb3J0IHNlZWsgZnJvbSAnZG9tLXNlZWsnXG5cbmltcG9ydCByYW5nZVRvU3RyaW5nIGZyb20gJy4vcmFuZ2UtdG8tc3RyaW5nJ1xuXG5jb25zdCBTSE9XX1RFWFQgPSA0XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IGRvY3VtZW50ID0gcm9vdC5vd25lckRvY3VtZW50XG4gIGxldCBwcmVmaXggPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG5cbiAgbGV0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGxldCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG5cbiAgcHJlZml4LnNldFN0YXJ0KHJvb3QsIDApXG4gIHByZWZpeC5zZXRFbmQoc3RhcnROb2RlLCBzdGFydE9mZnNldClcblxuICBsZXQgc3RhcnQgPSByYW5nZVRvU3RyaW5nKHByZWZpeCkubGVuZ3RoXG4gIGxldCBlbmQgPSBzdGFydCArIHJhbmdlVG9TdHJpbmcocmFuZ2UpLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFuZ2Uocm9vdCwgc2VsZWN0b3IgPSB7fSkge1xuICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJvb3RcIicpXG4gIH1cblxuICBsZXQgZG9jdW1lbnQgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICBsZXQgaXRlciA9IGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCBTSE9XX1RFWFQpXG5cbiAgbGV0IHN0YXJ0ID0gc2VsZWN0b3Iuc3RhcnQgfHwgMFxuICBsZXQgZW5kID0gc2VsZWN0b3IuZW5kIHx8IHN0YXJ0XG4gIGxldCBjb3VudCA9IHNlZWsoaXRlciwgc3RhcnQpXG4gIGxldCByZW1haW5kZXIgPSBzdGFydCAtIGNvdW50XG5cbiAgaWYgKGl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGUpIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLnJlZmVyZW5jZU5vZGUsIHJlbWFpbmRlcilcbiAgfSBlbHNlIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgICBpdGVyLnByZXZpb3VzTm9kZSgpXG4gIH1cblxuICBsZXQgbGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSArIHJlbWFpbmRlclxuICBjb3VudCA9IHNlZWsoaXRlciwgbGVuZ3RoKVxuICByZW1haW5kZXIgPSBsZW5ndGggLSBjb3VudFxuXG4gIGlmIChpdGVyLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgcmFuZ2Uuc2V0RW5kKGl0ZXIucmVmZXJlbmNlTm9kZSwgcmVtYWluZGVyKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlLnNldEVuZChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgfVxuXG4gIHJldHVybiByYW5nZVxufVxuIl19","module.exports = require('./lib')\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.fromTextPosition = fromTextPosition;\nexports.toRange = toRange;\nexports.toTextPosition = toTextPosition;\n\nvar _diffMatchPatch = require('diff-match-patch');\n\nvar _diffMatchPatch2 = _interopRequireDefault(_diffMatchPatch);\n\nvar _domAnchorTextPosition = require('dom-anchor-text-position');\n\nvar textPosition = _interopRequireWildcard(_domAnchorTextPosition);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The DiffMatchPatch bitap has a hard 32-character pattern length limit.\nvar SLICE_LENGTH = 32;\nvar SLICE_RE = new RegExp('(.|[\\r\\n]){1,' + String(SLICE_LENGTH) + '}', 'g');\nvar CONTEXT_LENGTH = SLICE_LENGTH;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var position = textPosition.fromRange(root, range);\n return fromTextPosition(root, position);\n}\n\nfunction fromTextPosition(root, selector) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var start = selector.start;\n\n if (start === undefined) {\n throw new Error('selector missing required property \"start\"');\n }\n if (start < 0) {\n throw new Error('property \"start\" must be a non-negative integer');\n }\n\n var end = selector.end;\n\n if (end === undefined) {\n throw new Error('selector missing required property \"end\"');\n }\n if (end < 0) {\n throw new Error('property \"end\" must be a non-negative integer');\n }\n\n var exact = root.textContent.substr(start, end - start);\n\n var prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n var prefix = root.textContent.substr(prefixStart, start - prefixStart);\n\n var suffixEnd = Math.min(root.textContent.length, end + CONTEXT_LENGTH);\n var suffix = root.textContent.substr(end, suffixEnd - end);\n\n return { exact: exact, prefix: prefix, suffix: suffix };\n}\n\nfunction toRange(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var position = toTextPosition(root, selector, options);\n if (position === null) {\n return null;\n } else {\n return textPosition.toRange(root, position);\n }\n}\n\nfunction toTextPosition(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var exact = selector.exact;\n\n if (exact === undefined) {\n throw new Error('selector missing required property \"exact\"');\n }\n\n var prefix = selector.prefix,\n suffix = selector.suffix;\n var hint = options.hint;\n\n var dmp = new _diffMatchPatch2.default();\n\n dmp.Match_Distance = root.textContent.length * 2;\n\n // Work around a hard limit of the DiffMatchPatch bitap implementation.\n // The search pattern must be no more than SLICE_LENGTH characters.\n var slices = exact.match(SLICE_RE);\n var loc = hint === undefined ? root.textContent.length / 2 | 0 : hint;\n var start = Number.POSITIVE_INFINITY;\n var end = Number.NEGATIVE_INFINITY;\n var result = -1;\n var havePrefix = prefix !== undefined;\n var haveSuffix = suffix !== undefined;\n var foundPrefix = false;\n\n // If the prefix is known then search for that first.\n if (havePrefix) {\n result = dmp.match_main(root.textContent, prefix, loc);\n if (result > -1) {\n loc = result + prefix.length;\n foundPrefix = true;\n }\n }\n\n // If we have a suffix, and the prefix wasn't found, then search for it.\n if (haveSuffix && !foundPrefix) {\n result = dmp.match_main(root.textContent, suffix, loc + exact.length);\n if (result > -1) {\n loc = result - exact.length;\n }\n }\n\n // Search for the first slice.\n var firstSlice = slices.shift();\n result = dmp.match_main(root.textContent, firstSlice, loc);\n if (result > -1) {\n start = result;\n loc = end = start + firstSlice.length;\n } else {\n return null;\n }\n\n // Create a fold function that will reduce slices to positional extents.\n var foldSlices = function foldSlices(acc, slice) {\n if (!acc) {\n // A search for an earlier slice of the pattern failed to match.\n return null;\n }\n\n var result = dmp.match_main(root.textContent, slice, acc.loc);\n if (result === -1) {\n return null;\n }\n\n // The next slice should follow this one closely.\n acc.loc = result + slice.length;\n\n // Expand the start and end to a quote that includes all the slices.\n acc.start = Math.min(acc.start, result);\n acc.end = Math.max(acc.end, result + slice.length);\n\n return acc;\n };\n\n // Use the fold function to establish the full quote extents.\n // Expect the slices to be close to one another.\n // This distance is deliberately generous for now.\n dmp.Match_Distance = 64;\n var acc = slices.reduce(foldSlices, { start: start, end: end, loc: loc });\n if (!acc) {\n return null;\n }\n\n return { start: acc.start, end: acc.end };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JD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ZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/ICgocm9vdC50ZXh0Q29udGVudC5sZW5ndGggLyAyKSB8IDApIDogaGludFxuICBsZXQgc3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IGVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICBsZXQgcmVzdWx0ID0gLTFcbiAgbGV0IGhhdmVQcmVmaXggPSBwcmVmaXggIT09IHVuZGVmaW5lZFxuICBsZXQgaGF2ZVN1ZmZpeCA9IHN1ZmZpeCAhPT0gdW5kZWZpbmVkXG4gIGxldCBmb3VuZFByZWZpeCA9IGZhbHNlXG5cbiAgLy8gSWYgdGhlIHByZWZpeCBpcyBrbm93biB0aGVuIHNlYXJjaCBmb3IgdGhhdCBmaXJzdC5cbiAgaWYgKGhhdmVQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBwcmVmaXgsIGxvYylcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCArIHByZWZpeC5sZW5ndGhcbiAgICAgIGZvdW5kUHJlZml4ID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSBzdWZmaXgsIGFuZCB0aGUgcHJlZml4IHdhc24ndCBmb3VuZCwgdGhlbiBzZWFyY2ggZm9yIGl0LlxuICBpZiAoaGF2ZVN1ZmZpeCAmJiAhZm91bmRQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBzdWZmaXgsIGxvYyArIGV4YWN0Lmxlbmd0aClcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCAtIGV4YWN0Lmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsaWNlLlxuICBsZXQgZmlyc3RTbGljZSA9IHNsaWNlcy5zaGlmdCgpXG4gIHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIGZpcnN0U2xpY2UsIGxvYylcbiAgaWYgKHJlc3VsdCA+IC0xKSB7XG4gICAgc3RhcnQgPSByZXN1bHRcbiAgICBsb2MgPSBlbmQgPSBzdGFydCArIGZpcnN0U2xpY2UubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGZvbGQgZnVuY3Rpb24gdGhhdCB3aWxsIHJlZHVjZSBzbGljZXMgdG8gcG9zaXRpb25hbCBleHRlbnRzLlxuICBsZXQgZm9sZFNsaWNlcyA9IChhY2MsIHNsaWNlKSA9PiB7XG4gICAgaWYgKCFhY2MpIHtcbiAgICAgIC8vIEEgc2VhcmNoIGZvciBhbiBlYXJsaWVyIHNsaWNlIG9mIHRoZSBwYXR0ZXJuIGZhaWxlZCB0byBtYXRjaC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIHNsaWNlLCBhY2MubG9jKVxuICAgIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHNsaWNlIHNob3VsZCBmb2xsb3cgdGhpcyBvbmUgY2xvc2VseS5cbiAgICBhY2MubG9jID0gcmVzdWx0ICsgc2xpY2UubGVuZ3RoXG5cbiAgICAvLyBFeHBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgdG8gYSBxdW90ZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgc2xpY2VzLlxuICAgIGFjYy5zdGFydCA9IE1hdGgubWluKGFjYy5zdGFydCwgcmVzdWx0KVxuICAgIGFjYy5lbmQgPSBNYXRoLm1heChhY2MuZW5kLCByZXN1bHQgKyBzbGljZS5sZW5ndGgpXG5cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICAvLyBVc2UgdGhlIGZvbGQgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBmdWxsIHF1b3RlIGV4dGVudHMuXG4gIC8vIEV4cGVjdCB0aGUgc2xpY2VzIHRvIGJlIGNsb3NlIHRvIG9uZSBhbm90aGVyLlxuICAvLyBUaGlzIGRpc3RhbmNlIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3Igbm93LlxuICBkbXAuTWF0Y2hfRGlzdGFuY2UgPSA2NFxuICBjb25zdCBhY2MgPSBzbGljZXMucmVkdWNlKGZvbGRTbGljZXMsIHtzdGFydCwgZW5kLCBsb2N9KVxuICBpZiAoIWFjYykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge3N0YXJ0OiBhY2Muc3RhcnQsIGVuZDogYWNjLmVuZH1cbn1cbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = seek;\nvar E_END = 'Iterator exhausted before seek ended.';\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.';\nvar DOCUMENT_POSITION_PRECEDING = 2;\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n var error; // istanbul ignore next\n\n try {\n error = new DOMException(E_SHOW, 'InvalidStateError');\n } catch (_unused) {\n error = new Error(E_SHOW);\n error.code = 11;\n error.name = 'InvalidStateError';\n\n error.toString = function () {\n return \"InvalidStateError: \".concat(E_SHOW);\n };\n }\n\n throw error;\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isInteger(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where || !iter.pointerBeforeReferenceNode;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n\n var backward = function backward() {\n return node !== where || !iter.pointerBeforeReferenceNode;\n };\n\n predicates = {\n forward: forward,\n backward: backward\n };\n } else {\n throw new TypeError(E_WHERE);\n }\n\n while (predicates.forward()) {\n node = iter.nextNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count += node.nodeValue.length;\n }\n\n if (iter.nextNode()) {\n node = iter.previousNode();\n }\n\n while (predicates.backward()) {\n node = iter.previousNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count -= node.nodeValue.length;\n }\n\n if (!isText(iter.referenceNode)) {\n throw new RangeError(E_END);\n }\n\n return count;\n}\n\nfunction isInteger(n) {\n if (typeof n !== 'number') return false;\n return isFinite(n) && Math.floor(n) === n;\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING;\n}\n//# sourceMappingURL=index.js.map","module.exports = require('./lib')['default'];\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = rangeToString;\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n\n node = node.parentNode;\n } while (node);\n /* istanbul ignore next */\n\n\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true\n /* skip children */\n );\n }\n\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true\n /* skip children */\n );\n }\n\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\n\n\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=range-to-string.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domSeek = _interopRequireDefault(require(\"dom-seek\"));\n\nvar _rangeToString = _interopRequireDefault(require(\"./range-to-string\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n var start = (0, _rangeToString[\"default\"])(prefix).length;\n var end = start + (0, _rangeToString[\"default\"])(range).length;\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = document.createNodeIterator(root, SHOW_TEXT);\n var start = selector.start || 0;\n var end = selector.end || start;\n var startOffset = start - (0, _domSeek[\"default\"])(iter, start);\n var startNode = iter.referenceNode;\n var remainder = end - start + startOffset;\n var endOffset = remainder - (0, _domSeek[\"default\"])(iter, remainder);\n var endNode = iter.referenceNode;\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n return range;\n}\n//# sourceMappingURL=index.js.map","import { normalizeUrl } from '../utils';\n\n// Format relative time\nfunction formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n \n return date.toLocaleDateString();\n}\n\nexport class SeamsAnnotationCard extends HTMLElement {\n private _annotation: any = null;\n\n static get observedAttributes() {\n return ['annotation'];\n }\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\n if (name === 'annotation' && oldValue !== newValue) {\n try {\n this._annotation = JSON.parse(newValue);\n this.render();\n } catch (e) {\n console.error('Failed to parse annotation attribute', e);\n }\n }\n }\n\n set annotation(data: any) {\n this._annotation = data;\n this.render();\n }\n\n get annotation() {\n return this._annotation;\n }\n\n connectedCallback() {\n this.render();\n }\n\n async render() {\n if (!this._annotation || !this.shadowRoot) return;\n\n const { value, author } = this._annotation;\n const target = value.target;\n const body = value.body;\n const createdAt = value.createdAt;\n \n // Extract quote\n const textQuoteSelector = target.selector?.find(\n (s: any) => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector'\n );\n const quotedText = textQuoteSelector?.exact;\n\n const sourceUrl = target.url;\n const domain = sourceUrl ? this.getDomain(sourceUrl) : '';\n const fragmentUrl = this.buildTextFragmentUrl(sourceUrl, quotedText);\n\n // Author details\n const authorDid = author?.did || 'unknown';\n const authorHandle = author?.handle || (authorDid.includes(':') ? authorDid.split(':').pop() : authorDid);\n const avatarSrc = author?.avatar || `https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(authorHandle)}`;\n\n this.shadowRoot.innerHTML = `\n <style>\n :host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n \n .card {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.05);\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .card:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n }\n\n .quote {\n margin: 0 0 12px 0;\n padding-left: 12px;\n border-left: 3px solid #FFD700;\n color: #444;\n font-style: italic;\n font-size: 0.95em;\n line-height: 1.5;\n }\n\n .body {\n color: #1a1a1a;\n font-size: 1em;\n line-height: 1.6;\n margin-bottom: 16px;\n white-space: pre-wrap;\n }\n\n .meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.85em;\n color: #666;\n border-top: 1px solid #f0f0f0;\n padding-top: 12px;\n }\n\n .author {\n display: flex;\n align-items: center;\n gap: 8px;\n text-decoration: none;\n color: inherit;\n }\n\n .author:hover {\n color: #2E7D32;\n }\n\n .avatar {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n background: #eee;\n }\n\n .handle {\n font-weight: 500;\n }\n\n .source-link {\n color: #666;\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .source-link:hover {\n color: #2E7D32;\n text-decoration: underline;\n }\n\n .time {\n color: #999;\n }\n </style>\n\n <article class=\"card\">\n ${quotedText ? `<blockquote class=\"quote\">\"${quotedText}\"</blockquote>` : ''}\n ${body ? `<div class=\"body\">${this.escapeHtml(body)}</div>` : ''}\n \n <div class=\"meta\">\n <div class=\"left\">\n <a href=\"https://bsky.app/profile/${authorDid}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"author\">\n <img class=\"avatar\" src=\"${avatarSrc}\" alt=\"${authorHandle}'s avatar\" loading=\"lazy\" />\n <span class=\"handle\">@${authorHandle}</span>\n </a>\n </div>\n \n <div class=\"right\">\n <span class=\"time\">${formatRelativeTime(createdAt)}</span>\n ${domain ? `\n <span style=\"margin: 0 6px;\">•</span>\n <a href=\"${fragmentUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"source-link\">\n ${domain} ↗\n </a>\n ` : ''}\n </div>\n </div>\n </article>\n `;\n }\n\n private getDomain(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return url;\n }\n }\n\n private buildTextFragmentUrl(sourceUrl: string, exactText?: string): string {\n if (!sourceUrl || !exactText) return sourceUrl;\n try {\n const url = new URL(sourceUrl);\n url.hash = `:~:text=${encodeURIComponent(exactText)}`;\n return url.toString();\n } catch {\n return sourceUrl;\n }\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n\n// Register component if not already registered\nif (!customElements.get('seams-annotation-card')) {\n customElements.define('seams-annotation-card', SeamsAnnotationCard);\n}\n"],"names":["WebStorageAdapter","channelName","event","callback","keys","value","result","key","oldValue","change","diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","i","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","a","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","j","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","delta","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","chars","lineStart","lineEnd","lineArrayLength","line","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","length","pattern","found","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","html","pattern_amp","pattern_lt","pattern_gt","pattern_para","data","levenshtein","insertions","deletions","diffsLength","tokens","param","n","s","match_bitapScore_","e","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","start","finish","rd","charMatch","patch","padding","prefix","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","mod","paddingLength","extraLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","m","sign","coords1","coords2","module","exports","_classCallCheck","instance","Constructor","createNodeIterator","root","whatToShow","filter","doc","iter","NodeIterator","node","before","getPolyfill","_adapter","require$$0","_adapter2","_interopRequireDefault","_builtin","require$$1","_builtin2","_implementation","require$$2","_implementation2","obj","shim","_polyfill","_polyfill2","polyfill","_shim","_shim2","implementation","domNodeIteratorModule","require$$3","ancestors","parents","out","noop","indexOf","arr","ele","idx","len","seek","_ancestors","_ancestors2","_indexOf","_indexOf2","E_SHOW","E_WHERE","SHOW_TEXT","TEXT_NODE","where","count","predicates","isNumber","isText","forward","backward","ref","common","left","right","l","r","domSeek","rangeToString_1","rangeToString","nextNode","skipChildren","firstNode","range","firstNodeAfter","forEachNodeInRange","cb","pastEnd","end","lib","fromRange","toRange","_domNodeIterator","_domNodeIterator2","_domSeek","_domSeek2","_rangeToString","_rangeToString2","document","startNode","startOffset","selector","remainder","domAnchorTextPosition","fromTextPosition","toTextPosition","_diffMatchPatch","_diffMatchPatch2","_domAnchorTextPosition","textPosition","_interopRequireWildcard","newObj","SLICE_LENGTH","SLICE_RE","CONTEXT_LENGTH","position","exact","prefixStart","suffixEnd","options","hint","slices","havePrefix","haveSuffix","foundPrefix","firstSlice","foldSlices","acc","slice","E_END","DOCUMENT_POSITION_PRECEDING","error","isInteger","endOffset","endNode","formatRelativeTime","dateString","date","diffMs","diffSecs","diffMins","diffHours","diffDays","SeamsAnnotationCard","name","newValue","_a","author","target","body","createdAt","textQuoteSelector","quotedText","sourceUrl","domain","fragmentUrl","authorDid","authorHandle","avatarSrc","url","exactText","div"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
-2
proxy/static/static/assets/exchange-CZnIlTgn.js
··· 1 - var re=Object.defineProperty;var W=t=>{throw TypeError(t)};var ne=(t,e,r)=>e in t?re(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>ne(t,typeof e!="symbol"?e+"":e,r),K=(t,e,r)=>e.has(t)||W("Cannot "+r);var D=(t,e,r)=>(K(t,e,"read from private field"),r?r.call(t):e.get(t)),j=(t,e,r)=>e.has(t)?W("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),B=(t,e,r,n)=>(K(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),z=(t,e,r)=>(K(t,e,"access private method"),r);const se="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let M=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=se[r[t]&63];return e};const oe=new TextEncoder;new TextDecoder;const ae=crypto.subtle,ie=t=>new Uint8Array(t),ce=ie,P=t=>oe.encode(t),ue=async t=>new Uint8Array(await ae.digest("SHA-256",t)),de=(t,e,r)=>n=>{const s=(1<<e)-1;let o="",i=0,a=0;for(let c=0;c<n.length;++c)for(a=a<<8|n[c],i+=8;i>e;)i-=e,o+=t[s&a>>i];if(i!==0&&(o+=t[s&a<<e-i]),r)for(;o.length*e&7;)o+="=";return o},le=(t,e,r)=>{const n={};for(let s=0;s<t.length;++s)n[t[s]]=s;return s=>{let o=s.length;for(;r&&s[o-1]==="=";)--o;const i=ce(o*e/8|0);let a=0,c=0,u=0;for(let d=0;d<o;++d){const p=n[s[d]];if(p===void 0)throw new SyntaxError("invalid base string");c=c<<e|p,a+=e,a>=8&&(a-=8,i[u++]=255&c>>a)}if(a>=e||255&c<<8-a)throw new SyntaxError("unexpected end of data");return i}},pe=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),he=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),V="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",fe=le(V,6,!1),we=de(V,6,!1),G="fromBase64"in Uint8Array,ye=G?pe:fe,R=G?he:we,L=typeof navigator<"u"?navigator.locks:void 0,Q=async t=>{const e=P(t),r=await ue(e);return R(r)},ge=async()=>{const t=M(64);return{verifier:t,challenge:await Q(t),method:"S256"}},_e=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},me=({name:t})=>{const e=new AbortController,r=e.signal,n=(s,o,i=!1)=>{let a;const c=`${t}:${s}`,u=()=>a&&localStorage.setItem(c,JSON.stringify(a)),d=()=>{if(r.aborted)throw new Error("store closed");return a??(a=_e(localStorage.getItem(c)))};{const p=l=>{l.key===c&&(a=void 0)};globalThis.addEventListener("storage",p,{signal:r})}{const p=async l=>{if(!l||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let y=Date.now(),m=!1;d();for(const w in a){const x=a[w].expiresAt;x!==null&&y>x&&(m=!0,delete a[w])}m&&u()};L?L.request(`${c}:cleanup`,{ifAvailable:!0},p):p(!0)}return{get(p){d();const l=a[p];if(!l)return;const y=l.expiresAt;if(y!==null&&Date.now()>y){delete a[p],u();return}return l.value},getWithLapsed(p){d();const l=a[p],y=Date.now();if(!l)return[void 0,1/0];const m=l.updatedAt;return m===void 0?[l.value,1/0]:[l.value,y-m]},set(p,l){d();const y={value:l,expiresAt:o(l),updatedAt:i?Date.now():void 0};a[p]=y,u()},delete(p){d(),a[p]!==void 0&&(delete a[p],u())},keys(){return d(),Object.keys(a)}}};return{dispose:()=>{e.abort()},sessions:n("sessions",({token:s})=>s.refresh?null:s.expires_at??null),states:n("states",s=>Date.now()+10*60*1e3),dpopNonces:n("dpopNonces",s=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let C,H,_;const Ve=t=>{({client_id:C,redirect_uri:H}=t.metadata),_=me({name:t.storageName??"atcute-oauth"})};class b extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class ve extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class h extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class $ extends Error{constructor(r,n,s){super(n,s);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=r}}class X extends Error{constructor(r,n){var u,d;const s=J((u=Z(n))==null?void 0:u.error),o=J((d=Z(n))==null?void 0:d.error_description),i=s?`"${s}"`:"unknown",a=o?`: ${o}`:"",c=`OAuth ${i} error${a}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=r,this.data=n,this.error=s,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class ke extends Error{constructor(r,n,s){super(s);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=r,this.status=n}}const J=t=>typeof t=="string"?t:void 0,Z=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,Ee=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,xe=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&Ee.test(t),Ae="parse"in URL,be=t=>{let e=null;if(Ae)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},Re=(t,e)=>{const r=t.service;if(r)for(let n=0,s=r.length;n<s;n++){const{id:o,type:i,serviceEndpoint:a}=r[n];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(i)){if(!i.includes(e.type))continue}else if(i!==e.type)continue}if(!(typeof a!="string"||!be(a)))return a}}},Se=t=>Re(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),Ue="https://public.api.bsky.app",q=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},De="parse"in URL,je=t=>{let e=null;if(De)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},ze=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Te=async t=>{const e=Ue+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new h("domain handle not found");if(!r.ok)throw new h("directory is unreachable");return(await r.json()).did},Pe=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),n=t.slice(e+1);let s;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new h("did not found in directory");if(!o.ok)throw new h("directory is unreachable");s=await o.json()}else if(r==="web"){if(!ze.test(n))throw new h("invalid identifier");const o=await fetch(`https://${n}/.well-known/did.json`);if(!o.ok)throw new h("did document is unreachable");s=await o.json()}else throw new h("unsupported did method");return s},Le=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||q(r.headers)!=="application/json")throw new h("unexpected response");const n=await r.json();if(n.resource!==e.origin)throw new h("unexpected issuer");return n},$e=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||q(r.headers)!=="application/json")throw new h("unexpected response");const n=await r.json();if(n.issuer!==e.origin)throw new h("unexpected issuer");if(!je(n.authorization_endpoint))throw new h("authorization server provided incorrect authorization endpoint");if(!n.client_id_metadata_document_supported)throw new h("authorization server does not support 'client_id_metadata_document'");if(!n.pushed_authorization_request_endpoint)throw new h("authorization server does not support 'pushed_authorization request'");if(n.response_types_supported&&!n.response_types_supported.includes("code"))throw new h("authorization server does not support 'code' response type");return n},qe=async t=>{let e;xe(t)?e=t:e=await Te(t);const r=await Pe(e),n=Se(r);if(!n)throw new h("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(n)},metadata:await Oe(n)}},Oe=async t=>{var s;const e=await Le(t);if(((s=e.authorization_servers)==null?void 0:s.length)!==1)throw new h("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],n=await $e(r);if(n.protected_resources&&!n.protected_resources.includes(e.resource))throw new h("server is not in authorization server's jurisdiction");return n},Y={name:"ECDSA",namedCurve:"P-256"},Ie=async()=>{const t=await crypto.subtle.generateKey(Y,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:n,...s}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:R(new Uint8Array(e)),jwt:R(P(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:s})))}},Ne=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",ye(t.key),Y,!0,["sign"]),n=(s,o,i,a)=>{const c={ath:a,htm:s,htu:o,iat:Math.floor(Date.now()/1e3),jti:M(24),nonce:i};return R(P(JSON.stringify(c)))};return async(s,o,i,a)=>{const c=n(s,o,i,a),u=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,P(e+"."+c)),d=R(new Uint8Array(u));return e+"."+c+"."+d}},Ke=(t,e)=>{const r=_.dpopNonces,n=_.inflightDpop,s=Ne(t);return async(o,i)=>{const a=new Request(o,i),c=a.headers.get("authorization"),u=c!=null&&c.startsWith("DPoP ")?await Q(c.slice(5)):void 0,{method:d,url:p}=a,{origin:l,pathname:y}=new URL(p),m=l+y;let w=n.get(l);w&&(await w.promise,w=void 0);let U,x=!1;try{const[A,g]=r.getWithLapsed(l);U=A,x=g>3*60*1e3}catch{}x&&n.set(l,w=Promise.withResolvers());let k;try{const A=await s(d,m,U,u);a.headers.set("dpop",A);const g=await fetch(a);if(k=g.headers.get("dpop-nonce"),k===null||k===U)return g;try{r.set(l,k)}catch{}if(!await Be(g,e)||o===a||(i==null?void 0:i.body)instanceof ReadableStream)return g}finally{w&&(n.delete(l),w.resolve())}{const A=await s(d,m,k,u),g=new Request(o,i);g.headers.set("dpop",A);const I=await fetch(g),N=I.headers.get("dpop-nonce");if(N!==null&&N!==k)try{r.set(l,N)}catch{}return I}}},Be=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&q(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Fe=(t,e)=>{const r={};for(let n=0,s=e.length;n<s;n++){const o=e[n];r[o]=t[o]}return r};var S,E,v,F,ee;class O{constructor(e,r){j(this,v);j(this,S);j(this,E);B(this,E,e),B(this,S,Ke(r,!0))}async request(e,r){const n=D(this,E)[`${e}_endpoint`];if(!n)throw new Error(`no endpoint for ${e}`);const s=await D(this,S).call(this,n,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:C})});if(q(s.headers)!=="application/json")throw new ke(s,2,"unexpected content-type");const o=await s.json();if(s.ok)return o;throw new X(s,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const n=await this.request("token",{grant_type:"authorization_code",redirect_uri:H,code:e,code_verifier:r});try{return await z(this,v,ee).call(this,n)}catch(s){throw await this.revoke(n.access_token),s}}async refresh({sub:e,token:r}){if(!r.refresh)throw new $(e,"no refresh token available");const n=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==n.sub)throw new $(e,`sub mismatch in token response; got ${n.sub}`);return z(this,v,F).call(this,n)}catch(s){throw await this.revoke(n.access_token),s}}}S=new WeakMap,E=new WeakMap,v=new WeakSet,F=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ee=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const n=z(this,v,F).call(this,e),s=await qe(r);if(s.metadata.issuer!==D(this,E).issuer)throw new TypeError(`issuer mismatch; got ${s.metadata.issuer}`);return{token:n,info:{sub:r,aud:s.identity.pds.href,server:Fe(s.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,Ge=async(t,e)=>{var a,c;(a=e==null?void 0:e.signal)==null||a.throwIfAborted();let r=Je;e!=null&&e.noCache?r=Ce:e!=null&&e.allowStale&&(r=Me);let n;for(;n=T.get(t);){try{const{isFresh:u,value:d}=await n;if(u||r(d))return d}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const s=async()=>{const u=_.sessions.get(t);if(u&&r(u))return{isFresh:!1,value:u};const d=await He(t,u);return await te(t,d),{isFresh:!0,value:d}};let o;if(L?o=L.request(`atcute-oauth:${t}`,s):o=s(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:i}=await o;return i},te=async(t,e)=>{try{_.sessions.set(t,e)}catch(r){throw await We(e),r}},Qe=t=>{_.sessions.delete(t)},Me=()=>!0,Ce=()=>!1,He=async(t,e)=>{if(e===void 0)throw new $(t,"session deleted by another tab");const{dpopKey:r,info:n,token:s}=e,o=new O(n.server,r);try{const i=await o.refresh({sub:n.sub,token:s});return{dpopKey:r,info:n,token:i}}catch(i){throw i instanceof X&&i.status===400&&i.error==="invalid_grant"?new $(t,"session was revoked",{cause:i}):i}},We=async({dpopKey:t,info:e,token:r})=>{await new O(e.server,t).revoke(r.refresh??r.access)},Je=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},Xe=async({metadata:t,identity:e,scope:r})=>{const n=M(24),s=await ge(),o=await Ie(),i={redirect_uri:H,code_challenge:s.challenge,code_challenge_method:s.method,state:n,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};_.states.set(n,{dpopKey:o,metadata:t,verifier:s.verifier});const c=await new O(t,o).request("pushed_authorization_request",i),u=new URL(t.authorization_endpoint);return u.searchParams.set("client_id",C),u.searchParams.set("request_uri",c.request_uri),u},Ye=async t=>{const e=t.get("iss"),r=t.get("state"),n=t.get("code"),s=t.get("error");if(!r||!(n||s))throw new b("missing parameters");const o=_.states.get(r);if(o)_.states.delete(r);else throw new b("unknown state provided");const i=o.dpopKey,a=o.metadata;if(s)throw new ve(t.get("error_description")||s);if(!n)throw new b("missing code parameter");if(e===null)throw new b("missing issuer parameter");if(e!==a.issuer)throw new b("issuer mismatch");const c=new O(a,i),{info:u,token:d}=await c.exchangeCode(n,o.verifier),p=u.sub,l={dpopKey:i,info:u,token:d};return await te(p,l),l};export{O,Ve as a,Xe as b,Ke as c,Qe as d,Ye as f,Ge as g,qe as r}; 2 - //# sourceMappingURL=exchange-CZnIlTgn.js.map
-1
proxy/static/static/assets/exchange-CZnIlTgn.js.map
··· 1 - {"version":3,"file":"exchange-CZnIlTgn.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]}
proxy/static/static/assets/fraunces-v38-latin-600-BFCDtZfi.woff2

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-600-BjX88IhF.eot

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-600-CKqwXJ4d.woff

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-600-DBZqn2mI.ttf

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-700-BcycBINP.eot

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-700-CEOla-zY.woff2

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-700-DX0krZF_.woff

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-700-EHXnlOoQ.ttf

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-regular-6IfK1voy.woff2

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-regular-BPnp2epa.woff

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-regular-DMmkNv7_.eot

This is a binary file and will not be displayed.

proxy/static/static/assets/fraunces-v38-latin-regular-g3PjdJvA.ttf

This is a binary file and will not be displayed.

-1
proxy/static/static/assets/index-B7JXvTVO.css
··· 1 - @font-face{font-display:swap;font-family:Fraunces;font-style:normal;font-weight:400;src:url(/static/assets/fraunces-v38-latin-regular-DMmkNv7_.eot);src:url(/static/assets/fraunces-v38-latin-regular-DMmkNv7_.eot?#iefix) format("embedded-opentype"),url(/static/assets/fraunces-v38-latin-regular-6IfK1voy.woff2) format("woff2"),url(/static/assets/fraunces-v38-latin-regular-BPnp2epa.woff) format("woff"),url(/static/assets/fraunces-v38-latin-regular-g3PjdJvA.ttf) format("truetype")}@font-face{font-display:swap;font-family:Fraunces;font-style:normal;font-weight:600;src:url(/static/assets/fraunces-v38-latin-600-BjX88IhF.eot);src:url(/static/assets/fraunces-v38-latin-600-BjX88IhF.eot?#iefix) format("embedded-opentype"),url(/static/assets/fraunces-v38-latin-600-BFCDtZfi.woff2) format("woff2"),url(/static/assets/fraunces-v38-latin-600-CKqwXJ4d.woff) format("woff"),url(/static/assets/fraunces-v38-latin-600-DBZqn2mI.ttf) format("truetype")}@font-face{font-display:swap;font-family:Fraunces;font-style:normal;font-weight:700;src:url(/static/assets/fraunces-v38-latin-700-BcycBINP.eot);src:url(/static/assets/fraunces-v38-latin-700-BcycBINP.eot?#iefix) format("embedded-opentype"),url(/static/assets/fraunces-v38-latin-700-CEOla-zY.woff2) format("woff2"),url(/static/assets/fraunces-v38-latin-700-DX0krZF_.woff) format("woff"),url(/static/assets/fraunces-v38-latin-700-EHXnlOoQ.ttf) format("truetype")}@font-face{font-display:swap;font-family:Spectral;font-style:normal;font-weight:600;src:url(/static/assets/spectral-v15-latin-600-BliT1AHr.eot);src:url(/static/assets/spectral-v15-latin-600-BliT1AHr.eot?#iefix) format("embedded-opentype"),url(/static/assets/spectral-v15-latin-600-DE3OxvnQ.woff2) format("woff2"),url(/static/assets/spectral-v15-latin-600-DB_3Affc.woff) format("woff"),url(/static/assets/spectral-v15-latin-600-BdHV-IKW.ttf) format("truetype")}@font-face{font-display:swap;font-family:Spectral;font-style:normal;font-weight:700;src:url(/static/assets/spectral-v15-latin-700-Bdud-RSb.eot);src:url(/static/assets/spectral-v15-latin-700-Bdud-RSb.eot?#iefix) format("embedded-opentype"),url(/static/assets/spectral-v15-latin-700-Cd2m0ohD.woff2) format("woff2"),url(/static/assets/spectral-v15-latin-700-D6tDXmC_.woff) format("woff"),url(/static/assets/spectral-v15-latin-700-1bnaK4j6.ttf) format("truetype")}*{box-sizing:border-box;margin:0;padding:0}:root{--forest-green: #2d5016;--forest-green-light: #3d6b1f;--forest-green-dark: #1f3810}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fafafa;color:#1a1a1a;position:relative;line-height:1.6;margin:0;padding:0}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;background-image:radial-gradient(circle,rgba(45,80,22,.06) 1px,transparent 1px);background-size:20px 20px;z-index:0}.layout{display:flex;min-height:100vh;position:relative;z-index:1}.sidebar{width:420px;background:#fff;border-right:2px dashed #d0d0d0;position:sticky;top:0;height:100vh;overflow-y:auto;flex-shrink:0}.sidebar-content{display:flex;flex-direction:column;justify-content:space-between;min-height:100vh;padding:60px 0}.hero{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;padding:0 48px}.logo{font-family:Spectral,serif;font-size:16px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#666;margin-bottom:24px}.hero h1{font-family:Fraunces,serif;font-size:clamp(28px,3vw,40px);font-weight:600;margin-bottom:24px;color:#1a1a1a;line-height:1.2;letter-spacing:-.01em}.tagline{font-size:14px;color:#666;margin-bottom:32px;font-weight:400;line-height:1.6}.cta-buttons{display:flex;gap:12px;flex-direction:row;align-items:center}.cta-primary,.cta-secondary{padding:10px 20px;border-radius:2px;font-size:13px;font-weight:500;text-decoration:none;transition:all .2s;border:1px dashed;display:inline-block}.cta-primary{background:var(--forest-green);color:#fff;border-color:var(--forest-green-dark)}.cta-primary:hover{background:var(--forest-green-dark);transform:translateY(-1px)}.cta-secondary{background:transparent;color:var(--forest-green);border-color:var(--forest-green)}.cta-secondary:hover{border-color:var(--forest-green-dark);background:#2d50160d}.main-content{flex:1;background:#fafafa;overflow-y:auto}.feed-section{padding:60px 48px;max-width:900px}.annotations-feed{display:flex;flex-direction:column;gap:24px}.annotation-card{padding:24px;border:1px dashed #d0d0d0;border-radius:2px;background:#fff;transition:all .2s;position:relative}.annotation-card:hover{border-color:var(--forest-green);box-shadow:0 2px 8px #2d501614}.annotation-quote{margin-bottom:16px;padding:12px 16px;background:#fafafa;border-left:3px solid var(--forest-green);font-style:italic;color:#555;font-size:15px;line-height:1.6}.annotation-body{margin-bottom:16px;line-height:1.6;color:#333;font-size:15px}.annotation-meta{display:flex;flex-wrap:wrap;gap:12px;align-items:center;padding-top:12px;border-top:1px dashed #e0e0e0;font-size:13px;color:#666}.annotation-source{color:#1a1a1a;text-decoration:none;font-weight:500;display:inline-flex;align-items:center;gap:4px;border-bottom:1px dashed transparent;transition:border-color .2s}.annotation-source:hover{border-bottom-color:#1a1a1a}.annotation-author{color:#666;display:inline-flex;align-items:center;gap:8px}.annotation-author .author-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px dashed #d0d0d0}.annotation-author a{color:#1a1a1a;text-decoration:none;font-weight:500;border-bottom:1px dashed transparent;transition:border-color .2s}.annotation-author a:hover{border-bottom-color:#1a1a1a}.annotation-time{color:#999}.loading,.empty,.error{text-align:center;padding:60px 20px;color:#999;font-style:italic}.error{color:#d93025;font-style:normal}.load-more{text-align:center;margin-top:40px}#load-more-btn{background:var(--forest-green);color:#fff;border:1px dashed var(--forest-green-dark);padding:12px 32px;border-radius:2px;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s}#load-more-btn:hover{background:var(--forest-green-dark);transform:translateY(-1px)}#load-more-btn:disabled{background:#ccc;border-color:#aaa;cursor:not-allowed;transform:none}.footer{padding-top:40px;color:#999;font-size:13px;text-align:center;margin:0;border-top:2px dashed #d0d0d0}.mobile-footer{display:none}.desktop-footer{display:block}.footer-icons{display:flex;gap:20px;justify-content:center;align-items:center}.footer-icons a{color:#1a1a1a;text-decoration:none;transition:all .2s;display:flex;align-items:center;justify-content:center}.footer-icons a img,.footer-icons a svg{width:32px;height:32px;opacity:.6;transition:opacity .2s}.footer-icons a:hover img,.footer-icons a:hover svg{opacity:1}@media (max-width: 1024px){.layout{flex-direction:column}.sidebar{width:100%;height:auto;position:relative;border-right:none;border-bottom:2px dashed #d0d0d0}.sidebar-content{min-height:auto;padding:40px 0}.hero{justify-content:flex-start;padding:0 32px}.desktop-footer{display:none}.mobile-footer{display:block;padding:40px 32px;margin:0;border-top:2px dashed #d0d0d0;background:#fafafa}.feed-section{padding:48px 32px}}@media (max-width: 640px){.sidebar-content{padding:32px 0}.hero{padding:0 24px}.hero h1{font-size:28px}.mobile-footer{padding:32px 24px;font-size:12px}.feed-section{padding:32px 24px}.annotation-card{padding:20px}}
-12
proxy/static/static/assets/index-BKdQD0EM.js
··· 1 - class Le{constructor(f="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(f),this.channel.onmessage=v=>{this.listeners.forEach(c=>c(v.data))}}async get(f){if(typeof f=="string"){const c=localStorage.getItem(f);return c?JSON.parse(c):null}const v={};return f.forEach(c=>{const h=localStorage.getItem(c);v[c]=h?JSON.parse(h):null}),v}async set(f,v){const c=await this.get(f);localStorage.setItem(f,JSON.stringify(v));const h={key:f,newValue:v,oldValue:c};this.channel.postMessage(h)}onChange(f){this.listeners.push(f)}close(){this.channel.close()}}var O={},J={exports:{}};(function(o){var f=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},v=-1,c=1,h=0;f.Diff=function(e,r){return[e,r]},f.prototype.diff_main=function(e,r,n,t){typeof t>"u"&&(this.Diff_Timeout<=0?t=Number.MAX_VALUE:t=new Date().getTime()+this.Diff_Timeout*1e3);var i=t;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new f.Diff(h,e)]:[];typeof n>"u"&&(n=!0);var a=n,s=this.diff_commonPrefix(e,r),l=e.substring(0,s);e=e.substring(s),r=r.substring(s),s=this.diff_commonSuffix(e,r);var u=e.substring(e.length-s);e=e.substring(0,e.length-s),r=r.substring(0,r.length-s);var g=this.diff_compute_(e,r,a,i);return l&&g.unshift(new f.Diff(h,l)),u&&g.push(new f.Diff(h,u)),this.diff_cleanupMerge(g),g},f.prototype.diff_compute_=function(e,r,n,t){var i;if(!e)return[new f.Diff(c,r)];if(!r)return[new f.Diff(v,e)];var a=e.length>r.length?e:r,s=e.length>r.length?r:e,l=a.indexOf(s);if(l!=-1)return i=[new f.Diff(c,a.substring(0,l)),new f.Diff(h,s),new f.Diff(c,a.substring(l+s.length))],e.length>r.length&&(i[0][0]=i[2][0]=v),i;if(s.length==1)return[new f.Diff(v,e),new f.Diff(c,r)];var u=this.diff_halfMatch_(e,r);if(u){var g=u[0],d=u[1],_=u[2],m=u[3],p=u[4],w=this.diff_main(g,_,n,t),b=this.diff_main(d,m,n,t);return w.concat([new f.Diff(h,p)],b)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,t):this.diff_bisect_(e,r,t)},f.prototype.diff_lineMode_=function(e,r,n){var t=this.diff_linesToChars_(e,r);e=t.chars1,r=t.chars2;var i=t.lineArray,a=this.diff_main(e,r,!1,n);this.diff_charsToLines_(a,i),this.diff_cleanupSemantic(a),a.push(new f.Diff(h,""));for(var s=0,l=0,u=0,g="",d="";s<a.length;){switch(a[s][0]){case c:u++,d+=a[s][1];break;case v:l++,g+=a[s][1];break;case h:if(l>=1&&u>=1){a.splice(s-l-u,l+u),s=s-l-u;for(var _=this.diff_main(g,d,!1,n),m=_.length-1;m>=0;m--)a.splice(s,0,_[m]);s=s+_.length}u=0,l=0,g="",d="";break}s++}return a.pop(),a},f.prototype.diff_bisect_=function(e,r,n){for(var t=e.length,i=r.length,a=Math.ceil((t+i)/2),s=a,l=2*a,u=new Array(l),g=new Array(l),d=0;d<l;d++)u[d]=-1,g[d]=-1;u[s+1]=0,g[s+1]=0;for(var _=t-i,m=_%2!=0,p=0,w=0,b=0,E=0,N=0;N<a&&!(new Date().getTime()>n);N++){for(var M=-N+p;M<=N-w;M+=2){var D=s+M,T;M==-N||M!=N&&u[D-1]<u[D+1]?T=u[D+1]:T=u[D-1]+1;for(var C=T-M;T<t&&C<i&&e.charAt(T)==r.charAt(C);)T++,C++;if(u[D]=T,T>t)w+=2;else if(C>i)p+=2;else if(m){var I=s+_-M;if(I>=0&&I<l&&g[I]!=-1){var S=t-g[I];if(T>=S)return this.diff_bisectSplit_(e,r,T,C,n)}}}for(var R=-N+b;R<=N-E;R+=2){var I=s+R,S;R==-N||R!=N&&g[I-1]<g[I+1]?S=g[I+1]:S=g[I-1]+1;for(var y=S-R;S<t&&y<i&&e.charAt(t-S-1)==r.charAt(i-y-1);)S++,y++;if(g[I]=S,S>t)E+=2;else if(y>i)b+=2;else if(!m){var D=s+_-R;if(D>=0&&D<l&&u[D]!=-1){var T=u[D],C=s+T-D;if(S=t-S,T>=S)return this.diff_bisectSplit_(e,r,T,C,n)}}}}return[new f.Diff(v,e),new f.Diff(c,r)]},f.prototype.diff_bisectSplit_=function(e,r,n,t,i){var a=e.substring(0,n),s=r.substring(0,t),l=e.substring(n),u=r.substring(t),g=this.diff_main(a,s,!1,i),d=this.diff_main(l,u,!1,i);return g.concat(d)},f.prototype.diff_linesToChars_=function(e,r){var n=[],t={};n[0]="";function i(u){for(var g="",d=0,_=-1,m=n.length;_<u.length-1;){_=u.indexOf(` 2 - `,d),_==-1&&(_=u.length-1);var p=u.substring(d,_+1);(t.hasOwnProperty?t.hasOwnProperty(p):t[p]!==void 0)?g+=String.fromCharCode(t[p]):(m==a&&(p=u.substring(d),_=u.length),g+=String.fromCharCode(m),t[p]=m,n[m++]=p),d=_+1}return g}var a=4e4,s=i(e);a=65535;var l=i(r);return{chars1:s,chars2:l,lineArray:n}},f.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var t=e[n][1],i=[],a=0;a<t.length;a++)i[a]=r[t.charCodeAt(a)];e[n][1]=i.join("")}},f.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,t=Math.min(e.length,r.length),i=t,a=0;n<i;)e.substring(a,i)==r.substring(a,i)?(n=i,a=n):t=i,i=Math.floor((t-n)/2+n);return i},f.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,t=Math.min(e.length,r.length),i=t,a=0;n<i;)e.substring(e.length-i,e.length-a)==r.substring(r.length-i,r.length-a)?(n=i,a=n):t=i,i=Math.floor((t-n)/2+n);return i},f.prototype.diff_commonOverlap_=function(e,r){var n=e.length,t=r.length;if(n==0||t==0)return 0;n>t?e=e.substring(n-t):n<t&&(r=r.substring(0,n));var i=Math.min(n,t);if(e==r)return i;for(var a=0,s=1;;){var l=e.substring(i-s),u=r.indexOf(l);if(u==-1)return a;s+=u,(u==0||e.substring(i-s)==r.substring(0,s))&&(a=s,s++)}},f.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,t=e.length>r.length?r:e;if(n.length<4||t.length*2<n.length)return null;var i=this;function a(w,b,E){for(var N=w.substring(E,E+Math.floor(w.length/4)),M=-1,D="",T,C,I,S;(M=b.indexOf(N,M+1))!=-1;){var R=i.diff_commonPrefix(w.substring(E),b.substring(M)),y=i.diff_commonSuffix(w.substring(0,E),b.substring(0,M));D.length<y+R&&(D=b.substring(M-y,M)+b.substring(M,M+R),T=w.substring(0,E-y),C=w.substring(E+R),I=b.substring(0,M-y),S=b.substring(M+R))}return D.length*2>=w.length?[T,C,I,S,D]:null}var s=a(n,t,Math.ceil(n.length/4)),l=a(n,t,Math.ceil(n.length/2)),u;if(!s&&!l)return null;l?s?u=s[4].length>l[4].length?s:l:u=l:u=s;var g,d,_,m;e.length>r.length?(g=u[0],d=u[1],_=u[2],m=u[3]):(_=u[0],m=u[1],g=u[2],d=u[3]);var p=u[4];return[g,d,_,m,p]},f.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],t=0,i=null,a=0,s=0,l=0,u=0,g=0;a<e.length;)e[a][0]==h?(n[t++]=a,s=u,l=g,u=0,g=0,i=e[a][1]):(e[a][0]==c?u+=e[a][1].length:g+=e[a][1].length,i&&i.length<=Math.max(s,l)&&i.length<=Math.max(u,g)&&(e.splice(n[t-1],0,new f.Diff(v,i)),e[n[t-1]+1][0]=c,t--,t--,a=t>0?n[t-1]:-1,s=0,l=0,u=0,g=0,i=null,r=!0)),a++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),a=1;a<e.length;){if(e[a-1][0]==v&&e[a][0]==c){var d=e[a-1][1],_=e[a][1],m=this.diff_commonOverlap_(d,_),p=this.diff_commonOverlap_(_,d);m>=p?(m>=d.length/2||m>=_.length/2)&&(e.splice(a,0,new f.Diff(h,_.substring(0,m))),e[a-1][1]=d.substring(0,d.length-m),e[a+1][1]=_.substring(m),a++):(p>=d.length/2||p>=_.length/2)&&(e.splice(a,0,new f.Diff(h,d.substring(0,p))),e[a-1][0]=c,e[a-1][1]=_.substring(0,_.length-p),e[a+1][0]=v,e[a+1][1]=d.substring(p),a++),a++}a++}},f.prototype.diff_cleanupSemanticLossless=function(e){function r(p,w){if(!p||!w)return 6;var b=p.charAt(p.length-1),E=w.charAt(0),N=b.match(f.nonAlphaNumericRegex_),M=E.match(f.nonAlphaNumericRegex_),D=N&&b.match(f.whitespaceRegex_),T=M&&E.match(f.whitespaceRegex_),C=D&&b.match(f.linebreakRegex_),I=T&&E.match(f.linebreakRegex_),S=C&&p.match(f.blanklineEndRegex_),R=I&&w.match(f.blanklineStartRegex_);return S||R?5:C||I?4:N&&!D&&T?3:D||T?2:N||M?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==h&&e[n+1][0]==h){var t=e[n-1][1],i=e[n][1],a=e[n+1][1],s=this.diff_commonSuffix(t,i);if(s){var l=i.substring(i.length-s);t=t.substring(0,t.length-s),i=l+i.substring(0,i.length-s),a=l+a}for(var u=t,g=i,d=a,_=r(t,i)+r(i,a);i.charAt(0)===a.charAt(0);){t+=i.charAt(0),i=i.substring(1)+a.charAt(0),a=a.substring(1);var m=r(t,i)+r(i,a);m>=_&&(_=m,u=t,g=i,d=a)}e[n-1][1]!=u&&(u?e[n-1][1]=u:(e.splice(n-1,1),n--),e[n][1]=g,d?e[n+1][1]=d:(e.splice(n+1,1),n--))}n++}},f.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,f.whitespaceRegex_=/\s/,f.linebreakRegex_=/[\r\n]/,f.blanklineEndRegex_=/\n\r?\n$/,f.blanklineStartRegex_=/^\r?\n\r?\n/,f.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],t=0,i=null,a=0,s=!1,l=!1,u=!1,g=!1;a<e.length;)e[a][0]==h?(e[a][1].length<this.Diff_EditCost&&(u||g)?(n[t++]=a,s=u,l=g,i=e[a][1]):(t=0,i=null),u=g=!1):(e[a][0]==v?g=!0:u=!0,i&&(s&&l&&u&&g||i.length<this.Diff_EditCost/2&&s+l+u+g==3)&&(e.splice(n[t-1],0,new f.Diff(v,i)),e[n[t-1]+1][0]=c,t--,i=null,s&&l?(u=g=!0,t=0):(t--,a=t>0?n[t-1]:-1,u=g=!1),r=!0)),a++;r&&this.diff_cleanupMerge(e)},f.prototype.diff_cleanupMerge=function(e){e.push(new f.Diff(h,""));for(var r=0,n=0,t=0,i="",a="",s;r<e.length;)switch(e[r][0]){case c:t++,a+=e[r][1],r++;break;case v:n++,i+=e[r][1],r++;break;case h:n+t>1?(n!==0&&t!==0&&(s=this.diff_commonPrefix(a,i),s!==0&&(r-n-t>0&&e[r-n-t-1][0]==h?e[r-n-t-1][1]+=a.substring(0,s):(e.splice(0,0,new f.Diff(h,a.substring(0,s))),r++),a=a.substring(s),i=i.substring(s)),s=this.diff_commonSuffix(a,i),s!==0&&(e[r][1]=a.substring(a.length-s)+e[r][1],a=a.substring(0,a.length-s),i=i.substring(0,i.length-s))),r-=n+t,e.splice(r,n+t),i.length&&(e.splice(r,0,new f.Diff(v,i)),r++),a.length&&(e.splice(r,0,new f.Diff(c,a)),r++),r++):r!==0&&e[r-1][0]==h?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,t=0,n=0,i="",a="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==h&&e[r+1][0]==h&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},f.prototype.diff_xIndex=function(e,r){var n=0,t=0,i=0,a=0,s;for(s=0;s<e.length&&(e[s][0]!==c&&(n+=e[s][1].length),e[s][0]!==v&&(t+=e[s][1].length),!(n>r));s++)i=n,a=t;return e.length!=s&&e[s][0]===v?a:a+(r-i)},f.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,t=/</g,i=/>/g,a=/\n/g,s=0;s<e.length;s++){var l=e[s][0],u=e[s][1],g=u.replace(n,"&amp;").replace(t,"&lt;").replace(i,"&gt;").replace(a,"&para;<br>");switch(l){case c:r[s]='<ins style="background:#e6ffe6;">'+g+"</ins>";break;case v:r[s]='<del style="background:#ffe6e6;">'+g+"</del>";break;case h:r[s]="<span>"+g+"</span>";break}}return r.join("")},f.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==c&&(r[n]=e[n][1]);return r.join("")},f.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==v&&(r[n]=e[n][1]);return r.join("")},f.prototype.diff_levenshtein=function(e){for(var r=0,n=0,t=0,i=0;i<e.length;i++){var a=e[i][0],s=e[i][1];switch(a){case c:n+=s.length;break;case v:t+=s.length;break;case h:r+=Math.max(n,t),n=0,t=0;break}}return r+=Math.max(n,t),r},f.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case c:r[n]="+"+encodeURI(e[n][1]);break;case v:r[n]="-"+e[n][1].length;break;case h:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},f.prototype.diff_fromDelta=function(e,r){for(var n=[],t=0,i=0,a=r.split(/\t/g),s=0;s<a.length;s++){var l=a[s].substring(1);switch(a[s].charAt(0)){case"+":try{n[t++]=new f.Diff(c,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var u=parseInt(l,10);if(isNaN(u)||u<0)throw new Error("Invalid number in diff_fromDelta: "+l);var g=e.substring(i,i+=u);a[s].charAt(0)=="="?n[t++]=new f.Diff(h,g):n[t++]=new f.Diff(v,g);break;default:if(a[s])throw new Error("Invalid diff operation in diff_fromDelta: "+a[s])}}if(i!=e.length)throw new Error("Delta length ("+i+") does not equal source text length ("+e.length+").");return n},f.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},f.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var t=this.match_alphabet_(r),i=this;function a(T,C){var I=T/r.length,S=Math.abs(n-C);return i.Match_Distance?I+S/i.Match_Distance:S?1:I}var s=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(s=Math.min(a(0,l),s),l=e.lastIndexOf(r,n+r.length),l!=-1&&(s=Math.min(a(0,l),s)));var u=1<<r.length-1;l=-1;for(var g,d,_=r.length+e.length,m,p=0;p<r.length;p++){for(g=0,d=_;g<d;)a(p,n+d)<=s?g=d:_=d,d=Math.floor((_-g)/2+g);_=d;var w=Math.max(1,n-d+1),b=Math.min(n+d,e.length)+r.length,E=Array(b+2);E[b+1]=(1<<p)-1;for(var N=b;N>=w;N--){var M=t[e.charAt(N-1)];if(p===0?E[N]=(E[N+1]<<1|1)&M:E[N]=(E[N+1]<<1|1)&M|((m[N+1]|m[N])<<1|1)|m[N+1],E[N]&u){var D=a(p,N-1);if(D<=s)if(s=D,l=N-1,l>n)w=Math.max(1,2*n-l);else break}}if(a(p+1,n)>s)break;m=E}return l},f.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},f.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),t=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)t+=this.Patch_Margin,n=r.substring(e.start2-t,e.start2+e.length1+t);t+=this.Patch_Margin;var i=r.substring(e.start2-t,e.start2);i&&e.diffs.unshift(new f.Diff(h,i));var a=r.substring(e.start2+e.length1,e.start2+e.length1+t);a&&e.diffs.push(new f.Diff(h,a)),e.start1-=i.length,e.start2-=i.length,e.length1+=i.length+a.length,e.length2+=i.length+a.length}},f.prototype.patch_make=function(e,r,n){var t,i;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")t=e,i=this.diff_main(t,r,!0),i.length>2&&(this.diff_cleanupSemantic(i),this.diff_cleanupEfficiency(i));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")i=e,t=this.diff_text1(i);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")t=e,i=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")t=e,i=n;else throw new Error("Unknown call format to patch_make.");if(i.length===0)return[];for(var a=[],s=new f.patch_obj,l=0,u=0,g=0,d=t,_=t,m=0;m<i.length;m++){var p=i[m][0],w=i[m][1];switch(!l&&p!==h&&(s.start1=u,s.start2=g),p){case c:s.diffs[l++]=i[m],s.length2+=w.length,_=_.substring(0,g)+w+_.substring(g);break;case v:s.length1+=w.length,s.diffs[l++]=i[m],_=_.substring(0,g)+_.substring(g+w.length);break;case h:w.length<=2*this.Patch_Margin&&l&&i.length!=m+1?(s.diffs[l++]=i[m],s.length1+=w.length,s.length2+=w.length):w.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(s,d),a.push(s),s=new f.patch_obj,l=0,d=_,u=g);break}p!==c&&(u+=w.length),p!==v&&(g+=w.length)}return l&&(this.patch_addContext_(s,d),a.push(s)),a},f.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var t=e[n],i=new f.patch_obj;i.diffs=[];for(var a=0;a<t.diffs.length;a++)i.diffs[a]=new f.Diff(t.diffs[a][0],t.diffs[a][1]);i.start1=t.start1,i.start2=t.start2,i.length1=t.length1,i.length2=t.length2,r[n]=i}return r},f.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var t=0,i=[],a=0;a<e.length;a++){var s=e[a].start2+t,l=this.diff_text1(e[a].diffs),u,g=-1;if(l.length>this.Match_MaxBits?(u=this.match_main(r,l.substring(0,this.Match_MaxBits),s),u!=-1&&(g=this.match_main(r,l.substring(l.length-this.Match_MaxBits),s+l.length-this.Match_MaxBits),(g==-1||u>=g)&&(u=-1))):u=this.match_main(r,l,s),u==-1)i[a]=!1,t-=e[a].length2-e[a].length1;else{i[a]=!0,t=u-s;var d;if(g==-1?d=r.substring(u,u+l.length):d=r.substring(u,g+this.Match_MaxBits),l==d)r=r.substring(0,u)+this.diff_text2(e[a].diffs)+r.substring(u+l.length);else{var _=this.diff_main(l,d,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(_)/l.length>this.Patch_DeleteThreshold)i[a]=!1;else{this.diff_cleanupSemanticLossless(_);for(var m=0,p,w=0;w<e[a].diffs.length;w++){var b=e[a].diffs[w];b[0]!==h&&(p=this.diff_xIndex(_,m)),b[0]===c?r=r.substring(0,u+p)+b[1]+r.substring(u+p):b[0]===v&&(r=r.substring(0,u+p)+r.substring(u+this.diff_xIndex(_,m+b[1].length))),b[0]!==v&&(m+=b[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,i]},f.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",t=1;t<=r;t++)n+=String.fromCharCode(t);for(var t=0;t<e.length;t++)e[t].start1+=r,e[t].start2+=r;var i=e[0],a=i.diffs;if(a.length==0||a[0][0]!=h)a.unshift(new f.Diff(h,n)),i.start1-=r,i.start2-=r,i.length1+=r,i.length2+=r;else if(r>a[0][1].length){var s=r-a[0][1].length;a[0][1]=n.substring(a[0][1].length)+a[0][1],i.start1-=s,i.start2-=s,i.length1+=s,i.length2+=s}if(i=e[e.length-1],a=i.diffs,a.length==0||a[a.length-1][0]!=h)a.push(new f.Diff(h,n)),i.length1+=r,i.length2+=r;else if(r>a[a.length-1][1].length){var s=r-a[a.length-1][1].length;a[a.length-1][1]+=n.substring(0,s),i.length1+=s,i.length2+=s}return n},f.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var t=e[n];e.splice(n--,1);for(var i=t.start1,a=t.start2,s="";t.diffs.length!==0;){var l=new f.patch_obj,u=!0;for(l.start1=i-s.length,l.start2=a-s.length,s!==""&&(l.length1=l.length2=s.length,l.diffs.push(new f.Diff(h,s)));t.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var g=t.diffs[0][0],d=t.diffs[0][1];g===c?(l.length2+=d.length,a+=d.length,l.diffs.push(t.diffs.shift()),u=!1):g===v&&l.diffs.length==1&&l.diffs[0][0]==h&&d.length>2*r?(l.length1+=d.length,i+=d.length,u=!1,l.diffs.push(new f.Diff(g,d)),t.diffs.shift()):(d=d.substring(0,r-l.length1-this.Patch_Margin),l.length1+=d.length,i+=d.length,g===h?(l.length2+=d.length,a+=d.length):u=!1,l.diffs.push(new f.Diff(g,d)),d==t.diffs[0][1]?t.diffs.shift():t.diffs[0][1]=t.diffs[0][1].substring(d.length))}s=this.diff_text2(l.diffs),s=s.substring(s.length-this.Patch_Margin);var _=this.diff_text1(t.diffs).substring(0,this.Patch_Margin);_!==""&&(l.length1+=_.length,l.length2+=_.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===h?l.diffs[l.diffs.length-1][1]+=_:l.diffs.push(new f.Diff(h,_))),u||e.splice(++n,0,l)}}},f.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},f.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(` 3 - `),t=0,i=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;t<n.length;){var a=n[t].match(i);if(!a)throw new Error("Invalid patch string: "+n[t]);var s=new f.patch_obj;for(r.push(s),s.start1=parseInt(a[1],10),a[2]===""?(s.start1--,s.length1=1):a[2]=="0"?s.length1=0:(s.start1--,s.length1=parseInt(a[2],10)),s.start2=parseInt(a[3],10),a[4]===""?(s.start2--,s.length2=1):a[4]=="0"?s.length2=0:(s.start2--,s.length2=parseInt(a[4],10)),t++;t<n.length;){var l=n[t].charAt(0);try{var u=decodeURI(n[t].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+u)}if(l=="-")s.diffs.push(new f.Diff(v,u));else if(l=="+")s.diffs.push(new f.Diff(c,u));else if(l==" ")s.diffs.push(new f.Diff(h,u));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+u)}t++}}return r},f.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},f.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@ 4 - `],t,i=0;i<this.diffs.length;i++){switch(this.diffs[i][0]){case c:t="+";break;case v:t="-";break;case h:t=" ";break}n[i+1]=t+encodeURI(this.diffs[i][1])+` 5 - `}return n.join("").replace(/%20/g," ")},o.exports=f,o.exports.diff_match_patch=f,o.exports.DIFF_DELETE=v,o.exports.DIFF_INSERT=c,o.exports.DIFF_EQUAL=h})(J);var ie=J.exports,k={},P={exports:{}},Q={},A={},Y={};(function(o){o.__esModule=!0;function f(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}o.default=v;function v(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2],n=h.nodeType==9||h.ownerDocument,t=n.createNodeIterator(h,e,r,!1);return new c(t,h,e,r)}var c=function(){function h(e,r,n,t){f(this,h),this.root=r,this.whatToShow=n,this.filter=t,this.referenceNode=r,this.pointerBeforeReferenceNode=!0,this._iter=e}return h.prototype.nextNode=function(){var r=this._iter.nextNode();return this.pointerBeforeReferenceNode=!1,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.previousNode=function(){var r=this._iter.previousNode();return this.pointerBeforeReferenceNode=!0,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(Y);var $={};(function(o){o.__esModule=!0,o.default=f;function f(v){var c=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],h=arguments.length<=2||arguments[2]===void 0?null:arguments[2],e=v.ownerDocument;return e.createNodeIterator.call(e,v,c,h)}})($);var B={};(function(o){o.__esModule=!0;function f(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}o.default=v;function v(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2];return new c(h,e,r)}var c=function(){function h(e,r,n){f(this,h),this.root=e,this.whatToShow=r,this.filter=n,this.referenceNode=e,this.pointerBeforeReferenceNode=!0,this._filter=function(t){return n?n(t)===1:!0},this._show=function(t){return r>>t.nodeType-1&!0}}return h.prototype.nextNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!1;var n=this.referenceNode;if(r&&this._show(n)&&this._filter(n))return n;do{if(n.firstChild){n=n.firstChild;continue}do{if(n===this.root)return null;if(n.nextSibling)break;n=n.parentNode}while(n);n=n.nextSibling}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!1,n},h.prototype.previousNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!0;var n=this.referenceNode;if(!r&&this._show(n)&&this._filter(n))return n;do{if(n===this.root)return null;if(n.previousSibling){for(n=n.previousSibling;n.lastChild;)n=n.lastChild;continue}n=n.parentNode}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!0,n},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(B);(function(o){o.__esModule=!0,o.default=t;var f=Y,v=n(f),c=$,h=n(c),e=B,r=n(e);function n(i){return i&&i.__esModule?i:{default:i}}function t(){try{var i=typeof document>"u"?{}:document,a=(0,h.default)(i,4294967295,null,!1);return a.referenceNode===i?h.default:v.default}catch{return r.default}}})(A);var L={};(function(o){o.__esModule=!0,o.default=r;var f=$,v=e(f),c=A,h=e(c);function e(n){return n&&n.__esModule?n:{default:n}}function r(){var n=typeof document>"u"?{}:document,t=(0,h.default)();return t!==v.default&&(n.createNodeIterator=t),t}})(L);(function(o){o.__esModule=!0;var f=A,v=n(f),c=B,h=n(c),e=L,r=n(e);function n(i){return i&&i.__esModule?i:{default:i}}var t=(0,v.default)();t.implementation=h.default,t.shim=r.default,o.default=t})(Q);var ae=A.default,se=B.default,fe=L.default;P.exports=Q.default;P.exports.getPolyfill=ae;P.exports.implementation=se;P.exports.shim=fe;var le=P.exports,Z={},oe=ue;function ue(o,f){var v=[];f=f||he;do v.push(o),o=o.parentNode;while(o&&o.tagName&&f(o));return v.slice(1)}function he(o){return!0}/*! 6 - * index-of <https://github.com/jonschlinkert/index-of> 7 - * 8 - * Copyright (c) 2014-2015 Jon Schlinkert. 9 - * Licensed under the MIT license. 10 - */var ge=function(f,v,c){c=c||0;var h=-1;if(f==null)return h;var e=f.length,r=c<0?e+c:c;if(r>=f.length)return-1;for(;r<e;){if(f[r]===v)return r;r++}return-1};(function(o){o.__esModule=!0,o.default=a;var f=oe,v=e(f),c=ge,h=e(c);function e(g){return g&&g.__esModule?g:{default:g}}var r="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",n="Argument 2 of seek must be a number or a Text Node.",t=4,i=3;function a(g,d){if(g.whatToShow!==t)throw new Error(r);var _=0,m=g.referenceNode,p=null;if(s(d))p={forward:function(){return _<d},backward:function(){return _>d}};else if(l(d)){var w=u(m,d)?function(){return!1}:function(){return m!==d},b=function(){return m!=d||!g.pointerBeforeReferenceNode};p={forward:w,backward:b}}else throw new Error(n);for(;p.forward()&&(m=g.nextNode())!==null;)_+=m.nodeValue.length;for(;p.backward()&&(m=g.previousNode())!==null;)_-=m.nodeValue.length;return _}function s(g){return!isNaN(parseInt(g))&&isFinite(g)}function l(g){return g.nodeType===i}function u(g,d){if(g===d)return!1;for(var _=null,m=[g].concat((0,v.default)(g)).reverse(),p=[d].concat((0,v.default)(d)).reverse();m[0]===p[0];)_=m.shift(),p.shift();m=m[0],p=p[0];var w=(0,h.default)(_.childNodes,m),b=(0,h.default)(_.childNodes,p);return w>b}})(Z);var ve=Z.default,H={};Object.defineProperty(H,"__esModule",{value:!0});H.default=me;function F(o,f){if(!f&&o.firstChild)return o.firstChild;do{if(o.nextSibling)return o.nextSibling;o=o.parentNode}while(o);return o}function ce(o){if(o.startContainer.nodeType===Node.ELEMENT_NODE){var f=o.startContainer.childNodes[o.startOffset];return f||F(o.startContainer,!0)}return o.startContainer}function de(o){if(o.endContainer.nodeType===Node.ELEMENT_NODE){var f=o.endContainer.childNodes[o.endOffset];return f||F(o.endContainer,!0)}return F(o.endContainer)}function _e(o,f){for(var v=ce(o),c=de(o);v!==c;)f(v),v=F(v)}function me(o){var f="";return _e(o,function(v){if(v.nodeType===Node.TEXT_NODE){var c=v===o.startContainer?o.startOffset:0,h=v===o.endContainer?o.endOffset:v.textContent.length;f+=v.textContent.slice(c,h)}}),f}Object.defineProperty(k,"__esModule",{value:!0});k.fromRange=Me;k.toRange=De;var pe=le,we=W(pe),be=ve,U=W(be),Ne=H,V=W(Ne);function W(o){return o&&o.__esModule?o:{default:o}}var Ee=4;function Me(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=o.ownerDocument,c=v.createRange(),h=f.startContainer,e=f.startOffset;c.setStart(o,0),c.setEnd(h,e);var r=(0,V.default)(c).length,n=r+(0,V.default)(f).length;return{start:r,end:n}}function De(o){var f=arguments.length<=1||arguments[1]===void 0?{}:arguments[1];if(o===void 0)throw new Error('missing required parameter "root"');var v=o.ownerDocument,c=v.createRange(),h=(0,we.default)(o,Ee),e=f.start||0,r=f.end||e,n=(0,U.default)(h,e),t=e-n;h.pointerBeforeReferenceNode?c.setStart(h.referenceNode,t):(c.setStart(h.nextNode(),t),h.previousNode());var i=r-e+t;return n=(0,U.default)(h,i),t=i-n,h.pointerBeforeReferenceNode?c.setEnd(h.referenceNode,t):c.setEnd(h.nextNode(),t),c}var Te=k;Object.defineProperty(O,"__esModule",{value:!0});O.fromRange=Pe;O.fromTextPosition=x;O.toRange=Fe;O.toTextPosition=ee;var Se=ie,Ie=ye(Se),Ce=Te,K=Re(Ce);function Re(o){if(o&&o.__esModule)return o;var f={};if(o!=null)for(var v in o)Object.prototype.hasOwnProperty.call(o,v)&&(f[v]=o[v]);return f.default=o,f}function ye(o){return o&&o.__esModule?o:{default:o}}var j=32,Oe=new RegExp(`(.|[\r 11 - ]){1,`+String(j)+"}","g"),q=j;function Pe(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=K.fromRange(o,f);return x(o,v)}function x(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "selector"');var v=f.start;if(v===void 0)throw new Error('selector missing required property "start"');if(v<0)throw new Error('property "start" must be a non-negative integer');var c=f.end;if(c===void 0)throw new Error('selector missing required property "end"');if(c<0)throw new Error('property "end" must be a non-negative integer');var h=o.textContent.substr(v,c-v),e=Math.max(0,v-q),r=o.textContent.substr(e,v-e),n=Math.min(o.textContent.length,c+q),t=o.textContent.substr(c,n-c);return{exact:h,prefix:r,suffix:t}}function Fe(o,f){var v=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},c=ee(o,f,v);return c===null?null:K.toRange(o,c)}function ee(o,f){var v=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "selector"');var c=f.exact;if(c===void 0)throw new Error('selector missing required property "exact"');var h=f.prefix,e=f.suffix,r=v.hint,n=new Ie.default;n.Match_Distance=o.textContent.length*2;var t=c.match(Oe),i=r===void 0?o.textContent.length/2|0:r,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=-1,u=h!==void 0,g=e!==void 0,d=!1;u&&(l=n.match_main(o.textContent,h,i),l>-1&&(i=l+h.length,d=!0)),g&&!d&&(l=n.match_main(o.textContent,e,i+c.length),l>-1&&(i=l-c.length));var _=t.shift();if(l=n.match_main(o.textContent,_,i),l>-1)a=l,i=s=a+_.length;else return null;var m=function(b,E){if(!b)return null;var N=n.match_main(o.textContent,E,b.loc);return N===-1?null:(b.loc=N+E.length,b.start=Math.min(b.start,N),b.end=Math.max(b.end,N+E.length),b)};n.Match_Distance=64;var p=t.reduce(m,{start:a,end:s,loc:i});return p?{start:p.start,end:p.end}:null}var X={},re={};(function(o){Object.defineProperty(o,"__esModule",{value:!0}),o.default=n;var f="Iterator exhausted before seek ended.",v="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",c="Argument 2 of seek must be an integer or a Text Node.",h=2,e=4,r=3;function n(s,l){if(s.whatToShow!==e){var u;try{u=new DOMException(v,"InvalidStateError")}catch{u=new Error(v),u.code=11,u.name="InvalidStateError",u.toString=function(){return"InvalidStateError: ".concat(v)}}throw u}var g=0,d=s.referenceNode,_=null;if(t(l))_={forward:function(){return g<l},backward:function(){return g>l||!s.pointerBeforeReferenceNode}};else if(i(l)){var m=a(d,l)?function(){return!1}:function(){return d!==l},p=function(){return d!==l||!s.pointerBeforeReferenceNode};_={forward:m,backward:p}}else throw new TypeError(c);for(;_.forward();){if(d=s.nextNode(),d===null)throw new RangeError(f);g+=d.nodeValue.length}for(s.nextNode()&&(d=s.previousNode());_.backward();){if(d=s.previousNode(),d===null)throw new RangeError(f);g-=d.nodeValue.length}if(!i(s.referenceNode))throw new RangeError(f);return g}function t(s){return typeof s!="number"?!1:isFinite(s)&&Math.floor(s)===s}function i(s){return s.nodeType===r}function a(s,l){return s.compareDocumentPosition(l)&h}})(re);var ke=re.default,ne={};(function(o){Object.defineProperty(o,"__esModule",{value:!0}),o.default=e;function f(r,n){if(!n&&r.firstChild)return r.firstChild;do{if(r.nextSibling)return r.nextSibling;r=r.parentNode}while(r);return r}function v(r){if(r.startContainer.nodeType===Node.ELEMENT_NODE){var n=r.startContainer.childNodes[r.startOffset];return n||f(r.startContainer,!0)}return r.startContainer}function c(r){if(r.endContainer.nodeType===Node.ELEMENT_NODE){var n=r.endContainer.childNodes[r.endOffset];return n||f(r.endContainer,!0)}return f(r.endContainer)}function h(r,n){for(var t=v(r),i=c(r);t!==i;)n(t),t=f(t)}function e(r){var n="";return h(r,function(t){if(t.nodeType===Node.TEXT_NODE){var i=t===r.startContainer?r.startOffset:0,a=t===r.endContainer?r.endOffset:t.textContent.length;n+=t.textContent.slice(i,a)}}),n}})(ne);Object.defineProperty(X,"__esModule",{value:!0});X.fromRange=Be;X.toRange=$e;var G=te(ke),z=te(ne);function te(o){return o&&o.__esModule?o:{default:o}}var Ae=4;function Be(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=o.ownerDocument,c=v.createRange(),h=f.startContainer,e=f.startOffset;c.setStart(o,0),c.setEnd(h,e);var r=(0,z.default)(c).length,n=r+(0,z.default)(f).length;return{start:r,end:n}}function $e(o){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(o===void 0)throw new Error('missing required parameter "root"');var v=o.ownerDocument,c=v.createRange(),h=v.createNodeIterator(o,Ae),e=f.start||0,r=f.end||e,n=e-(0,G.default)(h,e),t=h.referenceNode,i=r-e+n,a=i-(0,G.default)(h,i),s=h.referenceNode;return c.setStart(t,n),c.setEnd(s,a),c}export{Le as W,X as a,O as l}; 12 - //# sourceMappingURL=index-BKdQD0EM.js.map
-1
proxy/static/static/assets/index-BKdQD0EM.js.map
··· 1 - {"version":3,"file":"index-BKdQD0EM.js","sources":["../../../packages/core/src/storage/web.ts","../../../node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/adapter.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/builtin.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/index.js","../../../node_modules/.pnpm/ancestors@0.0.3/node_modules/ancestors/index.js","../../../node_modules/.pnpm/index-of@0.2.0/node_modules/index-of/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/index.js","../../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/index.js"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(keys: string | string[]): Promise<any> {\n if (typeof keys === 'string') {\n const value = localStorage.getItem(keys);\n return value ? JSON.parse(value) : null;\n }\n \n const result: Record<string, any> = {};\n keys.forEach(key => {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n });\n return result;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n","/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.nodeType == 9 || root.ownerDocument;\n var iter = doc.createNodeIterator(root, whatToShow, filter, false);\n return new NodeIterator(iter, root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(iter, root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._iter = iter;\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var result = this._iter.nextNode();\n this.pointerBeforeReferenceNode = false;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var result = this._iter.previousNode();\n this.pointerBeforeReferenceNode = true;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwibm9kZVR5cGUiLCJvd25lckRvY3VtZW50IiwiaXRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9pdGVyIiwibmV4dE5vZGUiLCJyZXN1bHQiLCJwcmV2aW91c05vZGUiLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFlQSxrQjs7O0FBR2YsU0FBU0Esa0JBQVQsQ0FBNEJDLElBQTVCLEVBQTBFO0FBQUEsTUFBeENDLFVBQXdDLHlEQUEzQixVQUEyQjtBQUFBLE1BQWZDLE1BQWUseURBQU4sSUFBTTs7QUFDeEUsTUFBTUMsTUFBT0gsS0FBS0ksUUFBTCxJQUFpQixDQUFsQixJQUF3QkosS0FBS0ssYUFBekM7QUFDQSxNQUFNQyxPQUFPSCxJQUFJSixrQkFBSixDQUF1QkMsSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRCxLQUFqRCxDQUFiO0FBQ0EsU0FBTyxJQUFJSyxZQUFKLENBQWlCRCxJQUFqQixFQUF1Qk4sSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxDQUFQO0FBQ0Q7O0lBR0tLLFk7QUFDSix3QkFBWUQsSUFBWixFQUFrQk4sSUFBbEIsRUFBd0JDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUFBOztBQUMxQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLGFBQUwsR0FBcUJSLElBQXJCO0FBQ0EsU0FBS1MsMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLElBQWI7QUFDRDs7eUJBRURLLFEsdUJBQVc7QUFDVCxRQUFNQyxTQUFTLEtBQUtGLEtBQUwsQ0FBV0MsUUFBWCxFQUFmO0FBQ0EsU0FBS0YsMEJBQUwsR0FBa0MsS0FBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURLLFksMkJBQWU7QUFDYixRQUFNRCxTQUFTLEtBQUtGLEtBQUwsQ0FBV0csWUFBWCxFQUFmO0FBQ0EsU0FBS0osMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURNLFEsdUJBQVc7QUFDVCxXQUFPLHVCQUFQO0FBQ0QsRyIsImZpbGUiOiJhZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY3JlYXRlTm9kZUl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QsIHdoYXRUb1Nob3cgPSAweEZGRkZGRkZGLCBmaWx0ZXIgPSBudWxsKSB7XG4gIGNvbnN0IGRvYyA9IChyb290Lm5vZGVUeXBlID09IDkpIHx8IHJvb3Qub3duZXJEb2N1bWVudFxuICBjb25zdCBpdGVyID0gZG9jLmNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGZhbHNlKVxuICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihpdGVyLCByb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpXG59XG5cblxuY2xhc3MgTm9kZUl0ZXJhdG9yIHtcbiAgY29uc3RydWN0b3IoaXRlciwgcm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgdGhpcy5yb290ID0gcm9vdFxuICAgIHRoaXMud2hhdFRvU2hvdyA9IHdoYXRUb1Nob3dcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlclxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJvb3RcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHRoaXMuX2l0ZXIgPSBpdGVyXG4gIH1cblxuICBuZXh0Tm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLm5leHROb2RlKClcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHByZXZpb3VzTm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLnByZXZpb3VzTm9kZSgpXG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBOb2RlSXRlcmF0b3JdJ1xuICB9XG59XG4iXX0=","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.ownerDocument;\n return doc.createNodeIterator.call(doc, root, whatToShow, filter);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsdGluLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwib3duZXJEb2N1bWVudCIsImNhbGwiXSwibWFwcGluZ3MiOiI7OztxQkFBZUEsa0I7OztBQUdmLFNBQVNBLGtCQUFULENBQTRCQyxJQUE1QixFQUEwRTtBQUFBLE1BQXhDQyxVQUF3Qyx5REFBM0IsVUFBMkI7QUFBQSxNQUFmQyxNQUFlLHlEQUFOLElBQU07O0FBQ3hFLE1BQU1DLE1BQU1ILEtBQUtJLGFBQWpCO0FBQ0EsU0FBT0QsSUFBSUosa0JBQUosQ0FBdUJNLElBQXZCLENBQTRCRixHQUE1QixFQUFpQ0gsSUFBakMsRUFBdUNDLFVBQXZDLEVBQW1EQyxNQUFuRCxDQUFQO0FBQ0QiLCJmaWxlIjoiYnVpbHRpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyZWF0ZU5vZGVJdGVyYXRvclxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93ID0gMHhGRkZGRkZGRiwgZmlsdGVyID0gbnVsbCkge1xuICBjb25zdCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgcmV0dXJuIGRvYy5jcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChkb2MsIHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcilcbn1cbiJdfQ==","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n return new NodeIterator(root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._filter = function (node) {\n return filter ? filter(node) === 1 : true;\n };\n this._show = function (node) {\n return whatToShow >> node.nodeType - 1 & 1 === 1;\n };\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = false;\n\n var node = this.referenceNode;\n if (before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node.firstChild) {\n node = node.firstChild;\n continue;\n }\n\n do {\n if (node === this.root) return null;\n if (node.nextSibling) break;\n node = node.parentNode;\n } while (node);\n\n node = node.nextSibling;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = false;\n return node;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = true;\n\n var node = this.referenceNode;\n if (!before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node === this.root) return null;\n\n if (node.previousSibling) {\n node = node.previousSibling;\n while (node.lastChild) {\n node = node.lastChild;\n }continue;\n }\n\n node = node.parentNode;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = true;\n return node;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBsZW1lbnRhdGlvbi5qcyJdLCJuYW1lcyI6WyJjcmVhdGVOb2RlSXRlcmF0b3IiLCJyb290Iiwid2hhdFRvU2hvdyIsImZpbHRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9maWx0ZXIiLCJub2RlIiwiX3Nob3ciLCJub2RlVHlwZSIsIm5leHROb2RlIiwiYmVmb3JlIiwiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInByZXZpb3VzTm9kZSIsInByZXZpb3VzU2libGluZyIsImxhc3RDaGlsZCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQWVBLGtCOzs7QUFHZixTQUFTQSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBMEU7QUFBQSxNQUF4Q0MsVUFBd0MseURBQTNCLFVBQTJCO0FBQUEsTUFBZkMsTUFBZSx5REFBTixJQUFNOztBQUN4RSxTQUFPLElBQUlDLFlBQUosQ0FBaUJILElBQWpCLEVBQXVCQyxVQUF2QixFQUFtQ0MsTUFBbkMsQ0FBUDtBQUNEOztJQUdLQyxZO0FBQ0osd0JBQVlILElBQVosRUFBa0JDLFVBQWxCLEVBQThCQyxNQUE5QixFQUFzQztBQUFBOztBQUNwQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtFLGFBQUwsR0FBcUJKLElBQXJCO0FBQ0EsU0FBS0ssMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxPQUFMLEdBQWUsVUFBQ0MsSUFBRDtBQUFBLGFBQVVMLFNBQVNBLE9BQU9LLElBQVAsTUFBaUIsQ0FBMUIsR0FBOEIsSUFBeEM7QUFBQSxLQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLFVBQUNELElBQUQ7QUFBQSxhQUFVTixjQUFjTSxLQUFLRSxRQUFMLEdBQWdCLENBQTlCLEdBQWtDLE1BQU0sQ0FBbEQ7QUFBQSxLQUFiO0FBQ0Q7O3lCQUVEQyxRLHVCQUFXO0FBQ1QsUUFBTUMsU0FBUyxLQUFLTiwwQkFBcEI7QUFDQSxTQUFLQSwwQkFBTCxHQUFrQyxLQUFsQzs7QUFFQSxRQUFJRSxPQUFPLEtBQUtILGFBQWhCO0FBQ0EsUUFBSU8sVUFBVSxLQUFLSCxLQUFMLENBQVdELElBQVgsQ0FBVixJQUE4QixLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FBbEMsRUFBc0QsT0FBT0EsSUFBUDs7QUFFdEQsT0FBRztBQUNELFVBQUlBLEtBQUtLLFVBQVQsRUFBcUI7QUFDbkJMLGVBQU9BLEtBQUtLLFVBQVo7QUFDQTtBQUNEOztBQUVELFNBQUc7QUFDRCxZQUFJTCxTQUFTLEtBQUtQLElBQWxCLEVBQXdCLE9BQU8sSUFBUDtBQUN4QixZQUFJTyxLQUFLTSxXQUFULEVBQXNCO0FBQ3RCTixlQUFPQSxLQUFLTyxVQUFaO0FBQ0QsT0FKRCxRQUlTUCxJQUpUOztBQU1BQSxhQUFPQSxLQUFLTSxXQUFaO0FBQ0QsS0FiRCxRQWFRLENBQUMsS0FBS0wsS0FBTCxDQUFXRCxJQUFYLENBQUQsSUFBcUIsQ0FBQyxLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FiOUI7O0FBZUEsU0FBS0gsYUFBTCxHQUFxQkcsSUFBckI7QUFDQSxTQUFLRiwwQkFBTCxHQUFrQyxLQUFsQztBQUNBLFdBQU9FLElBQVA7QUFDRCxHOzt5QkFFRFEsWSwyQkFBZTtBQUNiLFFBQU1KLFNBQVMsS0FBS04sMEJBQXBCO0FBQ0EsU0FBS0EsMEJBQUwsR0FBa0MsSUFBbEM7O0FBRUEsUUFBSUUsT0FBTyxLQUFLSCxhQUFoQjtBQUNBLFFBQUksQ0FBQ08sTUFBRCxJQUFXLEtBQUtILEtBQUwsQ0FBV0QsSUFBWCxDQUFYLElBQStCLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQUFuQyxFQUF1RCxPQUFPQSxJQUFQOztBQUV2RCxPQUFHO0FBQ0QsVUFBSUEsU0FBUyxLQUFLUCxJQUFsQixFQUF3QixPQUFPLElBQVA7O0FBRXhCLFVBQUlPLEtBQUtTLGVBQVQsRUFBMEI7QUFDeEJULGVBQU9BLEtBQUtTLGVBQVo7QUFDQSxlQUFPVCxLQUFLVSxTQUFaO0FBQXVCVixpQkFBT0EsS0FBS1UsU0FBWjtBQUF2QixTQUNBO0FBQ0Q7O0FBRURWLGFBQU9BLEtBQUtPLFVBQVo7QUFDRCxLQVZELFFBVVEsQ0FBQyxLQUFLTixLQUFMLENBQVdELElBQVgsQ0FBRCxJQUFxQixDQUFDLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQVY5Qjs7QUFZQSxTQUFLSCxhQUFMLEdBQXFCRyxJQUFyQjtBQUNBLFNBQUtGLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0EsV0FBT0UsSUFBUDtBQUNELEc7O3lCQUVEVyxRLHVCQUFXO0FBQ1QsV0FBTyx1QkFBUDtBQUNELEciLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjcmVhdGVOb2RlSXRlcmF0b3JcblxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdyA9IDB4RkZGRkZGRkYsIGZpbHRlciA9IG51bGwpIHtcbiAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKVxufVxuXG5cbmNsYXNzIE5vZGVJdGVyYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcikge1xuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcbiAgICB0aGlzLnJlZmVyZW5jZU5vZGUgPSByb290XG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICB0aGlzLl9maWx0ZXIgPSAobm9kZSkgPT4gZmlsdGVyID8gZmlsdGVyKG5vZGUpID09PSAxIDogdHJ1ZVxuICAgIHRoaXMuX3Nob3cgPSAobm9kZSkgPT4gd2hhdFRvU2hvdyA+PiBub2RlLm5vZGVUeXBlIC0gMSAmIDEgPT09IDFcbiAgfVxuXG4gIG5leHROb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcblxuICAgIGxldCBub2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlXG4gICAgaWYgKGJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG4gICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSBicmVha1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgICB9IHdoaWxlIChub2RlKVxuXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZ1xuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJldmlvdXNOb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgICBpZiAoIWJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG5cbiAgICAgIGlmIChub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUl0ZXJhdG9yXSdcbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = getPolyfill;\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction getPolyfill() {\n try {\n var doc = typeof document === 'undefined' ? {} : document;\n var iter = (0, _builtin2['default'])(doc, 0xFFFFFFFF, null, false);\n if (iter.referenceNode === doc) return _builtin2['default'];\n return _adapter2['default'];\n } catch (_) {\n return _implementation2['default'];\n }\n} /*global document*/\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wb2x5ZmlsbC5qcyJdLCJuYW1lcyI6WyJnZXRQb2x5ZmlsbCIsImRvYyIsImRvY3VtZW50IiwiaXRlciIsInJlZmVyZW5jZU5vZGUiLCJfIl0sIm1hcHBpbmdzIjoiOzs7cUJBTXdCQSxXOztBQUx4Qjs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUdlLFNBQVNBLFdBQVQsR0FBdUI7QUFDcEMsTUFBSTtBQUNGLFFBQU1DLE1BQU0sT0FBT0MsUUFBUCxLQUFxQixXQUFyQixHQUFtQyxFQUFuQyxHQUF3Q0EsUUFBcEQ7QUFDQSxRQUFNQyxPQUFPLDBCQUFRRixHQUFSLEVBQWEsVUFBYixFQUF5QixJQUF6QixFQUErQixLQUEvQixDQUFiO0FBQ0EsUUFBSUUsS0FBS0MsYUFBTCxLQUF1QkgsR0FBM0IsRUFBZ0M7QUFDaEM7QUFDRCxHQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1Y7QUFDRDtBQUNGLEMsQ0FmRCIsImZpbGUiOiJwb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBpbXBsZW1lbnRhdGlvbiBmcm9tICcuL2ltcGxlbWVudGF0aW9uJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICAgIGNvbnN0IGl0ZXIgPSBidWlsdGluKGRvYywgMHhGRkZGRkZGRiwgbnVsbCwgZmFsc2UpXG4gICAgaWYgKGl0ZXIucmVmZXJlbmNlTm9kZSA9PT0gZG9jKSByZXR1cm4gYnVpbHRpblxuICAgIHJldHVybiBhZGFwdGVyXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shim;\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/*global document*/\nfunction shim() {\n var doc = typeof document === 'undefined' ? {} : document;\n var polyfill = (0, _polyfill2['default'])();\n if (polyfill !== _builtin2['default']) doc.createNodeIterator = polyfill;\n return polyfill;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGltLmpzIl0sIm5hbWVzIjpbInNoaW0iLCJkb2MiLCJkb2N1bWVudCIsInBvbHlmaWxsIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIl0sIm1hcHBpbmdzIjoiOzs7cUJBS3dCQSxJOztBQUp4Qjs7OztBQUNBOzs7Ozs7QUFGQTtBQUtlLFNBQVNBLElBQVQsR0FBZ0I7QUFDN0IsTUFBTUMsTUFBTSxPQUFPQyxRQUFQLEtBQXFCLFdBQXJCLEdBQW1DLEVBQW5DLEdBQXdDQSxRQUFwRDtBQUNBLE1BQU1DLFdBQVcsNEJBQWpCO0FBQ0EsTUFBSUEsaUNBQUosRUFBMEJGLElBQUlHLGtCQUFKLEdBQXlCRCxRQUF6QjtBQUMxQixTQUFPQSxRQUFQO0FBQ0QiLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBnZXRQb2x5ZmlsbCBmcm9tICcuL3BvbHlmaWxsJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoaW0oKSB7XG4gIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICBjb25zdCBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKClcbiAgaWYgKHBvbHlmaWxsICE9PSBidWlsdGluKSBkb2MuY3JlYXRlTm9kZUl0ZXJhdG9yID0gcG9seWZpbGxcbiAgcmV0dXJuIHBvbHlmaWxsXG59XG4iXX0=","'use strict';\n\nexports.__esModule = true;\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nvar _shim = require('./shim');\n\nvar _shim2 = _interopRequireDefault(_shim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar polyfill = (0, _polyfill2['default'])();\npolyfill.implementation = _implementation2['default'];\npolyfill.shim = _shim2['default'];\n\nexports['default'] = polyfill;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwb2x5ZmlsbCIsImltcGxlbWVudGF0aW9uIiwic2hpbSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyw0QkFBakI7QUFDQUEsU0FBU0MsY0FBVDtBQUNBRCxTQUFTRSxJQUFUOztxQkFFZUYsUSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UG9seWZpbGwgfSBmcm9tICcuL3BvbHlmaWxsJ1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBpbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNoaW0gfSBmcm9tICcuL3NoaW0nXG5cbmNvbnN0IHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKVxucG9seWZpbGwuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvblxucG9seWZpbGwuc2hpbSA9IHNoaW1cblxuZXhwb3J0IGRlZmF1bHQgcG9seWZpbGxcbiJdfQ==","module.exports = require('./lib/polyfill')['default'];\n","module.exports = require('./lib/implementation')['default'];\n","module.exports = require('./lib/shim')['default'];\n","module.exports = require('./lib')['default'];\nmodule.exports.getPolyfill = require('./polyfill');\nmodule.exports.implementation = require('./implementation');\nmodule.exports.shim = require('./shim');\n","module.exports = parents\n\nfunction parents(node, filter) {\n var out = []\n\n filter = filter || noop\n\n do {\n out.push(node)\n node = node.parentNode\n } while(node && node.tagName && filter(node))\n\n return out.slice(1)\n}\n\nfunction noop(n) {\n return true\n}\n","/*!\n * index-of <https://github.com/jonschlinkert/index-of>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function indexOf(arr, ele, start) {\n start = start || 0;\n var idx = -1;\n\n if (arr == null) return idx;\n var len = arr.length;\n var i = start < 0\n ? (len + start)\n : start;\n\n if (i >= arr.length) {\n return -1;\n }\n\n while (i < len) {\n if (arr[i] === ele) {\n return i;\n }\n i++;\n }\n\n return -1;\n};\n","'use strict';\n\nexports.__esModule = true;\nexports['default'] = seek;\n\nvar _ancestors = require('ancestors');\n\nvar _ancestors2 = _interopRequireDefault(_ancestors);\n\nvar _indexOf = require('index-of');\n\nvar _indexOf2 = _interopRequireDefault(_indexOf);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be a number or a Text Node.';\n\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n throw new Error(E_SHOW);\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isNumber(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n var backward = function backward() {\n return node != where || !iter.pointerBeforeReferenceNode;\n };\n predicates = { forward: forward, backward: backward };\n } else {\n throw new Error(E_WHERE);\n }\n\n while (predicates.forward() && (node = iter.nextNode()) !== null) {\n count += node.nodeValue.length;\n }\n\n while (predicates.backward() && (node = iter.previousNode()) !== null) {\n count -= node.nodeValue.length;\n }\n\n return count;\n}\n\nfunction isNumber(n) {\n return !isNaN(parseInt(n)) && isFinite(n);\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n if (ref === node) return false;\n\n var common = null;\n var left = [ref].concat((0, _ancestors2['default'])(ref)).reverse();\n var right = [node].concat((0, _ancestors2['default'])(node)).reverse();\n\n while (left[0] === right[0]) {\n common = left.shift();\n right.shift();\n }\n\n left = left[0];\n right = right[0];\n\n var l = (0, _indexOf2['default'])(common.childNodes, left);\n var r = (0, _indexOf2['default'])(common.childNodes, right);\n\n return l > r;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzZWVrIiwiRV9TSE9XIiwiRV9XSEVSRSIsIlNIT1dfVEVYVCIsIlRFWFRfTk9ERSIsIml0ZXIiLCJ3aGVyZSIsIndoYXRUb1Nob3ciLCJFcnJvciIsImNvdW50Iiwibm9kZSIsInJlZmVyZW5jZU5vZGUiLCJwcmVkaWNhdGVzIiwiaXNOdW1iZXIiLCJmb3J3YXJkIiwiYmFja3dhcmQiLCJpc1RleHQiLCJiZWZvcmUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIm5leHROb2RlIiwibm9kZVZhbHVlIiwibGVuZ3RoIiwicHJldmlvdXNOb2RlIiwibiIsImlzTmFOIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsIm5vZGVUeXBlIiwicmVmIiwiY29tbW9uIiwibGVmdCIsImNvbmNhdCIsInJldmVyc2UiLCJyaWdodCIsInNoaWZ0IiwibCIsImNoaWxkTm9kZXMiLCJyIl0sIm1hcHBpbmdzIjoiOzs7cUJBVXdCQSxJOztBQVZ4Qjs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQyxTQUFTLDBEQUFmO0FBQ0EsSUFBTUMsVUFBVSxxREFBaEI7O0FBRUEsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLFlBQVksQ0FBbEI7O0FBR2UsU0FBU0osSUFBVCxDQUFjSyxJQUFkLEVBQW9CQyxLQUFwQixFQUEyQjtBQUN4QyxNQUFJRCxLQUFLRSxVQUFMLEtBQW9CSixTQUF4QixFQUFtQztBQUNqQyxVQUFNLElBQUlLLEtBQUosQ0FBVVAsTUFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSVEsUUFBUSxDQUFaO0FBQ0EsTUFBSUMsT0FBT0wsS0FBS00sYUFBaEI7QUFDQSxNQUFJQyxhQUFhLElBQWpCOztBQUVBLE1BQUlDLFNBQVNQLEtBQVQsQ0FBSixFQUFxQjtBQUNuQk0saUJBQWE7QUFDWEUsZUFBUztBQUFBLGVBQU1MLFFBQVFILEtBQWQ7QUFBQSxPQURFO0FBRVhTLGdCQUFVO0FBQUEsZUFBTU4sUUFBUUgsS0FBZDtBQUFBO0FBRkMsS0FBYjtBQUlELEdBTEQsTUFLTyxJQUFJVSxPQUFPVixLQUFQLENBQUosRUFBbUI7QUFDeEIsUUFBSVEsVUFBVUcsT0FBT1AsSUFBUCxFQUFhSixLQUFiLElBQXNCO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FBdEIsR0FBb0M7QUFBQSxhQUFNSSxTQUFTSixLQUFmO0FBQUEsS0FBbEQ7QUFDQSxRQUFJUyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxhQUFNTCxRQUFRSixLQUFSLElBQWlCLENBQUNELEtBQUthLDBCQUE3QjtBQUFBLEtBQWY7QUFDQU4saUJBQWEsRUFBQ0UsZ0JBQUQsRUFBVUMsa0JBQVYsRUFBYjtBQUNELEdBSk0sTUFJQTtBQUNMLFVBQU0sSUFBSVAsS0FBSixDQUFVTixPQUFWLENBQU47QUFDRDs7QUFFRCxTQUFPVSxXQUFXRSxPQUFYLE1BQXdCLENBQUNKLE9BQU9MLEtBQUtjLFFBQUwsRUFBUixNQUE2QixJQUE1RCxFQUFrRTtBQUNoRVYsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9ULFdBQVdHLFFBQVgsTUFBeUIsQ0FBQ0wsT0FBT0wsS0FBS2lCLFlBQUwsRUFBUixNQUFpQyxJQUFqRSxFQUF1RTtBQUNyRWIsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9aLEtBQVA7QUFDRDs7QUFHRCxTQUFTSSxRQUFULENBQWtCVSxDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNDLE1BQU1DLFNBQVNGLENBQVQsQ0FBTixDQUFELElBQXVCRyxTQUFTSCxDQUFULENBQTlCO0FBQ0Q7O0FBR0QsU0FBU1AsTUFBVCxDQUFnQk4sSUFBaEIsRUFBc0I7QUFDcEIsU0FBT0EsS0FBS2lCLFFBQUwsS0FBa0J2QixTQUF6QjtBQUNEOztBQUdELFNBQVNhLE1BQVQsQ0FBZ0JXLEdBQWhCLEVBQXFCbEIsSUFBckIsRUFBMkI7QUFDekIsTUFBSWtCLFFBQVFsQixJQUFaLEVBQWtCLE9BQU8sS0FBUDs7QUFFbEIsTUFBSW1CLFNBQVMsSUFBYjtBQUNBLE1BQUlDLE9BQU8sQ0FBQ0YsR0FBRCxFQUFNRyxNQUFOLENBQWEsNEJBQVVILEdBQVYsQ0FBYixFQUE2QkksT0FBN0IsRUFBWDtBQUNBLE1BQUlDLFFBQVEsQ0FBQ3ZCLElBQUQsRUFBT3FCLE1BQVAsQ0FBYyw0QkFBVXJCLElBQVYsQ0FBZCxFQUErQnNCLE9BQS9CLEVBQVo7O0FBRUEsU0FBT0YsS0FBSyxDQUFMLE1BQVlHLE1BQU0sQ0FBTixDQUFuQixFQUE2QjtBQUMzQkosYUFBU0MsS0FBS0ksS0FBTCxFQUFUO0FBQ0FELFVBQU1DLEtBQU47QUFDRDs7QUFFREosU0FBT0EsS0FBSyxDQUFMLENBQVA7QUFDQUcsVUFBUUEsTUFBTSxDQUFOLENBQVI7O0FBRUEsTUFBSUUsSUFBSSwwQkFBUU4sT0FBT08sVUFBZixFQUEyQk4sSUFBM0IsQ0FBUjtBQUNBLE1BQUlPLElBQUksMEJBQVFSLE9BQU9PLFVBQWYsRUFBMkJILEtBQTNCLENBQVI7O0FBRUEsU0FBT0UsSUFBSUUsQ0FBWDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFuY2VzdG9ycyBmcm9tICdhbmNlc3RvcnMnXG5pbXBvcnQgaW5kZXhPZiBmcm9tICdpbmRleC1vZidcblxuY29uc3QgRV9TSE9XID0gJ0FyZ3VtZW50IDEgb2Ygc2VlayBtdXN0IHVzZSBmaWx0ZXIgTm9kZUZpbHRlci5TSE9XX1RFWFQuJ1xuY29uc3QgRV9XSEVSRSA9ICdBcmd1bWVudCAyIG9mIHNlZWsgbXVzdCBiZSBhIG51bWJlciBvciBhIFRleHQgTm9kZS4nXG5cbmNvbnN0IFNIT1dfVEVYVCA9IDRcbmNvbnN0IFRFWFRfTk9ERSA9IDNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWVrKGl0ZXIsIHdoZXJlKSB7XG4gIGlmIChpdGVyLndoYXRUb1Nob3cgIT09IFNIT1dfVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1NIT1cpXG4gIH1cblxuICBsZXQgY291bnQgPSAwXG4gIGxldCBub2RlID0gaXRlci5yZWZlcmVuY2VOb2RlXG4gIGxldCBwcmVkaWNhdGVzID0gbnVsbFxuXG4gIGlmIChpc051bWJlcih3aGVyZSkpIHtcbiAgICBwcmVkaWNhdGVzID0ge1xuICAgICAgZm9yd2FyZDogKCkgPT4gY291bnQgPCB3aGVyZSxcbiAgICAgIGJhY2t3YXJkOiAoKSA9PiBjb3VudCA+IHdoZXJlLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHQod2hlcmUpKSB7XG4gICAgbGV0IGZvcndhcmQgPSBiZWZvcmUobm9kZSwgd2hlcmUpID8gKCkgPT4gZmFsc2UgOiAoKSA9PiBub2RlICE9PSB3aGVyZVxuICAgIGxldCBiYWNrd2FyZCA9ICgpID0+IG5vZGUgIT0gd2hlcmUgfHwgIWl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICBwcmVkaWNhdGVzID0ge2ZvcndhcmQsIGJhY2t3YXJkfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1dIRVJFKVxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuZm9yd2FyZCgpICYmIChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCkge1xuICAgIGNvdW50ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aFxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuYmFja3dhcmQoKSAmJiAobm9kZSA9IGl0ZXIucHJldmlvdXNOb2RlKCkpICE9PSBudWxsKSB7XG4gICAgY291bnQgLT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuXG5mdW5jdGlvbiBpc051bWJlcihuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobikpICYmIGlzRmluaXRlKG4pXG59XG5cblxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZShyZWYsIG5vZGUpIHtcbiAgaWYgKHJlZiA9PT0gbm9kZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNvbW1vbiA9IG51bGxcbiAgbGV0IGxlZnQgPSBbcmVmXS5jb25jYXQoYW5jZXN0b3JzKHJlZikpLnJldmVyc2UoKVxuICBsZXQgcmlnaHQgPSBbbm9kZV0uY29uY2F0KGFuY2VzdG9ycyhub2RlKSkucmV2ZXJzZSgpXG5cbiAgd2hpbGUgKGxlZnRbMF0gPT09IHJpZ2h0WzBdKSB7XG4gICAgY29tbW9uID0gbGVmdC5zaGlmdCgpXG4gICAgcmlnaHQuc2hpZnQoKVxuICB9XG5cbiAgbGVmdCA9IGxlZnRbMF1cbiAgcmlnaHQgPSByaWdodFswXVxuXG4gIGxldCBsID0gaW5kZXhPZihjb21tb24uY2hpbGROb2RlcywgbGVmdClcbiAgbGV0IHIgPSBpbmRleE9mKGNvbW1vbi5jaGlsZE5vZGVzLCByaWdodClcblxuICByZXR1cm4gbCA+IHJcbn1cbiJdfQ==","module.exports = require('./lib')['default'];\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rangeToString;\n/* global Node */\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n } while (node);\n\n /* istanbul ignore next */\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true /* skip children */);\n }\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true /* skip children */);\n }\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS10by1zdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBcUR3QixhO0FBckR4Qjs7QUFFQTs7O0FBR0EsU0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCLFlBQXhCLEVBQXNDO0FBQ3BDLE1BQUksQ0FBQyxZQUFELElBQWlCLEtBQUssVUFBMUIsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFFRCxLQUFHO0FBQ0QsUUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsYUFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELFdBQU8sS0FBSyxVQUFaO0FBQ0QsR0FMRCxRQUtTLElBTFQ7O0FBT0E7QUFDQSxTQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFDeEIsTUFBSSxNQUFNLGNBQU4sQ0FBcUIsUUFBckIsS0FBa0MsS0FBSyxZQUEzQyxFQUF5RDtBQUN2RCxRQUFNLE9BQU8sTUFBTSxjQUFOLENBQXFCLFVBQXJCLENBQWdDLE1BQU0sV0FBdEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sY0FBZixFQUErQixJQUEvQixDQUFvQyxtQkFBcEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxNQUFNLGNBQWI7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsS0FBeEIsRUFBK0I7QUFDN0IsTUFBSSxNQUFNLFlBQU4sQ0FBbUIsUUFBbkIsS0FBZ0MsS0FBSyxZQUF6QyxFQUF1RDtBQUNyRCxRQUFNLE9BQU8sTUFBTSxZQUFOLENBQW1CLFVBQW5CLENBQThCLE1BQU0sU0FBcEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sWUFBZixFQUE2QixJQUE3QixDQUFrQyxtQkFBbEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxTQUFTLE1BQU0sWUFBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxFQUF1QztBQUNyQyxNQUFJLE9BQU8sVUFBVSxLQUFWLENBQVg7QUFDQSxNQUFNLFVBQVUsZUFBZSxLQUFmLENBQWhCO0FBQ0EsU0FBTyxTQUFTLE9BQWhCLEVBQXlCO0FBQ3ZCLE9BQUcsSUFBSDtBQUNBLFdBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNGOztBQUVEOzs7Ozs7O0FBT2UsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCO0FBQzNDO0FBQ0E7QUFDQSxNQUFJLE9BQU8sRUFBWDtBQUNBLHFCQUFtQixLQUFuQixFQUEwQixVQUFDLElBQUQsRUFBVTtBQUNsQyxRQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFNBQTNCLEVBQXNDO0FBQ3BDO0FBQ0Q7QUFDRCxRQUFNLFFBQVEsU0FBUyxNQUFNLGNBQWYsR0FBZ0MsTUFBTSxXQUF0QyxHQUFvRCxDQUFsRTtBQUNBLFFBQU0sTUFBTSxTQUFTLE1BQU0sWUFBZixHQUE4QixNQUFNLFNBQXBDLEdBQWdELEtBQUssV0FBTCxDQUFpQixNQUE3RTtBQUNBLFlBQVEsS0FBSyxXQUFMLENBQWlCLEtBQWpCLENBQXVCLEtBQXZCLEVBQThCLEdBQTlCLENBQVI7QUFDRCxHQVBEO0FBUUEsU0FBTyxJQUFQO0FBQ0QiLCJmaWxlIjoicmFuZ2UtdG8tc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIE5vZGUgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgbm9kZSBhZnRlciBgbm9kZWAgaW4gYSB0cmVlIG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG5leHROb2RlKG5vZGUsIHNraXBDaGlsZHJlbikge1xuICBpZiAoIXNraXBDaGlsZHJlbiAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkXG4gIH1cblxuICBkbyB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgfSB3aGlsZSAobm9kZSlcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiBmaXJzdE5vZGUocmFuZ2UpIHtcbiAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XVxuICAgIHJldHVybiBub2RlIHx8IG5leHROb2RlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0cnVlIC8qIHNraXAgY2hpbGRyZW4gKi8pXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnN0YXJ0Q29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGZpcnN0Tm9kZUFmdGVyKHJhbmdlKSB7XG4gIGlmIChyYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF1cbiAgICByZXR1cm4gbm9kZSB8fCBuZXh0Tm9kZShyYW5nZS5lbmRDb250YWluZXIsIHRydWUgLyogc2tpcCBjaGlsZHJlbiAqLylcbiAgfVxuICByZXR1cm4gbmV4dE5vZGUocmFuZ2UuZW5kQ29udGFpbmVyKVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIGNiKSB7XG4gIGxldCBub2RlID0gZmlyc3ROb2RlKHJhbmdlKVxuICBjb25zdCBwYXN0RW5kID0gZmlyc3ROb2RlQWZ0ZXIocmFuZ2UpXG4gIHdoaWxlIChub2RlICE9PSBwYXN0RW5kKSB7XG4gICAgY2Iobm9kZSlcbiAgICBub2RlID0gbmV4dE5vZGUobm9kZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgcG9ueWZpbGwgZm9yIFJhbmdlLnRvU3RyaW5nKCkuXG4gKiBTcGVjOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yYW5nZS1zdHJpbmdpZmllclxuICpcbiAqIFdvcmtzIGFyb3VuZCB0aGUgYnVnZ3kgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBpbiBJRSBhbmQgRWRnZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGlsZ292aS9kb20tYW5jaG9yLXRleHQtcG9zaXRpb24vaXNzdWVzLzRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhyYW5nZSkge1xuICAvLyBUaGlzIGlzIGEgZmFpcmx5IGRpcmVjdCB0cmFuc2xhdGlvbiBvZiB0aGUgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvblxuICAvLyBpbiBCbGluay5cbiAgbGV0IHRleHQgPSAnJ1xuICBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlID09PSByYW5nZS5zdGFydENvbnRhaW5lciA/IHJhbmdlLnN0YXJ0T2Zmc2V0IDogMFxuICAgIGNvbnN0IGVuZCA9IG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lciA/IHJhbmdlLmVuZE9mZnNldCA6IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoXG4gICAgdGV4dCArPSBub2RlLnRleHRDb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0pXG4gIHJldHVybiB0ZXh0XG59XG5cbiJdfQ==","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domNodeIterator = require('dom-node-iterator');\n\nvar _domNodeIterator2 = _interopRequireDefault(_domNodeIterator);\n\nvar _domSeek = require('dom-seek');\n\nvar _domSeek2 = _interopRequireDefault(_domSeek);\n\nvar _rangeToString = require('./range-to-string');\n\nvar _rangeToString2 = _interopRequireDefault(_rangeToString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n\n var start = (0, _rangeToString2.default)(prefix).length;\n var end = start + (0, _rangeToString2.default)(range).length;\n\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = (0, _domNodeIterator2.default)(root, SHOW_TEXT);\n\n var start = selector.start || 0;\n var end = selector.end || start;\n var count = (0, _domSeek2.default)(iter, start);\n var remainder = start - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setStart(iter.referenceNode, remainder);\n } else {\n range.setStart(iter.nextNode(), remainder);\n iter.previousNode();\n }\n\n var length = end - start + remainder;\n count = (0, _domSeek2.default)(iter, length);\n remainder = length - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setEnd(iter.referenceNode, remainder);\n } else {\n range.setEnd(iter.nextNode(), remainder);\n }\n\n return range;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQU9nQixTLEdBQUEsUztRQTJCQSxPLEdBQUEsTzs7QUFsQ2hCOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxZQUFZLENBQWxCOztBQUVPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxNQUFJLFNBQVMsU0FBYixFQUF3QjtBQUN0QixVQUFNLElBQUksS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUksVUFBVSxTQUFkLEVBQXlCO0FBQ3ZCLFVBQU0sSUFBSSxLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxTQUFTLFNBQVMsV0FBVCxFQUFiOztBQUVBLE1BQUksWUFBWSxNQUFNLGNBQXRCO0FBQ0EsTUFBSSxjQUFjLE1BQU0sV0FBeEI7O0FBRUEsU0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLENBQXRCO0FBQ0EsU0FBTyxNQUFQLENBQWMsU0FBZCxFQUF5QixXQUF6Qjs7QUFFQSxNQUFJLFFBQVEsNkJBQWMsTUFBZCxFQUFzQixNQUFsQztBQUNBLE1BQUksTUFBTSxRQUFRLDZCQUFjLEtBQWQsRUFBcUIsTUFBdkM7O0FBRUEsU0FBTztBQUNMLFdBQU8sS0FERjtBQUVMLFNBQUs7QUFGQSxHQUFQO0FBSUQ7O0FBR00sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXNDO0FBQUEsTUFBZixRQUFlLHlEQUFKLEVBQUk7O0FBQzNDLE1BQUksU0FBUyxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSSxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxRQUFRLFNBQVMsV0FBVCxFQUFaO0FBQ0EsTUFBSSxPQUFPLCtCQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFYOztBQUVBLE1BQUksUUFBUSxTQUFTLEtBQVQsSUFBa0IsQ0FBOUI7QUFDQSxNQUFJLE1BQU0sU0FBUyxHQUFULElBQWdCLEtBQTFCO0FBQ0EsTUFBSSxRQUFRLHVCQUFLLElBQUwsRUFBVyxLQUFYLENBQVo7QUFDQSxNQUFJLFlBQVksUUFBUSxLQUF4Qjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxRQUFOLENBQWUsS0FBSyxhQUFwQixFQUFtQyxTQUFuQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sUUFBTixDQUFlLEtBQUssUUFBTCxFQUFmLEVBQWdDLFNBQWhDO0FBQ0EsU0FBSyxZQUFMO0FBQ0Q7O0FBRUQsTUFBSSxTQUFVLE1BQU0sS0FBUCxHQUFnQixTQUE3QjtBQUNBLFVBQVEsdUJBQUssSUFBTCxFQUFXLE1BQVgsQ0FBUjtBQUNBLGNBQVksU0FBUyxLQUFyQjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxNQUFOLENBQWEsS0FBSyxhQUFsQixFQUFpQyxTQUFqQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sTUFBTixDQUFhLEtBQUssUUFBTCxFQUFiLEVBQThCLFNBQTlCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTm9kZUl0ZXJhdG9yIGZyb20gJ2RvbS1ub2RlLWl0ZXJhdG9yJ1xuaW1wb3J0IHNlZWsgZnJvbSAnZG9tLXNlZWsnXG5cbmltcG9ydCByYW5nZVRvU3RyaW5nIGZyb20gJy4vcmFuZ2UtdG8tc3RyaW5nJ1xuXG5jb25zdCBTSE9XX1RFWFQgPSA0XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IGRvY3VtZW50ID0gcm9vdC5vd25lckRvY3VtZW50XG4gIGxldCBwcmVmaXggPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG5cbiAgbGV0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGxldCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG5cbiAgcHJlZml4LnNldFN0YXJ0KHJvb3QsIDApXG4gIHByZWZpeC5zZXRFbmQoc3RhcnROb2RlLCBzdGFydE9mZnNldClcblxuICBsZXQgc3RhcnQgPSByYW5nZVRvU3RyaW5nKHByZWZpeCkubGVuZ3RoXG4gIGxldCBlbmQgPSBzdGFydCArIHJhbmdlVG9TdHJpbmcocmFuZ2UpLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFuZ2Uocm9vdCwgc2VsZWN0b3IgPSB7fSkge1xuICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJvb3RcIicpXG4gIH1cblxuICBsZXQgZG9jdW1lbnQgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICBsZXQgaXRlciA9IGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCBTSE9XX1RFWFQpXG5cbiAgbGV0IHN0YXJ0ID0gc2VsZWN0b3Iuc3RhcnQgfHwgMFxuICBsZXQgZW5kID0gc2VsZWN0b3IuZW5kIHx8IHN0YXJ0XG4gIGxldCBjb3VudCA9IHNlZWsoaXRlciwgc3RhcnQpXG4gIGxldCByZW1haW5kZXIgPSBzdGFydCAtIGNvdW50XG5cbiAgaWYgKGl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGUpIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLnJlZmVyZW5jZU5vZGUsIHJlbWFpbmRlcilcbiAgfSBlbHNlIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgICBpdGVyLnByZXZpb3VzTm9kZSgpXG4gIH1cblxuICBsZXQgbGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSArIHJlbWFpbmRlclxuICBjb3VudCA9IHNlZWsoaXRlciwgbGVuZ3RoKVxuICByZW1haW5kZXIgPSBsZW5ndGggLSBjb3VudFxuXG4gIGlmIChpdGVyLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgcmFuZ2Uuc2V0RW5kKGl0ZXIucmVmZXJlbmNlTm9kZSwgcmVtYWluZGVyKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlLnNldEVuZChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgfVxuXG4gIHJldHVybiByYW5nZVxufVxuIl19","module.exports = require('./lib')\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.fromTextPosition = fromTextPosition;\nexports.toRange = toRange;\nexports.toTextPosition = toTextPosition;\n\nvar _diffMatchPatch = require('diff-match-patch');\n\nvar _diffMatchPatch2 = _interopRequireDefault(_diffMatchPatch);\n\nvar _domAnchorTextPosition = require('dom-anchor-text-position');\n\nvar textPosition = _interopRequireWildcard(_domAnchorTextPosition);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The DiffMatchPatch bitap has a hard 32-character pattern length limit.\nvar SLICE_LENGTH = 32;\nvar SLICE_RE = new RegExp('(.|[\\r\\n]){1,' + String(SLICE_LENGTH) + '}', 'g');\nvar CONTEXT_LENGTH = SLICE_LENGTH;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var position = textPosition.fromRange(root, range);\n return fromTextPosition(root, position);\n}\n\nfunction fromTextPosition(root, selector) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var start = selector.start;\n\n if (start === undefined) {\n throw new Error('selector missing required property \"start\"');\n }\n if (start < 0) {\n throw new Error('property \"start\" must be a non-negative integer');\n }\n\n var end = selector.end;\n\n if (end === undefined) {\n throw new Error('selector missing required property \"end\"');\n }\n if (end < 0) {\n throw new Error('property \"end\" must be a non-negative integer');\n }\n\n var exact = root.textContent.substr(start, end - start);\n\n var prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n var prefix = root.textContent.substr(prefixStart, start - prefixStart);\n\n var suffixEnd = Math.min(root.textContent.length, end + CONTEXT_LENGTH);\n var suffix = root.textContent.substr(end, suffixEnd - end);\n\n return { exact: exact, prefix: prefix, suffix: suffix };\n}\n\nfunction toRange(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var position = toTextPosition(root, selector, options);\n if (position === null) {\n return null;\n } else {\n return textPosition.toRange(root, position);\n }\n}\n\nfunction toTextPosition(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var exact = selector.exact;\n\n if (exact === undefined) {\n throw new Error('selector missing required property \"exact\"');\n }\n\n var prefix = selector.prefix,\n suffix = selector.suffix;\n var hint = options.hint;\n\n var dmp = new _diffMatchPatch2.default();\n\n dmp.Match_Distance = root.textContent.length * 2;\n\n // Work around a hard limit of the DiffMatchPatch bitap implementation.\n // The search pattern must be no more than SLICE_LENGTH characters.\n var slices = exact.match(SLICE_RE);\n var loc = hint === undefined ? root.textContent.length / 2 | 0 : hint;\n var start = Number.POSITIVE_INFINITY;\n var end = Number.NEGATIVE_INFINITY;\n var result = -1;\n var havePrefix = prefix !== undefined;\n var haveSuffix = suffix !== undefined;\n var foundPrefix = false;\n\n // If the prefix is known then search for that first.\n if (havePrefix) {\n result = dmp.match_main(root.textContent, prefix, loc);\n if (result > -1) {\n loc = result + prefix.length;\n foundPrefix = true;\n }\n }\n\n // If we have a suffix, and the prefix wasn't found, then search for it.\n if (haveSuffix && !foundPrefix) {\n result = dmp.match_main(root.textContent, suffix, loc + exact.length);\n if (result > -1) {\n loc = result - exact.length;\n }\n }\n\n // Search for the first slice.\n var firstSlice = slices.shift();\n result = dmp.match_main(root.textContent, firstSlice, loc);\n if (result > -1) {\n start = result;\n loc = end = start + firstSlice.length;\n } else {\n return null;\n }\n\n // Create a fold function that will reduce slices to positional extents.\n var foldSlices = function foldSlices(acc, slice) {\n if (!acc) {\n // A search for an earlier slice of the pattern failed to match.\n return null;\n }\n\n var result = dmp.match_main(root.textContent, slice, acc.loc);\n if (result === -1) {\n return null;\n }\n\n // The next slice should follow this one closely.\n acc.loc = result + slice.length;\n\n // Expand the start and end to a quote that includes all the slices.\n acc.start = Math.min(acc.start, result);\n acc.end = Math.max(acc.end, result + slice.length);\n\n return acc;\n };\n\n // Use the fold function to establish the full quote extents.\n // Expect the slices to be close to one another.\n // This distance is deliberately generous for now.\n dmp.Match_Distance = 64;\n var acc = slices.reduce(foldSlices, { start: start, end: end, loc: loc });\n if (!acc) {\n return null;\n }\n\n return { start: acc.start, end: acc.end };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JD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ZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/ICgocm9vdC50ZXh0Q29udGVudC5sZW5ndGggLyAyKSB8IDApIDogaGludFxuICBsZXQgc3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IGVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICBsZXQgcmVzdWx0ID0gLTFcbiAgbGV0IGhhdmVQcmVmaXggPSBwcmVmaXggIT09IHVuZGVmaW5lZFxuICBsZXQgaGF2ZVN1ZmZpeCA9IHN1ZmZpeCAhPT0gdW5kZWZpbmVkXG4gIGxldCBmb3VuZFByZWZpeCA9IGZhbHNlXG5cbiAgLy8gSWYgdGhlIHByZWZpeCBpcyBrbm93biB0aGVuIHNlYXJjaCBmb3IgdGhhdCBmaXJzdC5cbiAgaWYgKGhhdmVQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBwcmVmaXgsIGxvYylcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCArIHByZWZpeC5sZW5ndGhcbiAgICAgIGZvdW5kUHJlZml4ID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSBzdWZmaXgsIGFuZCB0aGUgcHJlZml4IHdhc24ndCBmb3VuZCwgdGhlbiBzZWFyY2ggZm9yIGl0LlxuICBpZiAoaGF2ZVN1ZmZpeCAmJiAhZm91bmRQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBzdWZmaXgsIGxvYyArIGV4YWN0Lmxlbmd0aClcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCAtIGV4YWN0Lmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsaWNlLlxuICBsZXQgZmlyc3RTbGljZSA9IHNsaWNlcy5zaGlmdCgpXG4gIHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIGZpcnN0U2xpY2UsIGxvYylcbiAgaWYgKHJlc3VsdCA+IC0xKSB7XG4gICAgc3RhcnQgPSByZXN1bHRcbiAgICBsb2MgPSBlbmQgPSBzdGFydCArIGZpcnN0U2xpY2UubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGZvbGQgZnVuY3Rpb24gdGhhdCB3aWxsIHJlZHVjZSBzbGljZXMgdG8gcG9zaXRpb25hbCBleHRlbnRzLlxuICBsZXQgZm9sZFNsaWNlcyA9IChhY2MsIHNsaWNlKSA9PiB7XG4gICAgaWYgKCFhY2MpIHtcbiAgICAgIC8vIEEgc2VhcmNoIGZvciBhbiBlYXJsaWVyIHNsaWNlIG9mIHRoZSBwYXR0ZXJuIGZhaWxlZCB0byBtYXRjaC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIHNsaWNlLCBhY2MubG9jKVxuICAgIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHNsaWNlIHNob3VsZCBmb2xsb3cgdGhpcyBvbmUgY2xvc2VseS5cbiAgICBhY2MubG9jID0gcmVzdWx0ICsgc2xpY2UubGVuZ3RoXG5cbiAgICAvLyBFeHBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgdG8gYSBxdW90ZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgc2xpY2VzLlxuICAgIGFjYy5zdGFydCA9IE1hdGgubWluKGFjYy5zdGFydCwgcmVzdWx0KVxuICAgIGFjYy5lbmQgPSBNYXRoLm1heChhY2MuZW5kLCByZXN1bHQgKyBzbGljZS5sZW5ndGgpXG5cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICAvLyBVc2UgdGhlIGZvbGQgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBmdWxsIHF1b3RlIGV4dGVudHMuXG4gIC8vIEV4cGVjdCB0aGUgc2xpY2VzIHRvIGJlIGNsb3NlIHRvIG9uZSBhbm90aGVyLlxuICAvLyBUaGlzIGRpc3RhbmNlIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3Igbm93LlxuICBkbXAuTWF0Y2hfRGlzdGFuY2UgPSA2NFxuICBjb25zdCBhY2MgPSBzbGljZXMucmVkdWNlKGZvbGRTbGljZXMsIHtzdGFydCwgZW5kLCBsb2N9KVxuICBpZiAoIWFjYykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge3N0YXJ0OiBhY2Muc3RhcnQsIGVuZDogYWNjLmVuZH1cbn1cbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = seek;\nvar E_END = 'Iterator exhausted before seek ended.';\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.';\nvar DOCUMENT_POSITION_PRECEDING = 2;\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n var error; // istanbul ignore next\n\n try {\n error = new DOMException(E_SHOW, 'InvalidStateError');\n } catch (_unused) {\n error = new Error(E_SHOW);\n error.code = 11;\n error.name = 'InvalidStateError';\n\n error.toString = function () {\n return \"InvalidStateError: \".concat(E_SHOW);\n };\n }\n\n throw error;\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isInteger(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where || !iter.pointerBeforeReferenceNode;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n\n var backward = function backward() {\n return node !== where || !iter.pointerBeforeReferenceNode;\n };\n\n predicates = {\n forward: forward,\n backward: backward\n };\n } else {\n throw new TypeError(E_WHERE);\n }\n\n while (predicates.forward()) {\n node = iter.nextNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count += node.nodeValue.length;\n }\n\n if (iter.nextNode()) {\n node = iter.previousNode();\n }\n\n while (predicates.backward()) {\n node = iter.previousNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count -= node.nodeValue.length;\n }\n\n if (!isText(iter.referenceNode)) {\n throw new RangeError(E_END);\n }\n\n return count;\n}\n\nfunction isInteger(n) {\n if (typeof n !== 'number') return false;\n return isFinite(n) && Math.floor(n) === n;\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING;\n}\n//# sourceMappingURL=index.js.map","module.exports = require('./lib')['default'];\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = rangeToString;\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n\n node = node.parentNode;\n } while (node);\n /* istanbul ignore next */\n\n\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true\n /* skip children */\n );\n }\n\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true\n /* skip children */\n );\n }\n\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\n\n\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=range-to-string.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domSeek = _interopRequireDefault(require(\"dom-seek\"));\n\nvar _rangeToString = _interopRequireDefault(require(\"./range-to-string\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n var start = (0, _rangeToString[\"default\"])(prefix).length;\n var end = start + (0, _rangeToString[\"default\"])(range).length;\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = document.createNodeIterator(root, SHOW_TEXT);\n var start = selector.start || 0;\n var end = selector.end || start;\n var startOffset = start - (0, _domSeek[\"default\"])(iter, start);\n var startNode = iter.referenceNode;\n var remainder = end - start + startOffset;\n var endOffset = remainder - (0, _domSeek[\"default\"])(iter, remainder);\n var endNode = iter.referenceNode;\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n return range;\n}\n//# sourceMappingURL=index.js.map"],"names":["WebStorageAdapter","channelName","event","callback","keys","value","result","key","oldValue","change","diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","i","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","a","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","j","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","delta","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","chars","lineStart","lineEnd","lineArrayLength","line","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","length","pattern","found","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","html","pattern_amp","pattern_lt","pattern_gt","pattern_para","data","levenshtein","insertions","deletions","diffsLength","tokens","param","n","s","match_bitapScore_","e","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","start","finish","rd","charMatch","patch","padding","prefix","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","mod","paddingLength","extraLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","m","sign","coords1","coords2","module","exports","_classCallCheck","instance","Constructor","createNodeIterator","root","whatToShow","filter","doc","iter","NodeIterator","node","before","getPolyfill","_adapter","require$$0","_adapter2","_interopRequireDefault","_builtin","require$$1","_builtin2","_implementation","require$$2","_implementation2","obj","shim","_polyfill","_polyfill2","polyfill","_shim","_shim2","implementation","domNodeIteratorModule","require$$3","ancestors","parents","out","noop","indexOf","arr","ele","idx","len","seek","_ancestors","_ancestors2","_indexOf","_indexOf2","E_SHOW","E_WHERE","SHOW_TEXT","TEXT_NODE","where","count","predicates","isNumber","isText","forward","backward","ref","common","left","right","l","r","domSeek","rangeToString_1","rangeToString","nextNode","skipChildren","firstNode","range","firstNodeAfter","forEachNodeInRange","cb","pastEnd","end","lib","fromRange","toRange","_domNodeIterator","_domNodeIterator2","_domSeek","_domSeek2","_rangeToString","_rangeToString2","document","startNode","startOffset","selector","remainder","domAnchorTextPosition","fromTextPosition","toTextPosition","_diffMatchPatch","_diffMatchPatch2","_domAnchorTextPosition","textPosition","_interopRequireWildcard","newObj","SLICE_LENGTH","SLICE_RE","CONTEXT_LENGTH","position","exact","prefixStart","suffixEnd","options","hint","slices","havePrefix","haveSuffix","foundPrefix","firstSlice","foldSlices","acc","slice","E_END","DOCUMENT_POSITION_PRECEDING","error","isInteger","endOffset","endNode"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
-2
proxy/static/static/assets/index-BNF_FRu3.js
··· 1 - var de=Object.defineProperty;var V=t=>{throw TypeError(t)};var he=(t,e,s)=>e in t?de(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var f=(t,e,s)=>he(t,typeof e!="symbol"?e+"":e,s),H=(t,e,s)=>e.has(t)||V("Cannot "+s);var m=(t,e,s)=>(H(t,e,"read from private field"),s?s.call(t):e.get(t)),S=(t,e,s)=>e.has(t)?V("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),b=(t,e,s,r)=>(H(t,e,"write to private field"),r?r.call(t,s):e.set(t,s),s),$=(t,e,s)=>(H(t,e,"access private method"),s);const pe="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let W=(t=21)=>{let e="",s=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=pe[s[t]&63];return e};const fe=new TextEncoder;new TextDecoder;const we=crypto.subtle,ge=t=>new Uint8Array(t),ye=ge,q=t=>fe.encode(t),me=async t=>new Uint8Array(await we.digest("SHA-256",t)),_e=(t,e,s)=>r=>{const n=(1<<e)-1;let o="",i=0,a=0;for(let c=0;c<r.length;++c)for(a=a<<8|r[c],i+=8;i>e;)i-=e,o+=t[n&a>>i];if(i!==0&&(o+=t[n&a<<e-i]),s)for(;o.length*e&7;)o+="=";return o},ve=(t,e,s)=>{const r={};for(let n=0;n<t.length;++n)r[t[n]]=n;return n=>{let o=n.length;for(;s&&n[o-1]==="=";)--o;const i=ye(o*e/8|0);let a=0,c=0,u=0;for(let l=0;l<o;++l){const h=r[n[l]];if(h===void 0)throw new SyntaxError("invalid base string");c=c<<e|h,a+=e,a>=8&&(a-=8,i[u++]=255&c>>a)}if(a>=e||255&c<<8-a)throw new SyntaxError("unexpected end of data");return i}},ke=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),Ae=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",Ee=ve(ee,6,!1),Se=_e(ee,6,!1),te="fromBase64"in Uint8Array,be=te?ke:Ee,j=te?Ae:Se,N=typeof navigator<"u"?navigator.locks:void 0,se=async t=>{const e=q(t),s=await me(e);return j(s)},Re=async()=>{const t=W(64);return{verifier:t,challenge:await se(t),method:"S256"}},Ue=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},xe=({name:t})=>{const e=new AbortController,s=e.signal,r=(n,o,i=!1)=>{let a;const c=`${t}:${n}`,u=()=>a&&localStorage.setItem(c,JSON.stringify(a)),l=()=>{if(s.aborted)throw new Error("store closed");return a??(a=Ue(localStorage.getItem(c)))};{const h=d=>{d.key===c&&(a=void 0)};globalThis.addEventListener("storage",h,{signal:s})}{const h=async d=>{if(!d||s.aborted||(await new Promise(w=>setTimeout(w,1e4)),s.aborted))return;let g=Date.now(),v=!1;l();for(const w in a){const x=a[w].expiresAt;x!==null&&g>x&&(v=!0,delete a[w])}v&&u()};N?N.request(`${c}:cleanup`,{ifAvailable:!0},h):h(!0)}return{get(h){l();const d=a[h];if(!d)return;const g=d.expiresAt;if(g!==null&&Date.now()>g){delete a[h],u();return}return d.value},getWithLapsed(h){l();const d=a[h],g=Date.now();if(!d)return[void 0,1/0];const v=d.updatedAt;return v===void 0?[d.value,1/0]:[d.value,g-v]},set(h,d){l();const g={value:d,expiresAt:o(d),updatedAt:i?Date.now():void 0};a[h]=g,u()},delete(h){l(),a[h]!==void 0&&(delete a[h],u())},keys(){return l(),Object.keys(a)}}};return{dispose:()=>{e.abort()},sessions:r("sessions",({token:n})=>n.refresh?null:n.expires_at??null),states:r("states",n=>Date.now()+10*60*1e3),dpopNonces:r("dpopNonces",n=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let J,Z,_;const re=t=>{({client_id:J,redirect_uri:Z}=t.metadata),_=xe({name:t.storageName??"atcute-oauth"})};class D extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class ze extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class p extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class K extends Error{constructor(s,r,n){super(r,n);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=s}}class ne extends Error{constructor(s,r){var u,l;const n=G((u=Y(r))==null?void 0:u.error),o=G((l=Y(r))==null?void 0:l.error_description),i=n?`"${n}"`:"unknown",a=o?`: ${o}`:"",c=`OAuth ${i} error${a}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=s,this.data=r,this.error=n,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class De extends Error{constructor(s,r,n){super(n);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=s,this.status=r}}const G=t=>typeof t=="string"?t:void 0,Y=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,je=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Oe=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&je.test(t),Le="parse"in URL,Pe=t=>{let e=null;if(Le)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},$e=(t,e)=>{const s=t.service;if(s)for(let r=0,n=s.length;r<n;r++){const{id:o,type:i,serviceEndpoint:a}=s[r];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(i)){if(!i.includes(e.type))continue}else if(i!==e.type)continue}if(!(typeof a!="string"||!Pe(a)))return a}}},Te=t=>$e(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),Ie="https://public.api.bsky.app",F=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},qe="parse"in URL,Ne=t=>{let e=null;if(qe)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},Ke=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Fe=async t=>{const e=Ie+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,s=await fetch(e);if(s.status===400)throw new p("domain handle not found");if(!s.ok)throw new p("directory is unreachable");return(await s.json()).did},Be=async t=>{const e=t.indexOf(":",4),s=t.slice(4,e),r=t.slice(e+1);let n;if(s==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new p("did not found in directory");if(!o.ok)throw new p("directory is unreachable");n=await o.json()}else if(s==="web"){if(!Ke.test(r))throw new p("invalid identifier");const o=await fetch(`https://${r}/.well-known/did.json`);if(!o.ok)throw new p("did document is unreachable");n=await o.json()}else throw new p("unsupported did method");return n},Ce=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),s=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(s.status!==200||F(s.headers)!=="application/json")throw new p("unexpected response");const r=await s.json();if(r.resource!==e.origin)throw new p("unexpected issuer");return r},He=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),s=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(s.status!==200||F(s.headers)!=="application/json")throw new p("unexpected response");const r=await s.json();if(r.issuer!==e.origin)throw new p("unexpected issuer");if(!Ne(r.authorization_endpoint))throw new p("authorization server provided incorrect authorization endpoint");if(!r.client_id_metadata_document_supported)throw new p("authorization server does not support 'client_id_metadata_document'");if(!r.pushed_authorization_request_endpoint)throw new p("authorization server does not support 'pushed_authorization request'");if(r.response_types_supported&&!r.response_types_supported.includes("code"))throw new p("authorization server does not support 'code' response type");return r},oe=async t=>{let e;Oe(t)?e=t:e=await Fe(t);const s=await Be(e),r=Te(s);if(!r)throw new p("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(r)},metadata:await Me(r)}},Me=async t=>{var n;const e=await Ce(t);if(((n=e.authorization_servers)==null?void 0:n.length)!==1)throw new p("expected exactly one authorization server in the listing");const s=e.authorization_servers[0],r=await He(s);if(r.protected_resources&&!r.protected_resources.includes(e.resource))throw new p("server is not in authorization server's jurisdiction");return r},ae={name:"ECDSA",namedCurve:"P-256"},We=async()=>{const t=await crypto.subtle.generateKey(ae,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:s,key_ops:r,...n}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:j(new Uint8Array(e)),jwt:j(q(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:n})))}},Je=t=>{const e=t.jwt,s=crypto.subtle.importKey("pkcs8",be(t.key),ae,!0,["sign"]),r=(n,o,i,a)=>{const c={ath:a,htm:n,htu:o,iat:Math.floor(Date.now()/1e3),jti:W(24),nonce:i};return j(q(JSON.stringify(c)))};return async(n,o,i,a)=>{const c=r(n,o,i,a),u=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await s,q(e+"."+c)),l=j(new Uint8Array(u));return e+"."+c+"."+l}},ie=(t,e)=>{const s=_.dpopNonces,r=_.inflightDpop,n=Je(t);return async(o,i)=>{const a=new Request(o,i),c=a.headers.get("authorization"),u=c!=null&&c.startsWith("DPoP ")?await se(c.slice(5)):void 0,{method:l,url:h}=a,{origin:d,pathname:g}=new URL(h),v=d+g;let w=r.get(d);w&&(await w.promise,w=void 0);let P,x=!1;try{const[z,y]=s.getWithLapsed(d);P=z,x=y>3*60*1e3}catch{}x&&r.set(d,w=Promise.withResolvers());let E;try{const z=await n(l,v,P,u);a.headers.set("dpop",z);const y=await fetch(a);if(E=y.headers.get("dpop-nonce"),E===null||E===P)return y;try{s.set(d,E)}catch{}if(!await Ze(y,e)||o===a||(i==null?void 0:i.body)instanceof ReadableStream)return y}finally{w&&(r.delete(d),w.resolve())}{const z=await n(l,v,E,u),y=new Request(o,i);y.headers.set("dpop",z);const B=await fetch(y),C=B.headers.get("dpop-nonce");if(C!==null&&C!==E)try{s.set(d,C)}catch{}return B}}},Ze=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const s=t.headers.get("www-authenticate");if(s!=null&&s.startsWith("DPoP"))return s.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&F(t.headers)==="application/json")try{const s=await t.clone().json();return typeof s=="object"&&(s==null?void 0:s.error)==="use_dpop_nonce"}catch{return!1}return!1},Ve=(t,e)=>{const s={};for(let r=0,n=e.length;r<n;r++){const o=e[r];s[o]=t[o]}return s};var O,R,A,M,ce;class L{constructor(e,s){S(this,A);S(this,O);S(this,R);b(this,R,e),b(this,O,ie(s,!0))}async request(e,s){const r=m(this,R)[`${e}_endpoint`];if(!r)throw new Error(`no endpoint for ${e}`);const n=await m(this,O).call(this,r,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...s,client_id:J})});if(F(n.headers)!=="application/json")throw new De(n,2,"unexpected content-type");const o=await n.json();if(n.ok)return o;throw new ne(n,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,s){const r=await this.request("token",{grant_type:"authorization_code",redirect_uri:Z,code:e,code_verifier:s});try{return await $(this,A,ce).call(this,r)}catch(n){throw await this.revoke(r.access_token),n}}async refresh({sub:e,token:s}){if(!s.refresh)throw new K(e,"no refresh token available");const r=await this.request("token",{grant_type:"refresh_token",refresh_token:s.refresh});try{if(e!==r.sub)throw new K(e,`sub mismatch in token response; got ${r.sub}`);return $(this,A,M).call(this,r)}catch(n){throw await this.revoke(r.access_token),n}}}O=new WeakMap,R=new WeakMap,A=new WeakSet,M=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ce=async function(e){const s=e.sub;if(!s)throw new TypeError("missing sub field in token response");const r=$(this,A,M).call(this,e),n=await oe(s);if(n.metadata.issuer!==m(this,R).issuer)throw new TypeError(`issuer mismatch; got ${n.metadata.issuer}`);return{token:r,info:{sub:s,aud:n.identity.pds.href,server:Ve(n.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,Q=async(t,e)=>{var a,c;(a=e==null?void 0:e.signal)==null||a.throwIfAborted();let s=tt;e!=null&&e.noCache?s=Qe:e!=null&&e.allowStale&&(s=Ye);let r;for(;r=T.get(t);){try{const{isFresh:u,value:l}=await r;if(u||s(l))return l}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const n=async()=>{const u=_.sessions.get(t);if(u&&s(u))return{isFresh:!1,value:u};const l=await Xe(t,u);return await ue(t,l),{isFresh:!0,value:l}};let o;if(N?o=N.request(`atcute-oauth:${t}`,n):o=n(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:i}=await o;return i},ue=async(t,e)=>{try{_.sessions.set(t,e)}catch(s){throw await et(e),s}},Ge=t=>{_.sessions.delete(t)},Ye=()=>!0,Qe=()=>!1,Xe=async(t,e)=>{if(e===void 0)throw new K(t,"session deleted by another tab");const{dpopKey:s,info:r,token:n}=e,o=new L(r.server,s);try{const i=await o.refresh({sub:r.sub,token:n});return{dpopKey:s,info:r,token:i}}catch(i){throw i instanceof ne&&i.status===400&&i.error==="invalid_grant"?new K(t,"session was revoked",{cause:i}):i}},et=async({dpopKey:t,info:e,token:s})=>{await new L(e.server,t).revoke(s.refresh??s.access)},tt=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},st=async({metadata:t,identity:e,scope:s})=>{const r=W(24),n=await Re(),o=await We(),i={redirect_uri:Z,code_challenge:n.challenge,code_challenge_method:n.method,state:r,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:s};_.states.set(r,{dpopKey:o,metadata:t,verifier:n.verifier});const c=await new L(t,o).request("pushed_authorization_request",i),u=new URL(t.authorization_endpoint);return u.searchParams.set("client_id",J),u.searchParams.set("request_uri",c.request_uri),u},le=async t=>{const e=t.get("iss"),s=t.get("state"),r=t.get("code"),n=t.get("error");if(!s||!(r||n))throw new D("missing parameters");const o=_.states.get(s);if(o)_.states.delete(s);else throw new D("unknown state provided");const i=o.dpopKey,a=o.metadata;if(n)throw new ze(t.get("error_description")||n);if(!r)throw new D("missing code parameter");if(e===null)throw new D("missing issuer parameter");if(e!==a.issuer)throw new D("issuer mismatch");const c=new L(a,i),{info:u,token:l}=await c.exchangeCode(r,o.verifier),h=u.sub,d={dpopKey:i,info:u,token:l};return await ue(h,d),d};var U,k;class rt{constructor(e){f(this,"session");S(this,U);S(this,k);this.session=e,b(this,U,ie(e.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(e){const s=Q(this.session.info.sub,e);return s.then(r=>{this.session=r}).finally(()=>{b(this,k,void 0)}),b(this,k,s)}async signOut(){const e=this.session.info.sub;try{const{dpopKey:s,info:r,token:n}=await Q(e,{allowStale:!0});await new L(r.server,s).revoke(n.refresh??n.access)}finally{Ge(e)}}async handle(e,s){await m(this,k);const r=new Headers(s==null?void 0:s.headers);let n=this.session,o=new URL(e,n.info.aud);r.set("authorization",`${n.token.type} ${n.token.access}`);let i=await m(this,U).call(this,o,{...s,headers:r});if(!nt(i))return i;try{m(this,k)?n=await m(this,k):n=await this.getSession()}catch{return i}return(s==null?void 0:s.body)instanceof ReadableStream?i:(o=new URL(e,n.info.aud),r.set("authorization",`${n.token.type} ${n.token.access}`),await m(this,U).call(this,o,{...s,headers:r}))}}U=new WeakMap,k=new WeakMap;const nt=t=>{if(t.status!==401)return!1;const e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')},I="synthesis-oauth:session";let X=!1;class at{constructor(e,s,r){this.storage=e,this.launcher=s,this.config=r}initialize(){typeof window<"u"&&!X&&(re({metadata:{client_id:this.config.clientId,redirect_uri:this.config.redirectUri}}),X=!0)}async startLoginProcess(e){if(console.log("[oauth] Starting login process for handle:",e),typeof window<"u"&&window.location)try{sessionStorage.setItem("seams_login_redirect",window.location.href)}catch(u){console.warn("[oauth] Failed to save redirect URL:",u)}this.initialize(),console.log("[oauth] Resolving identity...");const{metadata:s}=await oe(e);console.log("[oauth] PDS metadata:",s),console.log("[oauth] Creating authorization URL...");const r=await st({metadata:s,scope:this.config.scope});console.log("[oauth] Auth URL:",r.toString()),console.log("[oauth] Launching auth flow...");const n=await this.launcher.launch(r);if(!n)throw new Error("OAuth flow cancelled or failed");console.log("[oauth] Captured redirect URL:",n);const o=new URL(n),i=o.search||o.hash.slice(1),a=new URLSearchParams(i);if(console.log("[oauth] OAuth params:",Object.fromEntries(a)),a.has("error")){const u=a.get("error"),l=a.get("error_description");throw console.error("[oauth] OAuth error:",u,l),new Error(`OAuth error: ${u} - ${l}`)}console.log("[oauth] Finalizing authorization...");const c=await le(a);console.log("[oauth] Authorization complete, session:",c),await this.saveSession(c),console.log("[oauth] Session saved successfully")}async saveSession(e){await this.storage.set(I,e)}async loadSession(){return await this.storage.get(I)}async clearSession(){await this.storage.set(I,null)}async getProfile(e){return await(await new rt(e).handle("/xrpc/app.bsky.actor.getProfile?actor="+e.info.sub)).json()}}async function it(t,e){console.log("[oauth] Handling OAuth callback"),e&&(console.log("[oauth] Configuring OAuth client with:",e),re({metadata:{client_id:e.clientId,redirect_uri:e.redirectUri}}));const s=new URL(window.location.href),r=s.search||s.hash.slice(1),n=new URLSearchParams(r);if(console.log("[oauth] OAuth params:",Object.fromEntries(n)),!n.has("code")&&!n.has("error"))return console.log("[oauth] No OAuth params found"),null;if(n.has("error")){const i=n.get("error"),a=n.get("error_description");throw console.error("[oauth] OAuth error:",i,a),new Error(`OAuth error: ${i} - ${a}`)}console.log("[oauth] Finalizing authorization...");const o=await le(n);return console.log("[oauth] Authorization complete, session:",o),await t.set(I,o),console.log("[oauth] Session saved successfully"),o}export{rt as O,at as a,it as h}; 2 - //# sourceMappingURL=index-BNF_FRu3.js.map
-1
proxy/static/static/assets/index-BNF_FRu3.js.map
··· 1 - {"version":3,"file":"index-BNF_FRu3.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../../packages/core/src/oauth/index.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","import {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport type { StorageAdapter } from \"../storage\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nexport interface OAuthLauncher {\n launch(authUrl: URL): Promise<string>;\n}\n\nexport interface OAuthConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nlet isOAuthInitialized = false;\n\nexport class OAuthManager {\n private storage: StorageAdapter;\n private launcher: OAuthLauncher;\n private config: OAuthConfig;\n\n constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) {\n this.storage = storage;\n this.launcher = launcher;\n this.config = config;\n }\n\n initialize() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n configureOAuth({\n metadata: {\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n },\n });\n isOAuthInitialized = true;\n }\n }\n\n async startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth] Starting login process for handle:', handle);\n \n // Store current location for redirect back after login (for web flow)\n if (typeof window !== 'undefined' && window.location) {\n try {\n sessionStorage.setItem('seams_login_redirect', window.location.href);\n } catch (e) {\n console.warn('[oauth] Failed to save redirect URL:', e);\n }\n }\n\n this.initialize();\n \n console.log('[oauth] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth] PDS metadata:', metadata);\n \n console.log('[oauth] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: this.config.scope,\n });\n console.log('[oauth] Auth URL:', authUrl.toString());\n\n console.log('[oauth] Launching auth flow...');\n const capturedUrl = await this.launcher.launch(authUrl);\n \n if (!capturedUrl) {\n throw new Error('OAuth flow cancelled or failed');\n }\n\n console.log('[oauth] Captured redirect URL:', capturedUrl);\n\n // Parse OAuth response from redirect URL (params can be in search or hash)\n const url = new URL(capturedUrl);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await this.saveSession(session);\n console.log('[oauth] Session saved successfully');\n }\n\n async saveSession(session: OAuthSession): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, session);\n }\n\n async loadSession(): Promise<OAuthSession | null> {\n return await this.storage.get(OAUTH_SESSION_KEY);\n }\n\n async clearSession(): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, null);\n }\n\n async getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n }\n}\n\n/**\n * Handle OAuth callback from URL parameters (for web contexts)\n * Call this from your oauth-callback page to process the redirect\n */\nexport async function handleOAuthCallback(storage: StorageAdapter, config?: OAuthConfig): Promise<OAuthSession | null> {\n console.log('[oauth] Handling OAuth callback');\n\n if (config) {\n console.log('[oauth] Configuring OAuth client with:', config);\n configureOAuth({\n metadata: {\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n },\n });\n }\n \n // Parse OAuth response from URL (params can be in search or hash)\n const url = new URL(window.location.href);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (!params.has('code') && !params.has('error')) {\n console.log('[oauth] No OAuth params found');\n return null;\n }\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await storage.set(OAUTH_SESSION_KEY, session);\n console.log('[oauth] Session saved successfully');\n\n return session;\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session","_getSessionPromise","OAuthUserAgent","isInvalidTokenResponse","auth","OAUTH_SESSION_KEY","isOAuthInitialized","OAuthManager","storage","launcher","config","e","capturedUrl","paramString","errorDesc","handleOAuthCallback"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-296
proxy/static/static/assets/index-kV7Brn54.js
··· 1 - function h(l){const t=typeof l=="string"?new Date(l):l,e=new Date().getTime()-t.getTime(),n=Math.floor(e/1e3),a=Math.floor(n/60),r=Math.floor(a/60),s=Math.floor(r/24);return n<60?"just now":a<60?`${a}m ago`:r<24?`${r}h ago`:s<7?`${s}d ago`:t.toLocaleDateString()}const g=` 2 - :host { 3 - display: block; 4 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 5 - } 6 - 7 - * { 8 - box-sizing: border-box; 9 - } 10 - 11 - .annotation-card { 12 - padding: 16px; 13 - border: 1px dashed #d0d0d0; 14 - border-radius: 2px; 15 - background: #fff; 16 - transition: all 0.2s; 17 - position: relative; 18 - } 19 - 20 - .annotation-card:hover { 21 - border-color: #2d5016; 22 - box-shadow: 0 2px 8px rgba(45, 80, 22, 0.08); 23 - } 24 - 25 - blockquote { 26 - margin: 0 0 12px 0; 27 - padding: 8px 12px; 28 - background: #fafafa; 29 - border-left: 3px solid #2d5016; 30 - font-style: italic; 31 - color: #555; 32 - font-size: 14px; 33 - line-height: 1.5; 34 - } 35 - 36 - .annotation-body { 37 - margin-bottom: 12px; 38 - line-height: 1.5; 39 - color: #333; 40 - font-size: 14px; 41 - } 42 - 43 - .annotation-meta { 44 - display: flex; 45 - flex-wrap: wrap; 46 - gap: 12px; 47 - align-items: center; 48 - padding-top: 12px; 49 - border-top: 1px dashed #e0e0e0; 50 - font-size: 12px; 51 - color: #666; 52 - } 53 - 54 - .annotation-author { 55 - color: #666; 56 - display: inline-flex; 57 - align-items: center; 58 - gap: 6px; 59 - } 60 - 61 - .author-avatar { 62 - width: 20px; 63 - height: 20px; 64 - border-radius: 50%; 65 - object-fit: cover; 66 - border: 1px dashed #d0d0d0; 67 - } 68 - 69 - .author-link { 70 - color: #1a1a1a; 71 - text-decoration: none; 72 - font-weight: 500; 73 - } 74 - 75 - .author-link:hover { 76 - text-decoration: underline; 77 - } 78 - 79 - .annotation-source { 80 - color: #1a1a1a; 81 - text-decoration: none; 82 - font-weight: 500; 83 - } 84 - 85 - /* Comments */ 86 - .comments-section { 87 - margin-top: 12px; 88 - padding-top: 12px; 89 - border-top: 1px dashed #e0e0e0; 90 - } 91 - 92 - .comments-header { 93 - display: flex; 94 - gap: 8px; 95 - margin-bottom: 8px; 96 - align-items: center; 97 - } 98 - 99 - button { 100 - background: transparent; 101 - border: 1px solid #d0d0d0; 102 - color: #666; 103 - font-size: 12px; 104 - padding: 4px 8px; 105 - border-radius: 2px; 106 - cursor: pointer; 107 - } 108 - 109 - button:hover { 110 - background: #f5f5f5; 111 - color: #333; 112 - } 113 - 114 - button.primary { 115 - background: #2d5016; 116 - color: white; 117 - border-color: #1f3810; 118 - } 119 - 120 - button.primary:hover { 121 - background: #1f3810; 122 - } 123 - 124 - .comments-list { 125 - display: flex; 126 - flex-direction: column; 127 - gap: 8px; 128 - margin-top: 8px; 129 - } 130 - 131 - .comment { 132 - padding: 8px; 133 - background: #fafafa; 134 - border: 1px solid #e0e0e0; 135 - border-radius: 2px; 136 - } 137 - 138 - .comment-content { 139 - display: flex; 140 - flex-direction: column; 141 - gap: 4px; 142 - } 143 - 144 - .comment-text { 145 - font-size: 13px; 146 - line-height: 1.4; 147 - color: #333; 148 - } 149 - 150 - .comment-meta { 151 - display: flex; 152 - gap: 8px; 153 - align-items: center; 154 - font-size: 11px; 155 - color: #999; 156 - } 157 - 158 - .reply-btn { 159 - border: none; 160 - color: #2d5016; 161 - padding: 0; 162 - background: transparent; 163 - } 164 - 165 - .reply-btn:hover { 166 - text-decoration: underline; 167 - background: transparent; 168 - } 169 - 170 - .comment-thread { 171 - margin-top: 8px; 172 - padding-left: 12px; 173 - position: relative; 174 - } 175 - 176 - .thread-toggle-btn { 177 - position: absolute; 178 - left: -4px; 179 - top: 0; 180 - border: none; 181 - width: 16px; 182 - height: 16px; 183 - padding: 0; 184 - display: flex; 185 - align-items: center; 186 - justify-content: center; 187 - } 188 - 189 - .comment-form, .reply-form { 190 - margin-top: 8px; 191 - padding: 8px; 192 - background: #fff; 193 - border: 1px dashed #d0d0d0; 194 - border-radius: 2px; 195 - } 196 - 197 - textarea { 198 - width: 100%; 199 - min-height: 60px; 200 - padding: 6px; 201 - border: 1px solid #d0d0d0; 202 - border-radius: 2px; 203 - font-family: inherit; 204 - font-size: 13px; 205 - margin-bottom: 6px; 206 - background: #fafafa; 207 - resize: vertical; 208 - } 209 - 210 - .form-actions { 211 - display: flex; 212 - gap: 6px; 213 - justify-content: flex-end; 214 - } 215 - `;class x extends HTMLElement{constructor(){super(),this._annotation=null,this._comments=[],this._collapsedThreads=new Set,this._activeReplyForms=new Set,this.attachShadow({mode:"open"})}static get observedAttributes(){return["annotation","comments"]}connectedCallback(){this.render()}set annotation(t){this._annotation=t,this.render()}get annotation(){return this._annotation}set comments(t){this._comments=t,this.render()}get comments(){return this._comments}toggleThread(t){this._collapsedThreads.has(t)?this._collapsedThreads.delete(t):this._collapsedThreads.add(t),this.render()}toggleReplyForm(t){this._activeReplyForms.has(t)?this._activeReplyForms.delete(t):this._activeReplyForms.add(t),this.render()}buildCommentThread(t,o=!1){const e=this._comments.filter(a=>{var r;return((r=a.reply)==null?void 0:r.parent)===t});if(e.length===0)return"";const n=this._collapsedThreads.has(t);return` 216 - <div class="comment-thread ${o?"nested":""}"> 217 - <button class="thread-toggle-btn" data-uri="${t}"> 218 - ${n?"▸":"▾"} 219 - </button> 220 - ${n?` 221 - <small style="color: #999; font-style: italic; margin-left: 16px;"> 222 - ${e.length} ${e.length===1?"reply":"replies"} 223 - </small> 224 - `:` 225 - <div class="thread-children"> 226 - ${e.map(a=>this.renderComment(a)).join("")} 227 - </div> 228 - `} 229 - </div> 230 - `}renderComment(t){const o=this._comments.some(n=>{var a;return((a=n.reply)==null?void 0:a.parent)===t.uri}),e=t.uri?this._activeReplyForms.has(t.uri):!1;return` 231 - <div class="comment" data-uri="${t.uri}"> 232 - <div class="comment-content"> 233 - <div class="comment-text">${this.escapeHtml(t.plaintext)}</div> 234 - <div class="comment-meta"> 235 - <span>${h(t.createdAt)}</span> 236 - <button class="reply-btn" data-uri="${t.uri}">Reply</button> 237 - </div> 238 - </div> 239 - ${e?` 240 - <div class="reply-form" data-parent="${t.uri}"> 241 - <textarea class="reply-input" placeholder="Write a reply..."></textarea> 242 - <div class="form-actions"> 243 - <button class="cancel-reply-btn" data-uri="${t.uri}">Cancel</button> 244 - <button class="save-reply-btn primary" data-uri="${t.uri}">Post</button> 245 - </div> 246 - </div> 247 - `:""} 248 - ${o&&t.uri?this.buildCommentThread(t.uri,!0):""} 249 - </div> 250 - `}render(){var c,p,m,u;if(!this.shadowRoot)return;if(!this._annotation){this.shadowRoot.innerHTML="";return}const t=this._annotation,o=(c=t.value.target.selector)==null?void 0:c.find(i=>i.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),e=(o==null?void 0:o.exact)||"",n=this._comments.filter(i=>i.subject===t.uri&&!i.reply),a=t.uri?this._collapsedThreads.has(t.uri):!1,r=t.uri?this._activeReplyForms.has(t.uri):!1,s=((p=t.author)==null?void 0:p.did)||"unknown",d=((m=t.author)==null?void 0:m.handle)||(s.includes(":")?s.split(":").pop():s),f=((u=t.author)==null?void 0:u.avatar)||`https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(d||s)}`,b=` 251 - <style>${g}</style> 252 - <article class="annotation-card" data-uri="${t.uri}"> 253 - ${e?`<blockquote>"${this.escapeHtml(e)}"</blockquote>`:""} 254 - ${t.value.body?`<div class="annotation-body">${this.escapeHtml(t.value.body)}</div>`:""} 255 - 256 - <div class="annotation-meta"> 257 - <div class="annotation-author"> 258 - <img class="author-avatar" src="${this.escapeHtml(f)}" alt="avatar"> 259 - <a href="https://bsky.app/profile/${this.escapeHtml(s)}" target="_blank" class="author-link"> 260 - ${this.escapeHtml(d||"")} 261 - </a> 262 - </div> 263 - <span>${h(t.value.createdAt)}</span> 264 - ${t.value.target.url?` 265 - <a href="${this.escapeHtml(t.value.target.url)}" target="_blank" class="annotation-source"> 266 - 267 - </a> 268 - `:""} 269 - </div> 270 - 271 - <div class="comments-section"> 272 - <div class="comments-header"> 273 - <button class="toggle-comments-btn" data-uri="${t.uri}"> 274 - ${a?"▸":"▾"} ${n.length} comment${n.length!==1?"s":""} 275 - </button> 276 - <button class="add-comment-btn" data-uri="${t.uri}">Add comment</button> 277 - </div> 278 - 279 - ${a?"":` 280 - <div class="comments-list"> 281 - ${r?` 282 - <div class="comment-form" data-subject="${t.uri}"> 283 - <textarea class="comment-input" placeholder="Write a comment..."></textarea> 284 - <div class="form-actions"> 285 - <button class="cancel-comment-btn" data-uri="${t.uri}">Cancel</button> 286 - <button class="save-comment-btn primary" data-uri="${t.uri}">Post</button> 287 - </div> 288 - </div> 289 - `:""} 290 - ${n.map(i=>this.renderComment(i)).join("")} 291 - </div> 292 - `} 293 - </div> 294 - </article> 295 - `;this.shadowRoot.innerHTML=b,this.attachEventListeners()}attachEventListeners(){this.shadowRoot&&(this.shadowRoot.querySelectorAll(".toggle-comments-btn, .thread-toggle-btn").forEach(t=>{t.addEventListener("click",o=>{const e=o.currentTarget.dataset.uri;e&&this.toggleThread(e)})}),this.shadowRoot.querySelectorAll(".add-comment-btn, .reply-btn").forEach(t=>{t.addEventListener("click",o=>{const e=o.currentTarget.dataset.uri;e&&this.toggleReplyForm(e)})}),this.shadowRoot.querySelectorAll(".cancel-comment-btn, .cancel-reply-btn").forEach(t=>{t.addEventListener("click",o=>{const e=o.currentTarget.dataset.uri;e&&this.toggleReplyForm(e)})}),this.shadowRoot.querySelectorAll(".save-comment-btn").forEach(t=>{t.addEventListener("click",o=>{const e=o.currentTarget.dataset.uri,n=o.currentTarget.closest(".comment-form"),a=n==null?void 0:n.querySelector("textarea"),r=a==null?void 0:a.value.trim();e&&r&&(this.dispatchEvent(new CustomEvent("comment-submit",{detail:{subjectUri:e,text:r},bubbles:!0,composed:!0})),this.toggleReplyForm(e))})}),this.shadowRoot.querySelectorAll(".save-reply-btn").forEach(t=>{t.addEventListener("click",o=>{const e=o.currentTarget.dataset.uri,n=o.currentTarget.closest(".reply-form"),a=n==null?void 0:n.querySelector("textarea"),r=a==null?void 0:a.value.trim();e&&r&&(this.dispatchEvent(new CustomEvent("reply-submit",{detail:{parentUri:e,text:r},bubbles:!0,composed:!0})),this.toggleReplyForm(e))})}))}escapeHtml(t){const o=document.createElement("div");return o.textContent=t,o.innerHTML}}function v(){customElements.get("seams-annotation-card")||customElements.define("seams-annotation-card",x)}export{v as r}; 296 - //# sourceMappingURL=index-kV7Brn54.js.map
-1
proxy/static/static/assets/index-kV7Brn54.js.map
··· 1 - {"version":3,"file":"index-kV7Brn54.js","sources":["../../../packages/core/src/utils/date.ts","../../../packages/core/src/components/annotation-card.ts","../../../packages/core/src/components/index.ts"],"sourcesContent":["export function formatRelativeTime(dateString: string | Date): string {\n const date = typeof dateString === 'string' ? new Date(dateString) : dateString;\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSecs < 60) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n \n return date.toLocaleDateString();\n}\n","import { Annotation } from '../types';\nimport { Comment } from '../pds/index';\nimport { formatRelativeTime } from '../utils/date';\n\nconst STYLES = `\n:host {\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n* {\n box-sizing: border-box;\n}\n\n.annotation-card {\n padding: 16px;\n border: 1px dashed #d0d0d0;\n border-radius: 2px;\n background: #fff;\n transition: all 0.2s;\n position: relative;\n}\n\n.annotation-card:hover {\n border-color: #2d5016;\n box-shadow: 0 2px 8px rgba(45, 80, 22, 0.08);\n}\n\nblockquote {\n margin: 0 0 12px 0;\n padding: 8px 12px;\n background: #fafafa;\n border-left: 3px solid #2d5016;\n font-style: italic;\n color: #555;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.annotation-body {\n margin-bottom: 12px;\n line-height: 1.5;\n color: #333;\n font-size: 14px;\n}\n\n.annotation-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n align-items: center;\n padding-top: 12px;\n border-top: 1px dashed #e0e0e0;\n font-size: 12px;\n color: #666;\n}\n\n.annotation-author {\n color: #666;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n.author-avatar {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n object-fit: cover;\n border: 1px dashed #d0d0d0;\n}\n\n.author-link {\n color: #1a1a1a;\n text-decoration: none;\n font-weight: 500;\n}\n\n.author-link:hover {\n text-decoration: underline;\n}\n\n.annotation-source {\n color: #1a1a1a;\n text-decoration: none;\n font-weight: 500;\n}\n\n/* Comments */\n.comments-section {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #e0e0e0;\n}\n\n.comments-header {\n display: flex;\n gap: 8px;\n margin-bottom: 8px;\n align-items: center;\n}\n\nbutton {\n background: transparent;\n border: 1px solid #d0d0d0;\n color: #666;\n font-size: 12px;\n padding: 4px 8px;\n border-radius: 2px;\n cursor: pointer;\n}\n\nbutton:hover {\n background: #f5f5f5;\n color: #333;\n}\n\nbutton.primary {\n background: #2d5016;\n color: white;\n border-color: #1f3810;\n}\n\nbutton.primary:hover {\n background: #1f3810;\n}\n\n.comments-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.comment {\n padding: 8px;\n background: #fafafa;\n border: 1px solid #e0e0e0;\n border-radius: 2px;\n}\n\n.comment-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.comment-text {\n font-size: 13px;\n line-height: 1.4;\n color: #333;\n}\n\n.comment-meta {\n display: flex;\n gap: 8px;\n align-items: center;\n font-size: 11px;\n color: #999;\n}\n\n.reply-btn {\n border: none;\n color: #2d5016;\n padding: 0;\n background: transparent;\n}\n\n.reply-btn:hover {\n text-decoration: underline;\n background: transparent;\n}\n\n.comment-thread {\n margin-top: 8px;\n padding-left: 12px;\n position: relative;\n}\n\n.thread-toggle-btn {\n position: absolute;\n left: -4px;\n top: 0;\n border: none;\n width: 16px;\n height: 16px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.comment-form, .reply-form {\n margin-top: 8px;\n padding: 8px;\n background: #fff;\n border: 1px dashed #d0d0d0;\n border-radius: 2px;\n}\n\ntextarea {\n width: 100%;\n min-height: 60px;\n padding: 6px;\n border: 1px solid #d0d0d0;\n border-radius: 2px;\n font-family: inherit;\n font-size: 13px;\n margin-bottom: 6px;\n background: #fafafa;\n resize: vertical;\n}\n\n.form-actions {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n}\n`;\n\nexport class SeamsAnnotationCard extends HTMLElement {\n private _annotation: Annotation | null = null;\n private _comments: Comment[] = [];\n private _collapsedThreads: Set<string> = new Set(); // set of URIs\n private _activeReplyForms: Set<string> = new Set(); // set of URIs (subject or parent)\n\n static get observedAttributes() {\n return ['annotation', 'comments'];\n }\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n connectedCallback() {\n this.render();\n }\n\n set annotation(val: Annotation | null) {\n this._annotation = val;\n this.render();\n }\n\n get annotation() {\n return this._annotation;\n }\n\n set comments(val: Comment[]) {\n this._comments = val;\n this.render();\n }\n\n get comments() {\n return this._comments;\n }\n\n private toggleThread(uri: string) {\n if (this._collapsedThreads.has(uri)) {\n this._collapsedThreads.delete(uri);\n } else {\n this._collapsedThreads.add(uri);\n }\n this.render();\n }\n\n private toggleReplyForm(uri: string) {\n if (this._activeReplyForms.has(uri)) {\n this._activeReplyForms.delete(uri);\n } else {\n this._activeReplyForms.add(uri);\n }\n this.render();\n }\n\n private buildCommentThread(parentUri: string, isNested: boolean = false): string {\n const replies = this._comments.filter(c => c.reply?.parent === parentUri);\n if (replies.length === 0) return '';\n\n const isCollapsed = this._collapsedThreads.has(parentUri);\n\n return `\n <div class=\"comment-thread ${isNested ? 'nested' : ''}\">\n <button class=\"thread-toggle-btn\" data-uri=\"${parentUri}\">\n ${isCollapsed ? '▸' : '▾'}\n </button>\n ${!isCollapsed ? `\n <div class=\"thread-children\">\n ${replies.map(comment => this.renderComment(comment)).join('')}\n </div>\n ` : `\n <small style=\"color: #999; font-style: italic; margin-left: 16px;\">\n ${replies.length} ${replies.length === 1 ? 'reply' : 'replies'}\n </small>\n `}\n </div>\n `;\n }\n\n private renderComment(comment: Comment): string {\n const hasReplies = this._comments.some(c => c.reply?.parent === comment.uri);\n const isReplyFormActive = comment.uri ? this._activeReplyForms.has(comment.uri) : false;\n\n return `\n <div class=\"comment\" data-uri=\"${comment.uri}\">\n <div class=\"comment-content\">\n <div class=\"comment-text\">${this.escapeHtml(comment.plaintext)}</div>\n <div class=\"comment-meta\">\n <span>${formatRelativeTime(comment.createdAt)}</span>\n <button class=\"reply-btn\" data-uri=\"${comment.uri}\">Reply</button>\n </div>\n </div>\n ${isReplyFormActive ? `\n <div class=\"reply-form\" data-parent=\"${comment.uri}\">\n <textarea class=\"reply-input\" placeholder=\"Write a reply...\"></textarea>\n <div class=\"form-actions\">\n <button class=\"cancel-reply-btn\" data-uri=\"${comment.uri}\">Cancel</button>\n <button class=\"save-reply-btn primary\" data-uri=\"${comment.uri}\">Post</button>\n </div>\n </div>\n ` : ''}\n ${hasReplies && comment.uri ? this.buildCommentThread(comment.uri, true) : ''}\n </div>\n `;\n }\n\n private render() {\n if (!this.shadowRoot) return;\n if (!this._annotation) {\n this.shadowRoot.innerHTML = '';\n return;\n }\n\n const ann = this._annotation;\n const quote = ann.value.target.selector?.find((s: any) => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector');\n const text = quote?.exact || '';\n const comments = this._comments.filter(c => c.subject === ann.uri && !c.reply);\n \n // Comments section state\n const isCommentsCollapsed = ann.uri ? this._collapsedThreads.has(ann.uri) : false;\n const isCommentFormActive = ann.uri ? this._activeReplyForms.has(ann.uri) : false;\n\n // Author info\n const authorDid = ann.author?.did || 'unknown';\n const authorHandle = ann.author?.handle || (authorDid.includes(':') ? authorDid.split(':').pop() : authorDid);\n // Use dicebear fallback if no avatar\n const avatarSrc = ann.author?.avatar || `https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(authorHandle || authorDid)}`;\n\n const html = `\n <style>${STYLES}</style>\n <article class=\"annotation-card\" data-uri=\"${ann.uri}\">\n ${text ? `<blockquote>\"${this.escapeHtml(text)}\"</blockquote>` : ''}\n ${ann.value.body ? `<div class=\"annotation-body\">${this.escapeHtml(ann.value.body)}</div>` : ''}\n \n <div class=\"annotation-meta\">\n <div class=\"annotation-author\">\n <img class=\"author-avatar\" src=\"${this.escapeHtml(avatarSrc)}\" alt=\"avatar\">\n <a href=\"https://bsky.app/profile/${this.escapeHtml(authorDid)}\" target=\"_blank\" class=\"author-link\">\n ${this.escapeHtml(authorHandle || '')}\n </a>\n </div>\n <span>${formatRelativeTime(ann.value.createdAt)}</span>\n ${ann.value.target.url ? `\n <a href=\"${this.escapeHtml(ann.value.target.url)}\" target=\"_blank\" class=\"annotation-source\">\n ↗\n </a>\n ` : ''}\n </div>\n\n <div class=\"comments-section\">\n <div class=\"comments-header\">\n <button class=\"toggle-comments-btn\" data-uri=\"${ann.uri}\">\n ${isCommentsCollapsed ? '▸' : '▾'} ${comments.length} comment${comments.length !== 1 ? 's' : ''}\n </button>\n <button class=\"add-comment-btn\" data-uri=\"${ann.uri}\">Add comment</button>\n </div>\n\n ${!isCommentsCollapsed ? `\n <div class=\"comments-list\">\n ${isCommentFormActive ? `\n <div class=\"comment-form\" data-subject=\"${ann.uri}\">\n <textarea class=\"comment-input\" placeholder=\"Write a comment...\"></textarea>\n <div class=\"form-actions\">\n <button class=\"cancel-comment-btn\" data-uri=\"${ann.uri}\">Cancel</button>\n <button class=\"save-comment-btn primary\" data-uri=\"${ann.uri}\">Post</button>\n </div>\n </div>\n ` : ''}\n ${comments.map(c => this.renderComment(c)).join('')}\n </div>\n ` : ''}\n </div>\n </article>\n `;\n\n this.shadowRoot.innerHTML = html;\n this.attachEventListeners();\n }\n\n private attachEventListeners() {\n if (!this.shadowRoot) return;\n\n // Thread toggles (comments section and replies)\n this.shadowRoot.querySelectorAll('.toggle-comments-btn, .thread-toggle-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.currentTarget as HTMLElement).dataset.uri;\n if (uri) this.toggleThread(uri);\n });\n });\n\n // Show/Hide forms\n this.shadowRoot.querySelectorAll('.add-comment-btn, .reply-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.currentTarget as HTMLElement).dataset.uri;\n if (uri) this.toggleReplyForm(uri);\n });\n });\n\n this.shadowRoot.querySelectorAll('.cancel-comment-btn, .cancel-reply-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.currentTarget as HTMLElement).dataset.uri;\n if (uri) this.toggleReplyForm(uri);\n });\n });\n\n // Submit forms\n this.shadowRoot.querySelectorAll('.save-comment-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.currentTarget as HTMLElement).dataset.uri;\n const container = (e.currentTarget as HTMLElement).closest('.comment-form');\n const textarea = container?.querySelector('textarea');\n const text = textarea?.value.trim();\n\n if (uri && text) {\n this.dispatchEvent(new CustomEvent('comment-submit', {\n detail: { subjectUri: uri, text },\n bubbles: true,\n composed: true\n }));\n this.toggleReplyForm(uri); // Close form on submit (optimistic)\n }\n });\n });\n\n this.shadowRoot.querySelectorAll('.save-reply-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.currentTarget as HTMLElement).dataset.uri; // This is parent URI\n const container = (e.currentTarget as HTMLElement).closest('.reply-form');\n const textarea = container?.querySelector('textarea');\n const text = textarea?.value.trim();\n\n if (uri && text) {\n this.dispatchEvent(new CustomEvent('reply-submit', {\n detail: { parentUri: uri, text },\n bubbles: true,\n composed: true\n }));\n this.toggleReplyForm(uri); // Close form on submit\n }\n });\n });\n }\n\n private escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n}\n","import { SeamsAnnotationCard } from './annotation-card';\n\nexport * from './annotation-card';\n\nexport function registerComponents() {\n if (!customElements.get('seams-annotation-card')) {\n customElements.define('seams-annotation-card', SeamsAnnotationCard);\n }\n}\n"],"names":["formatRelativeTime","dateString","date","diffMs","diffSecs","diffMins","diffHours","diffDays","STYLES","SeamsAnnotationCard","val","uri","parentUri","isNested","replies","_a","c","isCollapsed","comment","hasReplies","isReplyFormActive","_b","_c","_d","ann","quote","s","text","comments","isCommentsCollapsed","isCommentFormActive","authorDid","authorHandle","avatarSrc","html","btn","e","container","textarea","div","registerComponents"],"mappings":"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"}
-1
proxy/static/static/assets/landing-B7JXvTVO.css
··· 1 - @font-face{font-display:swap;font-family:Fraunces;font-style:normal;font-weight:400;src:url(/static/assets/fraunces-v38-latin-regular-DMmkNv7_.eot);src:url(/static/assets/fraunces-v38-latin-regular-DMmkNv7_.eot?#iefix) format("embedded-opentype"),url(/static/assets/fraunces-v38-latin-regular-6IfK1voy.woff2) format("woff2"),url(/static/assets/fraunces-v38-latin-regular-BPnp2epa.woff) format("woff"),url(/static/assets/fraunces-v38-latin-regular-g3PjdJvA.ttf) format("truetype")}@font-face{font-display:swap;font-family:Fraunces;font-style:normal;font-weight:600;src:url(/static/assets/fraunces-v38-latin-600-BjX88IhF.eot);src:url(/static/assets/fraunces-v38-latin-600-BjX88IhF.eot?#iefix) format("embedded-opentype"),url(/static/assets/fraunces-v38-latin-600-BFCDtZfi.woff2) format("woff2"),url(/static/assets/fraunces-v38-latin-600-CKqwXJ4d.woff) format("woff"),url(/static/assets/fraunces-v38-latin-600-DBZqn2mI.ttf) format("truetype")}@font-face{font-display:swap;font-family:Fraunces;font-style:normal;font-weight:700;src:url(/static/assets/fraunces-v38-latin-700-BcycBINP.eot);src:url(/static/assets/fraunces-v38-latin-700-BcycBINP.eot?#iefix) format("embedded-opentype"),url(/static/assets/fraunces-v38-latin-700-CEOla-zY.woff2) format("woff2"),url(/static/assets/fraunces-v38-latin-700-DX0krZF_.woff) format("woff"),url(/static/assets/fraunces-v38-latin-700-EHXnlOoQ.ttf) format("truetype")}@font-face{font-display:swap;font-family:Spectral;font-style:normal;font-weight:600;src:url(/static/assets/spectral-v15-latin-600-BliT1AHr.eot);src:url(/static/assets/spectral-v15-latin-600-BliT1AHr.eot?#iefix) format("embedded-opentype"),url(/static/assets/spectral-v15-latin-600-DE3OxvnQ.woff2) format("woff2"),url(/static/assets/spectral-v15-latin-600-DB_3Affc.woff) format("woff"),url(/static/assets/spectral-v15-latin-600-BdHV-IKW.ttf) format("truetype")}@font-face{font-display:swap;font-family:Spectral;font-style:normal;font-weight:700;src:url(/static/assets/spectral-v15-latin-700-Bdud-RSb.eot);src:url(/static/assets/spectral-v15-latin-700-Bdud-RSb.eot?#iefix) format("embedded-opentype"),url(/static/assets/spectral-v15-latin-700-Cd2m0ohD.woff2) format("woff2"),url(/static/assets/spectral-v15-latin-700-D6tDXmC_.woff) format("woff"),url(/static/assets/spectral-v15-latin-700-1bnaK4j6.ttf) format("truetype")}*{box-sizing:border-box;margin:0;padding:0}:root{--forest-green: #2d5016;--forest-green-light: #3d6b1f;--forest-green-dark: #1f3810}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fafafa;color:#1a1a1a;position:relative;line-height:1.6;margin:0;padding:0}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;background-image:radial-gradient(circle,rgba(45,80,22,.06) 1px,transparent 1px);background-size:20px 20px;z-index:0}.layout{display:flex;min-height:100vh;position:relative;z-index:1}.sidebar{width:420px;background:#fff;border-right:2px dashed #d0d0d0;position:sticky;top:0;height:100vh;overflow-y:auto;flex-shrink:0}.sidebar-content{display:flex;flex-direction:column;justify-content:space-between;min-height:100vh;padding:60px 0}.hero{flex:1;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;padding:0 48px}.logo{font-family:Spectral,serif;font-size:16px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#666;margin-bottom:24px}.hero h1{font-family:Fraunces,serif;font-size:clamp(28px,3vw,40px);font-weight:600;margin-bottom:24px;color:#1a1a1a;line-height:1.2;letter-spacing:-.01em}.tagline{font-size:14px;color:#666;margin-bottom:32px;font-weight:400;line-height:1.6}.cta-buttons{display:flex;gap:12px;flex-direction:row;align-items:center}.cta-primary,.cta-secondary{padding:10px 20px;border-radius:2px;font-size:13px;font-weight:500;text-decoration:none;transition:all .2s;border:1px dashed;display:inline-block}.cta-primary{background:var(--forest-green);color:#fff;border-color:var(--forest-green-dark)}.cta-primary:hover{background:var(--forest-green-dark);transform:translateY(-1px)}.cta-secondary{background:transparent;color:var(--forest-green);border-color:var(--forest-green)}.cta-secondary:hover{border-color:var(--forest-green-dark);background:#2d50160d}.main-content{flex:1;background:#fafafa;overflow-y:auto}.feed-section{padding:60px 48px;max-width:900px}.annotations-feed{display:flex;flex-direction:column;gap:24px}.annotation-card{padding:24px;border:1px dashed #d0d0d0;border-radius:2px;background:#fff;transition:all .2s;position:relative}.annotation-card:hover{border-color:var(--forest-green);box-shadow:0 2px 8px #2d501614}.annotation-quote{margin-bottom:16px;padding:12px 16px;background:#fafafa;border-left:3px solid var(--forest-green);font-style:italic;color:#555;font-size:15px;line-height:1.6}.annotation-body{margin-bottom:16px;line-height:1.6;color:#333;font-size:15px}.annotation-meta{display:flex;flex-wrap:wrap;gap:12px;align-items:center;padding-top:12px;border-top:1px dashed #e0e0e0;font-size:13px;color:#666}.annotation-source{color:#1a1a1a;text-decoration:none;font-weight:500;display:inline-flex;align-items:center;gap:4px;border-bottom:1px dashed transparent;transition:border-color .2s}.annotation-source:hover{border-bottom-color:#1a1a1a}.annotation-author{color:#666;display:inline-flex;align-items:center;gap:8px}.annotation-author .author-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px dashed #d0d0d0}.annotation-author a{color:#1a1a1a;text-decoration:none;font-weight:500;border-bottom:1px dashed transparent;transition:border-color .2s}.annotation-author a:hover{border-bottom-color:#1a1a1a}.annotation-time{color:#999}.loading,.empty,.error{text-align:center;padding:60px 20px;color:#999;font-style:italic}.error{color:#d93025;font-style:normal}.load-more{text-align:center;margin-top:40px}#load-more-btn{background:var(--forest-green);color:#fff;border:1px dashed var(--forest-green-dark);padding:12px 32px;border-radius:2px;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s}#load-more-btn:hover{background:var(--forest-green-dark);transform:translateY(-1px)}#load-more-btn:disabled{background:#ccc;border-color:#aaa;cursor:not-allowed;transform:none}.footer{padding-top:40px;color:#999;font-size:13px;text-align:center;margin:0;border-top:2px dashed #d0d0d0}.mobile-footer{display:none}.desktop-footer{display:block}.footer-icons{display:flex;gap:20px;justify-content:center;align-items:center}.footer-icons a{color:#1a1a1a;text-decoration:none;transition:all .2s;display:flex;align-items:center;justify-content:center}.footer-icons a img,.footer-icons a svg{width:32px;height:32px;opacity:.6;transition:opacity .2s}.footer-icons a:hover img,.footer-icons a:hover svg{opacity:1}@media (max-width: 1024px){.layout{flex-direction:column}.sidebar{width:100%;height:auto;position:relative;border-right:none;border-bottom:2px dashed #d0d0d0}.sidebar-content{min-height:auto;padding:40px 0}.hero{justify-content:flex-start;padding:0 32px}.desktop-footer{display:none}.mobile-footer{display:block;padding:40px 32px;margin:0;border-top:2px dashed #d0d0d0;background:#fafafa}.feed-section{padding:48px 32px}}@media (max-width: 640px){.sidebar-content{padding:32px 0}.hero{padding:0 24px}.hero h1{font-size:28px}.mobile-footer{padding:32px 24px;font-size:12px}.feed-section{padding:32px 24px}.annotation-card{padding:20px}}
-2
proxy/static/static/assets/modulepreload-polyfill-59aEHZEI.js
··· 1 - var re=Object.defineProperty;var W=t=>{throw TypeError(t)};var ne=(t,e,r)=>e in t?re(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var h=(t,e,r)=>ne(t,typeof e!="symbol"?e+"":e,r),K=(t,e,r)=>e.has(t)||W("Cannot "+r);var D=(t,e,r)=>(K(t,e,"read from private field"),r?r.call(t):e.get(t)),j=(t,e,r)=>e.has(t)?W("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),F=(t,e,r,s)=>(K(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),z=(t,e,r)=>(K(t,e,"access private method"),r);const se="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let M=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=se[r[t]&63];return e};const oe=new TextEncoder;new TextDecoder;const ae=crypto.subtle,ie=t=>new Uint8Array(t),ce=ie,L=t=>oe.encode(t),ue=async t=>new Uint8Array(await ae.digest("SHA-256",t)),le=(t,e,r)=>s=>{const n=(1<<e)-1;let o="",i=0,a=0;for(let c=0;c<s.length;++c)for(a=a<<8|s[c],i+=8;i>e;)i-=e,o+=t[n&a>>i];if(i!==0&&(o+=t[n&a<<e-i]),r)for(;o.length*e&7;)o+="=";return o},de=(t,e,r)=>{const s={};for(let n=0;n<t.length;++n)s[t[n]]=n;return n=>{let o=n.length;for(;r&&n[o-1]==="=";)--o;const i=ce(o*e/8|0);let a=0,c=0,u=0;for(let l=0;l<o;++l){const p=s[n[l]];if(p===void 0)throw new SyntaxError("invalid base string");c=c<<e|p,a+=e,a>=8&&(a-=8,i[u++]=255&c>>a)}if(a>=e||255&c<<8-a)throw new SyntaxError("unexpected end of data");return i}},pe=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),fe=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),V="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",he=de(V,6,!1),we=le(V,6,!1),G="fromBase64"in Uint8Array,ye=G?pe:he,R=G?fe:we,T=typeof navigator<"u"?navigator.locks:void 0,Q=async t=>{const e=L(t),r=await ue(e);return R(r)},ge=async()=>{const t=M(64);return{verifier:t,challenge:await Q(t),method:"S256"}},me=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},_e=({name:t})=>{const e=new AbortController,r=e.signal,s=(n,o,i=!1)=>{let a;const c=`${t}:${n}`,u=()=>a&&localStorage.setItem(c,JSON.stringify(a)),l=()=>{if(r.aborted)throw new Error("store closed");return a??(a=me(localStorage.getItem(c)))};{const p=d=>{d.key===c&&(a=void 0)};globalThis.addEventListener("storage",p,{signal:r})}{const p=async d=>{if(!d||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let y=Date.now(),_=!1;l();for(const w in a){const A=a[w].expiresAt;A!==null&&y>A&&(_=!0,delete a[w])}_&&u()};T?T.request(`${c}:cleanup`,{ifAvailable:!0},p):p(!0)}return{get(p){l();const d=a[p];if(!d)return;const y=d.expiresAt;if(y!==null&&Date.now()>y){delete a[p],u();return}return d.value},getWithLapsed(p){l();const d=a[p],y=Date.now();if(!d)return[void 0,1/0];const _=d.updatedAt;return _===void 0?[d.value,1/0]:[d.value,y-_]},set(p,d){l();const y={value:d,expiresAt:o(d),updatedAt:i?Date.now():void 0};a[p]=y,u()},delete(p){l(),a[p]!==void 0&&(delete a[p],u())},keys(){return l(),Object.keys(a)}}};return{dispose:()=>{e.abort()},sessions:s("sessions",({token:n})=>n.refresh?null:n.expires_at??null),states:s("states",n=>Date.now()+10*60*1e3),dpopNonces:s("dpopNonces",n=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let C,H,m;const Ve=t=>{({client_id:C,redirect_uri:H}=t.metadata),m=_e({name:t.storageName??"atcute-oauth"})};class b extends Error{constructor(){super(...arguments);h(this,"name","LoginError")}}class ve extends Error{constructor(){super(...arguments);h(this,"name","AuthorizationError")}}class f extends Error{constructor(){super(...arguments);h(this,"name","ResolverError")}}class O extends Error{constructor(r,s,n){super(s,n);h(this,"sub");h(this,"name","TokenRefreshError");this.sub=r}}class X extends Error{constructor(r,s){var u,l;const n=J((u=Z(s))==null?void 0:u.error),o=J((l=Z(s))==null?void 0:l.error_description),i=n?`"${n}"`:"unknown",a=o?`: ${o}`:"",c=`OAuth ${i} error${a}`;super(c);h(this,"response");h(this,"data");h(this,"name","OAuthResponseError");h(this,"error");h(this,"description");this.response=r,this.data=s,this.error=n,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class Ee extends Error{constructor(r,s,n){super(n);h(this,"response");h(this,"status");h(this,"name","FetchResponseError");this.response=r,this.status=s}}const J=t=>typeof t=="string"?t:void 0,Z=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,ke=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Ae=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&ke.test(t),xe="parse"in URL,be=t=>{let e=null;if(xe)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},Re=(t,e)=>{const r=t.service;if(r)for(let s=0,n=r.length;s<n;s++){const{id:o,type:i,serviceEndpoint:a}=r[s];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(i)){if(!i.includes(e.type))continue}else if(i!==e.type)continue}if(!(typeof a!="string"||!be(a)))return a}}},Se=t=>Re(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),Ue="https://public.api.bsky.app",$=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},De="parse"in URL,je=t=>{let e=null;if(De)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},ze=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Pe=async t=>{const e=Ue+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new f("domain handle not found");if(!r.ok)throw new f("directory is unreachable");return(await r.json()).did},Le=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),s=t.slice(e+1);let n;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new f("did not found in directory");if(!o.ok)throw new f("directory is unreachable");n=await o.json()}else if(r==="web"){if(!ze.test(s))throw new f("invalid identifier");const o=await fetch(`https://${s}/.well-known/did.json`);if(!o.ok)throw new f("did document is unreachable");n=await o.json()}else throw new f("unsupported did method");return n},Te=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||$(r.headers)!=="application/json")throw new f("unexpected response");const s=await r.json();if(s.resource!==e.origin)throw new f("unexpected issuer");return s},Oe=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||$(r.headers)!=="application/json")throw new f("unexpected response");const s=await r.json();if(s.issuer!==e.origin)throw new f("unexpected issuer");if(!je(s.authorization_endpoint))throw new f("authorization server provided incorrect authorization endpoint");if(!s.client_id_metadata_document_supported)throw new f("authorization server does not support 'client_id_metadata_document'");if(!s.pushed_authorization_request_endpoint)throw new f("authorization server does not support 'pushed_authorization request'");if(s.response_types_supported&&!s.response_types_supported.includes("code"))throw new f("authorization server does not support 'code' response type");return s},$e=async t=>{let e;Ae(t)?e=t:e=await Pe(t);const r=await Le(e),s=Se(r);if(!s)throw new f("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(s)},metadata:await qe(s)}},qe=async t=>{var n;const e=await Te(t);if(((n=e.authorization_servers)==null?void 0:n.length)!==1)throw new f("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],s=await Oe(r);if(s.protected_resources&&!s.protected_resources.includes(e.resource))throw new f("server is not in authorization server's jurisdiction");return s},Y={name:"ECDSA",namedCurve:"P-256"},Ne=async()=>{const t=await crypto.subtle.generateKey(Y,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:s,...n}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:R(new Uint8Array(e)),jwt:R(L(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:n})))}},Ie=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",ye(t.key),Y,!0,["sign"]),s=(n,o,i,a)=>{const c={ath:a,htm:n,htu:o,iat:Math.floor(Date.now()/1e3),jti:M(24),nonce:i};return R(L(JSON.stringify(c)))};return async(n,o,i,a)=>{const c=s(n,o,i,a),u=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,L(e+"."+c)),l=R(new Uint8Array(u));return e+"."+c+"."+l}},Ke=(t,e)=>{const r=m.dpopNonces,s=m.inflightDpop,n=Ie(t);return async(o,i)=>{const a=new Request(o,i),c=a.headers.get("authorization"),u=c!=null&&c.startsWith("DPoP ")?await Q(c.slice(5)):void 0,{method:l,url:p}=a,{origin:d,pathname:y}=new URL(p),_=d+y;let w=s.get(d);w&&(await w.promise,w=void 0);let U,A=!1;try{const[x,g]=r.getWithLapsed(d);U=x,A=g>3*60*1e3}catch{}A&&s.set(d,w=Promise.withResolvers());let E;try{const x=await n(l,_,U,u);a.headers.set("dpop",x);const g=await fetch(a);if(E=g.headers.get("dpop-nonce"),E===null||E===U)return g;try{r.set(d,E)}catch{}if(!await Fe(g,e)||o===a||(i==null?void 0:i.body)instanceof ReadableStream)return g}finally{w&&(s.delete(d),w.resolve())}{const x=await n(l,_,E,u),g=new Request(o,i);g.headers.set("dpop",x);const N=await fetch(g),I=N.headers.get("dpop-nonce");if(I!==null&&I!==E)try{r.set(d,I)}catch{}return N}}},Fe=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&$(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Be=(t,e)=>{const r={};for(let s=0,n=e.length;s<n;s++){const o=e[s];r[o]=t[o]}return r};var S,k,v,B,ee;class q{constructor(e,r){j(this,v);j(this,S);j(this,k);F(this,k,e),F(this,S,Ke(r,!0))}async request(e,r){const s=D(this,k)[`${e}_endpoint`];if(!s)throw new Error(`no endpoint for ${e}`);const n=await D(this,S).call(this,s,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:C})});if($(n.headers)!=="application/json")throw new Ee(n,2,"unexpected content-type");const o=await n.json();if(n.ok)return o;throw new X(n,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const s=await this.request("token",{grant_type:"authorization_code",redirect_uri:H,code:e,code_verifier:r});try{return await z(this,v,ee).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}async refresh({sub:e,token:r}){if(!r.refresh)throw new O(e,"no refresh token available");const s=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==s.sub)throw new O(e,`sub mismatch in token response; got ${s.sub}`);return z(this,v,B).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}}S=new WeakMap,k=new WeakMap,v=new WeakSet,B=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ee=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const s=z(this,v,B).call(this,e),n=await $e(r);if(n.metadata.issuer!==D(this,k).issuer)throw new TypeError(`issuer mismatch; got ${n.metadata.issuer}`);return{token:s,info:{sub:r,aud:n.identity.pds.href,server:Be(n.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const P=new Map,Ge=async(t,e)=>{var a,c;(a=e==null?void 0:e.signal)==null||a.throwIfAborted();let r=Je;e!=null&&e.noCache?r=Ce:e!=null&&e.allowStale&&(r=Me);let s;for(;s=P.get(t);){try{const{isFresh:u,value:l}=await s;if(u||r(l))return l}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const n=async()=>{const u=m.sessions.get(t);if(u&&r(u))return{isFresh:!1,value:u};const l=await He(t,u);return await te(t,l),{isFresh:!0,value:l}};let o;if(T?o=T.request(`atcute-oauth:${t}`,n):o=n(),o=o.finally(()=>P.delete(t)),P.has(t))throw new Error("concurrent request for the same key");P.set(t,o);const{value:i}=await o;return i},te=async(t,e)=>{try{m.sessions.set(t,e)}catch(r){throw await We(e),r}},Qe=t=>{m.sessions.delete(t)},Me=()=>!0,Ce=()=>!1,He=async(t,e)=>{if(e===void 0)throw new O(t,"session deleted by another tab");const{dpopKey:r,info:s,token:n}=e,o=new q(s.server,r);try{const i=await o.refresh({sub:s.sub,token:n});return{dpopKey:r,info:s,token:i}}catch(i){throw i instanceof X&&i.status===400&&i.error==="invalid_grant"?new O(t,"session was revoked",{cause:i}):i}},We=async({dpopKey:t,info:e,token:r})=>{await new q(e.server,t).revoke(r.refresh??r.access)},Je=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},Xe=async({metadata:t,identity:e,scope:r})=>{const s=M(24),n=await ge(),o=await Ne(),i={redirect_uri:H,code_challenge:n.challenge,code_challenge_method:n.method,state:s,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};m.states.set(s,{dpopKey:o,metadata:t,verifier:n.verifier});const c=await new q(t,o).request("pushed_authorization_request",i),u=new URL(t.authorization_endpoint);return u.searchParams.set("client_id",C),u.searchParams.set("request_uri",c.request_uri),u},Ye=async t=>{const e=t.get("iss"),r=t.get("state"),s=t.get("code"),n=t.get("error");if(!r||!(s||n))throw new b("missing parameters");const o=m.states.get(r);if(o)m.states.delete(r);else throw new b("unknown state provided");const i=o.dpopKey,a=o.metadata;if(n)throw new ve(t.get("error_description")||n);if(!s)throw new b("missing code parameter");if(e===null)throw new b("missing issuer parameter");if(e!==a.issuer)throw new b("issuer mismatch");const c=new q(a,i),{info:u,token:l}=await c.exchangeCode(s,o.verifier),p=u.sub,d={dpopKey:i,info:u,token:l};return await te(p,d),d};(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))s(n);new MutationObserver(n=>{for(const o of n)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function r(n){const o={};return n.integrity&&(o.integrity=n.integrity),n.referrerPolicy&&(o.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?o.credentials="include":n.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(n){if(n.ep)return;n.ep=!0;const o=r(n);fetch(n.href,o)}})();export{q as O,Ve as a,Xe as b,Ke as c,Qe as d,Ye as f,Ge as g,$e as r}; 2 - //# sourceMappingURL=modulepreload-polyfill-59aEHZEI.js.map
-1
proxy/static/static/assets/modulepreload-polyfill-59aEHZEI.js.map
··· 1 - {"version":3,"file":"modulepreload-polyfill-59aEHZEI.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session"],"mappings":"6hBAAO,MAAMA,GACX,mECoBK,IAAIC,EAAS,CAACC,EAAO,KAAO,CACjC,IAAIC,EAAK,GACLC,EAAQ,OAAO,gBAAgB,IAAI,WAAYF,GAAQ,CAAC,CAAE,EAC9D,KAAOA,KACLC,GAAME,GAAkBD,EAAMF,CAAI,EAAI,EAAE,EAE1C,OAAOC,CACT,EC5BA,MAAMG,GAAc,IAAI,YACJ,IAAI,YACxB,MAAMC,GAAS,OAAO,OAITC,GAASN,GACX,IAAI,WAAWA,CAAI,EAMjBO,GAAcD,GA+EdE,EAAcC,GAChBL,GAAY,OAAOK,CAAG,EAgEpBC,GAAW,MAAOC,GACpB,IAAI,WAAW,MAAMN,GAAO,OAAO,UAAWM,CAAM,CAAC,EC7JnDC,GAAsB,CAACC,EAAUC,EAAaC,IAC/Cb,GAAU,CACd,MAAMc,GAAQ,GAAKF,GAAe,EAClC,IAAIL,EAAM,GACNQ,EAAO,EACPN,EAAS,EACb,QAASO,EAAI,EAAGA,EAAIhB,EAAM,OAAQ,EAAEgB,EAKhC,IAHAP,EAAUA,GAAU,EAAKT,EAAMgB,CAAC,EAChCD,GAAQ,EAEDA,EAAOH,GACVG,GAAQH,EACRL,GAAOI,EAASG,EAAQL,GAAUM,CAAK,EAQ/C,GAJIA,IAAS,IACTR,GAAOI,EAASG,EAAQL,GAAWG,EAAcG,CAAM,GAGvDF,EACA,KAASN,EAAI,OAASK,EAAe,GACjCL,GAAO,IAGf,OAAOA,CACX,EAESU,GAAsB,CAACN,EAAUC,EAAaC,IAAQ,CAE/D,MAAMK,EAAQ,CAAA,EACd,QAASF,EAAI,EAAGA,EAAIL,EAAS,OAAQ,EAAEK,EACnCE,EAAMP,EAASK,CAAC,CAAC,EAAIA,EAEzB,OAAQT,GAAQ,CAEZ,IAAIY,EAAMZ,EAAI,OACd,KAAOM,GAAON,EAAIY,EAAM,CAAC,IAAM,KAC3B,EAAEA,EAGN,MAAMnB,EAAQK,GAAcc,EAAMP,EAAe,EAAK,CAAC,EAEvD,IAAIG,EAAO,EACPN,EAAS,EACTW,EAAU,EACd,QAASJ,EAAI,EAAGA,EAAIG,EAAK,EAAEH,EAAG,CAE1B,MAAMK,EAAQH,EAAMX,EAAIS,CAAC,CAAC,EAC1B,GAAIK,IAAU,OACV,MAAM,IAAI,YAAY,qBAAqB,EAG/CZ,EAAUA,GAAUG,EAAeS,EACnCN,GAAQH,EAEJG,GAAQ,IACRA,GAAQ,EACRf,EAAMoB,GAAS,EAAI,IAAQX,GAAUM,EAE7C,CAEA,GAAIA,GAAQH,GAAgB,IAAQH,GAAW,EAAIM,EAC/C,MAAM,IAAI,YAAY,wBAAwB,EAElD,OAAOf,CACX,CACJ,ECpDasB,GAAiBf,GACnB,WAAW,WAAWA,EAAK,CAAE,SAAU,YAAa,kBAAmB,QAAS,EAE9EgB,GAAevB,GACjBA,EAAM,SAAS,CAAE,SAAU,YAAa,YAAa,GAAM,ECnBhEwB,EAAoB,mEAUbF,GAA8BL,GAAoBO,EAAmB,EAAG,EAAK,EAC7ED,GAA4Bb,GAAoBc,EAAmB,EAAG,EAAK,ECXlFC,EAAqB,eAAgB,WAU9BH,GAAiBG,EAA6CC,GAAxBC,GACtCJ,EAAeE,EAA2CG,GAAtBC,GCVpCC,EAAQ,OAAO,UAAc,IAAc,UAAU,MAAQ,OAC7DC,EAAiB,MAAOC,GAAU,CAC3C,MAAMhC,EAAQM,EAAW0B,CAAK,EACxBC,EAAS,MAAMzB,GAASR,CAAK,EACnC,OAAOuB,EAAYU,CAAM,CAC7B,EACaC,GAAe,SAAY,CACpC,MAAMC,EAAWtC,EAAO,EAAE,EAC1B,MAAO,CACH,SAAUsC,EACV,UAAW,MAAMJ,EAAeI,CAAQ,EACxC,OAAQ,MAChB,CACA,ECfMC,GAASC,GAAQ,CACnB,GAAIA,GAAO,KAAM,CACb,MAAMC,EAAS,KAAK,MAAMD,CAAG,EAC7B,GAAIC,GAAU,KACV,OAAOA,CAEf,CACA,MAAO,CAAA,CACX,EACaC,GAAsB,CAAC,CAAE,KAAAC,KAAW,CAC7C,MAAMC,EAAa,IAAI,gBACjBC,EAASD,EAAW,OACpBE,EAAc,CAACC,EAASC,EAAWC,EAAmB,KAAU,CAClE,IAAIC,EACJ,MAAMC,EAAa,GAAGR,CAAI,IAAII,CAAO,GAC/BK,EAAU,IAAMF,GAAS,aAAa,QAAQC,EAAY,KAAK,UAAUD,CAAK,CAAC,EAC/EG,EAAO,IAAM,CACf,GAAIR,EAAO,QACP,MAAM,IAAI,MAAM,cAAc,EAElC,OAAQK,MAAUX,GAAM,aAAa,QAAQY,CAAU,CAAC,EAC5D,EACA,CACI,MAAMG,EAAYC,GAAO,CACjBA,EAAG,MAAQJ,IACXD,EAAQ,OAEhB,EACA,WAAW,iBAAiB,UAAWI,EAAU,CAAE,OAAAT,CAAM,CAAE,CAC/D,CACA,CACI,MAAMW,EAAU,MAAOC,GAAS,CAK5B,GAJI,CAACA,GAAQZ,EAAO,UAGpB,MAAM,IAAI,QAASa,GAAY,WAAWA,EAAS,GAAM,CAAC,EACtDb,EAAO,SACP,OAEJ,IAAIc,EAAM,KAAK,IAAG,EACdC,EAAU,GACdP,EAAI,EACJ,UAAWQ,KAAOX,EAAO,CAErB,MAAMF,EADOE,EAAMW,CAAG,EACC,UACnBb,IAAc,MAAQW,EAAMX,IAC5BY,EAAU,GACV,OAAOV,EAAMW,CAAG,EAExB,CACID,GACAR,EAAO,CAEf,EACInB,EACAA,EAAM,QAAQ,GAAGkB,CAAU,WAAY,CAAE,YAAa,EAAI,EAAIK,CAAO,EAGrEA,EAAQ,EAAI,CAEpB,CACA,MAAO,CACH,IAAIK,EAAK,CACLR,EAAI,EACJ,MAAMS,EAAOZ,EAAMW,CAAG,EACtB,GAAI,CAACC,EACD,OAEJ,MAAMd,EAAYc,EAAK,UACvB,GAAId,IAAc,MAAQ,KAAK,IAAG,EAAKA,EAAW,CAC9C,OAAOE,EAAMW,CAAG,EAChBT,EAAO,EACP,MACJ,CACA,OAAOU,EAAK,KAChB,EACA,cAAcD,EAAK,CACfR,EAAI,EACJ,MAAMS,EAAOZ,EAAMW,CAAG,EAChBF,EAAM,KAAK,IAAG,EACpB,GAAI,CAACG,EACD,MAAO,CAAC,OAAW,GAAQ,EAE/B,MAAMC,EAAYD,EAAK,UACvB,OAAIC,IAAc,OACP,CAACD,EAAK,MAAO,GAAQ,EAEzB,CAACA,EAAK,MAAOH,EAAMI,CAAS,CACvC,EACA,IAAIF,EAAKrC,EAAO,CACZ6B,EAAI,EACJ,MAAMS,EAAO,CACT,MAAOtC,EACP,UAAWwB,EAAUxB,CAAK,EAC1B,UAAWyB,EAAmB,KAAK,IAAG,EAAK,MAC/D,EACgBC,EAAMW,CAAG,EAAIC,EACbV,EAAO,CACX,EACA,OAAOS,EAAK,CACRR,EAAI,EACAH,EAAMW,CAAG,IAAM,SACf,OAAOX,EAAMW,CAAG,EAChBT,EAAO,EAEf,EACA,MAAO,CACH,OAAAC,EAAI,EACG,OAAO,KAAKH,CAAK,CAC5B,CACZ,CACI,EACA,MAAO,CACH,QAAS,IAAM,CACXN,EAAW,MAAK,CACpB,EACA,SAAUE,EAAY,WAAY,CAAC,CAAE,MAAAkB,CAAK,IAClCA,EAAM,QACC,KAEJA,EAAM,YAAc,IAC9B,EACD,OAAQlB,EAAY,SAAWmB,GAAU,KAAK,MAAQ,GAAK,GAAK,GAAK,EAIrE,WAAYnB,EAAY,aAAemB,GAAU,KAAK,IAAG,EAAK,GAAK,GAAK,GAAK,IAAO,EAAI,EACxF,aAAc,IAAI,GAC1B,CACA,ECjIO,IAAIC,EACAC,EACAC,EACC,MAACC,GAAkBC,GAAY,EACtC,CAAE,UAAWJ,EAAW,aAAcC,CAAY,EAAKG,EAAQ,UAChEF,EAAW1B,GAAoB,CAAE,KAAM4B,EAAQ,aAAe,eAAgB,CAClF,ECPO,MAAMC,UAAmB,KAAM,CAA/B,kCACHC,EAAA,YAAO,cACX,CACO,MAAMC,WAA2B,KAAM,CAAvC,kCACHD,EAAA,YAAO,sBACX,CACO,MAAME,UAAsB,KAAM,CAAlC,kCACHF,EAAA,YAAO,iBACX,CACO,MAAMG,UAA0B,KAAM,CAGzC,YAAYC,EAAKC,EAASP,EAAS,CAC/B,MAAMO,EAASP,CAAO,EAH1BE,EAAA,YACAA,EAAA,YAAO,qBAGH,KAAK,IAAMI,CACf,CACJ,CACO,MAAME,UAA2B,KAAM,CAM1C,YAAYC,EAAUC,EAAM,CVvBzB,IAAAC,EAAAC,EUwBC,MAAMC,EAAQC,GAASH,EAAAI,EAASL,CAAI,IAAb,YAAAC,EAAiB,KAAQ,EAC1CK,EAAmBF,GAASF,EAAAG,EAASL,CAAI,IAAb,YAAAE,EAAiB,iBAAoB,EACjEK,EAAeJ,EAAQ,IAAIA,CAAK,IAAM,UACtCK,EAAcF,EAAmB,KAAKA,CAAgB,GAAK,GAC3DT,EAAU,SAASU,CAAY,SAASC,CAAW,GACzD,MAAMX,CAAO,EAXjBL,EAAA,iBACAA,EAAA,aACAA,EAAA,YAAO,sBACPA,EAAA,cACAA,EAAA,oBAQI,KAAK,SAAWO,EAChB,KAAK,KAAOC,EACZ,KAAK,MAAQG,EACb,KAAK,YAAcG,CACvB,CACA,IAAI,QAAS,CACT,OAAO,KAAK,SAAS,MACzB,CACA,IAAI,SAAU,CACV,OAAO,KAAK,SAAS,OACzB,CACJ,CACO,MAAMG,WAA2B,KAAM,CAI1C,YAAYV,EAAUW,EAAQb,EAAS,CACnC,MAAMA,CAAO,EAJjBL,EAAA,iBACAA,EAAA,eACAA,EAAA,YAAO,sBAGH,KAAK,SAAWO,EAChB,KAAK,OAASW,CAClB,CACJ,CACA,MAAMN,EAAYO,GACP,OAAOA,GAAM,SAAWA,EAAI,OAEjCN,EAAYM,GACP,OAAOA,GAAM,UAAYA,IAAM,MAAQ,CAAC,MAAM,QAAQA,CAAC,EAAIA,EAAI,OCxDpEC,GAAS,qDAEFC,GAAS1D,GACX,OAAOA,GAAU,UAAYA,EAAM,QAAU,GAAKA,EAAM,QAAU,MAAQyD,GAAO,KAAKzD,CAAK,ECDhG2D,GAAsB,UAAW,IAC1BC,GAA4B5D,GAAU,CAC/C,IAAI6D,EAAM,KACV,GAAIF,GACAE,EAAM,IAAI,MAAM7D,CAAK,MAGrB,IAAI,CACA6D,EAAM,IAAI,IAAI7D,CAAK,CACvB,MACM,CAAE,CAEZ,OAAQ6D,IAAQ,OACXA,EAAI,WAAa,UAAYA,EAAI,WAAa,UAC/CA,EAAI,WAAa,KACjBA,EAAI,SAAW,IACfA,EAAI,OAAS,EACrB,EA2CaC,GAA4B,CAACC,EAAKC,IAAc,CACzD,MAAMC,EAAWF,EAAI,QACrB,GAAKE,EAGL,QAASC,EAAM,EAAGC,EAAMF,EAAS,OAAQC,EAAMC,EAAKD,IAAO,CACvD,KAAM,CAAE,GAAAnG,EAAI,KAAAqG,EAAM,gBAAAC,CAAe,EAAKJ,EAASC,CAAG,EAClD,GAAI,EAAAnG,IAAOiG,EAAU,IAAMjG,IAAOgG,EAAI,GAAKC,EAAU,IAGrD,IAAIA,EAAU,OAAS,QACnB,GAAI,MAAM,QAAQI,CAAI,GAClB,GAAI,CAACA,EAAK,SAASJ,EAAU,IAAI,EAC7B,iBAIAI,IAASJ,EAAU,KACnB,SAIZ,GAAI,SAAOK,GAAoB,UAAY,CAACT,GAAyBS,CAAe,GAGpF,OAAOA,EACX,CACJ,EACaC,GAAkBP,GACpBD,GAA0BC,EAAK,CAClC,GAAI,eACJ,KAAM,2BACd,CAAK,EC9FQQ,GAAsB,8BCAtBC,EAAsBC,GAAY,CdAxC,IAAA3B,EcCH,OAAOA,EAAA2B,EAAQ,IAAI,cAAc,IAA1B,YAAA3B,EAA6B,MAAM,KAAK,EACnD,ECFMa,GAAsB,UAAW,IAC1Be,GAAcC,GAAc,CACrC,IAAId,EAAM,KACV,GAAIF,GACAE,EAAM,IAAI,MAAMc,CAAS,MAGzB,IAAI,CACAd,EAAM,IAAI,IAAIc,CAAS,CAC3B,MACM,CAAE,CAEZ,OAAId,IAAQ,KACDA,EAAI,WAAa,UAAYA,EAAI,WAAa,QAElD,EACX,ECVMe,GAAa,0DAONC,GAAgB,MAAOC,GAAW,CAC3C,MAAMjB,EAAMU,GAAsB,mDAAwDO,CAAM,GAC1FlC,EAAW,MAAM,MAAMiB,CAAG,EAChC,GAAIjB,EAAS,SAAW,IACpB,MAAM,IAAIL,EAAc,yBAAyB,EAEhD,GAAI,CAACK,EAAS,GACf,MAAM,IAAIL,EAAc,0BAA0B,EAGtD,OADc,MAAMK,EAAS,QACjB,GAChB,EAMamC,GAAiB,MAAOC,GAAQ,CACzC,MAAMC,EAAcD,EAAI,QAAQ,IAAK,CAAC,EAChCZ,EAAOY,EAAI,MAAM,EAAGC,CAAW,EAC/BC,EAAQF,EAAI,MAAMC,EAAc,CAAC,EAEvC,IAAIlB,EACJ,GAAIK,IAAS,MAAO,CAChB,MAAMxB,EAAW,MAAM,MAAM,yBAAyBoC,CAAG,EAAE,EAC3D,GAAIpC,EAAS,SAAW,IACpB,MAAM,IAAIL,EAAc,4BAA4B,EAEnD,GAAI,CAACK,EAAS,GACf,MAAM,IAAIL,EAAc,0BAA0B,EAGtDwB,EADa,MAAMnB,EAAS,KAAI,CAEpC,SACSwB,IAAS,MAAO,CACrB,GAAI,CAACQ,GAAW,KAAKM,CAAK,EACtB,MAAM,IAAI3C,EAAc,oBAAoB,EAEhD,MAAMK,EAAW,MAAM,MAAM,WAAWsC,CAAK,uBAAuB,EACpE,GAAI,CAACtC,EAAS,GACV,MAAM,IAAIL,EAAc,6BAA6B,EAGzDwB,EADa,MAAMnB,EAAS,KAAI,CAEpC,KAEI,OAAM,IAAIL,EAAc,wBAAwB,EAEpD,OAAOwB,CACX,EAMaoB,GAA+B,MAAOC,GAAS,CACxD,MAAMvB,EAAM,IAAI,IAAI,wCAAyCuB,CAAI,EAC3DxC,EAAW,MAAM,MAAMiB,EAAK,CAC9B,SAAU,SACV,QAAS,CACL,OAAQ,kBACpB,CACA,CAAK,EACD,GAAIjB,EAAS,SAAW,KAAO4B,EAAmB5B,EAAS,OAAO,IAAM,mBACpE,MAAM,IAAIL,EAAc,qBAAqB,EAEjD,MAAM8C,EAAY,MAAMzC,EAAS,OACjC,GAAIyC,EAAS,WAAaxB,EAAI,OAC1B,MAAM,IAAItB,EAAc,mBAAmB,EAE/C,OAAO8C,CACX,EAMaC,GAAiC,MAAOF,GAAS,CAC1D,MAAMvB,EAAM,IAAI,IAAI,0CAA2CuB,CAAI,EAC7DxC,EAAW,MAAM,MAAMiB,EAAK,CAC9B,SAAU,SACV,QAAS,CACL,OAAQ,kBACpB,CACA,CAAK,EACD,GAAIjB,EAAS,SAAW,KAAO4B,EAAmB5B,EAAS,OAAO,IAAM,mBACpE,MAAM,IAAIL,EAAc,qBAAqB,EAEjD,MAAM8C,EAAY,MAAMzC,EAAS,OACjC,GAAIyC,EAAS,SAAWxB,EAAI,OACxB,MAAM,IAAItB,EAAc,mBAAmB,EAE/C,GAAI,CAACmC,GAAWW,EAAS,sBAAsB,EAC3C,MAAM,IAAI9C,EAAc,gEAAgE,EAE5F,GAAI,CAAC8C,EAAS,sCACV,MAAM,IAAI9C,EAAc,qEAAqE,EAEjG,GAAI,CAAC8C,EAAS,sCACV,MAAM,IAAI9C,EAAc,sEAAsE,EAElG,GAAI8C,EAAS,0BACL,CAACA,EAAS,yBAAyB,SAAS,MAAM,EAClD,MAAM,IAAI9C,EAAc,4DAA4D,EAG5F,OAAO8C,CACX,EAMaE,GAAsB,MAAOL,GAAU,CAChD,IAAIF,EACAtB,GAAMwB,CAAK,EACXF,EAAME,EAINF,EADiB,MAAMH,GAAcK,CAAK,EAG9C,MAAMnB,EAAM,MAAMgB,GAAeC,CAAG,EAC9BQ,EAAMlB,GAAeP,CAAG,EAC9B,GAAI,CAACyB,EACD,MAAM,IAAIjD,EAAc,sBAAsB,EAElD,MAAO,CACH,SAAU,CACN,GAAIyC,EACJ,IAAKE,EACL,IAAK,IAAI,IAAIM,CAAG,CAC5B,EACQ,SAAU,MAAMC,GAA8BD,CAAG,CACzD,CACA,EA2BaC,GAAgC,MAAOzF,GAAU,ChB/KvD,IAAA8C,EgBgLH,MAAM4C,EAAc,MAAMP,GAA6BnF,CAAK,EAC5D,KAAI8C,EAAA4C,EAAY,wBAAZ,YAAA5C,EAAmC,UAAW,EAC9C,MAAM,IAAIP,EAAc,0DAA0D,EAEtF,MAAMoD,EAASD,EAAY,sBAAsB,CAAC,EAC5CE,EAAc,MAAMN,GAA+BK,CAAM,EAC/D,GAAIC,EAAY,qBACR,CAACA,EAAY,oBAAoB,SAASF,EAAY,QAAQ,EAC9D,MAAM,IAAInD,EAAc,sDAAsD,EAGtF,OAAOqD,CACX,ECtLMC,EAAY,CAAE,KAAM,QAAS,WAAY,OAAO,EACzCC,GAAiB,SAAY,CACtC,MAAMC,EAAO,MAAM,OAAO,OAAO,YAAYF,EAAW,GAAM,CAAC,OAAQ,QAAQ,CAAC,EAC1EnE,EAAM,MAAM,OAAO,OAAO,UAAU,QAASqE,EAAK,UAAU,EAC5D,CAAE,IAAKC,EAAM,QAASC,EAAW,GAAGC,CAAG,EAAK,MAAM,OAAO,OAAO,UAAU,MAAOH,EAAK,SAAS,EACrG,MAAO,CACH,IAAK,QACL,IAAKxG,EAAY,IAAI,WAAWmC,CAAG,CAAC,EACpC,IAAKnC,EAAYjB,EAAW,KAAK,UAAU,CAAE,IAAK,WAAY,IAAK,QAAS,IAAK4H,CAAG,CAAE,CAAC,CAAC,CAChG,CACA,EACaC,GAAqBC,GAAY,CAC1C,MAAMC,EAAeD,EAAQ,IACvBE,EAAa,OAAO,OAAO,UAAU,QAAShH,GAAc8G,EAAQ,GAAG,EAAGP,EAAW,GAAM,CAAC,MAAM,CAAC,EACnGU,EAAmB,CAACC,EAAKC,EAAKC,EAAOC,IAAQ,CAC/C,MAAMC,EAAU,CACZ,IAAKD,EACL,IAAKH,EACL,IAAKC,EACL,IAAK,KAAK,MAAM,KAAK,IAAG,EAAK,GAAK,EAClC,IAAK5I,EAAO,EAAE,EACd,MAAO6I,CACnB,EACQ,OAAOnH,EAAYjB,EAAW,KAAK,UAAUsI,CAAO,CAAC,CAAC,CAC1D,EACA,MAAO,OAAOC,EAAQJ,EAAKC,EAAOC,IAAQ,CACtC,MAAMG,EAAgBP,EAAiBM,EAAQJ,EAAKC,EAAOC,CAAG,EACxDI,EAAS,MAAM,OAAO,OAAO,KAAK,CAAE,KAAM,QAAS,KAAM,CAAE,KAAM,SAAS,CAAE,EAAI,MAAMT,EAAYhI,EAAW+H,EAAe,IAAMS,CAAa,CAAC,EAChJE,EAAkBzH,EAAY,IAAI,WAAWwH,CAAM,CAAC,EAC1D,OAAOV,EAAe,IAAMS,EAAgB,IAAME,CACtD,CACJ,EACaC,GAAkB,CAACb,EAASc,IAAiB,CACtD,MAAMC,EAASlF,EAAS,WAClBmF,EAAUnF,EAAS,aACnBoF,EAAOlB,GAAkBC,CAAO,EACtC,MAAO,OAAOpG,EAAOsH,IAAS,CAC1B,MAAMC,EAAU,IAAI,QAAQvH,EAAOsH,CAAI,EACjCE,EAAsBD,EAAQ,QAAQ,IAAI,eAAe,EACzDZ,EAAMa,GAAA,MAAAA,EAAqB,WAAW,SACtC,MAAMzH,EAAeyH,EAAoB,MAAM,CAAC,CAAC,EACjD,OACA,CAAE,OAAAX,EAAQ,IAAAhD,CAAG,EAAK0D,EAClB,CAAE,OAAAE,EAAQ,SAAAC,CAAQ,EAAK,IAAI,IAAI7D,CAAG,EAClC4C,EAAMgB,EAASC,EAIrB,IAAIC,EAAWP,EAAQ,IAAIK,CAAM,EAC7BE,IACA,MAAMA,EAAS,QACfA,EAAW,QAGf,IAAIC,EACAC,EAAmB,GACvB,GAAI,CACA,KAAM,CAACnB,EAAOoB,CAAM,EAAIX,EAAO,cAAcM,CAAM,EACnDG,EAAYlB,EAeZmB,EAAmBC,EAAS,EAAI,GAAK,GACzC,MACM,CAEN,CACID,GAEAT,EAAQ,IAAIK,EAASE,EAAW,QAAQ,cAAa,CAAE,EAE3D,IAAII,EACJ,GAAI,CACA,MAAMC,EAAY,MAAMX,EAAKR,EAAQJ,EAAKmB,EAAWjB,CAAG,EACxDY,EAAQ,QAAQ,IAAI,OAAQS,CAAS,EACrC,MAAMC,EAAe,MAAM,MAAMV,CAAO,EAExC,GADAQ,EAAYE,EAAa,QAAQ,IAAI,YAAY,EAC7CF,IAAc,MAAQA,IAAcH,EAGpC,OAAOK,EAGX,GAAI,CACAd,EAAO,IAAIM,EAAQM,CAAS,CAChC,MACM,CAEN,CAMA,GAJI,CADgB,MAAMG,GAAoBD,EAAcf,CAAY,GAKpElH,IAAUuH,IAAWD,GAAA,YAAAA,EAAM,gBAAgB,eAK3C,OAAOW,CAEf,QACR,CAEgBN,IACAP,EAAQ,OAAOK,CAAM,EACrBE,EAAS,QAAO,EAExB,CAGA,CACI,MAAMQ,EAAY,MAAMd,EAAKR,EAAQJ,EAAKsB,EAAWpB,CAAG,EAClDyB,EAAc,IAAI,QAAQpI,EAAOsH,CAAI,EAC3Cc,EAAY,QAAQ,IAAI,OAAQD,CAAS,EACzC,MAAME,EAAgB,MAAM,MAAMD,CAAW,EAEvCE,EAAaD,EAAc,QAAQ,IAAI,YAAY,EACzD,GAAIC,IAAe,MAAQA,IAAeP,EACtC,GAAI,CACAZ,EAAO,IAAIM,EAAQa,CAAU,CACjC,MACM,CAEN,CAEJ,OAAOD,CACX,CACJ,CACJ,EACMH,GAAsB,MAAOtF,EAAUsE,IAAiB,CAG1D,IAAIA,IAAiB,QAAaA,IAAiB,KAC3CtE,EAAS,SAAW,IAAK,CACzB,MAAM2F,EAAU3F,EAAS,QAAQ,IAAI,kBAAkB,EACvD,GAAI2F,GAAA,MAAAA,EAAS,WAAW,QACpB,OAAOA,EAAQ,SAAS,wBAAwB,CAExD,CAGJ,IAAIrB,IAAiB,QAAaA,IAAiB,KAC3CtE,EAAS,SAAW,KAAO4B,EAAmB5B,EAAS,OAAO,IAAM,mBACpE,GAAI,CACA,MAAM4F,EAAO,MAAM5F,EAAS,MAAK,EAAG,KAAI,EACxC,OAAO,OAAO4F,GAAS,WAAYA,GAAA,YAAAA,EAAO,SAAa,gBAC3D,MACM,CAEF,MAAO,EACX,CAGR,MAAO,EACX,EC5KaC,GAAO,CAACC,EAAKC,IAAS,CAC/B,MAAMC,EAAS,CAAA,EACf,QAAS1E,EAAM,EAAGC,EAAMwE,EAAK,OAAQzE,EAAMC,EAAKD,IAAO,CACnD,MAAMxC,EAAMiH,EAAKzE,CAAG,EAEpB0E,EAAOlH,CAAG,EAAIgH,EAAIhH,CAAG,CACzB,CACA,OAAOkH,CACX,ElBRO,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GmBMA,MAAMC,CAAiB,CAG1B,YAAY7D,EAAUe,EAAS,CAH5B+C,EAAA,KAAAJ,GACHI,EAAA,KAAAN,GACAM,EAAA,KAAAL,GAEIM,EAAA,KAAKN,EAAYzD,GACjB+D,EAAA,KAAKP,EAAS5B,GAAgBb,EAAS,EAAI,EAC/C,CACA,MAAM,QAAQiD,EAAUzC,EAAS,CAC7B,MAAM/C,EAAMyF,EAAA,KAAKR,GAAU,GAAGO,CAAQ,WAAW,EACjD,GAAI,CAACxF,EACD,MAAM,IAAI,MAAM,mBAAmBwF,CAAQ,EAAE,EAEjD,MAAMzG,EAAW,MAAM0G,EAAA,KAAKT,GAAL,UAAYhF,EAAK,CACpC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAkB,EAC7C,KAAM,KAAK,UAAU,CAAE,GAAG+C,EAAS,UAAW7E,EAAW,CACrE,GACQ,GAAIyC,EAAmB5B,EAAS,OAAO,IAAM,mBACzC,MAAM,IAAIU,GAAmBV,EAAU,EAAG,yBAAyB,EAEvE,MAAM4F,EAAO,MAAM5F,EAAS,KAAI,EAChC,GAAIA,EAAS,GACT,OAAO4F,EAGP,MAAM,IAAI7F,EAAmBC,EAAU4F,CAAI,CAEnD,CACA,MAAM,OAAO3G,EAAO,CAChB,GAAI,CACA,MAAM,KAAK,QAAQ,aAAc,CAAE,MAAOA,CAAK,CAAE,CACrD,MACM,CAAE,CACZ,CACA,MAAM,aAAa0H,EAAMpJ,EAAU,CAC/B,MAAMyC,EAAW,MAAM,KAAK,QAAQ,QAAS,CACzC,WAAY,qBACZ,aAAcZ,EACd,KAAMuH,EACN,cAAepJ,CAC3B,CAAS,EACD,GAAI,CACA,OAAO,MAAMqJ,EAAA,KAAKT,EAAAE,IAAL,UAA8BrG,EAC/C,OACO6G,EAAK,CACR,YAAM,KAAK,OAAO7G,EAAS,YAAY,EACjC6G,CACV,CACJ,CACA,MAAM,QAAQ,CAAE,IAAAhH,EAAK,MAAAZ,GAAS,CAC1B,GAAI,CAACA,EAAM,QACP,MAAM,IAAIW,EAAkBC,EAAK,4BAA4B,EAEjE,MAAMG,EAAW,MAAM,KAAK,QAAQ,QAAS,CACzC,WAAY,gBACZ,cAAef,EAAM,OACjC,CAAS,EACD,GAAI,CACA,GAAIY,IAAQG,EAAS,IACjB,MAAM,IAAIJ,EAAkBC,EAAK,uCAAuCG,EAAS,GAAG,EAAE,EAE1F,OAAO4G,EAAA,KAAKT,EAAAC,GAAL,UAA2BpG,EACtC,OACO6G,EAAK,CACR,YAAM,KAAK,OAAO7G,EAAS,YAAY,EACjC6G,CACV,CACJ,CA6CJ,CA/GIZ,EAAA,YACAC,EAAA,YAFGC,EAAA,YAoEHC,EAAqB,SAACU,EAAK,CACvB,GAAI,CAACA,EAAI,IACL,MAAM,IAAI,UAAU,qCAAqC,EAE7D,GAAI,CAACA,EAAI,MACL,MAAM,IAAI,UAAU,uCAAuC,EAE/D,GAAIA,EAAI,aAAe,OACnB,MAAM,IAAI,UAAU,0CAA0C,EAElE,MAAO,CACH,MAAOA,EAAI,MACX,QAASA,EAAI,cACb,OAAQA,EAAI,aACZ,KAAMA,EAAI,WACV,WAAY,OAAOA,EAAI,YAAe,SAAW,KAAK,IAAG,EAAKA,EAAI,WAAa,IAAQ,MACnG,CACI,EACMT,GAAwB,eAACS,EAAK,CAChC,MAAMjH,EAAMiH,EAAI,IAChB,GAAI,CAACjH,EACD,MAAM,IAAI,UAAU,qCAAqC,EAE7D,MAAMZ,EAAQ2H,EAAA,KAAKT,EAAAC,GAAL,UAA2BU,GACnCC,EAAW,MAAMpE,GAAoB9C,CAAG,EAC9C,GAAIkH,EAAS,SAAS,SAAWL,EAAA,KAAKR,GAAU,OAC5C,MAAM,IAAI,UAAU,wBAAwBa,EAAS,SAAS,MAAM,EAAE,EAE1E,MAAO,CACH,MAAO9H,EACP,KAAM,CACF,IAAKY,EACL,IAAKkH,EAAS,SAAS,IAAI,KAC3B,OAAQlB,GAAKkB,EAAS,SAAU,CAC5B,SACA,yBACA,yBACA,wCACA,sBACA,gBACpB,CAAiB,CACjB,CACA,CACI,ECjHJ,MAAMvC,EAAU,IAAI,IACPwC,GAAa,MAAOnH,EAAKN,IAAY,CpBL3C,IAAAW,EAAAC,GoBMHD,EAAAX,GAAA,YAAAA,EAAS,SAAT,MAAAW,EAAiB,iBACjB,IAAI+G,EAAcC,GACd3H,GAAA,MAAAA,EAAS,QACT0H,EAAcE,GAET5H,GAAA,MAAAA,EAAS,aACd0H,EAAcG,IAQlB,IAAIC,EACJ,KAAQA,EAAwB7C,EAAQ,IAAI3E,CAAG,GAAI,CAC/C,GAAI,CACA,KAAM,CAAE,QAAAyH,EAAS,MAAA7K,CAAK,EAAK,MAAM4K,EACjC,GAAIC,GAAWL,EAAYxK,CAAK,EAC5B,OAAOA,CAEf,MACM,CAGN,EACA0D,EAAAZ,GAAA,YAAAA,EAAS,SAAT,MAAAY,EAAiB,gBACrB,CACA,MAAMoH,EAAM,SAAY,CACpB,MAAMC,EAAgBnI,EAAS,SAAS,IAAIQ,CAAG,EAC/C,GAAI2H,GAAiBP,EAAYO,CAAa,EAK1C,MAAO,CAAE,QAAS,GAAO,MAAOA,CAAa,EAEjD,MAAMC,EAAa,MAAMC,GAAa7H,EAAK2H,CAAa,EACxD,aAAMG,GAAa9H,EAAK4H,CAAU,EAC3B,CAAE,QAAS,GAAM,MAAOA,CAAU,CAC7C,EACA,IAAIG,EAQJ,GAPI1K,EACA0K,EAAU1K,EAAM,QAAQ,gBAAgB2C,CAAG,GAAI0H,CAAG,EAGlDK,EAAUL,EAAG,EAEjBK,EAAUA,EAAQ,QAAQ,IAAMpD,EAAQ,OAAO3E,CAAG,CAAC,EAC/C2E,EAAQ,IAAI3E,CAAG,EAKf,MAAM,IAAI,MAAM,qCAAqC,EAEzD2E,EAAQ,IAAI3E,EAAK+H,CAAO,EACxB,KAAM,CAAE,MAAAnL,CAAK,EAAK,MAAMmL,EACxB,OAAOnL,CACX,EACakL,GAAe,MAAO9H,EAAK4H,IAAe,CACnD,GAAI,CACApI,EAAS,SAAS,IAAIQ,EAAK4H,CAAU,CACzC,OACOZ,EAAK,CACR,YAAMgB,GAAeJ,CAAU,EACzBZ,CACV,CACJ,EACaiB,GAAuBjI,GAAQ,CACxCR,EAAS,SAAS,OAAOQ,CAAG,CAChC,EAIMuH,GAAa,IAAM,GACnBD,GAAc,IAAM,GACpBO,GAAe,MAAO7H,EAAK2H,IAAkB,CAC/C,GAAIA,IAAkB,OAClB,MAAM,IAAI5H,EAAkBC,EAAK,gCAAgC,EAErE,KAAM,CAAE,QAAA2D,EAAS,KAAAuE,EAAM,MAAA9I,CAAK,EAAKuI,EAC3BQ,EAAS,IAAI1B,EAAiByB,EAAK,OAAQvE,CAAO,EACxD,GAAI,CACA,MAAMyE,EAAW,MAAMD,EAAO,QAAQ,CAAE,IAAKD,EAAK,IAAK,MAAA9I,EAAO,EAC9D,MAAO,CAAE,QAAAuE,EAAS,KAAAuE,EAAM,MAAOE,CAAQ,CAC3C,OACOC,EAAO,CACV,MAAIA,aAAiBnI,GAAsBmI,EAAM,SAAW,KAAOA,EAAM,QAAU,gBACzE,IAAItI,EAAkBC,EAAK,sBAAuB,CAAE,MAAAqI,EAAO,EAE/DA,CACV,CACJ,EACML,GAAiB,MAAO,CAAE,QAAArE,EAAS,KAAAuE,EAAM,MAAA9I,CAAK,IAAO,CAGvD,MADe,IAAIqH,EAAiByB,EAAK,OAAQvE,CAAO,EAC3C,OAAOvE,EAAM,SAAWA,EAAM,MAAM,CACrD,EACMiI,GAAgB,CAAC,CAAE,MAAAjI,KAAY,CACjC,MAAMkJ,EAAUlJ,EAAM,WACtB,OAAOkJ,GAAW,MAAQ,KAAK,IAAG,EAAK,KAAUA,CACrD,EChGaC,GAAyB,MAAO,CAAE,SAAA3F,EAAU,SAAA4F,EAAU,MAAAC,CAAK,IAAQ,CAC5E,MAAMC,EAAQtN,EAAO,EAAE,EACjBuN,EAAO,MAAMlL,GAAY,EACzBkG,EAAU,MAAMN,GAAc,EAC9BuF,EAAS,CACX,aAAcrJ,EACd,eAAgBoJ,EAAK,UACrB,sBAAuBA,EAAK,OAC5B,MAAOD,EACP,WAAYF,GAAA,YAAAA,EAAU,IACtB,cAAe,WACf,cAAe,OACf,QAAS,OAIT,MAAOC,CAEf,EACIjJ,EAAS,OAAO,IAAIkJ,EAAO,CACvB,QAAS/E,EACT,SAAUf,EACV,SAAU+F,EAAK,QACvB,CAAK,EAED,MAAMxI,EAAW,MADF,IAAIsG,EAAiB7D,EAAUe,CAAO,EACvB,QAAQ,+BAAgCiF,CAAM,EACtEC,EAAU,IAAI,IAAIjG,EAAS,sBAAsB,EACvD,OAAAiG,EAAQ,aAAa,IAAI,YAAavJ,CAAS,EAC/CuJ,EAAQ,aAAa,IAAI,cAAe1I,EAAS,WAAW,EACrD0I,CACX,EAMaC,GAAwB,MAAOF,GAAW,CACnD,MAAM1F,EAAS0F,EAAO,IAAI,KAAK,EACzBF,EAAQE,EAAO,IAAI,OAAO,EAC1B9B,EAAO8B,EAAO,IAAI,MAAM,EACxBrI,EAAQqI,EAAO,IAAI,OAAO,EAChC,GAAI,CAACF,GAAS,EAAE5B,GAAQvG,GACpB,MAAM,IAAIZ,EAAW,oBAAoB,EAE7C,MAAMoJ,EAASvJ,EAAS,OAAO,IAAIkJ,CAAK,EACxC,GAAIK,EAEAvJ,EAAS,OAAO,OAAOkJ,CAAK,MAG5B,OAAM,IAAI/I,EAAW,wBAAwB,EAEjD,MAAMgE,EAAUoF,EAAO,QACjBnG,EAAWmG,EAAO,SACxB,GAAIxI,EACA,MAAM,IAAIV,GAAmB+I,EAAO,IAAI,mBAAmB,GAAKrI,CAAK,EAEzE,GAAI,CAACuG,EACD,MAAM,IAAInH,EAAW,wBAAwB,EAEjD,GAAIuD,IAAW,KACX,MAAM,IAAIvD,EAAW,0BAA0B,EAE9C,GAAIuD,IAAWN,EAAS,OACzB,MAAM,IAAIjD,EAAW,iBAAiB,EAG1C,MAAMwI,EAAS,IAAI1B,EAAiB7D,EAAUe,CAAO,EAC/C,CAAE,KAAAuE,EAAM,MAAA9I,GAAU,MAAM+I,EAAO,aAAarB,EAAMiC,EAAO,QAAQ,EAEjE/I,EAAMkI,EAAK,IACXc,EAAU,CAAE,QAAArF,EAAS,KAAAuE,EAAM,MAAA9I,CAAK,EACtC,aAAM0I,GAAa9H,EAAKgJ,CAAO,EACxBA,CACX","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]}
-2
proxy/static/static/assets/modulepreload-polyfill-B384jI_7.js
··· 1 - var de=Object.defineProperty;var V=t=>{throw TypeError(t)};var he=(t,e,r)=>e in t?de(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>he(t,typeof e!="symbol"?e+"":e,r),H=(t,e,r)=>e.has(t)||V("Cannot "+r);var m=(t,e,r)=>(H(t,e,"read from private field"),r?r.call(t):e.get(t)),S=(t,e,r)=>e.has(t)?V("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),b=(t,e,r,n)=>(H(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),$=(t,e,r)=>(H(t,e,"access private method"),r);const pe="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let W=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=pe[r[t]&63];return e};const fe=new TextEncoder;new TextDecoder;const we=crypto.subtle,ge=t=>new Uint8Array(t),ye=ge,N=t=>fe.encode(t),me=async t=>new Uint8Array(await we.digest("SHA-256",t)),_e=(t,e,r)=>n=>{const s=(1<<e)-1;let o="",a=0,i=0;for(let c=0;c<n.length;++c)for(i=i<<8|n[c],a+=8;a>e;)a-=e,o+=t[s&i>>a];if(a!==0&&(o+=t[s&i<<e-a]),r)for(;o.length*e&7;)o+="=";return o},ve=(t,e,r)=>{const n={};for(let s=0;s<t.length;++s)n[t[s]]=s;return s=>{let o=s.length;for(;r&&s[o-1]==="=";)--o;const a=ye(o*e/8|0);let i=0,c=0,u=0;for(let l=0;l<o;++l){const h=n[s[l]];if(h===void 0)throw new SyntaxError("invalid base string");c=c<<e|h,i+=e,i>=8&&(i-=8,a[u++]=255&c>>i)}if(i>=e||255&c<<8-i)throw new SyntaxError("unexpected end of data");return a}},Ae=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),ke=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",Ee=ve(ee,6,!1),Se=_e(ee,6,!1),te="fromBase64"in Uint8Array,be=te?Ae:Ee,D=te?ke:Se,q=typeof navigator<"u"?navigator.locks:void 0,re=async t=>{const e=N(t),r=await me(e);return D(r)},Re=async()=>{const t=W(64);return{verifier:t,challenge:await re(t),method:"S256"}},Ue=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},xe=({name:t})=>{const e=new AbortController,r=e.signal,n=(s,o,a=!1)=>{let i;const c=`${t}:${s}`,u=()=>i&&localStorage.setItem(c,JSON.stringify(i)),l=()=>{if(r.aborted)throw new Error("store closed");return i??(i=Ue(localStorage.getItem(c)))};{const h=d=>{d.key===c&&(i=void 0)};globalThis.addEventListener("storage",h,{signal:r})}{const h=async d=>{if(!d||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let g=Date.now(),v=!1;l();for(const w in i){const x=i[w].expiresAt;x!==null&&g>x&&(v=!0,delete i[w])}v&&u()};q?q.request(`${c}:cleanup`,{ifAvailable:!0},h):h(!0)}return{get(h){l();const d=i[h];if(!d)return;const g=d.expiresAt;if(g!==null&&Date.now()>g){delete i[h],u();return}return d.value},getWithLapsed(h){l();const d=i[h],g=Date.now();if(!d)return[void 0,1/0];const v=d.updatedAt;return v===void 0?[d.value,1/0]:[d.value,g-v]},set(h,d){l();const g={value:d,expiresAt:o(d),updatedAt:a?Date.now():void 0};i[h]=g,u()},delete(h){l(),i[h]!==void 0&&(delete i[h],u())},keys(){return l(),Object.keys(i)}}};return{dispose:()=>{e.abort()},sessions:n("sessions",({token:s})=>s.refresh?null:s.expires_at??null),states:n("states",s=>Date.now()+10*60*1e3),dpopNonces:n("dpopNonces",s=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let J,Z,_;const se=t=>{({client_id:J,redirect_uri:Z}=t.metadata),_=xe({name:t.storageName??"atcute-oauth"})};class z extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class Oe extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class p extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class K extends Error{constructor(r,n,s){super(n,s);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=r}}class ne extends Error{constructor(r,n){var u,l;const s=G((u=Y(n))==null?void 0:u.error),o=G((l=Y(n))==null?void 0:l.error_description),a=s?`"${s}"`:"unknown",i=o?`: ${o}`:"",c=`OAuth ${a} error${i}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=r,this.data=n,this.error=s,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class ze extends Error{constructor(r,n,s){super(s);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=r,this.status=n}}const G=t=>typeof t=="string"?t:void 0,Y=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,De=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Le=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&De.test(t),je="parse"in URL,Pe=t=>{let e=null;if(je)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},$e=(t,e)=>{const r=t.service;if(r)for(let n=0,s=r.length;n<s;n++){const{id:o,type:a,serviceEndpoint:i}=r[n];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(a)){if(!a.includes(e.type))continue}else if(a!==e.type)continue}if(!(typeof i!="string"||!Pe(i)))return i}}},Te=t=>$e(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),Ie="https://public.api.bsky.app",F=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},Ne="parse"in URL,qe=t=>{let e=null;if(Ne)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},Ke=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Fe=async t=>{const e=Ie+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new p("domain handle not found");if(!r.ok)throw new p("directory is unreachable");return(await r.json()).did},Be=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),n=t.slice(e+1);let s;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new p("did not found in directory");if(!o.ok)throw new p("directory is unreachable");s=await o.json()}else if(r==="web"){if(!Ke.test(n))throw new p("invalid identifier");const o=await fetch(`https://${n}/.well-known/did.json`);if(!o.ok)throw new p("did document is unreachable");s=await o.json()}else throw new p("unsupported did method");return s},Ce=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||F(r.headers)!=="application/json")throw new p("unexpected response");const n=await r.json();if(n.resource!==e.origin)throw new p("unexpected issuer");return n},He=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||F(r.headers)!=="application/json")throw new p("unexpected response");const n=await r.json();if(n.issuer!==e.origin)throw new p("unexpected issuer");if(!qe(n.authorization_endpoint))throw new p("authorization server provided incorrect authorization endpoint");if(!n.client_id_metadata_document_supported)throw new p("authorization server does not support 'client_id_metadata_document'");if(!n.pushed_authorization_request_endpoint)throw new p("authorization server does not support 'pushed_authorization request'");if(n.response_types_supported&&!n.response_types_supported.includes("code"))throw new p("authorization server does not support 'code' response type");return n},oe=async t=>{let e;Le(t)?e=t:e=await Fe(t);const r=await Be(e),n=Te(r);if(!n)throw new p("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(n)},metadata:await Me(n)}},Me=async t=>{var s;const e=await Ce(t);if(((s=e.authorization_servers)==null?void 0:s.length)!==1)throw new p("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],n=await He(r);if(n.protected_resources&&!n.protected_resources.includes(e.resource))throw new p("server is not in authorization server's jurisdiction");return n},ae={name:"ECDSA",namedCurve:"P-256"},We=async()=>{const t=await crypto.subtle.generateKey(ae,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:n,...s}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:D(new Uint8Array(e)),jwt:D(N(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:s})))}},Je=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",be(t.key),ae,!0,["sign"]),n=(s,o,a,i)=>{const c={ath:i,htm:s,htu:o,iat:Math.floor(Date.now()/1e3),jti:W(24),nonce:a};return D(N(JSON.stringify(c)))};return async(s,o,a,i)=>{const c=n(s,o,a,i),u=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,N(e+"."+c)),l=D(new Uint8Array(u));return e+"."+c+"."+l}},ie=(t,e)=>{const r=_.dpopNonces,n=_.inflightDpop,s=Je(t);return async(o,a)=>{const i=new Request(o,a),c=i.headers.get("authorization"),u=c!=null&&c.startsWith("DPoP ")?await re(c.slice(5)):void 0,{method:l,url:h}=i,{origin:d,pathname:g}=new URL(h),v=d+g;let w=n.get(d);w&&(await w.promise,w=void 0);let P,x=!1;try{const[O,y]=r.getWithLapsed(d);P=O,x=y>3*60*1e3}catch{}x&&n.set(d,w=Promise.withResolvers());let E;try{const O=await s(l,v,P,u);i.headers.set("dpop",O);const y=await fetch(i);if(E=y.headers.get("dpop-nonce"),E===null||E===P)return y;try{r.set(d,E)}catch{}if(!await Ze(y,e)||o===i||(a==null?void 0:a.body)instanceof ReadableStream)return y}finally{w&&(n.delete(d),w.resolve())}{const O=await s(l,v,E,u),y=new Request(o,a);y.headers.set("dpop",O);const B=await fetch(y),C=B.headers.get("dpop-nonce");if(C!==null&&C!==E)try{r.set(d,C)}catch{}return B}}},Ze=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&F(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Ve=(t,e)=>{const r={};for(let n=0,s=e.length;n<s;n++){const o=e[n];r[o]=t[o]}return r};var L,R,k,M,ce;class j{constructor(e,r){S(this,k);S(this,L);S(this,R);b(this,R,e),b(this,L,ie(r,!0))}async request(e,r){const n=m(this,R)[`${e}_endpoint`];if(!n)throw new Error(`no endpoint for ${e}`);const s=await m(this,L).call(this,n,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:J})});if(F(s.headers)!=="application/json")throw new ze(s,2,"unexpected content-type");const o=await s.json();if(s.ok)return o;throw new ne(s,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const n=await this.request("token",{grant_type:"authorization_code",redirect_uri:Z,code:e,code_verifier:r});try{return await $(this,k,ce).call(this,n)}catch(s){throw await this.revoke(n.access_token),s}}async refresh({sub:e,token:r}){if(!r.refresh)throw new K(e,"no refresh token available");const n=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==n.sub)throw new K(e,`sub mismatch in token response; got ${n.sub}`);return $(this,k,M).call(this,n)}catch(s){throw await this.revoke(n.access_token),s}}}L=new WeakMap,R=new WeakMap,k=new WeakSet,M=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ce=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const n=$(this,k,M).call(this,e),s=await oe(r);if(s.metadata.issuer!==m(this,R).issuer)throw new TypeError(`issuer mismatch; got ${s.metadata.issuer}`);return{token:n,info:{sub:r,aud:s.identity.pds.href,server:Ve(s.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,Q=async(t,e)=>{var i,c;(i=e==null?void 0:e.signal)==null||i.throwIfAborted();let r=tt;e!=null&&e.noCache?r=Qe:e!=null&&e.allowStale&&(r=Ye);let n;for(;n=T.get(t);){try{const{isFresh:u,value:l}=await n;if(u||r(l))return l}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const s=async()=>{const u=_.sessions.get(t);if(u&&r(u))return{isFresh:!1,value:u};const l=await Xe(t,u);return await ue(t,l),{isFresh:!0,value:l}};let o;if(q?o=q.request(`atcute-oauth:${t}`,s):o=s(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:a}=await o;return a},ue=async(t,e)=>{try{_.sessions.set(t,e)}catch(r){throw await et(e),r}},Ge=t=>{_.sessions.delete(t)},Ye=()=>!0,Qe=()=>!1,Xe=async(t,e)=>{if(e===void 0)throw new K(t,"session deleted by another tab");const{dpopKey:r,info:n,token:s}=e,o=new j(n.server,r);try{const a=await o.refresh({sub:n.sub,token:s});return{dpopKey:r,info:n,token:a}}catch(a){throw a instanceof ne&&a.status===400&&a.error==="invalid_grant"?new K(t,"session was revoked",{cause:a}):a}},et=async({dpopKey:t,info:e,token:r})=>{await new j(e.server,t).revoke(r.refresh??r.access)},tt=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},rt=async({metadata:t,identity:e,scope:r})=>{const n=W(24),s=await Re(),o=await We(),a={redirect_uri:Z,code_challenge:s.challenge,code_challenge_method:s.method,state:n,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};_.states.set(n,{dpopKey:o,metadata:t,verifier:s.verifier});const c=await new j(t,o).request("pushed_authorization_request",a),u=new URL(t.authorization_endpoint);return u.searchParams.set("client_id",J),u.searchParams.set("request_uri",c.request_uri),u},le=async t=>{const e=t.get("iss"),r=t.get("state"),n=t.get("code"),s=t.get("error");if(!r||!(n||s))throw new z("missing parameters");const o=_.states.get(r);if(o)_.states.delete(r);else throw new z("unknown state provided");const a=o.dpopKey,i=o.metadata;if(s)throw new Oe(t.get("error_description")||s);if(!n)throw new z("missing code parameter");if(e===null)throw new z("missing issuer parameter");if(e!==i.issuer)throw new z("issuer mismatch");const c=new j(i,a),{info:u,token:l}=await c.exchangeCode(n,o.verifier),h=u.sub,d={dpopKey:a,info:u,token:l};return await ue(h,d),d};var U,A;class st{constructor(e){f(this,"session");S(this,U);S(this,A);this.session=e,b(this,U,ie(e.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(e){const r=Q(this.session.info.sub,e);return r.then(n=>{this.session=n}).finally(()=>{b(this,A,void 0)}),b(this,A,r)}async signOut(){const e=this.session.info.sub;try{const{dpopKey:r,info:n,token:s}=await Q(e,{allowStale:!0});await new j(n.server,r).revoke(s.refresh??s.access)}finally{Ge(e)}}async handle(e,r){await m(this,A);const n=new Headers(r==null?void 0:r.headers);let s=this.session,o=new URL(e,s.info.aud);n.set("authorization",`${s.token.type} ${s.token.access}`);let a=await m(this,U).call(this,o,{...r,headers:n});if(!nt(a))return a;try{m(this,A)?s=await m(this,A):s=await this.getSession()}catch{return a}return(r==null?void 0:r.body)instanceof ReadableStream?a:(o=new URL(e,s.info.aud),n.set("authorization",`${s.token.type} ${s.token.access}`),await m(this,U).call(this,o,{...r,headers:n}))}}U=new WeakMap,A=new WeakMap;const nt=t=>{if(t.status!==401)return!1;const e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')},I="synthesis-oauth:session";let X=!1;class at{constructor(e,r,n){this.storage=e,this.launcher=r,this.config=n}initialize(){typeof window<"u"&&!X&&(se({metadata:{client_id:this.config.clientId,redirect_uri:this.config.redirectUri}}),X=!0)}async startLoginProcess(e){if(console.log("[oauth] Starting login process for handle:",e),typeof window<"u"&&window.location)try{sessionStorage.setItem("seams_login_redirect",window.location.href)}catch(u){console.warn("[oauth] Failed to save redirect URL:",u)}this.initialize(),console.log("[oauth] Resolving identity...");const{metadata:r}=await oe(e);console.log("[oauth] PDS metadata:",r),console.log("[oauth] Creating authorization URL...");const n=await rt({metadata:r,scope:this.config.scope});console.log("[oauth] Auth URL:",n.toString()),console.log("[oauth] Launching auth flow...");const s=await this.launcher.launch(n);if(!s)throw new Error("OAuth flow cancelled or failed");console.log("[oauth] Captured redirect URL:",s);const o=new URL(s),a=o.search||o.hash.slice(1),i=new URLSearchParams(a);if(console.log("[oauth] OAuth params:",Object.fromEntries(i)),i.has("error")){const u=i.get("error"),l=i.get("error_description");throw console.error("[oauth] OAuth error:",u,l),new Error(`OAuth error: ${u} - ${l}`)}console.log("[oauth] Finalizing authorization...");const c=await le(i);console.log("[oauth] Authorization complete, session:",c),await this.saveSession(c),console.log("[oauth] Session saved successfully")}async saveSession(e){await this.storage.set(I,e)}async loadSession(){return await this.storage.get(I)}async clearSession(){await this.storage.set(I,null)}async getProfile(e){return await(await new st(e).handle("/xrpc/app.bsky.actor.getProfile?actor="+e.info.sub)).json()}}async function it(t,e){console.log("[oauth] Handling OAuth callback"),e&&(console.log("[oauth] Configuring OAuth client with:",e),se({metadata:{client_id:e.clientId,redirect_uri:e.redirectUri}}));const r=new URL(window.location.href),n=r.search||r.hash.slice(1),s=new URLSearchParams(n);if(console.log("[oauth] OAuth params:",Object.fromEntries(s)),!s.has("code")&&!s.has("error"))return console.log("[oauth] No OAuth params found"),null;if(s.has("error")){const a=s.get("error"),i=s.get("error_description");throw console.error("[oauth] OAuth error:",a,i),new Error(`OAuth error: ${a} - ${i}`)}console.log("[oauth] Finalizing authorization...");const o=await le(s);return console.log("[oauth] Authorization complete, session:",o),await t.set(I,o),console.log("[oauth] Session saved successfully"),o}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(s){if(s.ep)return;s.ep=!0;const o=r(s);fetch(s.href,o)}})();export{st as O,at as a,it as h}; 2 - //# sourceMappingURL=modulepreload-polyfill-B384jI_7.js.map
-1
proxy/static/static/assets/modulepreload-polyfill-B384jI_7.js.map
··· 1 - {"version":3,"file":"modulepreload-polyfill-B384jI_7.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../../packages/core/src/oauth/index.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","import {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport type { StorageAdapter } from \"../storage\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nexport interface OAuthLauncher {\n launch(authUrl: URL): Promise<string>;\n}\n\nexport interface OAuthConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nlet isOAuthInitialized = false;\n\nexport class OAuthManager {\n private storage: StorageAdapter;\n private launcher: OAuthLauncher;\n private config: OAuthConfig;\n\n constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) {\n this.storage = storage;\n this.launcher = launcher;\n this.config = config;\n }\n\n initialize() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n configureOAuth({\n metadata: {\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n },\n });\n isOAuthInitialized = true;\n }\n }\n\n async startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth] Starting login process for handle:', handle);\n \n // Store current location for redirect back after login (for web flow)\n if (typeof window !== 'undefined' && window.location) {\n try {\n sessionStorage.setItem('seams_login_redirect', window.location.href);\n } catch (e) {\n console.warn('[oauth] Failed to save redirect URL:', e);\n }\n }\n\n this.initialize();\n \n console.log('[oauth] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth] PDS metadata:', metadata);\n \n console.log('[oauth] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: this.config.scope,\n });\n console.log('[oauth] Auth URL:', authUrl.toString());\n\n console.log('[oauth] Launching auth flow...');\n const capturedUrl = await this.launcher.launch(authUrl);\n \n if (!capturedUrl) {\n throw new Error('OAuth flow cancelled or failed');\n }\n\n console.log('[oauth] Captured redirect URL:', capturedUrl);\n\n // Parse OAuth response from redirect URL (params can be in search or hash)\n const url = new URL(capturedUrl);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await this.saveSession(session);\n console.log('[oauth] Session saved successfully');\n }\n\n async saveSession(session: OAuthSession): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, session);\n }\n\n async loadSession(): Promise<OAuthSession | null> {\n return await this.storage.get(OAUTH_SESSION_KEY);\n }\n\n async clearSession(): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, null);\n }\n\n async getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n }\n}\n\n/**\n * Handle OAuth callback from URL parameters (for web contexts)\n * Call this from your oauth-callback page to process the redirect\n */\nexport async function handleOAuthCallback(storage: StorageAdapter, config?: OAuthConfig): Promise<OAuthSession | null> {\n console.log('[oauth] Handling OAuth callback');\n\n if (config) {\n console.log('[oauth] Configuring OAuth client with:', config);\n configureOAuth({\n metadata: {\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n },\n });\n }\n \n // Parse OAuth response from URL (params can be in search or hash)\n const url = new URL(window.location.href);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (!params.has('code') && !params.has('error')) {\n console.log('[oauth] No OAuth params found');\n return null;\n }\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await storage.set(OAUTH_SESSION_KEY, session);\n console.log('[oauth] Session saved successfully');\n\n return session;\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session","_getSessionPromise","OAuthUserAgent","isInvalidTokenResponse","auth","OAUTH_SESSION_KEY","isOAuthInitialized","OAuthManager","storage","launcher","config","e","capturedUrl","paramString","errorDesc","handleOAuthCallback"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-2
proxy/static/static/assets/modulepreload-polyfill-B5Qt9EMX.js
··· 1 - (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))i(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&i(o)}).observe(document,{childList:!0,subtree:!0});function s(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(e){if(e.ep)return;e.ep=!0;const r=s(e);fetch(e.href,r)}})(); 2 - //# sourceMappingURL=modulepreload-polyfill-B5Qt9EMX.js.map
-1
proxy/static/static/assets/modulepreload-polyfill-B5Qt9EMX.js.map
··· 1 - {"version":3,"file":"modulepreload-polyfill-B5Qt9EMX.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
-2
proxy/static/static/assets/modulepreload-polyfill-BRQHV-rj.js
··· 1 - var de=Object.defineProperty;var V=t=>{throw TypeError(t)};var he=(t,e,r)=>e in t?de(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>he(t,typeof e!="symbol"?e+"":e,r),H=(t,e,r)=>e.has(t)||V("Cannot "+r);var m=(t,e,r)=>(H(t,e,"read from private field"),r?r.call(t):e.get(t)),S=(t,e,r)=>e.has(t)?V("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),b=(t,e,r,n)=>(H(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),$=(t,e,r)=>(H(t,e,"access private method"),r);const pe="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let W=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=pe[r[t]&63];return e};const fe=new TextEncoder;new TextDecoder;const we=crypto.subtle,ge=t=>new Uint8Array(t),ye=ge,N=t=>fe.encode(t),me=async t=>new Uint8Array(await we.digest("SHA-256",t)),_e=(t,e,r)=>n=>{const s=(1<<e)-1;let o="",a=0,i=0;for(let c=0;c<n.length;++c)for(i=i<<8|n[c],a+=8;a>e;)a-=e,o+=t[s&i>>a];if(a!==0&&(o+=t[s&i<<e-a]),r)for(;o.length*e&7;)o+="=";return o},ve=(t,e,r)=>{const n={};for(let s=0;s<t.length;++s)n[t[s]]=s;return s=>{let o=s.length;for(;r&&s[o-1]==="=";)--o;const a=ye(o*e/8|0);let i=0,c=0,u=0;for(let l=0;l<o;++l){const h=n[s[l]];if(h===void 0)throw new SyntaxError("invalid base string");c=c<<e|h,i+=e,i>=8&&(i-=8,a[u++]=255&c>>i)}if(i>=e||255&c<<8-i)throw new SyntaxError("unexpected end of data");return a}},Ae=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),ke=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",Ee=ve(ee,6,!1),Se=_e(ee,6,!1),te="fromBase64"in Uint8Array,be=te?Ae:Ee,D=te?ke:Se,q=typeof navigator<"u"?navigator.locks:void 0,re=async t=>{const e=N(t),r=await me(e);return D(r)},Re=async()=>{const t=W(64);return{verifier:t,challenge:await re(t),method:"S256"}},Ue=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},xe=({name:t})=>{const e=new AbortController,r=e.signal,n=(s,o,a=!1)=>{let i;const c=`${t}:${s}`,u=()=>i&&localStorage.setItem(c,JSON.stringify(i)),l=()=>{if(r.aborted)throw new Error("store closed");return i??(i=Ue(localStorage.getItem(c)))};{const h=d=>{d.key===c&&(i=void 0)};globalThis.addEventListener("storage",h,{signal:r})}{const h=async d=>{if(!d||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let g=Date.now(),v=!1;l();for(const w in i){const x=i[w].expiresAt;x!==null&&g>x&&(v=!0,delete i[w])}v&&u()};q?q.request(`${c}:cleanup`,{ifAvailable:!0},h):h(!0)}return{get(h){l();const d=i[h];if(!d)return;const g=d.expiresAt;if(g!==null&&Date.now()>g){delete i[h],u();return}return d.value},getWithLapsed(h){l();const d=i[h],g=Date.now();if(!d)return[void 0,1/0];const v=d.updatedAt;return v===void 0?[d.value,1/0]:[d.value,g-v]},set(h,d){l();const g={value:d,expiresAt:o(d),updatedAt:a?Date.now():void 0};i[h]=g,u()},delete(h){l(),i[h]!==void 0&&(delete i[h],u())},keys(){return l(),Object.keys(i)}}};return{dispose:()=>{e.abort()},sessions:n("sessions",({token:s})=>s.refresh?null:s.expires_at??null),states:n("states",s=>Date.now()+10*60*1e3),dpopNonces:n("dpopNonces",s=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let J,Z,_;const se=t=>{({client_id:J,redirect_uri:Z}=t.metadata),_=xe({name:t.storageName??"atcute-oauth"})};class z extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class Oe extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class p extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class K extends Error{constructor(r,n,s){super(n,s);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=r}}class ne extends Error{constructor(r,n){var u,l;const s=G((u=Y(n))==null?void 0:u.error),o=G((l=Y(n))==null?void 0:l.error_description),a=s?`"${s}"`:"unknown",i=o?`: ${o}`:"",c=`OAuth ${a} error${i}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=r,this.data=n,this.error=s,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class ze extends Error{constructor(r,n,s){super(s);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=r,this.status=n}}const G=t=>typeof t=="string"?t:void 0,Y=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,De=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Le=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&De.test(t),je="parse"in URL,Pe=t=>{let e=null;if(je)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},$e=(t,e)=>{const r=t.service;if(r)for(let n=0,s=r.length;n<s;n++){const{id:o,type:a,serviceEndpoint:i}=r[n];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(a)){if(!a.includes(e.type))continue}else if(a!==e.type)continue}if(!(typeof i!="string"||!Pe(i)))return i}}},Te=t=>$e(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),Ie="https://public.api.bsky.app",F=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},Ne="parse"in URL,qe=t=>{let e=null;if(Ne)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},Ke=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Fe=async t=>{const e=Ie+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new p("domain handle not found");if(!r.ok)throw new p("directory is unreachable");return(await r.json()).did},Be=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),n=t.slice(e+1);let s;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new p("did not found in directory");if(!o.ok)throw new p("directory is unreachable");s=await o.json()}else if(r==="web"){if(!Ke.test(n))throw new p("invalid identifier");const o=await fetch(`https://${n}/.well-known/did.json`);if(!o.ok)throw new p("did document is unreachable");s=await o.json()}else throw new p("unsupported did method");return s},Ce=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||F(r.headers)!=="application/json")throw new p("unexpected response");const n=await r.json();if(n.resource!==e.origin)throw new p("unexpected issuer");return n},He=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||F(r.headers)!=="application/json")throw new p("unexpected response");const n=await r.json();if(n.issuer!==e.origin)throw new p("unexpected issuer");if(!qe(n.authorization_endpoint))throw new p("authorization server provided incorrect authorization endpoint");if(!n.client_id_metadata_document_supported)throw new p("authorization server does not support 'client_id_metadata_document'");if(!n.pushed_authorization_request_endpoint)throw new p("authorization server does not support 'pushed_authorization request'");if(n.response_types_supported&&!n.response_types_supported.includes("code"))throw new p("authorization server does not support 'code' response type");return n},oe=async t=>{let e;Le(t)?e=t:e=await Fe(t);const r=await Be(e),n=Te(r);if(!n)throw new p("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(n)},metadata:await Me(n)}},Me=async t=>{var s;const e=await Ce(t);if(((s=e.authorization_servers)==null?void 0:s.length)!==1)throw new p("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],n=await He(r);if(n.protected_resources&&!n.protected_resources.includes(e.resource))throw new p("server is not in authorization server's jurisdiction");return n},ae={name:"ECDSA",namedCurve:"P-256"},We=async()=>{const t=await crypto.subtle.generateKey(ae,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:n,...s}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:D(new Uint8Array(e)),jwt:D(N(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:s})))}},Je=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",be(t.key),ae,!0,["sign"]),n=(s,o,a,i)=>{const c={ath:i,htm:s,htu:o,iat:Math.floor(Date.now()/1e3),jti:W(24),nonce:a};return D(N(JSON.stringify(c)))};return async(s,o,a,i)=>{const c=n(s,o,a,i),u=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,N(e+"."+c)),l=D(new Uint8Array(u));return e+"."+c+"."+l}},ie=(t,e)=>{const r=_.dpopNonces,n=_.inflightDpop,s=Je(t);return async(o,a)=>{const i=new Request(o,a),c=i.headers.get("authorization"),u=c!=null&&c.startsWith("DPoP ")?await re(c.slice(5)):void 0,{method:l,url:h}=i,{origin:d,pathname:g}=new URL(h),v=d+g;let w=n.get(d);w&&(await w.promise,w=void 0);let P,x=!1;try{const[O,y]=r.getWithLapsed(d);P=O,x=y>3*60*1e3}catch{}x&&n.set(d,w=Promise.withResolvers());let E;try{const O=await s(l,v,P,u);i.headers.set("dpop",O);const y=await fetch(i);if(E=y.headers.get("dpop-nonce"),E===null||E===P)return y;try{r.set(d,E)}catch{}if(!await Ze(y,e)||o===i||(a==null?void 0:a.body)instanceof ReadableStream)return y}finally{w&&(n.delete(d),w.resolve())}{const O=await s(l,v,E,u),y=new Request(o,a);y.headers.set("dpop",O);const B=await fetch(y),C=B.headers.get("dpop-nonce");if(C!==null&&C!==E)try{r.set(d,C)}catch{}return B}}},Ze=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&F(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Ve=(t,e)=>{const r={};for(let n=0,s=e.length;n<s;n++){const o=e[n];r[o]=t[o]}return r};var L,R,k,M,ce;class j{constructor(e,r){S(this,k);S(this,L);S(this,R);b(this,R,e),b(this,L,ie(r,!0))}async request(e,r){const n=m(this,R)[`${e}_endpoint`];if(!n)throw new Error(`no endpoint for ${e}`);const s=await m(this,L).call(this,n,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:J})});if(F(s.headers)!=="application/json")throw new ze(s,2,"unexpected content-type");const o=await s.json();if(s.ok)return o;throw new ne(s,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const n=await this.request("token",{grant_type:"authorization_code",redirect_uri:Z,code:e,code_verifier:r});try{return await $(this,k,ce).call(this,n)}catch(s){throw await this.revoke(n.access_token),s}}async refresh({sub:e,token:r}){if(!r.refresh)throw new K(e,"no refresh token available");const n=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==n.sub)throw new K(e,`sub mismatch in token response; got ${n.sub}`);return $(this,k,M).call(this,n)}catch(s){throw await this.revoke(n.access_token),s}}}L=new WeakMap,R=new WeakMap,k=new WeakSet,M=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ce=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const n=$(this,k,M).call(this,e),s=await oe(r);if(s.metadata.issuer!==m(this,R).issuer)throw new TypeError(`issuer mismatch; got ${s.metadata.issuer}`);return{token:n,info:{sub:r,aud:s.identity.pds.href,server:Ve(s.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,Q=async(t,e)=>{var i,c;(i=e==null?void 0:e.signal)==null||i.throwIfAborted();let r=tt;e!=null&&e.noCache?r=Qe:e!=null&&e.allowStale&&(r=Ye);let n;for(;n=T.get(t);){try{const{isFresh:u,value:l}=await n;if(u||r(l))return l}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const s=async()=>{const u=_.sessions.get(t);if(u&&r(u))return{isFresh:!1,value:u};const l=await Xe(t,u);return await ue(t,l),{isFresh:!0,value:l}};let o;if(q?o=q.request(`atcute-oauth:${t}`,s):o=s(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:a}=await o;return a},ue=async(t,e)=>{try{_.sessions.set(t,e)}catch(r){throw await et(e),r}},Ge=t=>{_.sessions.delete(t)},Ye=()=>!0,Qe=()=>!1,Xe=async(t,e)=>{if(e===void 0)throw new K(t,"session deleted by another tab");const{dpopKey:r,info:n,token:s}=e,o=new j(n.server,r);try{const a=await o.refresh({sub:n.sub,token:s});return{dpopKey:r,info:n,token:a}}catch(a){throw a instanceof ne&&a.status===400&&a.error==="invalid_grant"?new K(t,"session was revoked",{cause:a}):a}},et=async({dpopKey:t,info:e,token:r})=>{await new j(e.server,t).revoke(r.refresh??r.access)},tt=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},rt=async({metadata:t,identity:e,scope:r})=>{const n=W(24),s=await Re(),o=await We(),a={redirect_uri:Z,code_challenge:s.challenge,code_challenge_method:s.method,state:n,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};_.states.set(n,{dpopKey:o,metadata:t,verifier:s.verifier});const c=await new j(t,o).request("pushed_authorization_request",a),u=new URL(t.authorization_endpoint);return u.searchParams.set("client_id",J),u.searchParams.set("request_uri",c.request_uri),u},le=async t=>{const e=t.get("iss"),r=t.get("state"),n=t.get("code"),s=t.get("error");if(!r||!(n||s))throw new z("missing parameters");const o=_.states.get(r);if(o)_.states.delete(r);else throw new z("unknown state provided");const a=o.dpopKey,i=o.metadata;if(s)throw new Oe(t.get("error_description")||s);if(!n)throw new z("missing code parameter");if(e===null)throw new z("missing issuer parameter");if(e!==i.issuer)throw new z("issuer mismatch");const c=new j(i,a),{info:u,token:l}=await c.exchangeCode(n,o.verifier),h=u.sub,d={dpopKey:a,info:u,token:l};return await ue(h,d),d};var U,A;class st{constructor(e){f(this,"session");S(this,U);S(this,A);this.session=e,b(this,U,ie(e.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(e){const r=Q(this.session.info.sub,e);return r.then(n=>{this.session=n}).finally(()=>{b(this,A,void 0)}),b(this,A,r)}async signOut(){const e=this.session.info.sub;try{const{dpopKey:r,info:n,token:s}=await Q(e,{allowStale:!0});await new j(n.server,r).revoke(s.refresh??s.access)}finally{Ge(e)}}async handle(e,r){await m(this,A);const n=new Headers(r==null?void 0:r.headers);let s=this.session,o=new URL(e,s.info.aud);n.set("authorization",`${s.token.type} ${s.token.access}`);let a=await m(this,U).call(this,o,{...r,headers:n});if(!nt(a))return a;try{m(this,A)?s=await m(this,A):s=await this.getSession()}catch{return a}return(r==null?void 0:r.body)instanceof ReadableStream?a:(o=new URL(e,s.info.aud),n.set("authorization",`${s.token.type} ${s.token.access}`),await m(this,U).call(this,o,{...r,headers:n}))}}U=new WeakMap,A=new WeakMap;const nt=t=>{if(t.status!==401)return!1;const e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')},I="synthesis-oauth:session";let X=!1;class at{constructor(e,r,n){this.storage=e,this.launcher=r,this.config=n}initialize(){typeof window<"u"&&!X&&(se({metadata:{client_id:this.config.clientId,redirect_uri:this.config.redirectUri}}),X=!0)}async startLoginProcess(e){console.log("[oauth] Starting login process for handle:",e),this.initialize(),console.log("[oauth] Resolving identity...");const{metadata:r}=await oe(e);console.log("[oauth] PDS metadata:",r),console.log("[oauth] Creating authorization URL...");const n=await rt({metadata:r,scope:this.config.scope});console.log("[oauth] Auth URL:",n.toString()),console.log("[oauth] Launching auth flow...");const s=await this.launcher.launch(n);if(!s)throw new Error("OAuth flow cancelled or failed");console.log("[oauth] Captured redirect URL:",s);const o=new URL(s),a=o.search||o.hash.slice(1),i=new URLSearchParams(a);if(console.log("[oauth] OAuth params:",Object.fromEntries(i)),i.has("error")){const u=i.get("error"),l=i.get("error_description");throw console.error("[oauth] OAuth error:",u,l),new Error(`OAuth error: ${u} - ${l}`)}console.log("[oauth] Finalizing authorization...");const c=await le(i);console.log("[oauth] Authorization complete, session:",c),await this.saveSession(c),console.log("[oauth] Session saved successfully")}async saveSession(e){await this.storage.set(I,e)}async loadSession(){return await this.storage.get(I)}async clearSession(){await this.storage.set(I,null)}async getProfile(e){return await(await new st(e).handle("/xrpc/app.bsky.actor.getProfile?actor="+e.info.sub)).json()}}async function it(t,e){console.log("[oauth] Handling OAuth callback"),e&&(console.log("[oauth] Configuring OAuth client with:",e),se({metadata:{client_id:e.clientId,redirect_uri:e.redirectUri}}));const r=new URL(window.location.href),n=r.search||r.hash.slice(1),s=new URLSearchParams(n);if(console.log("[oauth] OAuth params:",Object.fromEntries(s)),!s.has("code")&&!s.has("error"))return console.log("[oauth] No OAuth params found"),null;if(s.has("error")){const a=s.get("error"),i=s.get("error_description");throw console.error("[oauth] OAuth error:",a,i),new Error(`OAuth error: ${a} - ${i}`)}console.log("[oauth] Finalizing authorization...");const o=await le(s);return console.log("[oauth] Authorization complete, session:",o),await t.set(I,o),console.log("[oauth] Session saved successfully"),o}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(s){if(s.ep)return;s.ep=!0;const o=r(s);fetch(s.href,o)}})();export{st as O,at as a,it as h}; 2 - //# sourceMappingURL=modulepreload-polyfill-BRQHV-rj.js.map
-1
proxy/static/static/assets/modulepreload-polyfill-BRQHV-rj.js.map
··· 1 - {"version":3,"file":"modulepreload-polyfill-BRQHV-rj.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../../packages/core/src/oauth/index.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","import {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport type { StorageAdapter } from \"../storage\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nexport interface OAuthLauncher {\n launch(authUrl: URL): Promise<string>;\n}\n\nexport interface OAuthConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nlet isOAuthInitialized = false;\n\nexport class OAuthManager {\n private storage: StorageAdapter;\n private launcher: OAuthLauncher;\n private config: OAuthConfig;\n\n constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) {\n this.storage = storage;\n this.launcher = launcher;\n this.config = config;\n }\n\n initialize() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n configureOAuth({\n metadata: {\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n },\n });\n isOAuthInitialized = true;\n }\n }\n\n async startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth] Starting login process for handle:', handle);\n this.initialize();\n \n console.log('[oauth] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth] PDS metadata:', metadata);\n \n console.log('[oauth] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: this.config.scope,\n });\n console.log('[oauth] Auth URL:', authUrl.toString());\n\n console.log('[oauth] Launching auth flow...');\n const capturedUrl = await this.launcher.launch(authUrl);\n \n if (!capturedUrl) {\n throw new Error('OAuth flow cancelled or failed');\n }\n\n console.log('[oauth] Captured redirect URL:', capturedUrl);\n\n // Parse OAuth response from redirect URL (params can be in search or hash)\n const url = new URL(capturedUrl);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await this.saveSession(session);\n console.log('[oauth] Session saved successfully');\n }\n\n async saveSession(session: OAuthSession): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, session);\n }\n\n async loadSession(): Promise<OAuthSession | null> {\n return await this.storage.get(OAUTH_SESSION_KEY);\n }\n\n async clearSession(): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, null);\n }\n\n async getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n }\n}\n\n/**\n * Handle OAuth callback from URL parameters (for web contexts)\n * Call this from your oauth-callback page to process the redirect\n */\nexport async function handleOAuthCallback(storage: StorageAdapter, config?: OAuthConfig): Promise<OAuthSession | null> {\n console.log('[oauth] Handling OAuth callback');\n\n if (config) {\n console.log('[oauth] Configuring OAuth client with:', config);\n configureOAuth({\n metadata: {\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n },\n });\n }\n \n // Parse OAuth response from URL (params can be in search or hash)\n const url = new URL(window.location.href);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (!params.has('code') && !params.has('error')) {\n console.log('[oauth] No OAuth params found');\n return null;\n }\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await storage.set(OAUTH_SESSION_KEY, session);\n console.log('[oauth] Session saved successfully');\n\n return session;\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session","_getSessionPromise","OAuthUserAgent","isInvalidTokenResponse","auth","OAUTH_SESSION_KEY","isOAuthInitialized","OAuthManager","storage","launcher","config","capturedUrl","paramString","errorDesc","handleOAuthCallback"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-2
proxy/static/static/assets/modulepreload-polyfill-CyEOUuNr.js
··· 1 - var le=Object.defineProperty;var V=t=>{throw TypeError(t)};var de=(t,e,r)=>e in t?le(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>de(t,typeof e!="symbol"?e+"":e,r),H=(t,e,r)=>e.has(t)||V("Cannot "+r);var m=(t,e,r)=>(H(t,e,"read from private field"),r?r.call(t):e.get(t)),S=(t,e,r)=>e.has(t)?V("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),b=(t,e,r,s)=>(H(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),$=(t,e,r)=>(H(t,e,"access private method"),r);const he="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let W=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=he[r[t]&63];return e};const pe=new TextEncoder;new TextDecoder;const fe=crypto.subtle,we=t=>new Uint8Array(t),ge=we,N=t=>pe.encode(t),ye=async t=>new Uint8Array(await fe.digest("SHA-256",t)),me=(t,e,r)=>s=>{const n=(1<<e)-1;let o="",a=0,i=0;for(let c=0;c<s.length;++c)for(i=i<<8|s[c],a+=8;a>e;)a-=e,o+=t[n&i>>a];if(a!==0&&(o+=t[n&i<<e-a]),r)for(;o.length*e&7;)o+="=";return o},_e=(t,e,r)=>{const s={};for(let n=0;n<t.length;++n)s[t[n]]=n;return n=>{let o=n.length;for(;r&&n[o-1]==="=";)--o;const a=ge(o*e/8|0);let i=0,c=0,u=0;for(let l=0;l<o;++l){const h=s[n[l]];if(h===void 0)throw new SyntaxError("invalid base string");c=c<<e|h,i+=e,i>=8&&(i-=8,a[u++]=255&c>>i)}if(i>=e||255&c<<8-i)throw new SyntaxError("unexpected end of data");return a}},ve=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),Ae=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",ke=_e(ee,6,!1),Ee=me(ee,6,!1),te="fromBase64"in Uint8Array,Se=te?ve:ke,D=te?Ae:Ee,q=typeof navigator<"u"?navigator.locks:void 0,re=async t=>{const e=N(t),r=await ye(e);return D(r)},be=async()=>{const t=W(64);return{verifier:t,challenge:await re(t),method:"S256"}},Re=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},xe=({name:t})=>{const e=new AbortController,r=e.signal,s=(n,o,a=!1)=>{let i;const c=`${t}:${n}`,u=()=>i&&localStorage.setItem(c,JSON.stringify(i)),l=()=>{if(r.aborted)throw new Error("store closed");return i??(i=Re(localStorage.getItem(c)))};{const h=d=>{d.key===c&&(i=void 0)};globalThis.addEventListener("storage",h,{signal:r})}{const h=async d=>{if(!d||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let g=Date.now(),v=!1;l();for(const w in i){const U=i[w].expiresAt;U!==null&&g>U&&(v=!0,delete i[w])}v&&u()};q?q.request(`${c}:cleanup`,{ifAvailable:!0},h):h(!0)}return{get(h){l();const d=i[h];if(!d)return;const g=d.expiresAt;if(g!==null&&Date.now()>g){delete i[h],u();return}return d.value},getWithLapsed(h){l();const d=i[h],g=Date.now();if(!d)return[void 0,1/0];const v=d.updatedAt;return v===void 0?[d.value,1/0]:[d.value,g-v]},set(h,d){l();const g={value:d,expiresAt:o(d),updatedAt:a?Date.now():void 0};i[h]=g,u()},delete(h){l(),i[h]!==void 0&&(delete i[h],u())},keys(){return l(),Object.keys(i)}}};return{dispose:()=>{e.abort()},sessions:s("sessions",({token:n})=>n.refresh?null:n.expires_at??null),states:s("states",n=>Date.now()+10*60*1e3),dpopNonces:s("dpopNonces",n=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let J,Z,_;const Ue=t=>{({client_id:J,redirect_uri:Z}=t.metadata),_=xe({name:t.storageName??"atcute-oauth"})};class z extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class Oe extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class p extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class K extends Error{constructor(r,s,n){super(s,n);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=r}}class se extends Error{constructor(r,s){var u,l;const n=G((u=Y(s))==null?void 0:u.error),o=G((l=Y(s))==null?void 0:l.error_description),a=n?`"${n}"`:"unknown",i=o?`: ${o}`:"",c=`OAuth ${a} error${i}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=r,this.data=s,this.error=n,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class ze extends Error{constructor(r,s,n){super(n);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=r,this.status=s}}const G=t=>typeof t=="string"?t:void 0,Y=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,De=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Le=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&De.test(t),je="parse"in URL,Pe=t=>{let e=null;if(je)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},$e=(t,e)=>{const r=t.service;if(r)for(let s=0,n=r.length;s<n;s++){const{id:o,type:a,serviceEndpoint:i}=r[s];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(a)){if(!a.includes(e.type))continue}else if(a!==e.type)continue}if(!(typeof i!="string"||!Pe(i)))return i}}},Te=t=>$e(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),Ie="https://public.api.bsky.app",F=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},Ne="parse"in URL,qe=t=>{let e=null;if(Ne)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},Ke=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Fe=async t=>{const e=Ie+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new p("domain handle not found");if(!r.ok)throw new p("directory is unreachable");return(await r.json()).did},Be=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),s=t.slice(e+1);let n;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new p("did not found in directory");if(!o.ok)throw new p("directory is unreachable");n=await o.json()}else if(r==="web"){if(!Ke.test(s))throw new p("invalid identifier");const o=await fetch(`https://${s}/.well-known/did.json`);if(!o.ok)throw new p("did document is unreachable");n=await o.json()}else throw new p("unsupported did method");return n},Ce=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||F(r.headers)!=="application/json")throw new p("unexpected response");const s=await r.json();if(s.resource!==e.origin)throw new p("unexpected issuer");return s},He=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||F(r.headers)!=="application/json")throw new p("unexpected response");const s=await r.json();if(s.issuer!==e.origin)throw new p("unexpected issuer");if(!qe(s.authorization_endpoint))throw new p("authorization server provided incorrect authorization endpoint");if(!s.client_id_metadata_document_supported)throw new p("authorization server does not support 'client_id_metadata_document'");if(!s.pushed_authorization_request_endpoint)throw new p("authorization server does not support 'pushed_authorization request'");if(s.response_types_supported&&!s.response_types_supported.includes("code"))throw new p("authorization server does not support 'code' response type");return s},ne=async t=>{let e;Le(t)?e=t:e=await Fe(t);const r=await Be(e),s=Te(r);if(!s)throw new p("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(s)},metadata:await Me(s)}},Me=async t=>{var n;const e=await Ce(t);if(((n=e.authorization_servers)==null?void 0:n.length)!==1)throw new p("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],s=await He(r);if(s.protected_resources&&!s.protected_resources.includes(e.resource))throw new p("server is not in authorization server's jurisdiction");return s},oe={name:"ECDSA",namedCurve:"P-256"},We=async()=>{const t=await crypto.subtle.generateKey(oe,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:s,...n}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:D(new Uint8Array(e)),jwt:D(N(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:n})))}},Je=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",Se(t.key),oe,!0,["sign"]),s=(n,o,a,i)=>{const c={ath:i,htm:n,htu:o,iat:Math.floor(Date.now()/1e3),jti:W(24),nonce:a};return D(N(JSON.stringify(c)))};return async(n,o,a,i)=>{const c=s(n,o,a,i),u=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,N(e+"."+c)),l=D(new Uint8Array(u));return e+"."+c+"."+l}},ae=(t,e)=>{const r=_.dpopNonces,s=_.inflightDpop,n=Je(t);return async(o,a)=>{const i=new Request(o,a),c=i.headers.get("authorization"),u=c!=null&&c.startsWith("DPoP ")?await re(c.slice(5)):void 0,{method:l,url:h}=i,{origin:d,pathname:g}=new URL(h),v=d+g;let w=s.get(d);w&&(await w.promise,w=void 0);let P,U=!1;try{const[O,y]=r.getWithLapsed(d);P=O,U=y>3*60*1e3}catch{}U&&s.set(d,w=Promise.withResolvers());let E;try{const O=await n(l,v,P,u);i.headers.set("dpop",O);const y=await fetch(i);if(E=y.headers.get("dpop-nonce"),E===null||E===P)return y;try{r.set(d,E)}catch{}if(!await Ze(y,e)||o===i||(a==null?void 0:a.body)instanceof ReadableStream)return y}finally{w&&(s.delete(d),w.resolve())}{const O=await n(l,v,E,u),y=new Request(o,a);y.headers.set("dpop",O);const B=await fetch(y),C=B.headers.get("dpop-nonce");if(C!==null&&C!==E)try{r.set(d,C)}catch{}return B}}},Ze=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&F(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Ve=(t,e)=>{const r={};for(let s=0,n=e.length;s<n;s++){const o=e[s];r[o]=t[o]}return r};var L,R,k,M,ie;class j{constructor(e,r){S(this,k);S(this,L);S(this,R);b(this,R,e),b(this,L,ae(r,!0))}async request(e,r){const s=m(this,R)[`${e}_endpoint`];if(!s)throw new Error(`no endpoint for ${e}`);const n=await m(this,L).call(this,s,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:J})});if(F(n.headers)!=="application/json")throw new ze(n,2,"unexpected content-type");const o=await n.json();if(n.ok)return o;throw new se(n,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const s=await this.request("token",{grant_type:"authorization_code",redirect_uri:Z,code:e,code_verifier:r});try{return await $(this,k,ie).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}async refresh({sub:e,token:r}){if(!r.refresh)throw new K(e,"no refresh token available");const s=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==s.sub)throw new K(e,`sub mismatch in token response; got ${s.sub}`);return $(this,k,M).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}}L=new WeakMap,R=new WeakMap,k=new WeakSet,M=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ie=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const s=$(this,k,M).call(this,e),n=await ne(r);if(n.metadata.issuer!==m(this,R).issuer)throw new TypeError(`issuer mismatch; got ${n.metadata.issuer}`);return{token:s,info:{sub:r,aud:n.identity.pds.href,server:Ve(n.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,Q=async(t,e)=>{var i,c;(i=e==null?void 0:e.signal)==null||i.throwIfAborted();let r=tt;e!=null&&e.noCache?r=Qe:e!=null&&e.allowStale&&(r=Ye);let s;for(;s=T.get(t);){try{const{isFresh:u,value:l}=await s;if(u||r(l))return l}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const n=async()=>{const u=_.sessions.get(t);if(u&&r(u))return{isFresh:!1,value:u};const l=await Xe(t,u);return await ce(t,l),{isFresh:!0,value:l}};let o;if(q?o=q.request(`atcute-oauth:${t}`,n):o=n(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:a}=await o;return a},ce=async(t,e)=>{try{_.sessions.set(t,e)}catch(r){throw await et(e),r}},Ge=t=>{_.sessions.delete(t)},Ye=()=>!0,Qe=()=>!1,Xe=async(t,e)=>{if(e===void 0)throw new K(t,"session deleted by another tab");const{dpopKey:r,info:s,token:n}=e,o=new j(s.server,r);try{const a=await o.refresh({sub:s.sub,token:n});return{dpopKey:r,info:s,token:a}}catch(a){throw a instanceof se&&a.status===400&&a.error==="invalid_grant"?new K(t,"session was revoked",{cause:a}):a}},et=async({dpopKey:t,info:e,token:r})=>{await new j(e.server,t).revoke(r.refresh??r.access)},tt=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},rt=async({metadata:t,identity:e,scope:r})=>{const s=W(24),n=await be(),o=await We(),a={redirect_uri:Z,code_challenge:n.challenge,code_challenge_method:n.method,state:s,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};_.states.set(s,{dpopKey:o,metadata:t,verifier:n.verifier});const c=await new j(t,o).request("pushed_authorization_request",a),u=new URL(t.authorization_endpoint);return u.searchParams.set("client_id",J),u.searchParams.set("request_uri",c.request_uri),u},ue=async t=>{const e=t.get("iss"),r=t.get("state"),s=t.get("code"),n=t.get("error");if(!r||!(s||n))throw new z("missing parameters");const o=_.states.get(r);if(o)_.states.delete(r);else throw new z("unknown state provided");const a=o.dpopKey,i=o.metadata;if(n)throw new Oe(t.get("error_description")||n);if(!s)throw new z("missing code parameter");if(e===null)throw new z("missing issuer parameter");if(e!==i.issuer)throw new z("issuer mismatch");const c=new j(i,a),{info:u,token:l}=await c.exchangeCode(s,o.verifier),h=u.sub,d={dpopKey:a,info:u,token:l};return await ce(h,d),d};var x,A;class st{constructor(e){f(this,"session");S(this,x);S(this,A);this.session=e,b(this,x,ae(e.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(e){const r=Q(this.session.info.sub,e);return r.then(s=>{this.session=s}).finally(()=>{b(this,A,void 0)}),b(this,A,r)}async signOut(){const e=this.session.info.sub;try{const{dpopKey:r,info:s,token:n}=await Q(e,{allowStale:!0});await new j(s.server,r).revoke(n.refresh??n.access)}finally{Ge(e)}}async handle(e,r){await m(this,A);const s=new Headers(r==null?void 0:r.headers);let n=this.session,o=new URL(e,n.info.aud);s.set("authorization",`${n.token.type} ${n.token.access}`);let a=await m(this,x).call(this,o,{...r,headers:s});if(!nt(a))return a;try{m(this,A)?n=await m(this,A):n=await this.getSession()}catch{return a}return(r==null?void 0:r.body)instanceof ReadableStream?a:(o=new URL(e,n.info.aud),s.set("authorization",`${n.token.type} ${n.token.access}`),await m(this,x).call(this,o,{...r,headers:s}))}}x=new WeakMap,A=new WeakMap;const nt=t=>{if(t.status!==401)return!1;const e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')},I="synthesis-oauth:session";let X=!1;class at{constructor(e,r,s){this.storage=e,this.launcher=r,this.config=s}initialize(){typeof window<"u"&&!X&&(Ue({metadata:{client_id:this.config.clientId,redirect_uri:this.config.redirectUri}}),X=!0)}async startLoginProcess(e){console.log("[oauth] Starting login process for handle:",e),this.initialize(),console.log("[oauth] Resolving identity...");const{metadata:r}=await ne(e);console.log("[oauth] PDS metadata:",r),console.log("[oauth] Creating authorization URL...");const s=await rt({metadata:r,scope:this.config.scope});console.log("[oauth] Auth URL:",s.toString()),console.log("[oauth] Launching auth flow...");const n=await this.launcher.launch(s);if(!n)throw new Error("OAuth flow cancelled or failed");console.log("[oauth] Captured redirect URL:",n);const o=new URL(n),a=o.search||o.hash.slice(1),i=new URLSearchParams(a);if(console.log("[oauth] OAuth params:",Object.fromEntries(i)),i.has("error")){const u=i.get("error"),l=i.get("error_description");throw console.error("[oauth] OAuth error:",u,l),new Error(`OAuth error: ${u} - ${l}`)}console.log("[oauth] Finalizing authorization...");const c=await ue(i);console.log("[oauth] Authorization complete, session:",c),await this.saveSession(c),console.log("[oauth] Session saved successfully")}async saveSession(e){await this.storage.set(I,e)}async loadSession(){return await this.storage.get(I)}async clearSession(){await this.storage.set(I,null)}async getProfile(e){return await(await new st(e).handle("/xrpc/app.bsky.actor.getProfile?actor="+e.info.sub)).json()}}async function it(t){console.log("[oauth] Handling OAuth callback");const e=new URL(window.location.href),r=e.search||e.hash.slice(1),s=new URLSearchParams(r);if(console.log("[oauth] OAuth params:",Object.fromEntries(s)),!s.has("code")&&!s.has("error"))return console.log("[oauth] No OAuth params found"),null;if(s.has("error")){const o=s.get("error"),a=s.get("error_description");throw console.error("[oauth] OAuth error:",o,a),new Error(`OAuth error: ${o} - ${a}`)}console.log("[oauth] Finalizing authorization...");const n=await ue(s);return console.log("[oauth] Authorization complete, session:",n),await t.set(I,n),console.log("[oauth] Session saved successfully"),n}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))s(n);new MutationObserver(n=>{for(const o of n)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function r(n){const o={};return n.integrity&&(o.integrity=n.integrity),n.referrerPolicy&&(o.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?o.credentials="include":n.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(n){if(n.ep)return;n.ep=!0;const o=r(n);fetch(n.href,o)}})();export{st as O,at as a,it as h}; 2 - //# sourceMappingURL=modulepreload-polyfill-CyEOUuNr.js.map
-1
proxy/static/static/assets/modulepreload-polyfill-CyEOUuNr.js.map
··· 1 - {"version":3,"file":"modulepreload-polyfill-CyEOUuNr.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../../packages/core/src/oauth/index.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","import {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport type { StorageAdapter } from \"../storage\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nexport interface OAuthLauncher {\n launch(authUrl: URL): Promise<string>;\n}\n\nexport interface OAuthConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nlet isOAuthInitialized = false;\n\nexport class OAuthManager {\n private storage: StorageAdapter;\n private launcher: OAuthLauncher;\n private config: OAuthConfig;\n\n constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) {\n this.storage = storage;\n this.launcher = launcher;\n this.config = config;\n }\n\n initialize() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n configureOAuth({\n metadata: {\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n },\n });\n isOAuthInitialized = true;\n }\n }\n\n async startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth] Starting login process for handle:', handle);\n this.initialize();\n \n console.log('[oauth] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth] PDS metadata:', metadata);\n \n console.log('[oauth] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: this.config.scope,\n });\n console.log('[oauth] Auth URL:', authUrl.toString());\n\n console.log('[oauth] Launching auth flow...');\n const capturedUrl = await this.launcher.launch(authUrl);\n \n if (!capturedUrl) {\n throw new Error('OAuth flow cancelled or failed');\n }\n\n console.log('[oauth] Captured redirect URL:', capturedUrl);\n\n // Parse OAuth response from redirect URL (params can be in search or hash)\n const url = new URL(capturedUrl);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await this.saveSession(session);\n console.log('[oauth] Session saved successfully');\n }\n\n async saveSession(session: OAuthSession): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, session);\n }\n\n async loadSession(): Promise<OAuthSession | null> {\n return await this.storage.get(OAUTH_SESSION_KEY);\n }\n\n async clearSession(): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, null);\n }\n\n async getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n }\n}\n\n/**\n * Handle OAuth callback from URL parameters (for web contexts)\n * Call this from your oauth-callback page to process the redirect\n */\nexport async function handleOAuthCallback(storage: StorageAdapter): Promise<OAuthSession | null> {\n console.log('[oauth] Handling OAuth callback');\n \n // Parse OAuth response from URL (params can be in search or hash)\n const url = new URL(window.location.href);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (!params.has('code') && !params.has('error')) {\n console.log('[oauth] No OAuth params found');\n return null;\n }\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await storage.set(OAUTH_SESSION_KEY, session);\n console.log('[oauth] Session saved successfully');\n\n return session;\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session","_getSessionPromise","OAuthUserAgent","isInvalidTokenResponse","auth","OAUTH_SESSION_KEY","isOAuthInitialized","OAuthManager","storage","launcher","config","capturedUrl","paramString","errorDesc","handleOAuthCallback"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-2
proxy/static/static/assets/oauth-web-B1Uotnw-.js
··· 1 - var ue=Object.defineProperty;var G=t=>{throw TypeError(t)};var de=(t,e,r)=>e in t?ue(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>de(t,typeof e!="symbol"?e+"":e,r),H=(t,e,r)=>e.has(t)||G("Cannot "+r);var m=(t,e,r)=>(H(t,e,"read from private field"),r?r.call(t):e.get(t)),E=(t,e,r)=>e.has(t)?G("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),k=(t,e,r,s)=>(H(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),L=(t,e,r)=>(H(t,e,"access private method"),r);const he="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let W=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=he[r[t]&63];return e};const pe=new TextEncoder;new TextDecoder;const fe=crypto.subtle,we=t=>new Uint8Array(t),ge=we,$=t=>pe.encode(t),ye=async t=>new Uint8Array(await fe.digest("SHA-256",t)),me=(t,e,r)=>s=>{const n=(1<<e)-1;let o="",a=0,i=0;for(let c=0;c<s.length;++c)for(i=i<<8|s[c],a+=8;a>e;)a-=e,o+=t[n&i>>a];if(a!==0&&(o+=t[n&i<<e-a]),r)for(;o.length*e&7;)o+="=";return o},_e=(t,e,r)=>{const s={};for(let n=0;n<t.length;++n)s[t[n]]=n;return n=>{let o=n.length;for(;r&&n[o-1]==="=";)--o;const a=ge(o*e/8|0);let i=0,c=0,l=0;for(let u=0;u<o;++u){const h=s[n[u]];if(h===void 0)throw new SyntaxError("invalid base string");c=c<<e|h,i+=e,i>=8&&(i-=8,a[l++]=255&c>>i)}if(i>=e||255&c<<8-i)throw new SyntaxError("unexpected end of data");return a}},ve=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),Se=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",be=_e(te,6,!1),Ae=me(te,6,!1),re="fromBase64"in Uint8Array,Ee=re?ve:be,z=re?Se:Ae,N=typeof navigator<"u"?navigator.locks:void 0,se=async t=>{const e=$(t),r=await ye(e);return z(r)},ke=async()=>{const t=W(64);return{verifier:t,challenge:await se(t),method:"S256"}},Re=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},xe=({name:t})=>{const e=new AbortController,r=e.signal,s=(n,o,a=!1)=>{let i;const c=`${t}:${n}`,l=()=>i&&localStorage.setItem(c,JSON.stringify(i)),u=()=>{if(r.aborted)throw new Error("store closed");return i??(i=Re(localStorage.getItem(c)))};{const h=d=>{d.key===c&&(i=void 0)};globalThis.addEventListener("storage",h,{signal:r})}{const h=async d=>{if(!d||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let g=Date.now(),v=!1;u();for(const w in i){const U=i[w].expiresAt;U!==null&&g>U&&(v=!0,delete i[w])}v&&l()};N?N.request(`${c}:cleanup`,{ifAvailable:!0},h):h(!0)}return{get(h){u();const d=i[h];if(!d)return;const g=d.expiresAt;if(g!==null&&Date.now()>g){delete i[h],l();return}return d.value},getWithLapsed(h){u();const d=i[h],g=Date.now();if(!d)return[void 0,1/0];const v=d.updatedAt;return v===void 0?[d.value,1/0]:[d.value,g-v]},set(h,d){u();const g={value:d,expiresAt:o(d),updatedAt:a?Date.now():void 0};i[h]=g,l()},delete(h){u(),i[h]!==void 0&&(delete i[h],l())},keys(){return u(),Object.keys(i)}}};return{dispose:()=>{e.abort()},sessions:s("sessions",({token:n})=>n.refresh?null:n.expires_at??null),states:s("states",n=>Date.now()+10*60*1e3),dpopNonces:s("dpopNonces",n=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let M,Z,_;const Ue=t=>{({client_id:M,redirect_uri:Z}=t.metadata),_=xe({name:t.storageName??"atcute-oauth"})};class D extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class je extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class p extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class q extends Error{constructor(r,s,n){super(s,n);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=r}}class ne extends Error{constructor(r,s){var l,u;const n=Y((l=Q(s))==null?void 0:l.error),o=Y((u=Q(s))==null?void 0:u.error_description),a=n?`"${n}"`:"unknown",i=o?`: ${o}`:"",c=`OAuth ${a} error${i}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=r,this.data=s,this.error=n,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class De extends Error{constructor(r,s,n){super(n);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=r,this.status=s}}const Y=t=>typeof t=="string"?t:void 0,Q=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,ze=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Oe=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&ze.test(t),Pe="parse"in URL,Ie=t=>{let e=null;if(Pe)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},Le=(t,e)=>{const r=t.service;if(r)for(let s=0,n=r.length;s<n;s++){const{id:o,type:a,serviceEndpoint:i}=r[s];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(a)){if(!a.includes(e.type))continue}else if(a!==e.type)continue}if(!(typeof i!="string"||!Ie(i)))return i}}},Te=t=>Le(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),$e="https://public.api.bsky.app",B=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},Ne="parse"in URL,qe=t=>{let e=null;if(Ne)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},Ke=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Be=async t=>{const e=$e+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new p("domain handle not found");if(!r.ok)throw new p("directory is unreachable");return(await r.json()).did},Fe=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),s=t.slice(e+1);let n;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new p("did not found in directory");if(!o.ok)throw new p("directory is unreachable");n=await o.json()}else if(r==="web"){if(!Ke.test(s))throw new p("invalid identifier");const o=await fetch(`https://${s}/.well-known/did.json`);if(!o.ok)throw new p("did document is unreachable");n=await o.json()}else throw new p("unsupported did method");return n},Je=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||B(r.headers)!=="application/json")throw new p("unexpected response");const s=await r.json();if(s.resource!==e.origin)throw new p("unexpected issuer");return s},He=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||B(r.headers)!=="application/json")throw new p("unexpected response");const s=await r.json();if(s.issuer!==e.origin)throw new p("unexpected issuer");if(!qe(s.authorization_endpoint))throw new p("authorization server provided incorrect authorization endpoint");if(!s.client_id_metadata_document_supported)throw new p("authorization server does not support 'client_id_metadata_document'");if(!s.pushed_authorization_request_endpoint)throw new p("authorization server does not support 'pushed_authorization request'");if(s.response_types_supported&&!s.response_types_supported.includes("code"))throw new p("authorization server does not support 'code' response type");return s},oe=async t=>{let e;Oe(t)?e=t:e=await Be(t);const r=await Fe(e),s=Te(r);if(!s)throw new p("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(s)},metadata:await Ce(s)}},Ce=async t=>{var n;const e=await Je(t);if(((n=e.authorization_servers)==null?void 0:n.length)!==1)throw new p("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],s=await He(r);if(s.protected_resources&&!s.protected_resources.includes(e.resource))throw new p("server is not in authorization server's jurisdiction");return s},ae={name:"ECDSA",namedCurve:"P-256"},We=async()=>{const t=await crypto.subtle.generateKey(ae,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:s,...n}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:z(new Uint8Array(e)),jwt:z($(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:n})))}},Me=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",Ee(t.key),ae,!0,["sign"]),s=(n,o,a,i)=>{const c={ath:i,htm:n,htu:o,iat:Math.floor(Date.now()/1e3),jti:W(24),nonce:a};return z($(JSON.stringify(c)))};return async(n,o,a,i)=>{const c=s(n,o,a,i),l=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,$(e+"."+c)),u=z(new Uint8Array(l));return e+"."+c+"."+u}},ie=(t,e)=>{const r=_.dpopNonces,s=_.inflightDpop,n=Me(t);return async(o,a)=>{const i=new Request(o,a),c=i.headers.get("authorization"),l=c!=null&&c.startsWith("DPoP ")?await se(c.slice(5)):void 0,{method:u,url:h}=i,{origin:d,pathname:g}=new URL(h),v=d+g;let w=s.get(d);w&&(await w.promise,w=void 0);let I,U=!1;try{const[j,y]=r.getWithLapsed(d);I=j,U=y>3*60*1e3}catch{}U&&s.set(d,w=Promise.withResolvers());let A;try{const j=await n(u,v,I,l);i.headers.set("dpop",j);const y=await fetch(i);if(A=y.headers.get("dpop-nonce"),A===null||A===I)return y;try{r.set(d,A)}catch{}if(!await Ze(y,e)||o===i||(a==null?void 0:a.body)instanceof ReadableStream)return y}finally{w&&(s.delete(d),w.resolve())}{const j=await n(u,v,A,l),y=new Request(o,a);y.headers.set("dpop",j);const F=await fetch(y),J=F.headers.get("dpop-nonce");if(J!==null&&J!==A)try{r.set(d,J)}catch{}return F}}},Ze=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&B(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Ve=(t,e)=>{const r={};for(let s=0,n=e.length;s<n;s++){const o=e[s];r[o]=t[o]}return r};var O,R,b,C,ce;class P{constructor(e,r){E(this,b);E(this,O);E(this,R);k(this,R,e),k(this,O,ie(r,!0))}async request(e,r){const s=m(this,R)[`${e}_endpoint`];if(!s)throw new Error(`no endpoint for ${e}`);const n=await m(this,O).call(this,s,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:M})});if(B(n.headers)!=="application/json")throw new De(n,2,"unexpected content-type");const o=await n.json();if(n.ok)return o;throw new ne(n,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const s=await this.request("token",{grant_type:"authorization_code",redirect_uri:Z,code:e,code_verifier:r});try{return await L(this,b,ce).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}async refresh({sub:e,token:r}){if(!r.refresh)throw new q(e,"no refresh token available");const s=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==s.sub)throw new q(e,`sub mismatch in token response; got ${s.sub}`);return L(this,b,C).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}}O=new WeakMap,R=new WeakMap,b=new WeakSet,C=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ce=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const s=L(this,b,C).call(this,e),n=await oe(r);if(n.metadata.issuer!==m(this,R).issuer)throw new TypeError(`issuer mismatch; got ${n.metadata.issuer}`);return{token:s,info:{sub:r,aud:n.identity.pds.href,server:Ve(n.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,X=async(t,e)=>{var i,c;(i=e==null?void 0:e.signal)==null||i.throwIfAborted();let r=tt;e!=null&&e.noCache?r=Qe:e!=null&&e.allowStale&&(r=Ye);let s;for(;s=T.get(t);){try{const{isFresh:l,value:u}=await s;if(l||r(u))return u}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const n=async()=>{const l=_.sessions.get(t);if(l&&r(l))return{isFresh:!1,value:l};const u=await Xe(t,l);return await le(t,u),{isFresh:!0,value:u}};let o;if(N?o=N.request(`atcute-oauth:${t}`,n):o=n(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:a}=await o;return a},le=async(t,e)=>{try{_.sessions.set(t,e)}catch(r){throw await et(e),r}},Ge=t=>{_.sessions.delete(t)},Ye=()=>!0,Qe=()=>!1,Xe=async(t,e)=>{if(e===void 0)throw new q(t,"session deleted by another tab");const{dpopKey:r,info:s,token:n}=e,o=new P(s.server,r);try{const a=await o.refresh({sub:s.sub,token:n});return{dpopKey:r,info:s,token:a}}catch(a){throw a instanceof ne&&a.status===400&&a.error==="invalid_grant"?new q(t,"session was revoked",{cause:a}):a}},et=async({dpopKey:t,info:e,token:r})=>{await new P(e.server,t).revoke(r.refresh??r.access)},tt=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},rt=async({metadata:t,identity:e,scope:r})=>{const s=W(24),n=await ke(),o=await We(),a={redirect_uri:Z,code_challenge:n.challenge,code_challenge_method:n.method,state:s,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};_.states.set(s,{dpopKey:o,metadata:t,verifier:n.verifier});const c=await new P(t,o).request("pushed_authorization_request",a),l=new URL(t.authorization_endpoint);return l.searchParams.set("client_id",M),l.searchParams.set("request_uri",c.request_uri),l},st=async t=>{const e=t.get("iss"),r=t.get("state"),s=t.get("code"),n=t.get("error");if(!r||!(s||n))throw new D("missing parameters");const o=_.states.get(r);if(o)_.states.delete(r);else throw new D("unknown state provided");const a=o.dpopKey,i=o.metadata;if(n)throw new je(t.get("error_description")||n);if(!s)throw new D("missing code parameter");if(e===null)throw new D("missing issuer parameter");if(e!==i.issuer)throw new D("issuer mismatch");const c=new P(i,a),{info:l,token:u}=await c.exchangeCode(s,o.verifier),h=l.sub,d={dpopKey:a,info:l,token:u};return await le(h,d),d};var x,S;class nt{constructor(e){f(this,"session");E(this,x);E(this,S);this.session=e,k(this,x,ie(e.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(e){const r=X(this.session.info.sub,e);return r.then(s=>{this.session=s}).finally(()=>{k(this,S,void 0)}),k(this,S,r)}async signOut(){const e=this.session.info.sub;try{const{dpopKey:r,info:s,token:n}=await X(e,{allowStale:!0});await new P(s.server,r).revoke(n.refresh??n.access)}finally{Ge(e)}}async handle(e,r){await m(this,S);const s=new Headers(r==null?void 0:r.headers);let n=this.session,o=new URL(e,n.info.aud);s.set("authorization",`${n.token.type} ${n.token.access}`);let a=await m(this,x).call(this,o,{...r,headers:s});if(!ot(a))return a;try{m(this,S)?n=await m(this,S):n=await this.getSession()}catch{return a}return(r==null?void 0:r.body)instanceof ReadableStream?a:(o=new URL(e,n.info.aud),s.set("authorization",`${n.token.type} ${n.token.access}`),await m(this,x).call(this,o,{...r,headers:s}))}}x=new WeakMap,S=new WeakMap;const ot=t=>{if(t.status!==401)return!1;const e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')},V={local:{async get(t){if(!t){const r={};for(let s=0;s<localStorage.length;s++){const n=localStorage.key(s);if(n)try{r[n]=JSON.parse(localStorage.getItem(n)||"null")}catch{r[n]=localStorage.getItem(n)}}return r}const e={};if(typeof t=="string")try{const r=localStorage.getItem(t);e[t]=r?JSON.parse(r):null}catch{e[t]=localStorage.getItem(t)}else Array.isArray(t)?t.forEach(r=>{try{const s=localStorage.getItem(r);e[r]=s?JSON.parse(s):null}catch{e[r]=localStorage.getItem(r)}}):Object.keys(t).forEach(r=>{try{const s=localStorage.getItem(r);e[r]=s?JSON.parse(s):t[r]}catch{e[r]=localStorage.getItem(r)||t[r]}});return e},async set(t){Object.entries(t).forEach(([e,r])=>{localStorage.setItem(e,JSON.stringify(r))})},async remove(t){(Array.isArray(t)?t:[t]).forEach(r=>localStorage.removeItem(r))},async clear(){localStorage.clear()}}},K="synthesis-oauth:session";let ee=!1;function at(){typeof window<"u"&&!ee&&(Ue({metadata:{client_id:"http://localhost:8081/static/client-metadata.json",redirect_uri:"http://localhost:8081/static/oauth-callback.html"}}),ee=!0)}async function lt(t){console.log("[oauth-web] Starting login process for handle:",t),at(),console.log("[oauth-web] Resolving identity...");const{metadata:e}=await oe(t);console.log("[oauth-web] PDS metadata:",e),console.log("[oauth-web] Creating authorization URL...");const r=await rt({metadata:e,scope:"atproto transition:generic"});console.log("[oauth-web] Auth URL:",r.toString()),window.location.href=r.toString()}async function ut(){console.log("[oauth-web] Handling OAuth callback");const t=new URL(window.location.href),e=t.search||t.hash.slice(1),r=new URLSearchParams(e);if(console.log("[oauth-web] OAuth params:",Object.fromEntries(r)),!r.has("code")&&!r.has("error"))return console.log("[oauth-web] No OAuth params found"),null;if(r.has("error")){const n=r.get("error"),o=r.get("error_description");throw console.error("[oauth-web] OAuth error:",n,o),new Error(`OAuth error: ${n} - ${o}`)}console.log("[oauth-web] Finalizing authorization...");const s=await st(r);return console.log("[oauth-web] Authorization complete, session:",s),await it(s),console.log("[oauth-web] Session saved successfully"),s}async function it(t){await V.local.set({[K]:t})}async function dt(){return(await V.local.get(K))[K]||null}async function ht(){await V.local.remove(K)}async function pt(t){return await(await new nt(t).handle("/xrpc/app.bsky.actor.getProfile?actor="+t.info.sub)).json()}export{ht as c,pt as g,ut as h,at as i,dt as l,lt as s}; 2 - //# sourceMappingURL=oauth-web-B1Uotnw-.js.map
-1
proxy/static/static/assets/oauth-web-B1Uotnw-.js.map
··· 1 - {"version":3,"file":"oauth-web-B1Uotnw-.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../../lib/storage-adapter.ts","../../../lib/oauth-web.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","// Storage adapter that mimics browser.storage.local API but uses localStorage\n// This allows sharing code between extension and via-client\n\nexport const storage = {\n local: {\n async get(keys?: string | string[] | Record<string, any>): Promise<Record<string, any>> {\n if (!keys) {\n // Get all items\n const result: Record<string, any> = {};\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key) {\n try {\n result[key] = JSON.parse(localStorage.getItem(key) || 'null');\n } catch {\n result[key] = localStorage.getItem(key);\n }\n }\n }\n return result;\n }\n\n const result: Record<string, any> = {};\n \n if (typeof keys === 'string') {\n // Single key\n try {\n const value = localStorage.getItem(keys);\n result[keys] = value ? JSON.parse(value) : null;\n } catch {\n result[keys] = localStorage.getItem(keys);\n }\n } else if (Array.isArray(keys)) {\n // Array of keys\n keys.forEach(key => {\n try {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n } catch {\n result[key] = localStorage.getItem(key);\n }\n });\n } else {\n // Object with default values\n Object.keys(keys).forEach(key => {\n try {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : keys[key];\n } catch {\n result[key] = localStorage.getItem(key) || keys[key];\n }\n });\n }\n \n return result;\n },\n\n async set(items: Record<string, any>): Promise<void> {\n Object.entries(items).forEach(([key, value]) => {\n localStorage.setItem(key, JSON.stringify(value));\n });\n },\n\n async remove(keys: string | string[]): Promise<void> {\n const keysArray = Array.isArray(keys) ? keys : [keys];\n keysArray.forEach(key => localStorage.removeItem(key));\n },\n\n async clear(): Promise<void> {\n localStorage.clear();\n },\n },\n};\n","// Web-compatible OAuth implementation (for via-client)\n// Adapted from lib/oauth.ts to work without browser.* APIs\n\nimport {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport { storage } from \"./storage-adapter\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nlet isOAuthInitialized = false;\n\nexport function initializeOAuth() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n // Use web redirect URL for via proxy\n configureOAuth({\n metadata: {\n client_id: import.meta.env.VITE_OAUTH_CLIENT_ID || 'http://localhost:8081/static/client-metadata.json',\n redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'http://localhost:8081/static/oauth-callback.html',\n },\n });\n isOAuthInitialized = true;\n }\n}\n\nexport async function startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth-web] Starting login process for handle:', handle);\n initializeOAuth();\n \n console.log('[oauth-web] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth-web] PDS metadata:', metadata);\n \n console.log('[oauth-web] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic',\n });\n console.log('[oauth-web] Auth URL:', authUrl.toString());\n\n // For web context, redirect to auth URL\n window.location.href = authUrl.toString();\n}\n\nexport async function handleOAuthCallback(): Promise<OAuthSession | null> {\n console.log('[oauth-web] Handling OAuth callback');\n \n // Parse OAuth response from URL (params can be in search or hash)\n const url = new URL(window.location.href);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth-web] OAuth params:', Object.fromEntries(params));\n\n if (!params.has('code') && !params.has('error')) {\n console.log('[oauth-web] No OAuth params found');\n return null;\n }\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth-web] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth-web] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth-web] Authorization complete, session:', session);\n\n // Store session\n await saveSession(session);\n console.log('[oauth-web] Session saved successfully');\n\n return session;\n}\n\nexport async function saveSession(session: OAuthSession): Promise<void> {\n await storage.local.set({ [OAUTH_SESSION_KEY]: session });\n}\n\nexport async function loadSession(): Promise<OAuthSession | null> {\n const result = await storage.local.get(OAUTH_SESSION_KEY);\n return result[OAUTH_SESSION_KEY] || null;\n}\n\nexport async function clearSession(): Promise<void> {\n await storage.local.remove(OAUTH_SESSION_KEY);\n}\n\nexport async function getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session","_getSessionPromise","OAuthUserAgent","isInvalidTokenResponse","auth","storage","result","items","OAUTH_SESSION_KEY","isOAuthInitialized","initializeOAuth","startLoginProcess","handleOAuthCallback","paramString","errorDesc","saveSession","loadSession","clearSession","getProfile"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-2
proxy/static/static/assets/oauth-web-D0e6TxJF.js
··· 1 - var ue=Object.defineProperty;var G=t=>{throw TypeError(t)};var de=(t,e,r)=>e in t?ue(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var f=(t,e,r)=>de(t,typeof e!="symbol"?e+"":e,r),H=(t,e,r)=>e.has(t)||G("Cannot "+r);var m=(t,e,r)=>(H(t,e,"read from private field"),r?r.call(t):e.get(t)),E=(t,e,r)=>e.has(t)?G("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),k=(t,e,r,s)=>(H(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r),L=(t,e,r)=>(H(t,e,"access private method"),r);const he="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let W=(t=21)=>{let e="",r=crypto.getRandomValues(new Uint8Array(t|=0));for(;t--;)e+=he[r[t]&63];return e};const pe=new TextEncoder;new TextDecoder;const fe=crypto.subtle,we=t=>new Uint8Array(t),ge=we,$=t=>pe.encode(t),ye=async t=>new Uint8Array(await fe.digest("SHA-256",t)),me=(t,e,r)=>s=>{const n=(1<<e)-1;let o="",a=0,i=0;for(let c=0;c<s.length;++c)for(i=i<<8|s[c],a+=8;a>e;)a-=e,o+=t[n&i>>a];if(a!==0&&(o+=t[n&i<<e-a]),r)for(;o.length*e&7;)o+="=";return o},_e=(t,e,r)=>{const s={};for(let n=0;n<t.length;++n)s[t[n]]=n;return n=>{let o=n.length;for(;r&&n[o-1]==="=";)--o;const a=ge(o*e/8|0);let i=0,c=0,l=0;for(let u=0;u<o;++u){const h=s[n[u]];if(h===void 0)throw new SyntaxError("invalid base string");c=c<<e|h,i+=e,i>=8&&(i-=8,a[l++]=255&c>>i)}if(i>=e||255&c<<8-i)throw new SyntaxError("unexpected end of data");return a}},ve=t=>Uint8Array.fromBase64(t,{alphabet:"base64url",lastChunkHandling:"loose"}),Se=t=>t.toBase64({alphabet:"base64url",omitPadding:!0}),te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",be=_e(te,6,!1),Ae=me(te,6,!1),re="fromBase64"in Uint8Array,Ee=re?ve:be,z=re?Se:Ae,N=typeof navigator<"u"?navigator.locks:void 0,se=async t=>{const e=$(t),r=await ye(e);return z(r)},ke=async()=>{const t=W(64);return{verifier:t,challenge:await se(t),method:"S256"}},Re=t=>{if(t!=null){const e=JSON.parse(t);if(e!=null)return e}return{}},xe=({name:t})=>{const e=new AbortController,r=e.signal,s=(n,o,a=!1)=>{let i;const c=`${t}:${n}`,l=()=>i&&localStorage.setItem(c,JSON.stringify(i)),u=()=>{if(r.aborted)throw new Error("store closed");return i??(i=Re(localStorage.getItem(c)))};{const h=d=>{d.key===c&&(i=void 0)};globalThis.addEventListener("storage",h,{signal:r})}{const h=async d=>{if(!d||r.aborted||(await new Promise(w=>setTimeout(w,1e4)),r.aborted))return;let g=Date.now(),v=!1;u();for(const w in i){const U=i[w].expiresAt;U!==null&&g>U&&(v=!0,delete i[w])}v&&l()};N?N.request(`${c}:cleanup`,{ifAvailable:!0},h):h(!0)}return{get(h){u();const d=i[h];if(!d)return;const g=d.expiresAt;if(g!==null&&Date.now()>g){delete i[h],l();return}return d.value},getWithLapsed(h){u();const d=i[h],g=Date.now();if(!d)return[void 0,1/0];const v=d.updatedAt;return v===void 0?[d.value,1/0]:[d.value,g-v]},set(h,d){u();const g={value:d,expiresAt:o(d),updatedAt:a?Date.now():void 0};i[h]=g,l()},delete(h){u(),i[h]!==void 0&&(delete i[h],l())},keys(){return u(),Object.keys(i)}}};return{dispose:()=>{e.abort()},sessions:s("sessions",({token:n})=>n.refresh?null:n.expires_at??null),states:s("states",n=>Date.now()+10*60*1e3),dpopNonces:s("dpopNonces",n=>Date.now()+24*60*60*1e3,!0),inflightDpop:new Map}};let M,Z,_;const Ue=t=>{({client_id:M,redirect_uri:Z}=t.metadata),_=xe({name:t.storageName??"atcute-oauth"})};class D extends Error{constructor(){super(...arguments);f(this,"name","LoginError")}}class je extends Error{constructor(){super(...arguments);f(this,"name","AuthorizationError")}}class p extends Error{constructor(){super(...arguments);f(this,"name","ResolverError")}}class q extends Error{constructor(r,s,n){super(s,n);f(this,"sub");f(this,"name","TokenRefreshError");this.sub=r}}class ne extends Error{constructor(r,s){var l,u;const n=Y((l=Q(s))==null?void 0:l.error),o=Y((u=Q(s))==null?void 0:u.error_description),a=n?`"${n}"`:"unknown",i=o?`: ${o}`:"",c=`OAuth ${a} error${i}`;super(c);f(this,"response");f(this,"data");f(this,"name","OAuthResponseError");f(this,"error");f(this,"description");this.response=r,this.data=s,this.error=n,this.description=o}get status(){return this.response.status}get headers(){return this.response.headers}}class De extends Error{constructor(r,s,n){super(n);f(this,"response");f(this,"status");f(this,"name","FetchResponseError");this.response=r,this.status=s}}const Y=t=>typeof t=="string"?t:void 0,Q=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0,ze=/^did:([a-z]+):([a-zA-Z0-9._:%\-]*[a-zA-Z0-9._\-])$/,Oe=t=>typeof t=="string"&&t.length>=7&&t.length<=2048&&ze.test(t),Pe="parse"in URL,Ie=t=>{let e=null;if(Pe)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null&&(e.protocol==="https:"||e.protocol==="http:")&&e.pathname==="/"&&e.search===""&&e.hash===""},Le=(t,e)=>{const r=t.service;if(r)for(let s=0,n=r.length;s<n;s++){const{id:o,type:a,serviceEndpoint:i}=r[s];if(!(o!==e.id&&o!==t.id+e.id)){if(e.type!==void 0){if(Array.isArray(a)){if(!a.includes(e.type))continue}else if(a!==e.type)continue}if(!(typeof i!="string"||!Ie(i)))return i}}},Te=t=>Le(t,{id:"#atproto_pds",type:"AtprotoPersonalDataServer"}),$e="https://public.api.bsky.app",B=t=>{var e;return(e=t.get("content-type"))==null?void 0:e.split(";")[0]},Ne="parse"in URL,qe=t=>{let e=null;if(Ne)e=URL.parse(t);else try{e=new URL(t)}catch{}return e!==null?e.protocol==="https:"||e.protocol==="http:":!1},Ke=/^([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*(?:\.[a-zA-Z]{2,}))$/,Be=async t=>{const e=$e+`/xrpc/com.atproto.identity.resolveHandle?handle=${t}`,r=await fetch(e);if(r.status===400)throw new p("domain handle not found");if(!r.ok)throw new p("directory is unreachable");return(await r.json()).did},Fe=async t=>{const e=t.indexOf(":",4),r=t.slice(4,e),s=t.slice(e+1);let n;if(r==="plc"){const o=await fetch(`https://plc.directory/${t}`);if(o.status===404)throw new p("did not found in directory");if(!o.ok)throw new p("directory is unreachable");n=await o.json()}else if(r==="web"){if(!Ke.test(s))throw new p("invalid identifier");const o=await fetch(`https://${s}/.well-known/did.json`);if(!o.ok)throw new p("did document is unreachable");n=await o.json()}else throw new p("unsupported did method");return n},Je=async t=>{const e=new URL("/.well-known/oauth-protected-resource",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||B(r.headers)!=="application/json")throw new p("unexpected response");const s=await r.json();if(s.resource!==e.origin)throw new p("unexpected issuer");return s},He=async t=>{const e=new URL("/.well-known/oauth-authorization-server",t),r=await fetch(e,{redirect:"manual",headers:{accept:"application/json"}});if(r.status!==200||B(r.headers)!=="application/json")throw new p("unexpected response");const s=await r.json();if(s.issuer!==e.origin)throw new p("unexpected issuer");if(!qe(s.authorization_endpoint))throw new p("authorization server provided incorrect authorization endpoint");if(!s.client_id_metadata_document_supported)throw new p("authorization server does not support 'client_id_metadata_document'");if(!s.pushed_authorization_request_endpoint)throw new p("authorization server does not support 'pushed_authorization request'");if(s.response_types_supported&&!s.response_types_supported.includes("code"))throw new p("authorization server does not support 'code' response type");return s},oe=async t=>{let e;Oe(t)?e=t:e=await Be(t);const r=await Fe(e),s=Te(r);if(!s)throw new p("missing pds endpoint");return{identity:{id:e,raw:t,pds:new URL(s)},metadata:await Ce(s)}},Ce=async t=>{var n;const e=await Je(t);if(((n=e.authorization_servers)==null?void 0:n.length)!==1)throw new p("expected exactly one authorization server in the listing");const r=e.authorization_servers[0],s=await He(r);if(s.protected_resources&&!s.protected_resources.includes(e.resource))throw new p("server is not in authorization server's jurisdiction");return s},ae={name:"ECDSA",namedCurve:"P-256"},We=async()=>{const t=await crypto.subtle.generateKey(ae,!0,["sign","verify"]),e=await crypto.subtle.exportKey("pkcs8",t.privateKey),{ext:r,key_ops:s,...n}=await crypto.subtle.exportKey("jwk",t.publicKey);return{typ:"ES256",key:z(new Uint8Array(e)),jwt:z($(JSON.stringify({typ:"dpop+jwt",alg:"ES256",jwk:n})))}},Me=t=>{const e=t.jwt,r=crypto.subtle.importKey("pkcs8",Ee(t.key),ae,!0,["sign"]),s=(n,o,a,i)=>{const c={ath:i,htm:n,htu:o,iat:Math.floor(Date.now()/1e3),jti:W(24),nonce:a};return z($(JSON.stringify(c)))};return async(n,o,a,i)=>{const c=s(n,o,a,i),l=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},await r,$(e+"."+c)),u=z(new Uint8Array(l));return e+"."+c+"."+u}},ie=(t,e)=>{const r=_.dpopNonces,s=_.inflightDpop,n=Me(t);return async(o,a)=>{const i=new Request(o,a),c=i.headers.get("authorization"),l=c!=null&&c.startsWith("DPoP ")?await se(c.slice(5)):void 0,{method:u,url:h}=i,{origin:d,pathname:g}=new URL(h),v=d+g;let w=s.get(d);w&&(await w.promise,w=void 0);let I,U=!1;try{const[j,y]=r.getWithLapsed(d);I=j,U=y>3*60*1e3}catch{}U&&s.set(d,w=Promise.withResolvers());let A;try{const j=await n(u,v,I,l);i.headers.set("dpop",j);const y=await fetch(i);if(A=y.headers.get("dpop-nonce"),A===null||A===I)return y;try{r.set(d,A)}catch{}if(!await Ze(y,e)||o===i||(a==null?void 0:a.body)instanceof ReadableStream)return y}finally{w&&(s.delete(d),w.resolve())}{const j=await n(u,v,A,l),y=new Request(o,a);y.headers.set("dpop",j);const F=await fetch(y),J=F.headers.get("dpop-nonce");if(J!==null&&J!==A)try{r.set(d,J)}catch{}return F}}},Ze=async(t,e)=>{if((e===void 0||e===!1)&&t.status===401){const r=t.headers.get("www-authenticate");if(r!=null&&r.startsWith("DPoP"))return r.includes('error="use_dpop_nonce"')}if((e===void 0||e===!0)&&t.status===400&&B(t.headers)==="application/json")try{const r=await t.clone().json();return typeof r=="object"&&(r==null?void 0:r.error)==="use_dpop_nonce"}catch{return!1}return!1},Ve=(t,e)=>{const r={};for(let s=0,n=e.length;s<n;s++){const o=e[s];r[o]=t[o]}return r};var O,R,b,C,ce;class P{constructor(e,r){E(this,b);E(this,O);E(this,R);k(this,R,e),k(this,O,ie(r,!0))}async request(e,r){const s=m(this,R)[`${e}_endpoint`];if(!s)throw new Error(`no endpoint for ${e}`);const n=await m(this,O).call(this,s,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({...r,client_id:M})});if(B(n.headers)!=="application/json")throw new De(n,2,"unexpected content-type");const o=await n.json();if(n.ok)return o;throw new ne(n,o)}async revoke(e){try{await this.request("revocation",{token:e})}catch{}}async exchangeCode(e,r){const s=await this.request("token",{grant_type:"authorization_code",redirect_uri:Z,code:e,code_verifier:r});try{return await L(this,b,ce).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}async refresh({sub:e,token:r}){if(!r.refresh)throw new q(e,"no refresh token available");const s=await this.request("token",{grant_type:"refresh_token",refresh_token:r.refresh});try{if(e!==s.sub)throw new q(e,`sub mismatch in token response; got ${s.sub}`);return L(this,b,C).call(this,s)}catch(n){throw await this.revoke(s.access_token),n}}}O=new WeakMap,R=new WeakMap,b=new WeakSet,C=function(e){if(!e.sub)throw new TypeError("missing sub field in token response");if(!e.scope)throw new TypeError("missing scope field in token response");if(e.token_type!=="DPoP")throw new TypeError("token response returned a non-dpop token");return{scope:e.scope,refresh:e.refresh_token,access:e.access_token,type:e.token_type,expires_at:typeof e.expires_in=="number"?Date.now()+e.expires_in*1e3:void 0}},ce=async function(e){const r=e.sub;if(!r)throw new TypeError("missing sub field in token response");const s=L(this,b,C).call(this,e),n=await oe(r);if(n.metadata.issuer!==m(this,R).issuer)throw new TypeError(`issuer mismatch; got ${n.metadata.issuer}`);return{token:s,info:{sub:r,aud:n.identity.pds.href,server:Ve(n.metadata,["issuer","authorization_endpoint","introspection_endpoint","pushed_authorization_request_endpoint","revocation_endpoint","token_endpoint"])}}};const T=new Map,X=async(t,e)=>{var i,c;(i=e==null?void 0:e.signal)==null||i.throwIfAborted();let r=tt;e!=null&&e.noCache?r=Qe:e!=null&&e.allowStale&&(r=Ye);let s;for(;s=T.get(t);){try{const{isFresh:l,value:u}=await s;if(l||r(u))return u}catch{}(c=e==null?void 0:e.signal)==null||c.throwIfAborted()}const n=async()=>{const l=_.sessions.get(t);if(l&&r(l))return{isFresh:!1,value:l};const u=await Xe(t,l);return await le(t,u),{isFresh:!0,value:u}};let o;if(N?o=N.request(`atcute-oauth:${t}`,n):o=n(),o=o.finally(()=>T.delete(t)),T.has(t))throw new Error("concurrent request for the same key");T.set(t,o);const{value:a}=await o;return a},le=async(t,e)=>{try{_.sessions.set(t,e)}catch(r){throw await et(e),r}},Ge=t=>{_.sessions.delete(t)},Ye=()=>!0,Qe=()=>!1,Xe=async(t,e)=>{if(e===void 0)throw new q(t,"session deleted by another tab");const{dpopKey:r,info:s,token:n}=e,o=new P(s.server,r);try{const a=await o.refresh({sub:s.sub,token:n});return{dpopKey:r,info:s,token:a}}catch(a){throw a instanceof ne&&a.status===400&&a.error==="invalid_grant"?new q(t,"session was revoked",{cause:a}):a}},et=async({dpopKey:t,info:e,token:r})=>{await new P(e.server,t).revoke(r.refresh??r.access)},tt=({token:t})=>{const e=t.expires_at;return e==null||Date.now()+6e4<=e},rt=async({metadata:t,identity:e,scope:r})=>{const s=W(24),n=await ke(),o=await We(),a={redirect_uri:Z,code_challenge:n.challenge,code_challenge_method:n.method,state:s,login_hint:e==null?void 0:e.raw,response_mode:"fragment",response_type:"code",display:"page",scope:r};_.states.set(s,{dpopKey:o,metadata:t,verifier:n.verifier});const c=await new P(t,o).request("pushed_authorization_request",a),l=new URL(t.authorization_endpoint);return l.searchParams.set("client_id",M),l.searchParams.set("request_uri",c.request_uri),l},st=async t=>{const e=t.get("iss"),r=t.get("state"),s=t.get("code"),n=t.get("error");if(!r||!(s||n))throw new D("missing parameters");const o=_.states.get(r);if(o)_.states.delete(r);else throw new D("unknown state provided");const a=o.dpopKey,i=o.metadata;if(n)throw new je(t.get("error_description")||n);if(!s)throw new D("missing code parameter");if(e===null)throw new D("missing issuer parameter");if(e!==i.issuer)throw new D("issuer mismatch");const c=new P(i,a),{info:l,token:u}=await c.exchangeCode(s,o.verifier),h=l.sub,d={dpopKey:a,info:l,token:u};return await le(h,d),d};var x,S;class nt{constructor(e){f(this,"session");E(this,x);E(this,S);this.session=e,k(this,x,ie(e.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(e){const r=X(this.session.info.sub,e);return r.then(s=>{this.session=s}).finally(()=>{k(this,S,void 0)}),k(this,S,r)}async signOut(){const e=this.session.info.sub;try{const{dpopKey:r,info:s,token:n}=await X(e,{allowStale:!0});await new P(s.server,r).revoke(n.refresh??n.access)}finally{Ge(e)}}async handle(e,r){await m(this,S);const s=new Headers(r==null?void 0:r.headers);let n=this.session,o=new URL(e,n.info.aud);s.set("authorization",`${n.token.type} ${n.token.access}`);let a=await m(this,x).call(this,o,{...r,headers:s});if(!ot(a))return a;try{m(this,S)?n=await m(this,S):n=await this.getSession()}catch{return a}return(r==null?void 0:r.body)instanceof ReadableStream?a:(o=new URL(e,n.info.aud),s.set("authorization",`${n.token.type} ${n.token.access}`),await m(this,x).call(this,o,{...r,headers:s}))}}x=new WeakMap,S=new WeakMap;const ot=t=>{if(t.status!==401)return!1;const e=t.headers.get("www-authenticate");return e!=null&&(e.startsWith("Bearer ")||e.startsWith("DPoP "))&&e.includes('error="invalid_token"')},V={local:{async get(t){if(!t){const r={};for(let s=0;s<localStorage.length;s++){const n=localStorage.key(s);if(n)try{r[n]=JSON.parse(localStorage.getItem(n)||"null")}catch{r[n]=localStorage.getItem(n)}}return r}const e={};if(typeof t=="string")try{const r=localStorage.getItem(t);e[t]=r?JSON.parse(r):null}catch{e[t]=localStorage.getItem(t)}else Array.isArray(t)?t.forEach(r=>{try{const s=localStorage.getItem(r);e[r]=s?JSON.parse(s):null}catch{e[r]=localStorage.getItem(r)}}):Object.keys(t).forEach(r=>{try{const s=localStorage.getItem(r);e[r]=s?JSON.parse(s):t[r]}catch{e[r]=localStorage.getItem(r)||t[r]}});return e},async set(t){Object.entries(t).forEach(([e,r])=>{localStorage.setItem(e,JSON.stringify(r))})},async remove(t){(Array.isArray(t)?t:[t]).forEach(r=>localStorage.removeItem(r))},async clear(){localStorage.clear()}}},K="synthesis-oauth:session";let ee=!1;function at(){typeof window<"u"&&!ee&&(Ue({metadata:{client_id:"http://localhost:8081/static/client-metadata.json",redirect_uri:"http://localhost:8081/static/oauth-callback.html"}}),ee=!0)}async function lt(t){console.log("[oauth-web] Starting login process for handle:",t),at(),console.log("[oauth-web] Resolving identity...");const{metadata:e}=await oe(t);console.log("[oauth-web] PDS metadata:",e),console.log("[oauth-web] Creating authorization URL...");const r=await rt({metadata:e,scope:"atproto transition:generic"});console.log("[oauth-web] Auth URL:",r.toString()),window.location.href=r.toString()}async function ut(){console.log("[oauth-web] Handling OAuth callback");const t=new URL(window.location.href),e=t.search||t.hash.slice(1),r=new URLSearchParams(e);if(console.log("[oauth-web] OAuth params:",Object.fromEntries(r)),!r.has("code")&&!r.has("error"))return console.log("[oauth-web] No OAuth params found"),null;if(r.has("error")){const n=r.get("error"),o=r.get("error_description");throw console.error("[oauth-web] OAuth error:",n,o),new Error(`OAuth error: ${n} - ${o}`)}console.log("[oauth-web] Finalizing authorization...");const s=await st(r);return console.log("[oauth-web] Authorization complete, session:",s),await it(s),console.log("[oauth-web] Session saved successfully"),s}async function it(t){await V.local.set({[K]:t})}async function dt(){return(await V.local.get(K))[K]||null}async function ht(){await V.local.remove(K)}async function pt(t){return await(await new nt(t).handle("/xrpc/app.bsky.actor.getProfile?actor="+t.info.sub)).json()}export{lt as a,ht as c,pt as g,ut as h,at as i,dt as l,V as s}; 2 - //# sourceMappingURL=oauth-web-D0e6TxJF.js.map
-1
proxy/static/static/assets/oauth-web-D0e6TxJF.js.map
··· 1 - {"version":3,"file":"oauth-web-D0e6TxJF.js","sources":["../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.6/node_modules/nanoid/index.browser.js","../../../node_modules/.pnpm/@atcute+uint8array@1.0.5/node_modules/@atcute/uint8array/dist/index.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/utils.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-native.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web-polyfill.js","../../../node_modules/.pnpm/@atcute+multibase@1.1.6/node_modules/@atcute/multibase/dist/bases/base64-web.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/runtime.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/store/db.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/environment.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/errors.js","../../../node_modules/.pnpm/@atcute+lexicons@1.2.2/node_modules/@atcute/lexicons/dist/syntax/did.js","../../../node_modules/.pnpm/@atcute+identity@1.1.1/node_modules/@atcute/identity/dist/utils.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/constants.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/response.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/strings.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/resolvers.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/dpop.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/utils/misc.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/server-agent.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/sessions.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/exchange.js","../../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../../lib/storage-adapter.ts","../../../lib/oauth-web.ts"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","const textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst subtle = crypto.subtle;\n/**\n * creates an Uint8Array of the requested size, with the contents zeroed\n */\nexport const alloc = (size) => {\n return new Uint8Array(size);\n};\n/**\n * creates an Uint8Array of the requested size, where the contents may not be\n * zeroed out. only use if you're certain that the contents will be overwritten\n */\nexport const allocUnsafe = alloc;\n/**\n * compares two Uint8Array buffers\n */\nexport const compare = (a, b) => {\n const alen = a.length;\n const blen = b.length;\n if (alen > blen) {\n return 1;\n }\n if (alen < blen) {\n return -1;\n }\n for (let i = 0; i < alen; i++) {\n const ax = a[i];\n const bx = b[i];\n if (ax < bx) {\n return -1;\n }\n if (ax > bx) {\n return 1;\n }\n }\n return 0;\n};\n/**\n * checks if the two Uint8Array buffers are equal\n */\nexport const equals = (a, b) => {\n if (a === b) {\n return true;\n }\n let len;\n if ((len = a.length) === b.length) {\n while (len--) {\n if (a[len] !== b[len]) {\n return false;\n }\n }\n }\n return len === -1;\n};\n/**\n * checks if the two Uint8Array buffers are equal, timing-safe version\n */\nexport const timingSafeEquals = (a, b) => {\n let len;\n let out = 0;\n if ((len = a.length) === b.length) {\n while (len--) {\n out |= a[len] ^ b[len];\n }\n }\n return len === -1 && out === 0;\n};\n/**\n * concatenates multiple Uint8Array buffers into one\n */\nexport const concat = (arrays, size) => {\n let written = 0;\n let len = arrays.length;\n let idx;\n if (size === undefined) {\n for (idx = size = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n size += chunk.length;\n }\n }\n const buffer = new Uint8Array(size);\n for (idx = 0; idx < len; idx++) {\n const chunk = arrays[idx];\n buffer.set(chunk, written);\n written += chunk.length;\n }\n return buffer;\n};\n/**\n * encodes a UTF-8 string\n */\nexport const encodeUtf8 = (str) => {\n return textEncoder.encode(str);\n};\n/**\n * encodes a UTF-8 string into a given buffer\n */\nexport const encodeUtf8Into = (to, str, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = to;\n }\n else if (length === undefined) {\n buffer = to.subarray(offset);\n }\n else {\n buffer = to.subarray(offset, offset + length);\n }\n const result = textEncoder.encodeInto(str, buffer);\n return result.written;\n};\nconst fromCharCode = String.fromCharCode;\n/**\n * decodes a UTF-8 string from a given buffer\n */\nexport const decodeUtf8From = (from, offset, length) => {\n let buffer;\n if (offset === undefined) {\n buffer = from;\n }\n else if (length === undefined) {\n buffer = from.subarray(offset);\n }\n else {\n buffer = from.subarray(offset, offset + length);\n }\n const end = buffer.length;\n if (end > 24) {\n return textDecoder.decode(buffer);\n }\n {\n let str = '';\n let idx = 0;\n for (; idx + 3 < end; idx += 4) {\n const a = buffer[idx];\n const b = buffer[idx + 1];\n const c = buffer[idx + 2];\n const d = buffer[idx + 3];\n if ((a | b | c | d) & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(a, b, c, d);\n }\n for (; idx < end; idx++) {\n const x = buffer[idx];\n if (x & 0x80) {\n return str + textDecoder.decode(buffer.subarray(idx));\n }\n str += fromCharCode(x);\n }\n return str;\n }\n};\n/**\n * get a SHA-256 digest of this buffer\n */\nexport const toSha256 = async (buffer) => {\n return new Uint8Array(await subtle.digest('SHA-256', buffer));\n};\n//# sourceMappingURL=index.js.map","import { alloc, allocUnsafe } from '@atcute/uint8array';\nexport const createRfc4648Encode = (alphabet, bitsPerChar, pad) => {\n return (bytes) => {\n const mask = (1 << bitsPerChar) - 1;\n let str = '';\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n for (let i = 0; i < bytes.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | bytes[i];\n bits += 8;\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar;\n str += alphabet[mask & (buffer >> bits)];\n }\n }\n // Partial character:\n if (bits !== 0) {\n str += alphabet[mask & (buffer << (bitsPerChar - bits))];\n }\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((str.length * bitsPerChar) & 7) !== 0) {\n str += '=';\n }\n }\n return str;\n };\n};\nexport const createRfc4648Decode = (alphabet, bitsPerChar, pad) => {\n // Build the character lookup table:\n const codes = {};\n for (let i = 0; i < alphabet.length; ++i) {\n codes[alphabet[i]] = i;\n }\n return (str) => {\n // Count the padding bytes:\n let end = str.length;\n while (pad && str[end - 1] === '=') {\n --end;\n }\n // Allocate the output:\n const bytes = allocUnsafe(((end * bitsPerChar) / 8) | 0);\n // Parse the data:\n let bits = 0; // Number of bits currently in the buffer\n let buffer = 0; // Bits waiting to be written out, MSB first\n let written = 0; // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = codes[str[i]];\n if (value === undefined) {\n throw new SyntaxError(`invalid base string`);\n }\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value;\n bits += bitsPerChar;\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8;\n bytes[written++] = 0xff & (buffer >> bits);\n }\n }\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('unexpected end of data');\n }\n return bytes;\n };\n};\nexport const createBtcBaseEncode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n return (source) => {\n if (source.length === 0) {\n return '';\n }\n // Skip & count leading zeroes.\n let zeroes = 0;\n let length = 0;\n let pbegin = 0;\n const pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n const b58 = alloc(size);\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0;\n for (let it1 = size - 1; (carry !== 0 || i < length) && it1 !== -1; it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = carry % BASE >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) {\n str += alphabet.charAt(b58[it2]);\n }\n return str;\n };\n};\nexport const createBtcBaseDecode = (alphabet) => {\n if (alphabet.length >= 255) {\n throw new RangeError(`alphabet too long`);\n }\n const BASE_MAP = allocUnsafe(256).fill(255);\n for (let i = 0; i < alphabet.length; i++) {\n const xc = alphabet.charCodeAt(i);\n if (BASE_MAP[xc] !== 255) {\n throw new RangeError(`${alphabet[i]} is ambiguous`);\n }\n BASE_MAP[xc] = i;\n }\n const BASE = alphabet.length;\n const LEADER = alphabet.charAt(0);\n const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n return (source) => {\n if (source.length === 0) {\n return allocUnsafe(0);\n }\n // Skip and count leading '1's.\n let psz = 0;\n let zeroes = 0;\n let length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0; // log(58) / log(256), rounded up.\n const b256 = alloc(size);\n // Process the characters.\n while (psz < source.length) {\n // Decode character\n let carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) {\n throw new Error(`invalid string`);\n }\n let i = 0;\n for (let it3 = size - 1; (carry !== 0 || i < length) && it3 !== -1; it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = carry % 256 >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) {\n throw new Error('non-zero carry');\n }\n length = i;\n psz++;\n }\n // Skip leading zeroes in b256.\n let it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n if (it4 === zeroes) {\n return b256;\n }\n const vch = allocUnsafe(zeroes + (size - it4));\n vch.fill(0, 0, zeroes);\n vch.set(b256.subarray(it4), zeroes);\n return vch;\n };\n};\n//# sourceMappingURL=utils.js.map","// #region base64\nexport const fromBase64 = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'loose' });\n};\nexport const toBase64 = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: true });\n};\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64', lastChunkHandling: 'strict' });\n};\nexport const toBase64Pad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64', omitPadding: false });\n};\n// #endregion\n// #region base64url\nexport const fromBase64Url = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'loose' });\n};\nexport const toBase64Url = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: true });\n};\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = (str) => {\n return Uint8Array.fromBase64(str, { alphabet: 'base64url', lastChunkHandling: 'strict' });\n};\nexport const toBase64UrlPad = (bytes) => {\n return bytes.toBase64({ alphabet: 'base64url', omitPadding: false });\n};\n// #endregion\n//# sourceMappingURL=base64-web-native.js.map","import { createRfc4648Decode, createRfc4648Encode } from '../utils.js';\nconst BASE64_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst BASE64URL_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n// #region base64\nexport const fromBase64 = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, false);\nexport const toBase64 = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, false);\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = /*#__PURE__*/ createRfc4648Decode(BASE64_CHARSET, 6, true);\nexport const toBase64Pad = /*#__PURE__*/ createRfc4648Encode(BASE64_CHARSET, 6, true);\n// #endregion\n// #region base64url\nexport const fromBase64Url = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, false);\nexport const toBase64Url = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, false);\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = /*#__PURE__*/ createRfc4648Decode(BASE64URL_CHARSET, 6, true);\nexport const toBase64UrlPad = /*#__PURE__*/ createRfc4648Encode(BASE64URL_CHARSET, 6, true);\n// #endregion\n//# sourceMappingURL=base64-web-polyfill.js.map","import { fromBase64 as fromBase64Native, fromBase64Pad as fromBase64PadNative, fromBase64Url as fromBase64UrlNative, fromBase64UrlPad as fromBase64UrlPadNative, toBase64 as toBase64Native, toBase64Pad as toBase64PadNative, toBase64Url as toBase64UrlNative, toBase64UrlPad as toBase64UrlPadNative, } from './base64-web-native.js';\nimport { fromBase64Pad as fromBase64PadPolyfill, fromBase64 as fromBase64Polyfill, fromBase64UrlPad as fromBase64UrlPadPolyfill, fromBase64Url as fromBase64UrlPolyfill, toBase64Pad as toBase64PadPolyfill, toBase64 as toBase64Polyfill, toBase64UrlPad as toBase64UrlPadPolyfill, toBase64Url as toBase64UrlPolyfill, } from './base64-web-polyfill.js';\nconst HAS_NATIVE_SUPPORT = 'fromBase64' in Uint8Array;\n// #region base64\nexport const fromBase64 = !HAS_NATIVE_SUPPORT ? fromBase64Polyfill : fromBase64Native;\nexport const toBase64 = !HAS_NATIVE_SUPPORT ? toBase64Polyfill : toBase64Native;\n// #endregion\n// #region base64pad\nexport const fromBase64Pad = !HAS_NATIVE_SUPPORT ? fromBase64PadPolyfill : fromBase64PadNative;\nexport const toBase64Pad = !HAS_NATIVE_SUPPORT ? toBase64PadPolyfill : toBase64PadNative;\n// #endregion\n// #region base64url\nexport const fromBase64Url = !HAS_NATIVE_SUPPORT ? fromBase64UrlPolyfill : fromBase64UrlNative;\nexport const toBase64Url = !HAS_NATIVE_SUPPORT ? toBase64UrlPolyfill : toBase64UrlNative;\n// #endregion\n// #region base64urlpad\nexport const fromBase64UrlPad = !HAS_NATIVE_SUPPORT ? fromBase64UrlPadPolyfill : fromBase64UrlPadNative;\nexport const toBase64UrlPad = !HAS_NATIVE_SUPPORT ? toBase64UrlPadPolyfill : toBase64UrlPadNative;\n// #endregion\n//# sourceMappingURL=base64-web.js.map","import { nanoid } from 'nanoid';\nimport { toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8, toSha256 } from '@atcute/uint8array';\nexport const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\nexport const stringToSha256 = async (input) => {\n const bytes = encodeUtf8(input);\n const digest = await toSha256(bytes);\n return toBase64Url(digest);\n};\nexport const generatePKCE = async () => {\n const verifier = nanoid(64);\n return {\n verifier: verifier,\n challenge: await stringToSha256(verifier),\n method: 'S256',\n };\n};\n//# sourceMappingURL=runtime.js.map","import { locks } from '../utils/runtime.js';\nconst parse = (raw) => {\n if (raw != null) {\n const parsed = JSON.parse(raw);\n if (parsed != null) {\n return parsed;\n }\n }\n return {};\n};\nexport const createOAuthDatabase = ({ name }) => {\n const controller = new AbortController();\n const signal = controller.signal;\n const createStore = (subname, expiresAt, persistUpdatedAt = false) => {\n let store;\n const storageKey = `${name}:${subname}`;\n const persist = () => store && localStorage.setItem(storageKey, JSON.stringify(store));\n const read = () => {\n if (signal.aborted) {\n throw new Error(`store closed`);\n }\n return (store ??= parse(localStorage.getItem(storageKey)));\n };\n {\n const listener = (ev) => {\n if (ev.key === storageKey) {\n store = undefined;\n }\n };\n globalThis.addEventListener('storage', listener, { signal });\n }\n {\n const cleanup = async (lock) => {\n if (!lock || signal.aborted) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 10_000));\n if (signal.aborted) {\n return;\n }\n let now = Date.now();\n let changed = false;\n read();\n for (const key in store) {\n const item = store[key];\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && now > expiresAt) {\n changed = true;\n delete store[key];\n }\n }\n if (changed) {\n persist();\n }\n };\n if (locks) {\n locks.request(`${storageKey}:cleanup`, { ifAvailable: true }, cleanup);\n }\n else {\n cleanup(true);\n }\n }\n return {\n get(key) {\n read();\n const item = store[key];\n if (!item) {\n return;\n }\n const expiresAt = item.expiresAt;\n if (expiresAt !== null && Date.now() > expiresAt) {\n delete store[key];\n persist();\n return;\n }\n return item.value;\n },\n getWithLapsed(key) {\n read();\n const item = store[key];\n const now = Date.now();\n if (!item) {\n return [undefined, Infinity];\n }\n const updatedAt = item.updatedAt;\n if (updatedAt === undefined) {\n return [item.value, Infinity];\n }\n return [item.value, now - updatedAt];\n },\n set(key, value) {\n read();\n const item = {\n value: value,\n expiresAt: expiresAt(value),\n updatedAt: persistUpdatedAt ? Date.now() : undefined,\n };\n store[key] = item;\n persist();\n },\n delete(key) {\n read();\n if (store[key] !== undefined) {\n delete store[key];\n persist();\n }\n },\n keys() {\n read();\n return Object.keys(store);\n },\n };\n };\n return {\n dispose: () => {\n controller.abort();\n },\n sessions: createStore('sessions', ({ token }) => {\n if (token.refresh) {\n return null;\n }\n return token.expires_at ?? null;\n }),\n states: createStore('states', (_item) => Date.now() + 10 * 60 * 1_000), // 10 minutes\n // The reference PDS have nonces that expire after 3 minutes, while other\n // implementations can have varying expiration times.\n // Stored for 24 hours.\n dpopNonces: createStore('dpopNonces', (_item) => Date.now() + 24 * 60 * 60 * 1_000, true),\n inflightDpop: new Map(),\n };\n};\n//# sourceMappingURL=db.js.map","import { createOAuthDatabase } from './store/db.js';\nexport let CLIENT_ID;\nexport let REDIRECT_URI;\nexport let database;\nexport const configureOAuth = (options) => {\n ({ client_id: CLIENT_ID, redirect_uri: REDIRECT_URI } = options.metadata);\n database = createOAuthDatabase({ name: options.storageName ?? 'atcute-oauth' });\n};\n//# sourceMappingURL=environment.js.map","export class LoginError extends Error {\n name = 'LoginError';\n}\nexport class AuthorizationError extends Error {\n name = 'AuthorizationError';\n}\nexport class ResolverError extends Error {\n name = 'ResolverError';\n}\nexport class TokenRefreshError extends Error {\n sub;\n name = 'TokenRefreshError';\n constructor(sub, message, options) {\n super(message, options);\n this.sub = sub;\n }\n}\nexport class OAuthResponseError extends Error {\n response;\n data;\n name = 'OAuthResponseError';\n error;\n description;\n constructor(response, data) {\n const error = ifString(ifObject(data)?.['error']);\n const errorDescription = ifString(ifObject(data)?.['error_description']);\n const messageError = error ? `\"${error}\"` : 'unknown';\n const messageDesc = errorDescription ? `: ${errorDescription}` : '';\n const message = `OAuth ${messageError} error${messageDesc}`;\n super(message);\n this.response = response;\n this.data = data;\n this.error = error;\n this.description = errorDescription;\n }\n get status() {\n return this.response.status;\n }\n get headers() {\n return this.response.headers;\n }\n}\nexport class FetchResponseError extends Error {\n response;\n status;\n name = 'FetchResponseError';\n constructor(response, status, message) {\n super(message);\n this.response = response;\n this.status = status;\n }\n}\nconst ifString = (v) => {\n return typeof v === 'string' ? v : undefined;\n};\nconst ifObject = (v) => {\n return typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;\n};\n//# sourceMappingURL=errors.js.map","const DID_RE = /^did:([a-z]+):([a-zA-Z0-9._:%\\-]*[a-zA-Z0-9._\\-])$/;\n// #__NO_SIDE_EFFECTS__\nexport const isDid = (input) => {\n return typeof input === 'string' && input.length >= 7 && input.length <= 2048 && DID_RE.test(input);\n};\n//# sourceMappingURL=did.js.map","import { isHandle } from '@atcute/lexicons/syntax';\nimport * as t from './types.js';\nconst isUrlParseSupported = 'parse' in URL;\nexport const isAtprotoServiceEndpoint = (input) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(input);\n }\n else {\n try {\n url = new URL(input);\n }\n catch { }\n }\n return (url !== null &&\n (url.protocol === 'https:' || url.protocol === 'http:') &&\n url.pathname === '/' &&\n url.search === '' &&\n url.hash === '');\n};\nexport const getVerificationMaterial = (doc, id) => {\n const verificationMethods = doc.verificationMethod;\n if (!verificationMethods) {\n return;\n }\n const expectedId = `${doc.id}${id}`;\n for (let idx = 0, len = verificationMethods.length; idx < len; idx++) {\n const { id, type, publicKeyMultibase } = verificationMethods[idx];\n if (id !== expectedId) {\n continue;\n }\n if (publicKeyMultibase === undefined) {\n continue;\n }\n return { type, publicKeyMultibase };\n }\n};\nexport const getAtprotoVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto');\n};\nexport const getAtprotoLabelerVerificationMaterial = (doc) => {\n return getVerificationMaterial(doc, '#atproto_label');\n};\nexport const getAtprotoHandle = (doc) => {\n const alsoKnownAs = doc.alsoKnownAs;\n if (!alsoKnownAs) {\n return null;\n }\n const PREFIX = 'at://';\n for (let idx = 0, len = alsoKnownAs.length; idx < len; idx++) {\n const aka = alsoKnownAs[idx];\n if (!aka.startsWith(PREFIX)) {\n continue;\n }\n const raw = aka.slice(PREFIX.length);\n if (!isHandle(raw)) {\n return undefined;\n }\n return raw;\n }\n return null;\n};\nexport const getAtprotoServiceEndpoint = (doc, predicate) => {\n const services = doc.service;\n if (!services) {\n return;\n }\n for (let idx = 0, len = services.length; idx < len; idx++) {\n const { id, type, serviceEndpoint } = services[idx];\n if (id !== predicate.id && id !== doc.id + predicate.id) {\n continue;\n }\n if (predicate.type !== undefined) {\n if (Array.isArray(type)) {\n if (!type.includes(predicate.type)) {\n continue;\n }\n }\n else {\n if (type !== predicate.type) {\n continue;\n }\n }\n }\n if (typeof serviceEndpoint !== 'string' || !isAtprotoServiceEndpoint(serviceEndpoint)) {\n continue;\n }\n return serviceEndpoint;\n }\n};\nexport const getPdsEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_pds',\n type: 'AtprotoPersonalDataServer',\n });\n};\nexport const getLabelerEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#atproto_labeler',\n type: 'AtprotoLabeler',\n });\n};\nexport const getBlueskyChatEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_chat',\n type: 'BskyChatService',\n });\n};\nexport const getBlueskyFeedgenEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_fg',\n type: 'BskyFeedGenerator',\n });\n};\nexport const getBlueskyNotificationEndpoint = (doc) => {\n return getAtprotoServiceEndpoint(doc, {\n id: '#bsky_notif',\n type: 'BskyNotificationService',\n });\n};\n//# sourceMappingURL=utils.js.map","export const DEFAULT_APPVIEW_URL = 'https://public.api.bsky.app';\n//# sourceMappingURL=constants.js.map","export const extractContentType = (headers) => {\n return headers.get('content-type')?.split(';')[0];\n};\n//# sourceMappingURL=response.js.map","const isUrlParseSupported = 'parse' in URL;\nexport const isValidUrl = (urlString) => {\n let url = null;\n if (isUrlParseSupported) {\n url = URL.parse(urlString);\n }\n else {\n try {\n url = new URL(urlString);\n }\n catch { }\n }\n if (url !== null) {\n return url.protocol === 'https:' || url.protocol === 'http:';\n }\n return false;\n};\n//# sourceMappingURL=strings.js.map","import { getPdsEndpoint } from '@atcute/identity';\nimport { isDid } from '@atcute/lexicons/syntax';\nimport { DEFAULT_APPVIEW_URL } from './constants.js';\nimport { ResolverError } from './errors.js';\nimport { extractContentType } from './utils/response.js';\nimport { isValidUrl } from './utils/strings.js';\nconst DID_WEB_RE = /^([a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(?:\\.[a-zA-Z]{2,}))$/;\n/**\n * Resolves domain handles into DID identifiers, by requesting Bluesky's AppView\n * for identity resolution.\n * @param handle Domain handle to resolve\n * @returns DID identifier resolved from the domain handle\n */\nexport const resolveHandle = async (handle) => {\n const url = DEFAULT_APPVIEW_URL + `/xrpc/com.atproto.identity.resolveHandle` + `?handle=${handle}`;\n const response = await fetch(url);\n if (response.status === 400) {\n throw new ResolverError(`domain handle not found`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = (await response.json());\n return json.did;\n};\n/**\n * Get DID documents of did:plc (via plc.directory) and did:web identifiers\n * @param did DID identifier we're seeking DID doc from\n * @returns Retrieved DID document\n */\nexport const getDidDocument = async (did) => {\n const colon_index = did.indexOf(':', 4);\n const type = did.slice(4, colon_index);\n const ident = did.slice(colon_index + 1);\n // 2. retrieve their DID documents\n let doc;\n if (type === 'plc') {\n const response = await fetch(`https://plc.directory/${did}`);\n if (response.status === 404) {\n throw new ResolverError(`did not found in directory`);\n }\n else if (!response.ok) {\n throw new ResolverError(`directory is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else if (type === 'web') {\n if (!DID_WEB_RE.test(ident)) {\n throw new ResolverError(`invalid identifier`);\n }\n const response = await fetch(`https://${ident}/.well-known/did.json`);\n if (!response.ok) {\n throw new ResolverError(`did document is unreachable`);\n }\n const json = await response.json();\n doc = json;\n }\n else {\n throw new ResolverError(`unsupported did method`);\n }\n return doc;\n};\n/**\n * Get OAuth protected resource metadata from a host\n * @param host URL of the host\n * @returns Retrieved protected resource metadata\n */\nexport const getProtectedResourceMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-protected-resource`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.resource !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n return metadata;\n};\n/**\n * Get OAuth authorization server metadata from a host\n * @param host URL of the host\n * @returns Retrieved authorization server metadata\n */\nexport const getAuthorizationServerMetadata = async (host) => {\n const url = new URL(`/.well-known/oauth-authorization-server`, host);\n const response = await fetch(url, {\n redirect: 'manual',\n headers: {\n accept: 'application/json',\n },\n });\n if (response.status !== 200 || extractContentType(response.headers) !== 'application/json') {\n throw new ResolverError(`unexpected response`);\n }\n const metadata = (await response.json());\n if (metadata.issuer !== url.origin) {\n throw new ResolverError(`unexpected issuer`);\n }\n if (!isValidUrl(metadata.authorization_endpoint)) {\n throw new ResolverError(`authorization server provided incorrect authorization endpoint`);\n }\n if (!metadata.client_id_metadata_document_supported) {\n throw new ResolverError(`authorization server does not support 'client_id_metadata_document'`);\n }\n if (!metadata.pushed_authorization_request_endpoint) {\n throw new ResolverError(`authorization server does not support 'pushed_authorization request'`);\n }\n if (metadata.response_types_supported) {\n if (!metadata.response_types_supported.includes('code')) {\n throw new ResolverError(`authorization server does not support 'code' response type`);\n }\n }\n return metadata;\n};\n/**\n * Resolve handle domains or DID identifiers to get their PDS and its authorization server metadata\n * @param ident Handle domain or DID identifier to resolve\n * @returns Resolved PDS and authorization server metadata\n */\nexport const resolveFromIdentity = async (ident) => {\n let did;\n if (isDid(ident)) {\n did = ident;\n }\n else {\n const resolved = await resolveHandle(ident);\n did = resolved;\n }\n const doc = await getDidDocument(did);\n const pds = getPdsEndpoint(doc);\n if (!pds) {\n throw new ResolverError(`missing pds endpoint`);\n }\n return {\n identity: {\n id: did,\n raw: ident,\n pds: new URL(pds),\n },\n metadata: await getMetadataFromResourceServer(pds),\n };\n};\n/**\n * Request authorization server metadata from a PDS\n * @param host URL of the host\n * @returns Resolved authorization server metadata\n */\nexport const resolveFromService = async (host) => {\n try {\n const metadata = await getMetadataFromResourceServer(host);\n return { metadata };\n }\n catch (err) {\n if (err instanceof ResolverError) {\n try {\n const metadata = await getAuthorizationServerMetadata(host);\n return { metadata };\n }\n catch { }\n }\n throw err;\n }\n};\n/**\n * Request authorization server metadata from its protected resource metadata\n * @param input URL of the host whose authorization server is delegated\n * @returns Resolved authorization server metadata\n */\nexport const getMetadataFromResourceServer = async (input) => {\n const rs_metadata = await getProtectedResourceMetadata(input);\n if (rs_metadata.authorization_servers?.length !== 1) {\n throw new ResolverError(`expected exactly one authorization server in the listing`);\n }\n const issuer = rs_metadata.authorization_servers[0];\n const as_metadata = await getAuthorizationServerMetadata(issuer);\n if (as_metadata.protected_resources) {\n if (!as_metadata.protected_resources.includes(rs_metadata.resource)) {\n throw new ResolverError(`server is not in authorization server's jurisdiction`);\n }\n }\n return as_metadata;\n};\n//# sourceMappingURL=resolvers.js.map","import { fromBase64Url, toBase64Url } from '@atcute/multibase';\nimport { encodeUtf8 } from '@atcute/uint8array';\nimport { nanoid } from 'nanoid';\nimport { database } from './environment.js';\nimport { extractContentType } from './utils/response.js';\nimport { stringToSha256 } from './utils/runtime.js';\nconst ES256_ALG = { name: 'ECDSA', namedCurve: 'P-256' };\nexport const createES256Key = async () => {\n const pair = await crypto.subtle.generateKey(ES256_ALG, true, ['sign', 'verify']);\n const key = await crypto.subtle.exportKey('pkcs8', pair.privateKey);\n const { ext: _ext, key_ops: _key_opts, ...jwk } = await crypto.subtle.exportKey('jwk', pair.publicKey);\n return {\n typ: 'ES256',\n key: toBase64Url(new Uint8Array(key)),\n jwt: toBase64Url(encodeUtf8(JSON.stringify({ typ: 'dpop+jwt', alg: 'ES256', jwk: jwk }))),\n };\n};\nexport const createDPoPSignage = (dpopKey) => {\n const headerString = dpopKey.jwt;\n const keyPromise = crypto.subtle.importKey('pkcs8', fromBase64Url(dpopKey.key), ES256_ALG, true, ['sign']);\n const constructPayload = (htm, htu, nonce, ath) => {\n const payload = {\n ath: ath,\n htm: htm,\n htu: htu,\n iat: Math.floor(Date.now() / 1_000),\n jti: nanoid(24),\n nonce: nonce,\n };\n return toBase64Url(encodeUtf8(JSON.stringify(payload)));\n };\n return async (method, htu, nonce, ath) => {\n const payloadString = constructPayload(method, htu, nonce, ath);\n const signed = await crypto.subtle.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, await keyPromise, encodeUtf8(headerString + '.' + payloadString));\n const signatureString = toBase64Url(new Uint8Array(signed));\n return headerString + '.' + payloadString + '.' + signatureString;\n };\n};\nexport const createDPoPFetch = (dpopKey, isAuthServer) => {\n const nonces = database.dpopNonces;\n const pending = database.inflightDpop;\n const sign = createDPoPSignage(dpopKey);\n return async (input, init) => {\n const request = new Request(input, init);\n const authorizationHeader = request.headers.get('authorization');\n const ath = authorizationHeader?.startsWith('DPoP ')\n ? await stringToSha256(authorizationHeader.slice(5))\n : undefined;\n const { method, url } = request;\n const { origin, pathname } = new URL(url);\n const htu = origin + pathname;\n // See if we have a pending promise for this origin, we'll await before\n // proceeding with this request, next comment describes what the promise\n // is meant to be.\n let deferred = pending.get(origin);\n if (deferred) {\n await deferred.promise;\n deferred = undefined;\n }\n // Get our persisted nonce value for this origin\n let initNonce;\n let expiredOrMissing = false;\n try {\n const [nonce, lapsed] = nonces.getWithLapsed(origin);\n initNonce = nonce;\n // The problem with DPoP nonces is that we don't have insight as to when\n // they'll expire, either we have a nonce value or we don't.\n //\n // Which is very unfortunate, if the client makes multiple requests at the\n // same time, there's a chance that all of them will fail due to the nonce\n // value having expired.\n //\n // To make this less painful, if it's been over 3 minutes since we last\n // had a nonce value, or we never had one to begin with, we'll let this\n // request through and defer everyone else until we get a possibly fresh\n // nonce value.\n //\n // 3 minutes being the DPoP nonce expiration time set by the reference PDS\n // implementation.\n expiredOrMissing = lapsed > 3 * 60 * 1_000;\n }\n catch {\n // Ignore read errors, we'll just act like we're missing a nonce.\n }\n if (expiredOrMissing) {\n // Defer everyone else until this request finishes.\n pending.set(origin, (deferred = Promise.withResolvers()));\n }\n let nextNonce;\n try {\n const initProof = await sign(method, htu, initNonce, ath);\n request.headers.set('dpop', initProof);\n const initResponse = await fetch(request);\n nextNonce = initResponse.headers.get('dpop-nonce');\n if (nextNonce === null || nextNonce === initNonce) {\n // No nonce was returned or it is the same as the one we sent. No need to\n // update the nonce store, or retry the request.\n return initResponse;\n }\n // Store the fresh nonce for future requests\n try {\n nonces.set(origin, nextNonce);\n }\n catch {\n // Ignore write errors\n }\n const shouldRetry = await isUseDpopNonceError(initResponse, isAuthServer);\n if (!shouldRetry) {\n // Not a \"use_dpop_nonce\" error, so there is no need to retry\n return initResponse;\n }\n if (input === request || init?.body instanceof ReadableStream) {\n // If the input stream was already consumed, we cannot retry the request. A\n // solution would be to clone() the request but that would bufferize the\n // entire stream in memory which can lead to memory starvation. Instead, we\n // will return the original response and let the calling code handle retries.\n return initResponse;\n }\n }\n finally {\n // Now everyone can have their turn.\n if (deferred) {\n pending.delete(origin);\n deferred.resolve();\n }\n }\n // We got here because we were asked to retry the request (due to missing\n // nonce value in the first request), let's do just that.\n {\n const nextProof = await sign(method, htu, nextNonce, ath);\n const nextRequest = new Request(input, init);\n nextRequest.headers.set('dpop', nextProof);\n const retryResponse = await fetch(nextRequest);\n // Check if the server returned another new nonce in the retry response\n const retryNonce = retryResponse.headers.get('dpop-nonce');\n if (retryNonce !== null && retryNonce !== nextNonce) {\n try {\n nonces.set(origin, retryNonce);\n }\n catch {\n // Ignore write errors\n }\n }\n return retryResponse;\n }\n };\n};\nconst isUseDpopNonceError = async (response, isAuthServer) => {\n // https://datatracker.ietf.org/doc/html/rfc6750#section-3\n // https://datatracker.ietf.org/doc/html/rfc9449#name-resource-server-provided-no\n if (isAuthServer === undefined || isAuthServer === false) {\n if (response.status === 401) {\n const wwwAuth = response.headers.get('www-authenticate');\n if (wwwAuth?.startsWith('DPoP')) {\n return wwwAuth.includes('error=\"use_dpop_nonce\"');\n }\n }\n }\n // https://datatracker.ietf.org/doc/html/rfc9449#name-authorization-server-provid\n if (isAuthServer === undefined || isAuthServer === true) {\n if (response.status === 400 && extractContentType(response.headers) === 'application/json') {\n try {\n const json = await response.clone().json();\n return typeof json === 'object' && json?.['error'] === 'use_dpop_nonce';\n }\n catch {\n // Response too big (to be \"use_dpop_nonce\" error) or invalid JSON\n return false;\n }\n }\n }\n return false;\n};\n//# sourceMappingURL=dpop.js.map","export const pick = (obj, keys) => {\n const cloned = {};\n for (let idx = 0, len = keys.length; idx < len; idx++) {\n const key = keys[idx];\n // @ts-expect-error\n cloned[key] = obj[key];\n }\n return cloned;\n};\n//# sourceMappingURL=misc.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { CLIENT_ID, REDIRECT_URI } from '../environment.js';\nimport { FetchResponseError, OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { resolveFromIdentity } from '../resolvers.js';\nimport { pick } from '../utils/misc.js';\nimport { extractContentType } from '../utils/response.js';\nexport class OAuthServerAgent {\n #fetch;\n #metadata;\n constructor(metadata, dpopKey) {\n this.#metadata = metadata;\n this.#fetch = createDPoPFetch(dpopKey, true);\n }\n async request(endpoint, payload) {\n const url = this.#metadata[`${endpoint}_endpoint`];\n if (!url) {\n throw new Error(`no endpoint for ${endpoint}`);\n }\n const response = await this.#fetch(url, {\n method: 'post',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ ...payload, client_id: CLIENT_ID }),\n });\n if (extractContentType(response.headers) !== 'application/json') {\n throw new FetchResponseError(response, 2, `unexpected content-type`);\n }\n const json = await response.json();\n if (response.ok) {\n return json;\n }\n else {\n throw new OAuthResponseError(response, json);\n }\n }\n async revoke(token) {\n try {\n await this.request('revocation', { token: token });\n }\n catch { }\n }\n async exchangeCode(code, verifier) {\n const response = await this.request('token', {\n grant_type: 'authorization_code',\n redirect_uri: REDIRECT_URI,\n code: code,\n code_verifier: verifier,\n });\n try {\n return await this.#processExchangeResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n async refresh({ sub, token }) {\n if (!token.refresh) {\n throw new TokenRefreshError(sub, 'no refresh token available');\n }\n const response = await this.request('token', {\n grant_type: 'refresh_token',\n refresh_token: token.refresh,\n });\n try {\n if (sub !== response.sub) {\n throw new TokenRefreshError(sub, `sub mismatch in token response; got ${response.sub}`);\n }\n return this.#processTokenResponse(response);\n }\n catch (err) {\n await this.revoke(response.access_token);\n throw err;\n }\n }\n #processTokenResponse(res) {\n if (!res.sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n if (!res.scope) {\n throw new TypeError(`missing scope field in token response`);\n }\n if (res.token_type !== 'DPoP') {\n throw new TypeError(`token response returned a non-dpop token`);\n }\n return {\n scope: res.scope,\n refresh: res.refresh_token,\n access: res.access_token,\n type: res.token_type,\n expires_at: typeof res.expires_in === 'number' ? Date.now() + res.expires_in * 1_000 : undefined,\n };\n }\n async #processExchangeResponse(res) {\n const sub = res.sub;\n if (!sub) {\n throw new TypeError(`missing sub field in token response`);\n }\n const token = this.#processTokenResponse(res);\n const resolved = await resolveFromIdentity(sub);\n if (resolved.metadata.issuer !== this.#metadata.issuer) {\n throw new TypeError(`issuer mismatch; got ${resolved.metadata.issuer}`);\n }\n return {\n token: token,\n info: {\n sub: sub,\n aud: resolved.identity.pds.href,\n server: pick(resolved.metadata, [\n 'issuer',\n 'authorization_endpoint',\n 'introspection_endpoint',\n 'pushed_authorization_request_endpoint',\n 'revocation_endpoint',\n 'token_endpoint',\n ]),\n },\n };\n }\n}\n//# sourceMappingURL=server-agent.js.map","import { database } from '../environment.js';\nimport { OAuthResponseError, TokenRefreshError } from '../errors.js';\nimport { locks } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nconst pending = new Map();\nexport const getSession = async (sub, options) => {\n options?.signal?.throwIfAborted();\n let allowStored = isTokenUsable;\n if (options?.noCache) {\n allowStored = returnFalse;\n }\n else if (options?.allowStale) {\n allowStored = returnTrue;\n }\n // As long as concurrent requests are made for the same key, only one\n // request will be made to the cache & getter function at a time. This works\n // because there is no async operation between the while() loop and the\n // pending.set() call. Because of the \"single threaded\" nature of\n // JavaScript, the pending item will be set before the next iteration of the\n // while loop.\n let previousExecutionFlow;\n while ((previousExecutionFlow = pending.get(sub))) {\n try {\n const { isFresh, value } = await previousExecutionFlow;\n if (isFresh || allowStored(value)) {\n return value;\n }\n }\n catch {\n // Ignore errors from previous execution flows (they will have been\n // propagated by that flow).\n }\n options?.signal?.throwIfAborted();\n }\n const run = async () => {\n const storedSession = database.sessions.get(sub);\n if (storedSession && allowStored(storedSession)) {\n // Use the stored value as return value for the current execution\n // flow. Notify other concurrent execution flows (that should be\n // \"stuck\" in the loop before until this promise resolves) that we got\n // a value, but that it came from the store (isFresh = false).\n return { isFresh: false, value: storedSession };\n }\n const newSession = await refreshToken(sub, storedSession);\n await storeSession(sub, newSession);\n return { isFresh: true, value: newSession };\n };\n let promise;\n if (locks) {\n promise = locks.request(`atcute-oauth:${sub}`, run);\n }\n else {\n promise = run();\n }\n promise = promise.finally(() => pending.delete(sub));\n if (pending.has(sub)) {\n // This should never happen. Indeed, there must not be any 'await'\n // statement between this and the loop iteration check meaning that\n // this.pending.get returned undefined. It is there to catch bugs that\n // would occur in future changes to the code.\n throw new Error('concurrent request for the same key');\n }\n pending.set(sub, promise);\n const { value } = await promise;\n return value;\n};\nexport const storeSession = async (sub, newSession) => {\n try {\n database.sessions.set(sub, newSession);\n }\n catch (err) {\n await onRefreshError(newSession);\n throw err;\n }\n};\nexport const deleteStoredSession = (sub) => {\n database.sessions.delete(sub);\n};\nexport const listStoredSessions = () => {\n return database.sessions.keys();\n};\nconst returnTrue = () => true;\nconst returnFalse = () => false;\nconst refreshToken = async (sub, storedSession) => {\n if (storedSession === undefined) {\n throw new TokenRefreshError(sub, `session deleted by another tab`);\n }\n const { dpopKey, info, token } = storedSession;\n const server = new OAuthServerAgent(info.server, dpopKey);\n try {\n const newToken = await server.refresh({ sub: info.sub, token });\n return { dpopKey, info, token: newToken };\n }\n catch (cause) {\n if (cause instanceof OAuthResponseError && cause.status === 400 && cause.error === 'invalid_grant') {\n throw new TokenRefreshError(sub, `session was revoked`, { cause });\n }\n throw cause;\n }\n};\nconst onRefreshError = async ({ dpopKey, info, token }) => {\n // If the token data cannot be stored, let's revoke it\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n};\nconst isTokenUsable = ({ token }) => {\n const expires = token.expires_at;\n return expires == null || Date.now() + 60_000 <= expires;\n};\n//# sourceMappingURL=sessions.js.map","import { nanoid } from 'nanoid';\nimport { createES256Key } from '../dpop.js';\nimport { CLIENT_ID, database, REDIRECT_URI } from '../environment.js';\nimport { AuthorizationError, LoginError } from '../errors.js';\nimport { generatePKCE } from '../utils/runtime.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { storeSession } from './sessions.js';\n/**\n * Create authentication URL for authorization\n * @param options\n * @returns URL to redirect the user for authorization\n */\nexport const createAuthorizationUrl = async ({ metadata, identity, scope, }) => {\n const state = nanoid(24);\n const pkce = await generatePKCE();\n const dpopKey = await createES256Key();\n const params = {\n redirect_uri: REDIRECT_URI,\n code_challenge: pkce.challenge,\n code_challenge_method: pkce.method,\n state: state,\n login_hint: identity?.raw,\n response_mode: 'fragment',\n response_type: 'code',\n display: 'page',\n // id_token_hint: undefined,\n // max_age: undefined,\n // prompt: undefined,\n scope: scope,\n // ui_locales: undefined,\n };\n database.states.set(state, {\n dpopKey: dpopKey,\n metadata: metadata,\n verifier: pkce.verifier,\n });\n const server = new OAuthServerAgent(metadata, dpopKey);\n const response = await server.request('pushed_authorization_request', params);\n const authUrl = new URL(metadata.authorization_endpoint);\n authUrl.searchParams.set('client_id', CLIENT_ID);\n authUrl.searchParams.set('request_uri', response.request_uri);\n return authUrl;\n};\n/**\n * Finalize authorization\n * @param params Search params\n * @returns Session object, which you can use to instantiate user agents\n */\nexport const finalizeAuthorization = async (params) => {\n const issuer = params.get('iss');\n const state = params.get('state');\n const code = params.get('code');\n const error = params.get('error');\n if (!state || !(code || error)) {\n throw new LoginError(`missing parameters`);\n }\n const stored = database.states.get(state);\n if (stored) {\n // Delete now that we've caught it\n database.states.delete(state);\n }\n else {\n throw new LoginError(`unknown state provided`);\n }\n const dpopKey = stored.dpopKey;\n const metadata = stored.metadata;\n if (error) {\n throw new AuthorizationError(params.get('error_description') || error);\n }\n if (!code) {\n throw new LoginError(`missing code parameter`);\n }\n if (issuer === null) {\n throw new LoginError(`missing issuer parameter`);\n }\n else if (issuer !== metadata.issuer) {\n throw new LoginError(`issuer mismatch`);\n }\n // Retrieve authentication tokens\n const server = new OAuthServerAgent(metadata, dpopKey);\n const { info, token } = await server.exchangeCode(code, stored.verifier);\n // We're finished!\n const sub = info.sub;\n const session = { dpopKey, info, token };\n await storeSession(sub, session);\n return session;\n};\n//# sourceMappingURL=exchange.js.map","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","// Storage adapter that mimics browser.storage.local API but uses localStorage\n// This allows sharing code between extension and via-client\n\nexport const storage = {\n local: {\n async get(keys?: string | string[] | Record<string, any>): Promise<Record<string, any>> {\n if (!keys) {\n // Get all items\n const result: Record<string, any> = {};\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key) {\n try {\n result[key] = JSON.parse(localStorage.getItem(key) || 'null');\n } catch {\n result[key] = localStorage.getItem(key);\n }\n }\n }\n return result;\n }\n\n const result: Record<string, any> = {};\n \n if (typeof keys === 'string') {\n // Single key\n try {\n const value = localStorage.getItem(keys);\n result[keys] = value ? JSON.parse(value) : null;\n } catch {\n result[keys] = localStorage.getItem(keys);\n }\n } else if (Array.isArray(keys)) {\n // Array of keys\n keys.forEach(key => {\n try {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n } catch {\n result[key] = localStorage.getItem(key);\n }\n });\n } else {\n // Object with default values\n Object.keys(keys).forEach(key => {\n try {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : keys[key];\n } catch {\n result[key] = localStorage.getItem(key) || keys[key];\n }\n });\n }\n \n return result;\n },\n\n async set(items: Record<string, any>): Promise<void> {\n Object.entries(items).forEach(([key, value]) => {\n localStorage.setItem(key, JSON.stringify(value));\n });\n },\n\n async remove(keys: string | string[]): Promise<void> {\n const keysArray = Array.isArray(keys) ? keys : [keys];\n keysArray.forEach(key => localStorage.removeItem(key));\n },\n\n async clear(): Promise<void> {\n localStorage.clear();\n },\n },\n};\n","// Web-compatible OAuth implementation (for via-client)\n// Adapted from lib/oauth.ts to work without browser.* APIs\n\nimport {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport { storage } from \"./storage-adapter\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nlet isOAuthInitialized = false;\n\nexport function initializeOAuth() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n // Use web redirect URL for via proxy\n configureOAuth({\n metadata: {\n client_id: import.meta.env.VITE_OAUTH_CLIENT_ID || 'http://localhost:8081/static/client-metadata.json',\n redirect_uri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'http://localhost:8081/static/oauth-callback.html',\n },\n });\n isOAuthInitialized = true;\n }\n}\n\nexport async function startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth-web] Starting login process for handle:', handle);\n initializeOAuth();\n \n console.log('[oauth-web] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth-web] PDS metadata:', metadata);\n \n console.log('[oauth-web] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic',\n });\n console.log('[oauth-web] Auth URL:', authUrl.toString());\n\n // For web context, redirect to auth URL\n window.location.href = authUrl.toString();\n}\n\nexport async function handleOAuthCallback(): Promise<OAuthSession | null> {\n console.log('[oauth-web] Handling OAuth callback');\n \n // Parse OAuth response from URL (params can be in search or hash)\n const url = new URL(window.location.href);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth-web] OAuth params:', Object.fromEntries(params));\n\n if (!params.has('code') && !params.has('error')) {\n console.log('[oauth-web] No OAuth params found');\n return null;\n }\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth-web] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth-web] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth-web] Authorization complete, session:', session);\n\n // Store session\n await saveSession(session);\n console.log('[oauth-web] Session saved successfully');\n\n return session;\n}\n\nexport async function saveSession(session: OAuthSession): Promise<void> {\n await storage.local.set({ [OAUTH_SESSION_KEY]: session });\n}\n\nexport async function loadSession(): Promise<OAuthSession | null> {\n const result = await storage.local.get(OAUTH_SESSION_KEY);\n return result[OAUTH_SESSION_KEY] || null;\n}\n\nexport async function clearSession(): Promise<void> {\n await storage.local.remove(OAUTH_SESSION_KEY);\n}\n\nexport async function getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet","textEncoder","subtle","alloc","allocUnsafe","encodeUtf8","str","toSha256","buffer","createRfc4648Encode","alphabet","bitsPerChar","pad","mask","bits","i","createRfc4648Decode","codes","end","written","value","fromBase64Url","toBase64Url","BASE64URL_CHARSET","HAS_NATIVE_SUPPORT","fromBase64UrlNative","fromBase64UrlPolyfill","toBase64UrlNative","toBase64UrlPolyfill","locks","stringToSha256","input","digest","generatePKCE","verifier","parse","raw","parsed","createOAuthDatabase","name","controller","signal","createStore","subname","expiresAt","persistUpdatedAt","store","storageKey","persist","read","listener","ev","cleanup","lock","resolve","now","changed","key","item","updatedAt","token","_item","CLIENT_ID","REDIRECT_URI","database","configureOAuth","options","LoginError","__publicField","AuthorizationError","ResolverError","TokenRefreshError","sub","message","OAuthResponseError","response","data","_a","_b","error","ifString","ifObject","errorDescription","messageError","messageDesc","FetchResponseError","status","v","DID_RE","isDid","isUrlParseSupported","isAtprotoServiceEndpoint","url","getAtprotoServiceEndpoint","doc","predicate","services","idx","len","type","serviceEndpoint","getPdsEndpoint","DEFAULT_APPVIEW_URL","extractContentType","headers","isValidUrl","urlString","DID_WEB_RE","resolveHandle","handle","getDidDocument","did","colon_index","ident","getProtectedResourceMetadata","host","metadata","getAuthorizationServerMetadata","resolveFromIdentity","pds","getMetadataFromResourceServer","rs_metadata","issuer","as_metadata","ES256_ALG","createES256Key","pair","_ext","_key_opts","jwk","createDPoPSignage","dpopKey","headerString","keyPromise","constructPayload","htm","htu","nonce","ath","payload","method","payloadString","signed","signatureString","createDPoPFetch","isAuthServer","nonces","pending","sign","init","request","authorizationHeader","origin","pathname","deferred","initNonce","expiredOrMissing","lapsed","nextNonce","initProof","initResponse","isUseDpopNonceError","nextProof","nextRequest","retryResponse","retryNonce","wwwAuth","json","pick","obj","keys","cloned","_fetch","_metadata","_OAuthServerAgent_instances","processTokenResponse_fn","processExchangeResponse_fn","OAuthServerAgent","__privateAdd","__privateSet","endpoint","__privateGet","code","__privateMethod","err","res","resolved","getSession","allowStored","isTokenUsable","returnFalse","returnTrue","previousExecutionFlow","isFresh","run","storedSession","newSession","refreshToken","storeSession","promise","onRefreshError","deleteStoredSession","info","server","newToken","cause","expires","createAuthorizationUrl","identity","scope","state","pkce","params","authUrl","finalizeAuthorization","stored","session","_getSessionPromise","OAuthUserAgent","isInvalidTokenResponse","auth","storage","result","items","OAUTH_SESSION_KEY","isOAuthInitialized","initializeOAuth","startLoginProcess","handleOAuthCallback","paramString","errorDesc","saveSession","loadSession","clearSession","getProfile"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-2
proxy/static/static/assets/pds-CuMMYKQt.js
··· 1 - class i{constructor(t="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(t),this.channel.onmessage=o=>{console.log("[WebStorageAdapter] Received broadcast:",o.data),this.listeners.forEach(n=>n(o.data))}}async get(t){const o=localStorage.getItem(t);return o?JSON.parse(o):null}async set(t,o){const n=await this.get(t);localStorage.setItem(t,JSON.stringify(o));const e={key:t,newValue:o,oldValue:n};console.log("[WebStorageAdapter] Broadcasting change:",e),this.channel.postMessage(e)}onChange(t){this.listeners.push(t)}close(){this.channel.close()}}class l{constructor(t){this.currentUrl=null,this.storage=t.storage,this.fetchAnnotations=t.fetchAnnotations}async syncAnnotationsForUrl(t){console.log("[BackgroundWorker] Syncing annotations for:",t);try{const o=await this.fetchAnnotations(t);console.log("[BackgroundWorker] Fetched",o.length,"annotations");const n=`annotations:${t}`;await this.storage.set(n,o),console.log("[BackgroundWorker] Stored",o.length,"annotations")}catch(o){throw console.error("[BackgroundWorker] Failed to sync annotations:",o),o}}setCurrentUrl(t){this.currentUrl!==t&&(this.currentUrl=t,this.syncAnnotationsForUrl(t))}getCurrentUrl(){return this.currentUrl}}const r="community.lexicon.annotation.annotation",c="https://seams.so";async function h(s){try{const t=await fetch(`${c}/api/annotations?url=${encodeURIComponent(s)}&limit=100`);if(!t.ok)throw new Error(`Backend error: ${t.status}`);return((await t.json()).annotations||[]).map(e=>{const a=JSON.parse(e.selectors||"[]");return{$type:r,uri:e.uri,cid:e.cid,target:[{source:e.targetUrl,selector:a}],body:e.body||"",tags:e.tags?JSON.parse(e.tags):[],createdAt:e.createdAt,author:e.authorHandle?{did:e.authorDid,handle:e.authorHandle}:void 0}})}catch(t){return console.error("[pds] Failed to fetch from backend:",t),[]}}export{l as B,i as W,h as l}; 2 - //# sourceMappingURL=pds-CuMMYKQt.js.map
-1
proxy/static/static/assets/pds-CuMMYKQt.js.map
··· 1 - {"version":3,"file":"pds-CuMMYKQt.js","sources":["../../../packages/core/src/storage/web.ts","../../../packages/core/src/background/worker.ts","../../../lib/pds.ts"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n console.log('[WebStorageAdapter] Received broadcast:', event.data);\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(key: string): Promise<any> {\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n console.log('[WebStorageAdapter] Broadcasting change:', change);\n this.channel.postMessage(change);\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n","// Background worker - fetches annotations and writes to storage\nimport type { StorageAdapter } from '../storage/adapter';\nimport type { Annotation } from '../types';\n\nexport interface BackgroundWorkerOptions {\n storage: StorageAdapter;\n fetchAnnotations: (url: string) => Promise<Annotation[]>;\n}\n\nexport class BackgroundWorker {\n private storage: StorageAdapter;\n private fetchAnnotations: (url: string) => Promise<Annotation[]>;\n private currentUrl: string | null = null;\n\n constructor(options: BackgroundWorkerOptions) {\n this.storage = options.storage;\n this.fetchAnnotations = options.fetchAnnotations;\n }\n\n async syncAnnotationsForUrl(url: string): Promise<void> {\n console.log('[BackgroundWorker] Syncing annotations for:', url);\n \n try {\n const annotations = await this.fetchAnnotations(url);\n console.log('[BackgroundWorker] Fetched', annotations.length, 'annotations');\n \n const key = `annotations:${url}`;\n await this.storage.set(key, annotations);\n console.log('[BackgroundWorker] Stored', annotations.length, 'annotations');\n } catch (error) {\n console.error('[BackgroundWorker] Failed to sync annotations:', error);\n throw error;\n }\n }\n\n setCurrentUrl(url: string): void {\n if (this.currentUrl !== url) {\n this.currentUrl = url;\n this.syncAnnotationsForUrl(url);\n }\n }\n\n getCurrentUrl(): string | null {\n return this.currentUrl;\n }\n}\n","import { OAuthUserAgent } from \"@atcute/oauth-browser-client\";\nimport { loadSession } from \"./oauth\";\nimport type { Annotation } from \"./types/annotation\";\nimport type { Comment } from \"./types/comment\";\n\nconst ANNOTATION_COLLECTION = \"community.lexicon.annotation.annotation\";\nconst COMMENT_COLLECTION = \"pub.leaflet.comment\";\nconst BACKEND_URL = import.meta.env.BACKEND_URL || 'http://localhost:8080';\n\nexport async function createAnnotation(annotation: Annotation): Promise<Annotation> {\n const session = await loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n \n const record = {\n $type: annotation.$type,\n target: annotation.target,\n body: annotation.body,\n tags: annotation.tags,\n document: annotation.document,\n createdAt: annotation.createdAt,\n };\n\n const response = await agent.handle('/xrpc/com.atproto.repo.createRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: ANNOTATION_COLLECTION,\n record,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Create error:', error);\n throw new Error(`Failed to create annotation: ${response.status} - ${JSON.stringify(error)}`);\n }\n\n const result = await response.json();\n\n // Index in backend\n try {\n await fetch(`${BACKEND_URL}/api/annotations/index`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n uri: result.uri,\n cid: result.cid,\n }),\n });\n console.log('[pds] Annotation indexed in backend');\n } catch (err) {\n console.error('[pds] Failed to index annotation in backend:', err);\n // Don't fail the create operation\n }\n\n return {\n ...annotation,\n uri: result.uri,\n cid: result.cid,\n };\n}\n\nexport async function listAnnotations(): Promise<Annotation[]> {\n const session = await loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n\n const response = await agent.handle(\n `/xrpc/com.atproto.repo.listRecords?repo=${session.info.sub}&collection=${ANNOTATION_COLLECTION}`,\n { method: 'GET' }\n );\n\n const result = await response.json();\n\n return result.records.map((record: any) => ({\n ...record.value,\n uri: record.uri,\n cid: record.cid,\n }));\n}\n\nexport async function deleteAnnotation(uri: string): Promise<void> {\n const session = await loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n\n // Parse rkey from URI: at://did:plc:xxx/collection/rkey\n const rkey = uri.split(\"/\").pop();\n if (!rkey) {\n throw new Error(\"Invalid URI\");\n }\n\n const response = await agent.handle('/xrpc/com.atproto.repo.deleteRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: ANNOTATION_COLLECTION,\n rkey,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Delete error:', error);\n throw new Error(`Failed to delete annotation: ${response.status} - ${JSON.stringify(error)}`);\n }\n}\n\nexport async function createComment(comment: Omit<Comment, 'uri' | 'cid' | 'author'>): Promise<Comment> {\n const session = await loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n \n const record = {\n $type: 'pub.leaflet.comment',\n subject: comment.subject,\n plaintext: comment.plaintext,\n createdAt: comment.createdAt,\n reply: comment.reply,\n facets: comment.facets,\n onPage: comment.onPage,\n };\n\n const response = await agent.handle('/xrpc/com.atproto.repo.createRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: COMMENT_COLLECTION,\n record,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Create comment error:', error);\n throw new Error(`Failed to create comment: ${response.status} - ${JSON.stringify(error)}`);\n }\n\n const result = await response.json();\n\n return {\n ...comment,\n uri: result.uri,\n cid: result.cid,\n };\n}\n\nexport async function listComments(): Promise<Comment[]> {\n const session = await loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n\n const response = await agent.handle(\n `/xrpc/com.atproto.repo.listRecords?repo=${session.info.sub}&collection=${COMMENT_COLLECTION}`,\n { method: 'GET' }\n );\n\n const result = await response.json();\n\n return result.records.map((record: any) => ({\n ...record.value,\n uri: record.uri,\n cid: record.cid,\n }));\n}\n\nexport async function deleteComment(uri: string): Promise<void> {\n const session = await loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n\n const rkey = uri.split(\"/\").pop();\n if (!rkey) {\n throw new Error(\"Invalid URI\");\n }\n\n const response = await agent.handle('/xrpc/com.atproto.repo.deleteRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: COMMENT_COLLECTION,\n rkey,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Delete comment error:', error);\n throw new Error(`Failed to delete comment: ${response.status} - ${JSON.stringify(error)}`);\n }\n}\n\n// Query annotations from backend by URL\nexport async function listAnnotationsForPage(url: string): Promise<Annotation[]> {\n try {\n const response = await fetch(\n `${BACKEND_URL}/api/annotations?url=${encodeURIComponent(url)}&limit=100`\n );\n \n if (!response.ok) {\n throw new Error(`Backend error: ${response.status}`);\n }\n \n const data = await response.json();\n const annotations = data.annotations || [];\n \n // Transform backend format to extension format\n return annotations.map((ann: any) => {\n const selectors = JSON.parse(ann.selectors || '[]');\n return {\n $type: ANNOTATION_COLLECTION,\n uri: ann.uri,\n cid: ann.cid,\n target: [{\n source: ann.targetUrl,\n selector: selectors,\n }],\n body: ann.body || '',\n tags: ann.tags ? JSON.parse(ann.tags) : [],\n createdAt: ann.createdAt,\n author: ann.authorHandle ? {\n did: ann.authorDid,\n handle: ann.authorHandle,\n } : undefined,\n };\n });\n } catch (error) {\n console.error('[pds] Failed to fetch from backend:', error);\n return []; // Graceful fallback\n }\n}\n"],"names":["WebStorageAdapter","channelName","event","callback","key","value","oldValue","change","BackgroundWorker","options","url","annotations","error","ANNOTATION_COLLECTION","BACKEND_URL","listAnnotationsForPage","response","ann","selectors"],"mappings":"AAGO,MAAMA,CAA4C,CAIvD,YAAYC,EAAsB,gBAAiB,CAFnD,KAAQ,UAAoD,CAAA,EAG1D,KAAK,QAAU,IAAI,iBAAiBA,CAAW,EAE/C,KAAK,QAAQ,UAAaC,GAAU,CAClC,QAAQ,IAAI,0CAA2CA,EAAM,IAAI,EACjE,KAAK,UAAU,QAAQC,GAAYA,EAASD,EAAM,IAAI,CAAC,CACzD,CACF,CAEA,MAAM,IAAIE,EAA2B,CACnC,MAAMC,EAAQ,aAAa,QAAQD,CAAG,EACtC,OAAOC,EAAQ,KAAK,MAAMA,CAAK,EAAI,IACrC,CAEA,MAAM,IAAID,EAAaC,EAA2B,CAChD,MAAMC,EAAW,MAAM,KAAK,IAAIF,CAAG,EACnC,aAAa,QAAQA,EAAK,KAAK,UAAUC,CAAK,CAAC,EAE/C,MAAME,EAAwB,CAAE,IAAAH,EAAK,SAAUC,EAAO,SAAAC,CAAA,EACtD,QAAQ,IAAI,2CAA4CC,CAAM,EAC9D,KAAK,QAAQ,YAAYA,CAAM,CACjC,CAEA,SAASJ,EAAiD,CACxD,KAAK,UAAU,KAAKA,CAAQ,CAC9B,CAEA,OAAc,CACZ,KAAK,QAAQ,MAAA,CACf,CACF,CC5BO,MAAMK,CAAiB,CAK5B,YAAYC,EAAkC,CAF9C,KAAQ,WAA4B,KAGlC,KAAK,QAAUA,EAAQ,QACvB,KAAK,iBAAmBA,EAAQ,gBAClC,CAEA,MAAM,sBAAsBC,EAA4B,CACtD,QAAQ,IAAI,8CAA+CA,CAAG,EAE9D,GAAI,CACF,MAAMC,EAAc,MAAM,KAAK,iBAAiBD,CAAG,EACnD,QAAQ,IAAI,6BAA8BC,EAAY,OAAQ,aAAa,EAE3E,MAAMP,EAAM,eAAeM,CAAG,GAC9B,MAAM,KAAK,QAAQ,IAAIN,EAAKO,CAAW,EACvC,QAAQ,IAAI,4BAA6BA,EAAY,OAAQ,aAAa,CAC5E,OAASC,EAAO,CACd,cAAQ,MAAM,iDAAkDA,CAAK,EAC/DA,CACR,CACF,CAEA,cAAcF,EAAmB,CAC3B,KAAK,aAAeA,IACtB,KAAK,WAAaA,EAClB,KAAK,sBAAsBA,CAAG,EAElC,CAEA,eAA+B,CAC7B,OAAO,KAAK,UACd,CACF,CCxCA,MAAMG,EAAwB,0CAExBC,EAAc,mBAyNpB,eAAsBC,EAAuBL,EAAoC,CAC/E,GAAI,CACF,MAAMM,EAAW,MAAM,MACrB,GAAGF,CAAW,wBAAwB,mBAAmBJ,CAAG,CAAC,YAAA,EAG/D,GAAI,CAACM,EAAS,GACZ,MAAM,IAAI,MAAM,kBAAkBA,EAAS,MAAM,EAAE,EAOrD,QAJa,MAAMA,EAAS,KAAA,GACH,aAAe,CAAA,GAGrB,IAAKC,GAAa,CACnC,MAAMC,EAAY,KAAK,MAAMD,EAAI,WAAa,IAAI,EAClD,MAAO,CACL,MAAOJ,EACP,IAAKI,EAAI,IACT,IAAKA,EAAI,IACT,OAAQ,CAAC,CACP,OAAQA,EAAI,UACZ,SAAUC,CAAA,CACX,EACD,KAAMD,EAAI,MAAQ,GAClB,KAAMA,EAAI,KAAO,KAAK,MAAMA,EAAI,IAAI,EAAI,CAAA,EACxC,UAAWA,EAAI,UACf,OAAQA,EAAI,aAAe,CACzB,IAAKA,EAAI,UACT,OAAQA,EAAI,YAAA,EACV,MAAA,CAER,CAAC,CACH,OAASL,EAAO,CACd,eAAQ,MAAM,sCAAuCA,CAAK,EACnD,CAAA,CACT,CACF"}
-1
proxy/static/static/assets/seams-sidebar-gO3IQ7ah.css
··· 1 - *{box-sizing:border-box;margin:0;padding:0}:root{--forest-green: #2d5016;--forest-green-light: #3d6b1f;--forest-green-dark: #1f3810}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fafafa;color:#1a1a1a;position:relative}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;background-image:radial-gradient(circle,rgba(45,80,22,.06) 1px,transparent 1px);background-size:20px 20px;z-index:0}.sidebar{padding:16px;max-width:100%;position:relative;z-index:1}h2{font-size:16px;margin-bottom:12px;font-weight:600}button{background:var(--forest-green);color:#fff;border:1px dashed var(--forest-green-dark);padding:8px 16px;border-radius:2px;cursor:pointer;font-size:14px}button:hover{background:var(--forest-green-dark)}.annotation-form{margin:16px 0;padding:16px;border:1px dashed #d0d0d0;border-radius:2px;background:#fff}.form-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.form-header h2{margin-bottom:0}.clear-btn{background:transparent;border:none;color:#999;font-size:24px;padding:0;width:24px;height:24px;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}.clear-btn:hover{color:#666;background:transparent}textarea{width:100%;min-height:80px;padding:8px;border:1px solid #d0d0d0;border-radius:2px;font-family:inherit;margin-bottom:8px;background:#fafafa}.annotations-list{margin-top:12px}#annotations{display:flex;flex-direction:column;gap:12px}.annotation-card{padding:12px;border:1px dashed #d0d0d0;border-radius:2px;background:#fff}.annotation-card blockquote{margin:0 0 8px;padding:8px 12px;background:#fafafa;border-left:3px solid var(--forest-green);font-style:italic;color:#555}.annotation-card p{margin:8px 0;line-height:1.5}.annotation-meta{margin-top:8px;padding-top:8px;border-top:1px dashed #e0e0e0}.annotation-meta small{color:#666;font-size:12px}.selected-text{margin-bottom:12px;padding:0;background:transparent;border-radius:2px}.selected-text blockquote{margin:0;padding:8px 12px;background:#f5f5f5;border-left:3px solid var(--forest-green);font-style:italic;color:#333}.empty{color:#999;font-style:italic}.auth-section{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;padding:32px 16px}.login-container{width:100%;max-width:320px;display:flex;flex-direction:column;gap:16px}.login-container h2{text-align:center;margin-bottom:8px;font-size:20px}.input-wrapper{position:relative;width:100%;display:flex;align-items:center;background:#f5f5f5;border:1px dashed #d0d0d0;border-radius:2px;padding:12px 16px}.at-symbol{color:#999;font-size:16px;margin-right:4px;-webkit-user-select:none;user-select:none}.handle-input{flex:1;border:none;background:transparent;font-size:16px;font-family:inherit;outline:none;color:#333}.handle-input::placeholder{color:#bbb}#auth-status{text-align:center;color:#666;font-size:14px}.profile-menu{position:fixed;bottom:8px;right:6px;z-index:100}.profile-dropdown{position:absolute;bottom:48px;right:0;background:#fff;border:1px dashed #d0d0d0;border-radius:2px;box-shadow:0 4px 12px #00000014;padding:8px;min-width:120px}.profile-dropdown button{width:100%;text-align:left}.comments-section{margin-top:12px;padding-top:12px;border-top:1px dashed #e0e0e0}.comments-header{display:flex;gap:8px;margin-bottom:8px;align-items:center}.toggle-comments-btn,.add-comment-btn{background:transparent;border:1px solid #d0d0d0;color:#666;font-size:12px;padding:4px 8px}.toggle-comments-btn:hover,.add-comment-btn:hover{background:#f5f5f5;color:#333}.comments-list{display:flex;flex-direction:column;gap:8px;margin-top:8px}.comment{padding:8px;background:#fafafa;border:1px solid #e0e0e0;border-radius:2px;flex:1}.comment-thread{margin-top:8px;margin-left:0;padding-left:12px;position:relative}.thread-toggle-btn{position:absolute;left:-12px;top:0;background:transparent;border:none;color:#666;font-size:14px;width:4px;height:4px;display:flex;align-items:center;justify-content:center;cursor:pointer}.thread-toggle-btn:hover{background:transparent;border-radius:2px}.thread-children{padding-left:2px;position:relative;margin-top:2px}.thread-children>.comment{margin-bottom:8px}.thread-children>.comment:last-child{margin-bottom:0}.comment-thread.collapsed{padding-left:16px;margin-top:8px;margin-left:0;display:flex;align-items:center;gap:4px}.comment-thread.collapsed .thread-toggle-btn{position:absolute;left:-12px}.collapsed-indicator{font-size:12px;color:#999;font-style:italic}.comment-content{display:flex;flex-direction:column;gap:4px}.comment-text{font-size:14px;line-height:1.4;color:#333}.comment-meta{display:flex;gap:8px;align-items:center}.comment-meta small{color:#999;font-size:11px}.reply-btn{background:transparent;border:none;color:var(--forest-green);font-size:11px;padding:2px 4px;cursor:pointer}.reply-btn:hover{background:transparent;text-decoration:underline}.comment-form,.reply-form{margin-top:8px;padding:8px;background:#fff;border:1px dashed #d0d0d0;border-radius:2px}.comment-input,.reply-input{width:100%;min-height:60px;padding:6px;border:1px solid #d0d0d0;border-radius:2px;font-family:inherit;font-size:13px;margin-bottom:6px;background:#fafafa}.comment-actions,.reply-actions{display:flex;gap:6px;justify-content:flex-end}.save-comment-btn,.save-reply-btn,.cancel-comment-btn,.cancel-reply-btn{font-size:12px;padding:4px 12px}.cancel-comment-btn,.cancel-reply-btn{background:transparent;border:1px dashed #d0d0d0;color:#666}.cancel-comment-btn:hover,.cancel-reply-btn:hover{background:#f5f5f5;color:#333}.comment-thread{margin-top:8px}
-1
proxy/static/static/assets/sidebar-BBEPW7gD.css
··· 1 - *{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:14px;line-height:1.5;color:#333}.sidebar{display:flex;flex-direction:column;height:100vh;background:#fff}.sidebar-header{padding:16px;border-bottom:1px solid #e0e0e0;background:#f5f5f5}.sidebar-header h1{font-size:20px;font-weight:600;margin-bottom:4px}.sidebar-header p{font-size:12px;color:#666}.sidebar-content{flex:1;overflow-y:auto;padding:16px}
-1
proxy/static/static/assets/sidebar-J3iG1W2k.css
··· 1 - *{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:14px;line-height:1.5;color:#333}.sidebar{display:flex;flex-direction:column;height:100vh;background:#fff}.sidebar-header{padding:16px;border-bottom:1px solid #e0e0e0;background:#f5f5f5}.sidebar-header h1{font-size:20px;font-weight:600;margin-bottom:4px}.sidebar-header p{font-size:12px;color:#666}.profile-info{display:flex;align-items:center;gap:8px;margin-top:8px}.profile-avatar{width:32px;height:32px;border-radius:50%}.profile-handle{font-size:14px;color:#333}.sidebar-content{flex:1;overflow-y:auto;padding:16px}.login-container{display:flex;flex-direction:column;gap:12px}.login-container h2{font-size:18px;font-weight:600;margin-bottom:8px}.input-wrapper{position:relative;display:flex;align-items:center}.at-symbol{position:absolute;left:12px;color:#666;font-size:14px;pointer-events:none}.handle-input{width:100%;padding:10px 12px 10px 28px;border:1px solid #ccc;border-radius:4px;font-size:14px;font-family:inherit}.handle-input:focus{outline:none;border-color:#0085ff}button{padding:10px 16px;background:#0085ff;color:#fff;border:none;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;font-family:inherit}button:hover{background:#0073e6}button:active{background:#0061c2}#auth-status{font-size:12px;color:#666;min-height:16px}#logout-btn{background:#e74c3c;margin-top:8px}#logout-btn:hover{background:#c0392b}
-1
proxy/static/static/assets/sidebar-gO3IQ7ah.css
··· 1 - *{box-sizing:border-box;margin:0;padding:0}:root{--forest-green: #2d5016;--forest-green-light: #3d6b1f;--forest-green-dark: #1f3810}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#fafafa;color:#1a1a1a;position:relative}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;background-image:radial-gradient(circle,rgba(45,80,22,.06) 1px,transparent 1px);background-size:20px 20px;z-index:0}.sidebar{padding:16px;max-width:100%;position:relative;z-index:1}h2{font-size:16px;margin-bottom:12px;font-weight:600}button{background:var(--forest-green);color:#fff;border:1px dashed var(--forest-green-dark);padding:8px 16px;border-radius:2px;cursor:pointer;font-size:14px}button:hover{background:var(--forest-green-dark)}.annotation-form{margin:16px 0;padding:16px;border:1px dashed #d0d0d0;border-radius:2px;background:#fff}.form-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.form-header h2{margin-bottom:0}.clear-btn{background:transparent;border:none;color:#999;font-size:24px;padding:0;width:24px;height:24px;cursor:pointer;line-height:1;display:flex;align-items:center;justify-content:center}.clear-btn:hover{color:#666;background:transparent}textarea{width:100%;min-height:80px;padding:8px;border:1px solid #d0d0d0;border-radius:2px;font-family:inherit;margin-bottom:8px;background:#fafafa}.annotations-list{margin-top:12px}#annotations{display:flex;flex-direction:column;gap:12px}.annotation-card{padding:12px;border:1px dashed #d0d0d0;border-radius:2px;background:#fff}.annotation-card blockquote{margin:0 0 8px;padding:8px 12px;background:#fafafa;border-left:3px solid var(--forest-green);font-style:italic;color:#555}.annotation-card p{margin:8px 0;line-height:1.5}.annotation-meta{margin-top:8px;padding-top:8px;border-top:1px dashed #e0e0e0}.annotation-meta small{color:#666;font-size:12px}.selected-text{margin-bottom:12px;padding:0;background:transparent;border-radius:2px}.selected-text blockquote{margin:0;padding:8px 12px;background:#f5f5f5;border-left:3px solid var(--forest-green);font-style:italic;color:#333}.empty{color:#999;font-style:italic}.auth-section{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;padding:32px 16px}.login-container{width:100%;max-width:320px;display:flex;flex-direction:column;gap:16px}.login-container h2{text-align:center;margin-bottom:8px;font-size:20px}.input-wrapper{position:relative;width:100%;display:flex;align-items:center;background:#f5f5f5;border:1px dashed #d0d0d0;border-radius:2px;padding:12px 16px}.at-symbol{color:#999;font-size:16px;margin-right:4px;-webkit-user-select:none;user-select:none}.handle-input{flex:1;border:none;background:transparent;font-size:16px;font-family:inherit;outline:none;color:#333}.handle-input::placeholder{color:#bbb}#auth-status{text-align:center;color:#666;font-size:14px}.profile-menu{position:fixed;bottom:8px;right:6px;z-index:100}.profile-dropdown{position:absolute;bottom:48px;right:0;background:#fff;border:1px dashed #d0d0d0;border-radius:2px;box-shadow:0 4px 12px #00000014;padding:8px;min-width:120px}.profile-dropdown button{width:100%;text-align:left}.comments-section{margin-top:12px;padding-top:12px;border-top:1px dashed #e0e0e0}.comments-header{display:flex;gap:8px;margin-bottom:8px;align-items:center}.toggle-comments-btn,.add-comment-btn{background:transparent;border:1px solid #d0d0d0;color:#666;font-size:12px;padding:4px 8px}.toggle-comments-btn:hover,.add-comment-btn:hover{background:#f5f5f5;color:#333}.comments-list{display:flex;flex-direction:column;gap:8px;margin-top:8px}.comment{padding:8px;background:#fafafa;border:1px solid #e0e0e0;border-radius:2px;flex:1}.comment-thread{margin-top:8px;margin-left:0;padding-left:12px;position:relative}.thread-toggle-btn{position:absolute;left:-12px;top:0;background:transparent;border:none;color:#666;font-size:14px;width:4px;height:4px;display:flex;align-items:center;justify-content:center;cursor:pointer}.thread-toggle-btn:hover{background:transparent;border-radius:2px}.thread-children{padding-left:2px;position:relative;margin-top:2px}.thread-children>.comment{margin-bottom:8px}.thread-children>.comment:last-child{margin-bottom:0}.comment-thread.collapsed{padding-left:16px;margin-top:8px;margin-left:0;display:flex;align-items:center;gap:4px}.comment-thread.collapsed .thread-toggle-btn{position:absolute;left:-12px}.collapsed-indicator{font-size:12px;color:#999;font-style:italic}.comment-content{display:flex;flex-direction:column;gap:4px}.comment-text{font-size:14px;line-height:1.4;color:#333}.comment-meta{display:flex;gap:8px;align-items:center}.comment-meta small{color:#999;font-size:11px}.reply-btn{background:transparent;border:none;color:var(--forest-green);font-size:11px;padding:2px 4px;cursor:pointer}.reply-btn:hover{background:transparent;text-decoration:underline}.comment-form,.reply-form{margin-top:8px;padding:8px;background:#fff;border:1px dashed #d0d0d0;border-radius:2px}.comment-input,.reply-input{width:100%;min-height:60px;padding:6px;border:1px solid #d0d0d0;border-radius:2px;font-family:inherit;font-size:13px;margin-bottom:6px;background:#fafafa}.comment-actions,.reply-actions{display:flex;gap:6px;justify-content:flex-end}.save-comment-btn,.save-reply-btn,.cancel-comment-btn,.cancel-reply-btn{font-size:12px;padding:4px 12px}.cancel-comment-btn,.cancel-reply-btn{background:transparent;border:1px dashed #d0d0d0;color:#666}.cancel-comment-btn:hover,.cancel-reply-btn:hover{background:#f5f5f5;color:#333}.comment-thread{margin-top:8px}
proxy/static/static/assets/spectral-v15-latin-600-BdHV-IKW.ttf

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-600-BliT1AHr.eot

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-600-DB_3Affc.woff

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-600-DE3OxvnQ.woff2

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-700-1bnaK4j6.ttf

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-700-Bdud-RSb.eot

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-700-Cd2m0ohD.woff2

This is a binary file and will not be displayed.

proxy/static/static/assets/spectral-v15-latin-700-D6tDXmC_.woff

This is a binary file and will not be displayed.

-2
proxy/static/static/assets/storage-web-DVEDyBzH.js
··· 1 - class o{constructor(e="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(e),this.channel.onmessage=s=>{console.log("[WebStorage] Received broadcast:",s.data),this.listeners.forEach(a=>a(s.data))}}async get(e){const s=localStorage.getItem(e);return s?JSON.parse(s):null}async set(e,s){const a=await this.get(e);localStorage.setItem(e,JSON.stringify(s));const t={key:e,newValue:s,oldValue:a};console.log("[WebStorage] Broadcasting change:",t),this.channel.postMessage(t)}onChange(e){this.listeners.push(e)}close(){this.channel.close()}}export{o as W}; 2 - //# sourceMappingURL=storage-web-DVEDyBzH.js.map
-1
proxy/static/static/assets/storage-web-DVEDyBzH.js.map
··· 1 - {"version":3,"file":"storage-web-DVEDyBzH.js","sources":["../../../lib/storage-web.ts"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\n// Mimics browser.storage API for via proxy client\n\nexport interface StorageAdapter {\n get(key: string): Promise<any>;\n set(key: string, value: any): Promise<void>;\n onChange(callback: (changes: { key: string; newValue: any; oldValue?: any }) => void): void;\n}\n\nexport class WebStorage implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(changes: { key: string; newValue: any; oldValue?: any }) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n // Listen for broadcasts from other contexts\n this.channel.onmessage = (event) => {\n console.log('[WebStorage] Received broadcast:', event.data);\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(key: string): Promise<any> {\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n // Broadcast change to other contexts (sidebar, content script, other tabs)\n const change = { key, newValue: value, oldValue };\n console.log('[WebStorage] Broadcasting change:', change);\n this.channel.postMessage(change);\n }\n\n onChange(callback: (changes: { key: string; newValue: any; oldValue?: any }) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n"],"names":["WebStorage","channelName","event","callback","key","value","oldValue","change"],"mappings":"AASO,MAAMA,CAAqC,CAIhD,YAAYC,EAAsB,gBAAiB,CAFnD,KAAQ,UAAsF,CAAA,EAG5F,KAAK,QAAU,IAAI,iBAAiBA,CAAW,EAG/C,KAAK,QAAQ,UAAaC,GAAU,CAClC,QAAQ,IAAI,mCAAoCA,EAAM,IAAI,EAC1D,KAAK,UAAU,QAAQC,GAAYA,EAASD,EAAM,IAAI,CAAC,CACzD,CACF,CAEA,MAAM,IAAIE,EAA2B,CACnC,MAAMC,EAAQ,aAAa,QAAQD,CAAG,EACtC,OAAOC,EAAQ,KAAK,MAAMA,CAAK,EAAI,IACrC,CAEA,MAAM,IAAID,EAAaC,EAA2B,CAChD,MAAMC,EAAW,MAAM,KAAK,IAAIF,CAAG,EACnC,aAAa,QAAQA,EAAK,KAAK,UAAUC,CAAK,CAAC,EAG/C,MAAME,EAAS,CAAE,IAAAH,EAAK,SAAUC,EAAO,SAAAC,CAAA,EACvC,QAAQ,IAAI,oCAAqCC,CAAM,EACvD,KAAK,QAAQ,YAAYA,CAAM,CACjC,CAEA,SAASJ,EAAmF,CAC1F,KAAK,UAAU,KAAKA,CAAQ,CAC9B,CAEA,OAAc,CACZ,KAAK,QAAQ,MAAA,CACf,CACF"}
-2
proxy/static/static/assets/web-CKH-GYMX.js
··· 1 - class l{constructor(s="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(s),this.channel.onmessage=e=>{this.listeners.forEach(t=>t(e.data))}}async get(s){const e=localStorage.getItem(s);return e?JSON.parse(e):null}async set(s,e){const t=await this.get(s);localStorage.setItem(s,JSON.stringify(e));const a={key:s,newValue:e,oldValue:t};this.channel.postMessage(a)}onChange(s){this.listeners.push(s)}close(){this.channel.close()}}export{l as W}; 2 - //# sourceMappingURL=web-CKH-GYMX.js.map
-1
proxy/static/static/assets/web-CKH-GYMX.js.map
··· 1 - {"version":3,"file":"web-CKH-GYMX.js","sources":["../../../packages/core/src/storage/web.ts"],"sourcesContent":["// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(key: string): Promise<any> {\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n"],"names":["WebStorageAdapter","channelName","event","callback","key","value","oldValue","change"],"mappings":"AAGO,MAAMA,CAA4C,CAIvD,YAAYC,EAAsB,gBAAiB,CAFnD,KAAQ,UAAoD,CAAA,EAG1D,KAAK,QAAU,IAAI,iBAAiBA,CAAW,EAE/C,KAAK,QAAQ,UAAaC,GAAU,CAClC,KAAK,UAAU,QAAQC,GAAYA,EAASD,EAAM,IAAI,CAAC,CACzD,CACF,CAEA,MAAM,IAAIE,EAA2B,CACnC,MAAMC,EAAQ,aAAa,QAAQD,CAAG,EACtC,OAAOC,EAAQ,KAAK,MAAMA,CAAK,EAAI,IACrC,CAEA,MAAM,IAAID,EAAaC,EAA2B,CAChD,MAAMC,EAAW,MAAM,KAAK,IAAIF,CAAG,EACnC,aAAa,QAAQA,EAAK,KAAK,UAAUC,CAAK,CAAC,EAE/C,MAAME,EAAwB,CAAE,IAAAH,EAAK,SAAUC,EAAO,SAAAC,CAAA,EACtD,KAAK,QAAQ,YAAYC,CAAM,CACjC,CAEA,SAASJ,EAAiD,CACxD,KAAK,UAAU,KAAKA,CAAQ,CAC9B,CAEA,OAAc,CACZ,KAAK,QAAQ,MAAA,CACf,CACF"}
-12
proxy/static/static/assets/web-Cwqa0NM7.js
··· 1 - var O={},J={exports:{}};(function(o){var f=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},v=-1,d=1,h=0;f.Diff=function(e,r){return[e,r]},f.prototype.diff_main=function(e,r,n,t){typeof t>"u"&&(this.Diff_Timeout<=0?t=Number.MAX_VALUE:t=new Date().getTime()+this.Diff_Timeout*1e3);var i=t;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new f.Diff(h,e)]:[];typeof n>"u"&&(n=!0);var a=n,s=this.diff_commonPrefix(e,r),l=e.substring(0,s);e=e.substring(s),r=r.substring(s),s=this.diff_commonSuffix(e,r);var u=e.substring(e.length-s);e=e.substring(0,e.length-s),r=r.substring(0,r.length-s);var g=this.diff_compute_(e,r,a,i);return l&&g.unshift(new f.Diff(h,l)),u&&g.push(new f.Diff(h,u)),this.diff_cleanupMerge(g),g},f.prototype.diff_compute_=function(e,r,n,t){var i;if(!e)return[new f.Diff(d,r)];if(!r)return[new f.Diff(v,e)];var a=e.length>r.length?e:r,s=e.length>r.length?r:e,l=a.indexOf(s);if(l!=-1)return i=[new f.Diff(d,a.substring(0,l)),new f.Diff(h,s),new f.Diff(d,a.substring(l+s.length))],e.length>r.length&&(i[0][0]=i[2][0]=v),i;if(s.length==1)return[new f.Diff(v,e),new f.Diff(d,r)];var u=this.diff_halfMatch_(e,r);if(u){var g=u[0],c=u[1],_=u[2],m=u[3],p=u[4],w=this.diff_main(g,_,n,t),b=this.diff_main(c,m,n,t);return w.concat([new f.Diff(h,p)],b)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,t):this.diff_bisect_(e,r,t)},f.prototype.diff_lineMode_=function(e,r,n){var t=this.diff_linesToChars_(e,r);e=t.chars1,r=t.chars2;var i=t.lineArray,a=this.diff_main(e,r,!1,n);this.diff_charsToLines_(a,i),this.diff_cleanupSemantic(a),a.push(new f.Diff(h,""));for(var s=0,l=0,u=0,g="",c="";s<a.length;){switch(a[s][0]){case d:u++,c+=a[s][1];break;case v:l++,g+=a[s][1];break;case h:if(l>=1&&u>=1){a.splice(s-l-u,l+u),s=s-l-u;for(var _=this.diff_main(g,c,!1,n),m=_.length-1;m>=0;m--)a.splice(s,0,_[m]);s=s+_.length}u=0,l=0,g="",c="";break}s++}return a.pop(),a},f.prototype.diff_bisect_=function(e,r,n){for(var t=e.length,i=r.length,a=Math.ceil((t+i)/2),s=a,l=2*a,u=new Array(l),g=new Array(l),c=0;c<l;c++)u[c]=-1,g[c]=-1;u[s+1]=0,g[s+1]=0;for(var _=t-i,m=_%2!=0,p=0,w=0,b=0,E=0,N=0;N<a&&!(new Date().getTime()>n);N++){for(var M=-N+p;M<=N-w;M+=2){var D=s+M,T;M==-N||M!=N&&u[D-1]<u[D+1]?T=u[D+1]:T=u[D-1]+1;for(var I=T-M;T<t&&I<i&&e.charAt(T)==r.charAt(I);)T++,I++;if(u[D]=T,T>t)w+=2;else if(I>i)p+=2;else if(m){var C=s+_-M;if(C>=0&&C<l&&g[C]!=-1){var S=t-g[C];if(T>=S)return this.diff_bisectSplit_(e,r,T,I,n)}}}for(var R=-N+b;R<=N-E;R+=2){var C=s+R,S;R==-N||R!=N&&g[C-1]<g[C+1]?S=g[C+1]:S=g[C-1]+1;for(var y=S-R;S<t&&y<i&&e.charAt(t-S-1)==r.charAt(i-y-1);)S++,y++;if(g[C]=S,S>t)E+=2;else if(y>i)b+=2;else if(!m){var D=s+_-R;if(D>=0&&D<l&&u[D]!=-1){var T=u[D],I=s+T-D;if(S=t-S,T>=S)return this.diff_bisectSplit_(e,r,T,I,n)}}}}return[new f.Diff(v,e),new f.Diff(d,r)]},f.prototype.diff_bisectSplit_=function(e,r,n,t,i){var a=e.substring(0,n),s=r.substring(0,t),l=e.substring(n),u=r.substring(t),g=this.diff_main(a,s,!1,i),c=this.diff_main(l,u,!1,i);return g.concat(c)},f.prototype.diff_linesToChars_=function(e,r){var n=[],t={};n[0]="";function i(u){for(var g="",c=0,_=-1,m=n.length;_<u.length-1;){_=u.indexOf(` 2 - `,c),_==-1&&(_=u.length-1);var p=u.substring(c,_+1);(t.hasOwnProperty?t.hasOwnProperty(p):t[p]!==void 0)?g+=String.fromCharCode(t[p]):(m==a&&(p=u.substring(c),_=u.length),g+=String.fromCharCode(m),t[p]=m,n[m++]=p),c=_+1}return g}var a=4e4,s=i(e);a=65535;var l=i(r);return{chars1:s,chars2:l,lineArray:n}},f.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var t=e[n][1],i=[],a=0;a<t.length;a++)i[a]=r[t.charCodeAt(a)];e[n][1]=i.join("")}},f.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,t=Math.min(e.length,r.length),i=t,a=0;n<i;)e.substring(a,i)==r.substring(a,i)?(n=i,a=n):t=i,i=Math.floor((t-n)/2+n);return i},f.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,t=Math.min(e.length,r.length),i=t,a=0;n<i;)e.substring(e.length-i,e.length-a)==r.substring(r.length-i,r.length-a)?(n=i,a=n):t=i,i=Math.floor((t-n)/2+n);return i},f.prototype.diff_commonOverlap_=function(e,r){var n=e.length,t=r.length;if(n==0||t==0)return 0;n>t?e=e.substring(n-t):n<t&&(r=r.substring(0,n));var i=Math.min(n,t);if(e==r)return i;for(var a=0,s=1;;){var l=e.substring(i-s),u=r.indexOf(l);if(u==-1)return a;s+=u,(u==0||e.substring(i-s)==r.substring(0,s))&&(a=s,s++)}},f.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,t=e.length>r.length?r:e;if(n.length<4||t.length*2<n.length)return null;var i=this;function a(w,b,E){for(var N=w.substring(E,E+Math.floor(w.length/4)),M=-1,D="",T,I,C,S;(M=b.indexOf(N,M+1))!=-1;){var R=i.diff_commonPrefix(w.substring(E),b.substring(M)),y=i.diff_commonSuffix(w.substring(0,E),b.substring(0,M));D.length<y+R&&(D=b.substring(M-y,M)+b.substring(M,M+R),T=w.substring(0,E-y),I=w.substring(E+R),C=b.substring(0,M-y),S=b.substring(M+R))}return D.length*2>=w.length?[T,I,C,S,D]:null}var s=a(n,t,Math.ceil(n.length/4)),l=a(n,t,Math.ceil(n.length/2)),u;if(!s&&!l)return null;l?s?u=s[4].length>l[4].length?s:l:u=l:u=s;var g,c,_,m;e.length>r.length?(g=u[0],c=u[1],_=u[2],m=u[3]):(_=u[0],m=u[1],g=u[2],c=u[3]);var p=u[4];return[g,c,_,m,p]},f.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],t=0,i=null,a=0,s=0,l=0,u=0,g=0;a<e.length;)e[a][0]==h?(n[t++]=a,s=u,l=g,u=0,g=0,i=e[a][1]):(e[a][0]==d?u+=e[a][1].length:g+=e[a][1].length,i&&i.length<=Math.max(s,l)&&i.length<=Math.max(u,g)&&(e.splice(n[t-1],0,new f.Diff(v,i)),e[n[t-1]+1][0]=d,t--,t--,a=t>0?n[t-1]:-1,s=0,l=0,u=0,g=0,i=null,r=!0)),a++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),a=1;a<e.length;){if(e[a-1][0]==v&&e[a][0]==d){var c=e[a-1][1],_=e[a][1],m=this.diff_commonOverlap_(c,_),p=this.diff_commonOverlap_(_,c);m>=p?(m>=c.length/2||m>=_.length/2)&&(e.splice(a,0,new f.Diff(h,_.substring(0,m))),e[a-1][1]=c.substring(0,c.length-m),e[a+1][1]=_.substring(m),a++):(p>=c.length/2||p>=_.length/2)&&(e.splice(a,0,new f.Diff(h,c.substring(0,p))),e[a-1][0]=d,e[a-1][1]=_.substring(0,_.length-p),e[a+1][0]=v,e[a+1][1]=c.substring(p),a++),a++}a++}},f.prototype.diff_cleanupSemanticLossless=function(e){function r(p,w){if(!p||!w)return 6;var b=p.charAt(p.length-1),E=w.charAt(0),N=b.match(f.nonAlphaNumericRegex_),M=E.match(f.nonAlphaNumericRegex_),D=N&&b.match(f.whitespaceRegex_),T=M&&E.match(f.whitespaceRegex_),I=D&&b.match(f.linebreakRegex_),C=T&&E.match(f.linebreakRegex_),S=I&&p.match(f.blanklineEndRegex_),R=C&&w.match(f.blanklineStartRegex_);return S||R?5:I||C?4:N&&!D&&T?3:D||T?2:N||M?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==h&&e[n+1][0]==h){var t=e[n-1][1],i=e[n][1],a=e[n+1][1],s=this.diff_commonSuffix(t,i);if(s){var l=i.substring(i.length-s);t=t.substring(0,t.length-s),i=l+i.substring(0,i.length-s),a=l+a}for(var u=t,g=i,c=a,_=r(t,i)+r(i,a);i.charAt(0)===a.charAt(0);){t+=i.charAt(0),i=i.substring(1)+a.charAt(0),a=a.substring(1);var m=r(t,i)+r(i,a);m>=_&&(_=m,u=t,g=i,c=a)}e[n-1][1]!=u&&(u?e[n-1][1]=u:(e.splice(n-1,1),n--),e[n][1]=g,c?e[n+1][1]=c:(e.splice(n+1,1),n--))}n++}},f.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,f.whitespaceRegex_=/\s/,f.linebreakRegex_=/[\r\n]/,f.blanklineEndRegex_=/\n\r?\n$/,f.blanklineStartRegex_=/^\r?\n\r?\n/,f.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],t=0,i=null,a=0,s=!1,l=!1,u=!1,g=!1;a<e.length;)e[a][0]==h?(e[a][1].length<this.Diff_EditCost&&(u||g)?(n[t++]=a,s=u,l=g,i=e[a][1]):(t=0,i=null),u=g=!1):(e[a][0]==v?g=!0:u=!0,i&&(s&&l&&u&&g||i.length<this.Diff_EditCost/2&&s+l+u+g==3)&&(e.splice(n[t-1],0,new f.Diff(v,i)),e[n[t-1]+1][0]=d,t--,i=null,s&&l?(u=g=!0,t=0):(t--,a=t>0?n[t-1]:-1,u=g=!1),r=!0)),a++;r&&this.diff_cleanupMerge(e)},f.prototype.diff_cleanupMerge=function(e){e.push(new f.Diff(h,""));for(var r=0,n=0,t=0,i="",a="",s;r<e.length;)switch(e[r][0]){case d:t++,a+=e[r][1],r++;break;case v:n++,i+=e[r][1],r++;break;case h:n+t>1?(n!==0&&t!==0&&(s=this.diff_commonPrefix(a,i),s!==0&&(r-n-t>0&&e[r-n-t-1][0]==h?e[r-n-t-1][1]+=a.substring(0,s):(e.splice(0,0,new f.Diff(h,a.substring(0,s))),r++),a=a.substring(s),i=i.substring(s)),s=this.diff_commonSuffix(a,i),s!==0&&(e[r][1]=a.substring(a.length-s)+e[r][1],a=a.substring(0,a.length-s),i=i.substring(0,i.length-s))),r-=n+t,e.splice(r,n+t),i.length&&(e.splice(r,0,new f.Diff(v,i)),r++),a.length&&(e.splice(r,0,new f.Diff(d,a)),r++),r++):r!==0&&e[r-1][0]==h?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,t=0,n=0,i="",a="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==h&&e[r+1][0]==h&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},f.prototype.diff_xIndex=function(e,r){var n=0,t=0,i=0,a=0,s;for(s=0;s<e.length&&(e[s][0]!==d&&(n+=e[s][1].length),e[s][0]!==v&&(t+=e[s][1].length),!(n>r));s++)i=n,a=t;return e.length!=s&&e[s][0]===v?a:a+(r-i)},f.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,t=/</g,i=/>/g,a=/\n/g,s=0;s<e.length;s++){var l=e[s][0],u=e[s][1],g=u.replace(n,"&amp;").replace(t,"&lt;").replace(i,"&gt;").replace(a,"&para;<br>");switch(l){case d:r[s]='<ins style="background:#e6ffe6;">'+g+"</ins>";break;case v:r[s]='<del style="background:#ffe6e6;">'+g+"</del>";break;case h:r[s]="<span>"+g+"</span>";break}}return r.join("")},f.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==d&&(r[n]=e[n][1]);return r.join("")},f.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==v&&(r[n]=e[n][1]);return r.join("")},f.prototype.diff_levenshtein=function(e){for(var r=0,n=0,t=0,i=0;i<e.length;i++){var a=e[i][0],s=e[i][1];switch(a){case d:n+=s.length;break;case v:t+=s.length;break;case h:r+=Math.max(n,t),n=0,t=0;break}}return r+=Math.max(n,t),r},f.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case d:r[n]="+"+encodeURI(e[n][1]);break;case v:r[n]="-"+e[n][1].length;break;case h:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},f.prototype.diff_fromDelta=function(e,r){for(var n=[],t=0,i=0,a=r.split(/\t/g),s=0;s<a.length;s++){var l=a[s].substring(1);switch(a[s].charAt(0)){case"+":try{n[t++]=new f.Diff(d,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var u=parseInt(l,10);if(isNaN(u)||u<0)throw new Error("Invalid number in diff_fromDelta: "+l);var g=e.substring(i,i+=u);a[s].charAt(0)=="="?n[t++]=new f.Diff(h,g):n[t++]=new f.Diff(v,g);break;default:if(a[s])throw new Error("Invalid diff operation in diff_fromDelta: "+a[s])}}if(i!=e.length)throw new Error("Delta length ("+i+") does not equal source text length ("+e.length+").");return n},f.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},f.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var t=this.match_alphabet_(r),i=this;function a(T,I){var C=T/r.length,S=Math.abs(n-I);return i.Match_Distance?C+S/i.Match_Distance:S?1:C}var s=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(s=Math.min(a(0,l),s),l=e.lastIndexOf(r,n+r.length),l!=-1&&(s=Math.min(a(0,l),s)));var u=1<<r.length-1;l=-1;for(var g,c,_=r.length+e.length,m,p=0;p<r.length;p++){for(g=0,c=_;g<c;)a(p,n+c)<=s?g=c:_=c,c=Math.floor((_-g)/2+g);_=c;var w=Math.max(1,n-c+1),b=Math.min(n+c,e.length)+r.length,E=Array(b+2);E[b+1]=(1<<p)-1;for(var N=b;N>=w;N--){var M=t[e.charAt(N-1)];if(p===0?E[N]=(E[N+1]<<1|1)&M:E[N]=(E[N+1]<<1|1)&M|((m[N+1]|m[N])<<1|1)|m[N+1],E[N]&u){var D=a(p,N-1);if(D<=s)if(s=D,l=N-1,l>n)w=Math.max(1,2*n-l);else break}}if(a(p+1,n)>s)break;m=E}return l},f.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},f.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),t=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)t+=this.Patch_Margin,n=r.substring(e.start2-t,e.start2+e.length1+t);t+=this.Patch_Margin;var i=r.substring(e.start2-t,e.start2);i&&e.diffs.unshift(new f.Diff(h,i));var a=r.substring(e.start2+e.length1,e.start2+e.length1+t);a&&e.diffs.push(new f.Diff(h,a)),e.start1-=i.length,e.start2-=i.length,e.length1+=i.length+a.length,e.length2+=i.length+a.length}},f.prototype.patch_make=function(e,r,n){var t,i;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")t=e,i=this.diff_main(t,r,!0),i.length>2&&(this.diff_cleanupSemantic(i),this.diff_cleanupEfficiency(i));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")i=e,t=this.diff_text1(i);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")t=e,i=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")t=e,i=n;else throw new Error("Unknown call format to patch_make.");if(i.length===0)return[];for(var a=[],s=new f.patch_obj,l=0,u=0,g=0,c=t,_=t,m=0;m<i.length;m++){var p=i[m][0],w=i[m][1];switch(!l&&p!==h&&(s.start1=u,s.start2=g),p){case d:s.diffs[l++]=i[m],s.length2+=w.length,_=_.substring(0,g)+w+_.substring(g);break;case v:s.length1+=w.length,s.diffs[l++]=i[m],_=_.substring(0,g)+_.substring(g+w.length);break;case h:w.length<=2*this.Patch_Margin&&l&&i.length!=m+1?(s.diffs[l++]=i[m],s.length1+=w.length,s.length2+=w.length):w.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(s,c),a.push(s),s=new f.patch_obj,l=0,c=_,u=g);break}p!==d&&(u+=w.length),p!==v&&(g+=w.length)}return l&&(this.patch_addContext_(s,c),a.push(s)),a},f.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var t=e[n],i=new f.patch_obj;i.diffs=[];for(var a=0;a<t.diffs.length;a++)i.diffs[a]=new f.Diff(t.diffs[a][0],t.diffs[a][1]);i.start1=t.start1,i.start2=t.start2,i.length1=t.length1,i.length2=t.length2,r[n]=i}return r},f.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var t=0,i=[],a=0;a<e.length;a++){var s=e[a].start2+t,l=this.diff_text1(e[a].diffs),u,g=-1;if(l.length>this.Match_MaxBits?(u=this.match_main(r,l.substring(0,this.Match_MaxBits),s),u!=-1&&(g=this.match_main(r,l.substring(l.length-this.Match_MaxBits),s+l.length-this.Match_MaxBits),(g==-1||u>=g)&&(u=-1))):u=this.match_main(r,l,s),u==-1)i[a]=!1,t-=e[a].length2-e[a].length1;else{i[a]=!0,t=u-s;var c;if(g==-1?c=r.substring(u,u+l.length):c=r.substring(u,g+this.Match_MaxBits),l==c)r=r.substring(0,u)+this.diff_text2(e[a].diffs)+r.substring(u+l.length);else{var _=this.diff_main(l,c,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(_)/l.length>this.Patch_DeleteThreshold)i[a]=!1;else{this.diff_cleanupSemanticLossless(_);for(var m=0,p,w=0;w<e[a].diffs.length;w++){var b=e[a].diffs[w];b[0]!==h&&(p=this.diff_xIndex(_,m)),b[0]===d?r=r.substring(0,u+p)+b[1]+r.substring(u+p):b[0]===v&&(r=r.substring(0,u+p)+r.substring(u+this.diff_xIndex(_,m+b[1].length))),b[0]!==v&&(m+=b[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,i]},f.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",t=1;t<=r;t++)n+=String.fromCharCode(t);for(var t=0;t<e.length;t++)e[t].start1+=r,e[t].start2+=r;var i=e[0],a=i.diffs;if(a.length==0||a[0][0]!=h)a.unshift(new f.Diff(h,n)),i.start1-=r,i.start2-=r,i.length1+=r,i.length2+=r;else if(r>a[0][1].length){var s=r-a[0][1].length;a[0][1]=n.substring(a[0][1].length)+a[0][1],i.start1-=s,i.start2-=s,i.length1+=s,i.length2+=s}if(i=e[e.length-1],a=i.diffs,a.length==0||a[a.length-1][0]!=h)a.push(new f.Diff(h,n)),i.length1+=r,i.length2+=r;else if(r>a[a.length-1][1].length){var s=r-a[a.length-1][1].length;a[a.length-1][1]+=n.substring(0,s),i.length1+=s,i.length2+=s}return n},f.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var t=e[n];e.splice(n--,1);for(var i=t.start1,a=t.start2,s="";t.diffs.length!==0;){var l=new f.patch_obj,u=!0;for(l.start1=i-s.length,l.start2=a-s.length,s!==""&&(l.length1=l.length2=s.length,l.diffs.push(new f.Diff(h,s)));t.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var g=t.diffs[0][0],c=t.diffs[0][1];g===d?(l.length2+=c.length,a+=c.length,l.diffs.push(t.diffs.shift()),u=!1):g===v&&l.diffs.length==1&&l.diffs[0][0]==h&&c.length>2*r?(l.length1+=c.length,i+=c.length,u=!1,l.diffs.push(new f.Diff(g,c)),t.diffs.shift()):(c=c.substring(0,r-l.length1-this.Patch_Margin),l.length1+=c.length,i+=c.length,g===h?(l.length2+=c.length,a+=c.length):u=!1,l.diffs.push(new f.Diff(g,c)),c==t.diffs[0][1]?t.diffs.shift():t.diffs[0][1]=t.diffs[0][1].substring(c.length))}s=this.diff_text2(l.diffs),s=s.substring(s.length-this.Patch_Margin);var _=this.diff_text1(t.diffs).substring(0,this.Patch_Margin);_!==""&&(l.length1+=_.length,l.length2+=_.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===h?l.diffs[l.diffs.length-1][1]+=_:l.diffs.push(new f.Diff(h,_))),u||e.splice(++n,0,l)}}},f.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},f.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(` 3 - `),t=0,i=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;t<n.length;){var a=n[t].match(i);if(!a)throw new Error("Invalid patch string: "+n[t]);var s=new f.patch_obj;for(r.push(s),s.start1=parseInt(a[1],10),a[2]===""?(s.start1--,s.length1=1):a[2]=="0"?s.length1=0:(s.start1--,s.length1=parseInt(a[2],10)),s.start2=parseInt(a[3],10),a[4]===""?(s.start2--,s.length2=1):a[4]=="0"?s.length2=0:(s.start2--,s.length2=parseInt(a[4],10)),t++;t<n.length;){var l=n[t].charAt(0);try{var u=decodeURI(n[t].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+u)}if(l=="-")s.diffs.push(new f.Diff(v,u));else if(l=="+")s.diffs.push(new f.Diff(d,u));else if(l==" ")s.diffs.push(new f.Diff(h,u));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+u)}t++}}return r},f.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},f.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@ 4 - `],t,i=0;i<this.diffs.length;i++){switch(this.diffs[i][0]){case d:t="+";break;case v:t="-";break;case h:t=" ";break}n[i+1]=t+encodeURI(this.diffs[i][1])+` 5 - `}return n.join("").replace(/%20/g," ")},o.exports=f,o.exports.diff_match_patch=f,o.exports.DIFF_DELETE=v,o.exports.DIFF_INSERT=d,o.exports.DIFF_EQUAL=h})(J);var ie=J.exports,F={},P={exports:{}},Q={},A={},Y={};(function(o){o.__esModule=!0;function f(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}o.default=v;function v(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2],n=h.nodeType==9||h.ownerDocument,t=n.createNodeIterator(h,e,r,!1);return new d(t,h,e,r)}var d=function(){function h(e,r,n,t){f(this,h),this.root=r,this.whatToShow=n,this.filter=t,this.referenceNode=r,this.pointerBeforeReferenceNode=!0,this._iter=e}return h.prototype.nextNode=function(){var r=this._iter.nextNode();return this.pointerBeforeReferenceNode=!1,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.previousNode=function(){var r=this._iter.previousNode();return this.pointerBeforeReferenceNode=!0,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(Y);var $={};(function(o){o.__esModule=!0,o.default=f;function f(v){var d=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],h=arguments.length<=2||arguments[2]===void 0?null:arguments[2],e=v.ownerDocument;return e.createNodeIterator.call(e,v,d,h)}})($);var B={};(function(o){o.__esModule=!0;function f(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}o.default=v;function v(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2];return new d(h,e,r)}var d=function(){function h(e,r,n){f(this,h),this.root=e,this.whatToShow=r,this.filter=n,this.referenceNode=e,this.pointerBeforeReferenceNode=!0,this._filter=function(t){return n?n(t)===1:!0},this._show=function(t){return r>>t.nodeType-1&!0}}return h.prototype.nextNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!1;var n=this.referenceNode;if(r&&this._show(n)&&this._filter(n))return n;do{if(n.firstChild){n=n.firstChild;continue}do{if(n===this.root)return null;if(n.nextSibling)break;n=n.parentNode}while(n);n=n.nextSibling}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!1,n},h.prototype.previousNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!0;var n=this.referenceNode;if(!r&&this._show(n)&&this._filter(n))return n;do{if(n===this.root)return null;if(n.previousSibling){for(n=n.previousSibling;n.lastChild;)n=n.lastChild;continue}n=n.parentNode}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!0,n},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(B);(function(o){o.__esModule=!0,o.default=t;var f=Y,v=n(f),d=$,h=n(d),e=B,r=n(e);function n(i){return i&&i.__esModule?i:{default:i}}function t(){try{var i=typeof document>"u"?{}:document,a=(0,h.default)(i,4294967295,null,!1);return a.referenceNode===i?h.default:v.default}catch{return r.default}}})(A);var L={};(function(o){o.__esModule=!0,o.default=r;var f=$,v=e(f),d=A,h=e(d);function e(n){return n&&n.__esModule?n:{default:n}}function r(){var n=typeof document>"u"?{}:document,t=(0,h.default)();return t!==v.default&&(n.createNodeIterator=t),t}})(L);(function(o){o.__esModule=!0;var f=A,v=n(f),d=B,h=n(d),e=L,r=n(e);function n(i){return i&&i.__esModule?i:{default:i}}var t=(0,v.default)();t.implementation=h.default,t.shim=r.default,o.default=t})(Q);var ae=A.default,se=B.default,fe=L.default;P.exports=Q.default;P.exports.getPolyfill=ae;P.exports.implementation=se;P.exports.shim=fe;var le=P.exports,Z={},oe=ue;function ue(o,f){var v=[];f=f||he;do v.push(o),o=o.parentNode;while(o&&o.tagName&&f(o));return v.slice(1)}function he(o){return!0}/*! 6 - * index-of <https://github.com/jonschlinkert/index-of> 7 - * 8 - * Copyright (c) 2014-2015 Jon Schlinkert. 9 - * Licensed under the MIT license. 10 - */var ge=function(f,v,d){d=d||0;var h=-1;if(f==null)return h;var e=f.length,r=d<0?e+d:d;if(r>=f.length)return-1;for(;r<e;){if(f[r]===v)return r;r++}return-1};(function(o){o.__esModule=!0,o.default=a;var f=oe,v=e(f),d=ge,h=e(d);function e(g){return g&&g.__esModule?g:{default:g}}var r="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",n="Argument 2 of seek must be a number or a Text Node.",t=4,i=3;function a(g,c){if(g.whatToShow!==t)throw new Error(r);var _=0,m=g.referenceNode,p=null;if(s(c))p={forward:function(){return _<c},backward:function(){return _>c}};else if(l(c)){var w=u(m,c)?function(){return!1}:function(){return m!==c},b=function(){return m!=c||!g.pointerBeforeReferenceNode};p={forward:w,backward:b}}else throw new Error(n);for(;p.forward()&&(m=g.nextNode())!==null;)_+=m.nodeValue.length;for(;p.backward()&&(m=g.previousNode())!==null;)_-=m.nodeValue.length;return _}function s(g){return!isNaN(parseInt(g))&&isFinite(g)}function l(g){return g.nodeType===i}function u(g,c){if(g===c)return!1;for(var _=null,m=[g].concat((0,v.default)(g)).reverse(),p=[c].concat((0,v.default)(c)).reverse();m[0]===p[0];)_=m.shift(),p.shift();m=m[0],p=p[0];var w=(0,h.default)(_.childNodes,m),b=(0,h.default)(_.childNodes,p);return w>b}})(Z);var ve=Z.default,H={};Object.defineProperty(H,"__esModule",{value:!0});H.default=me;function k(o,f){if(!f&&o.firstChild)return o.firstChild;do{if(o.nextSibling)return o.nextSibling;o=o.parentNode}while(o);return o}function ce(o){if(o.startContainer.nodeType===Node.ELEMENT_NODE){var f=o.startContainer.childNodes[o.startOffset];return f||k(o.startContainer,!0)}return o.startContainer}function de(o){if(o.endContainer.nodeType===Node.ELEMENT_NODE){var f=o.endContainer.childNodes[o.endOffset];return f||k(o.endContainer,!0)}return k(o.endContainer)}function _e(o,f){for(var v=ce(o),d=de(o);v!==d;)f(v),v=k(v)}function me(o){var f="";return _e(o,function(v){if(v.nodeType===Node.TEXT_NODE){var d=v===o.startContainer?o.startOffset:0,h=v===o.endContainer?o.endOffset:v.textContent.length;f+=v.textContent.slice(d,h)}}),f}Object.defineProperty(F,"__esModule",{value:!0});F.fromRange=Me;F.toRange=De;var pe=le,we=W(pe),be=ve,U=W(be),Ne=H,V=W(Ne);function W(o){return o&&o.__esModule?o:{default:o}}var Ee=4;function Me(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=o.ownerDocument,d=v.createRange(),h=f.startContainer,e=f.startOffset;d.setStart(o,0),d.setEnd(h,e);var r=(0,V.default)(d).length,n=r+(0,V.default)(f).length;return{start:r,end:n}}function De(o){var f=arguments.length<=1||arguments[1]===void 0?{}:arguments[1];if(o===void 0)throw new Error('missing required parameter "root"');var v=o.ownerDocument,d=v.createRange(),h=(0,we.default)(o,Ee),e=f.start||0,r=f.end||e,n=(0,U.default)(h,e),t=e-n;h.pointerBeforeReferenceNode?d.setStart(h.referenceNode,t):(d.setStart(h.nextNode(),t),h.previousNode());var i=r-e+t;return n=(0,U.default)(h,i),t=i-n,h.pointerBeforeReferenceNode?d.setEnd(h.referenceNode,t):d.setEnd(h.nextNode(),t),d}var Te=F;Object.defineProperty(O,"__esModule",{value:!0});O.fromRange=Pe;O.fromTextPosition=x;O.toRange=ke;O.toTextPosition=ee;var Se=ie,Ce=ye(Se),Ie=Te,K=Re(Ie);function Re(o){if(o&&o.__esModule)return o;var f={};if(o!=null)for(var v in o)Object.prototype.hasOwnProperty.call(o,v)&&(f[v]=o[v]);return f.default=o,f}function ye(o){return o&&o.__esModule?o:{default:o}}var j=32,Oe=new RegExp(`(.|[\r 11 - ]){1,`+String(j)+"}","g"),q=j;function Pe(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=K.fromRange(o,f);return x(o,v)}function x(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "selector"');var v=f.start;if(v===void 0)throw new Error('selector missing required property "start"');if(v<0)throw new Error('property "start" must be a non-negative integer');var d=f.end;if(d===void 0)throw new Error('selector missing required property "end"');if(d<0)throw new Error('property "end" must be a non-negative integer');var h=o.textContent.substr(v,d-v),e=Math.max(0,v-q),r=o.textContent.substr(e,v-e),n=Math.min(o.textContent.length,d+q),t=o.textContent.substr(d,n-d);return{exact:h,prefix:r,suffix:t}}function ke(o,f){var v=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},d=ee(o,f,v);return d===null?null:K.toRange(o,d)}function ee(o,f){var v=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "selector"');var d=f.exact;if(d===void 0)throw new Error('selector missing required property "exact"');var h=f.prefix,e=f.suffix,r=v.hint,n=new Ce.default;n.Match_Distance=o.textContent.length*2;var t=d.match(Oe),i=r===void 0?o.textContent.length/2|0:r,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=-1,u=h!==void 0,g=e!==void 0,c=!1;u&&(l=n.match_main(o.textContent,h,i),l>-1&&(i=l+h.length,c=!0)),g&&!c&&(l=n.match_main(o.textContent,e,i+d.length),l>-1&&(i=l-d.length));var _=t.shift();if(l=n.match_main(o.textContent,_,i),l>-1)a=l,i=s=a+_.length;else return null;var m=function(b,E){if(!b)return null;var N=n.match_main(o.textContent,E,b.loc);return N===-1?null:(b.loc=N+E.length,b.start=Math.min(b.start,N),b.end=Math.max(b.end,N+E.length),b)};n.Match_Distance=64;var p=t.reduce(m,{start:a,end:s,loc:i});return p?{start:p.start,end:p.end}:null}var X={},re={};(function(o){Object.defineProperty(o,"__esModule",{value:!0}),o.default=n;var f="Iterator exhausted before seek ended.",v="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",d="Argument 2 of seek must be an integer or a Text Node.",h=2,e=4,r=3;function n(s,l){if(s.whatToShow!==e){var u;try{u=new DOMException(v,"InvalidStateError")}catch{u=new Error(v),u.code=11,u.name="InvalidStateError",u.toString=function(){return"InvalidStateError: ".concat(v)}}throw u}var g=0,c=s.referenceNode,_=null;if(t(l))_={forward:function(){return g<l},backward:function(){return g>l||!s.pointerBeforeReferenceNode}};else if(i(l)){var m=a(c,l)?function(){return!1}:function(){return c!==l},p=function(){return c!==l||!s.pointerBeforeReferenceNode};_={forward:m,backward:p}}else throw new TypeError(d);for(;_.forward();){if(c=s.nextNode(),c===null)throw new RangeError(f);g+=c.nodeValue.length}for(s.nextNode()&&(c=s.previousNode());_.backward();){if(c=s.previousNode(),c===null)throw new RangeError(f);g-=c.nodeValue.length}if(!i(s.referenceNode))throw new RangeError(f);return g}function t(s){return typeof s!="number"?!1:isFinite(s)&&Math.floor(s)===s}function i(s){return s.nodeType===r}function a(s,l){return s.compareDocumentPosition(l)&h}})(re);var Fe=re.default,ne={};(function(o){Object.defineProperty(o,"__esModule",{value:!0}),o.default=e;function f(r,n){if(!n&&r.firstChild)return r.firstChild;do{if(r.nextSibling)return r.nextSibling;r=r.parentNode}while(r);return r}function v(r){if(r.startContainer.nodeType===Node.ELEMENT_NODE){var n=r.startContainer.childNodes[r.startOffset];return n||f(r.startContainer,!0)}return r.startContainer}function d(r){if(r.endContainer.nodeType===Node.ELEMENT_NODE){var n=r.endContainer.childNodes[r.endOffset];return n||f(r.endContainer,!0)}return f(r.endContainer)}function h(r,n){for(var t=v(r),i=d(r);t!==i;)n(t),t=f(t)}function e(r){var n="";return h(r,function(t){if(t.nodeType===Node.TEXT_NODE){var i=t===r.startContainer?r.startOffset:0,a=t===r.endContainer?r.endOffset:t.textContent.length;n+=t.textContent.slice(i,a)}}),n}})(ne);Object.defineProperty(X,"__esModule",{value:!0});X.fromRange=Be;X.toRange=$e;var G=te(Fe),z=te(ne);function te(o){return o&&o.__esModule?o:{default:o}}var Ae=4;function Be(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=o.ownerDocument,d=v.createRange(),h=f.startContainer,e=f.startOffset;d.setStart(o,0),d.setEnd(h,e);var r=(0,z.default)(d).length,n=r+(0,z.default)(f).length;return{start:r,end:n}}function $e(o){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(o===void 0)throw new Error('missing required parameter "root"');var v=o.ownerDocument,d=v.createRange(),h=v.createNodeIterator(o,Ae),e=f.start||0,r=f.end||e,n=e-(0,G.default)(h,e),t=h.referenceNode,i=r-e+n,a=i-(0,G.default)(h,i),s=h.referenceNode;return d.setStart(t,n),d.setEnd(s,a),d}class Le{constructor(f="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(f),this.channel.onmessage=v=>{this.listeners.forEach(d=>d(v.data))}}async get(f){const v=localStorage.getItem(f);return v?JSON.parse(v):null}async set(f,v){const d=await this.get(f);localStorage.setItem(f,JSON.stringify(v));const h={key:f,newValue:v,oldValue:d};this.channel.postMessage(h)}onChange(f){this.listeners.push(f)}close(){this.channel.close()}}export{Le as W,X as a,O as l}; 12 - //# sourceMappingURL=web-Cwqa0NM7.js.map
-1
proxy/static/static/assets/web-Cwqa0NM7.js.map
··· 1 - {"version":3,"file":"web-Cwqa0NM7.js","sources":["../../../node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/adapter.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/builtin.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/index.js","../../../node_modules/.pnpm/ancestors@0.0.3/node_modules/ancestors/index.js","../../../node_modules/.pnpm/index-of@0.2.0/node_modules/index-of/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/index.js","../../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../packages/core/src/storage/web.ts"],"sourcesContent":["/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.nodeType == 9 || root.ownerDocument;\n var iter = doc.createNodeIterator(root, whatToShow, filter, false);\n return new NodeIterator(iter, root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(iter, root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._iter = iter;\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var result = this._iter.nextNode();\n this.pointerBeforeReferenceNode = false;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var result = this._iter.previousNode();\n this.pointerBeforeReferenceNode = true;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwibm9kZVR5cGUiLCJvd25lckRvY3VtZW50IiwiaXRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9pdGVyIiwibmV4dE5vZGUiLCJyZXN1bHQiLCJwcmV2aW91c05vZGUiLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFlQSxrQjs7O0FBR2YsU0FBU0Esa0JBQVQsQ0FBNEJDLElBQTVCLEVBQTBFO0FBQUEsTUFBeENDLFVBQXdDLHlEQUEzQixVQUEyQjtBQUFBLE1BQWZDLE1BQWUseURBQU4sSUFBTTs7QUFDeEUsTUFBTUMsTUFBT0gsS0FBS0ksUUFBTCxJQUFpQixDQUFsQixJQUF3QkosS0FBS0ssYUFBekM7QUFDQSxNQUFNQyxPQUFPSCxJQUFJSixrQkFBSixDQUF1QkMsSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRCxLQUFqRCxDQUFiO0FBQ0EsU0FBTyxJQUFJSyxZQUFKLENBQWlCRCxJQUFqQixFQUF1Qk4sSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxDQUFQO0FBQ0Q7O0lBR0tLLFk7QUFDSix3QkFBWUQsSUFBWixFQUFrQk4sSUFBbEIsRUFBd0JDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUFBOztBQUMxQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLGFBQUwsR0FBcUJSLElBQXJCO0FBQ0EsU0FBS1MsMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLElBQWI7QUFDRDs7eUJBRURLLFEsdUJBQVc7QUFDVCxRQUFNQyxTQUFTLEtBQUtGLEtBQUwsQ0FBV0MsUUFBWCxFQUFmO0FBQ0EsU0FBS0YsMEJBQUwsR0FBa0MsS0FBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURLLFksMkJBQWU7QUFDYixRQUFNRCxTQUFTLEtBQUtGLEtBQUwsQ0FBV0csWUFBWCxFQUFmO0FBQ0EsU0FBS0osMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURNLFEsdUJBQVc7QUFDVCxXQUFPLHVCQUFQO0FBQ0QsRyIsImZpbGUiOiJhZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY3JlYXRlTm9kZUl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QsIHdoYXRUb1Nob3cgPSAweEZGRkZGRkZGLCBmaWx0ZXIgPSBudWxsKSB7XG4gIGNvbnN0IGRvYyA9IChyb290Lm5vZGVUeXBlID09IDkpIHx8IHJvb3Qub3duZXJEb2N1bWVudFxuICBjb25zdCBpdGVyID0gZG9jLmNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGZhbHNlKVxuICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihpdGVyLCByb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpXG59XG5cblxuY2xhc3MgTm9kZUl0ZXJhdG9yIHtcbiAgY29uc3RydWN0b3IoaXRlciwgcm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgdGhpcy5yb290ID0gcm9vdFxuICAgIHRoaXMud2hhdFRvU2hvdyA9IHdoYXRUb1Nob3dcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlclxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJvb3RcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHRoaXMuX2l0ZXIgPSBpdGVyXG4gIH1cblxuICBuZXh0Tm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLm5leHROb2RlKClcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHByZXZpb3VzTm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLnByZXZpb3VzTm9kZSgpXG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBOb2RlSXRlcmF0b3JdJ1xuICB9XG59XG4iXX0=","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.ownerDocument;\n return doc.createNodeIterator.call(doc, root, whatToShow, filter);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsdGluLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwib3duZXJEb2N1bWVudCIsImNhbGwiXSwibWFwcGluZ3MiOiI7OztxQkFBZUEsa0I7OztBQUdmLFNBQVNBLGtCQUFULENBQTRCQyxJQUE1QixFQUEwRTtBQUFBLE1BQXhDQyxVQUF3Qyx5REFBM0IsVUFBMkI7QUFBQSxNQUFmQyxNQUFlLHlEQUFOLElBQU07O0FBQ3hFLE1BQU1DLE1BQU1ILEtBQUtJLGFBQWpCO0FBQ0EsU0FBT0QsSUFBSUosa0JBQUosQ0FBdUJNLElBQXZCLENBQTRCRixHQUE1QixFQUFpQ0gsSUFBakMsRUFBdUNDLFVBQXZDLEVBQW1EQyxNQUFuRCxDQUFQO0FBQ0QiLCJmaWxlIjoiYnVpbHRpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyZWF0ZU5vZGVJdGVyYXRvclxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93ID0gMHhGRkZGRkZGRiwgZmlsdGVyID0gbnVsbCkge1xuICBjb25zdCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgcmV0dXJuIGRvYy5jcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChkb2MsIHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcilcbn1cbiJdfQ==","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n return new NodeIterator(root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._filter = function (node) {\n return filter ? filter(node) === 1 : true;\n };\n this._show = function (node) {\n return whatToShow >> node.nodeType - 1 & 1 === 1;\n };\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = false;\n\n var node = this.referenceNode;\n if (before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node.firstChild) {\n node = node.firstChild;\n continue;\n }\n\n do {\n if (node === this.root) return null;\n if (node.nextSibling) break;\n node = node.parentNode;\n } while (node);\n\n node = node.nextSibling;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = false;\n return node;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = true;\n\n var node = this.referenceNode;\n if (!before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node === this.root) return null;\n\n if (node.previousSibling) {\n node = node.previousSibling;\n while (node.lastChild) {\n node = node.lastChild;\n }continue;\n }\n\n node = node.parentNode;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = true;\n return node;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBsZW1lbnRhdGlvbi5qcyJdLCJuYW1lcyI6WyJjcmVhdGVOb2RlSXRlcmF0b3IiLCJyb290Iiwid2hhdFRvU2hvdyIsImZpbHRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9maWx0ZXIiLCJub2RlIiwiX3Nob3ciLCJub2RlVHlwZSIsIm5leHROb2RlIiwiYmVmb3JlIiwiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInByZXZpb3VzTm9kZSIsInByZXZpb3VzU2libGluZyIsImxhc3RDaGlsZCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQWVBLGtCOzs7QUFHZixTQUFTQSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBMEU7QUFBQSxNQUF4Q0MsVUFBd0MseURBQTNCLFVBQTJCO0FBQUEsTUFBZkMsTUFBZSx5REFBTixJQUFNOztBQUN4RSxTQUFPLElBQUlDLFlBQUosQ0FBaUJILElBQWpCLEVBQXVCQyxVQUF2QixFQUFtQ0MsTUFBbkMsQ0FBUDtBQUNEOztJQUdLQyxZO0FBQ0osd0JBQVlILElBQVosRUFBa0JDLFVBQWxCLEVBQThCQyxNQUE5QixFQUFzQztBQUFBOztBQUNwQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtFLGFBQUwsR0FBcUJKLElBQXJCO0FBQ0EsU0FBS0ssMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxPQUFMLEdBQWUsVUFBQ0MsSUFBRDtBQUFBLGFBQVVMLFNBQVNBLE9BQU9LLElBQVAsTUFBaUIsQ0FBMUIsR0FBOEIsSUFBeEM7QUFBQSxLQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLFVBQUNELElBQUQ7QUFBQSxhQUFVTixjQUFjTSxLQUFLRSxRQUFMLEdBQWdCLENBQTlCLEdBQWtDLE1BQU0sQ0FBbEQ7QUFBQSxLQUFiO0FBQ0Q7O3lCQUVEQyxRLHVCQUFXO0FBQ1QsUUFBTUMsU0FBUyxLQUFLTiwwQkFBcEI7QUFDQSxTQUFLQSwwQkFBTCxHQUFrQyxLQUFsQzs7QUFFQSxRQUFJRSxPQUFPLEtBQUtILGFBQWhCO0FBQ0EsUUFBSU8sVUFBVSxLQUFLSCxLQUFMLENBQVdELElBQVgsQ0FBVixJQUE4QixLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FBbEMsRUFBc0QsT0FBT0EsSUFBUDs7QUFFdEQsT0FBRztBQUNELFVBQUlBLEtBQUtLLFVBQVQsRUFBcUI7QUFDbkJMLGVBQU9BLEtBQUtLLFVBQVo7QUFDQTtBQUNEOztBQUVELFNBQUc7QUFDRCxZQUFJTCxTQUFTLEtBQUtQLElBQWxCLEVBQXdCLE9BQU8sSUFBUDtBQUN4QixZQUFJTyxLQUFLTSxXQUFULEVBQXNCO0FBQ3RCTixlQUFPQSxLQUFLTyxVQUFaO0FBQ0QsT0FKRCxRQUlTUCxJQUpUOztBQU1BQSxhQUFPQSxLQUFLTSxXQUFaO0FBQ0QsS0FiRCxRQWFRLENBQUMsS0FBS0wsS0FBTCxDQUFXRCxJQUFYLENBQUQsSUFBcUIsQ0FBQyxLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FiOUI7O0FBZUEsU0FBS0gsYUFBTCxHQUFxQkcsSUFBckI7QUFDQSxTQUFLRiwwQkFBTCxHQUFrQyxLQUFsQztBQUNBLFdBQU9FLElBQVA7QUFDRCxHOzt5QkFFRFEsWSwyQkFBZTtBQUNiLFFBQU1KLFNBQVMsS0FBS04sMEJBQXBCO0FBQ0EsU0FBS0EsMEJBQUwsR0FBa0MsSUFBbEM7O0FBRUEsUUFBSUUsT0FBTyxLQUFLSCxhQUFoQjtBQUNBLFFBQUksQ0FBQ08sTUFBRCxJQUFXLEtBQUtILEtBQUwsQ0FBV0QsSUFBWCxDQUFYLElBQStCLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQUFuQyxFQUF1RCxPQUFPQSxJQUFQOztBQUV2RCxPQUFHO0FBQ0QsVUFBSUEsU0FBUyxLQUFLUCxJQUFsQixFQUF3QixPQUFPLElBQVA7O0FBRXhCLFVBQUlPLEtBQUtTLGVBQVQsRUFBMEI7QUFDeEJULGVBQU9BLEtBQUtTLGVBQVo7QUFDQSxlQUFPVCxLQUFLVSxTQUFaO0FBQXVCVixpQkFBT0EsS0FBS1UsU0FBWjtBQUF2QixTQUNBO0FBQ0Q7O0FBRURWLGFBQU9BLEtBQUtPLFVBQVo7QUFDRCxLQVZELFFBVVEsQ0FBQyxLQUFLTixLQUFMLENBQVdELElBQVgsQ0FBRCxJQUFxQixDQUFDLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQVY5Qjs7QUFZQSxTQUFLSCxhQUFMLEdBQXFCRyxJQUFyQjtBQUNBLFNBQUtGLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0EsV0FBT0UsSUFBUDtBQUNELEc7O3lCQUVEVyxRLHVCQUFXO0FBQ1QsV0FBTyx1QkFBUDtBQUNELEciLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjcmVhdGVOb2RlSXRlcmF0b3JcblxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdyA9IDB4RkZGRkZGRkYsIGZpbHRlciA9IG51bGwpIHtcbiAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKVxufVxuXG5cbmNsYXNzIE5vZGVJdGVyYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcikge1xuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcbiAgICB0aGlzLnJlZmVyZW5jZU5vZGUgPSByb290XG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICB0aGlzLl9maWx0ZXIgPSAobm9kZSkgPT4gZmlsdGVyID8gZmlsdGVyKG5vZGUpID09PSAxIDogdHJ1ZVxuICAgIHRoaXMuX3Nob3cgPSAobm9kZSkgPT4gd2hhdFRvU2hvdyA+PiBub2RlLm5vZGVUeXBlIC0gMSAmIDEgPT09IDFcbiAgfVxuXG4gIG5leHROb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcblxuICAgIGxldCBub2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlXG4gICAgaWYgKGJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG4gICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSBicmVha1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgICB9IHdoaWxlIChub2RlKVxuXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZ1xuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJldmlvdXNOb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgICBpZiAoIWJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG5cbiAgICAgIGlmIChub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUl0ZXJhdG9yXSdcbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = getPolyfill;\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction getPolyfill() {\n try {\n var doc = typeof document === 'undefined' ? {} : document;\n var iter = (0, _builtin2['default'])(doc, 0xFFFFFFFF, null, false);\n if (iter.referenceNode === doc) return _builtin2['default'];\n return _adapter2['default'];\n } catch (_) {\n return _implementation2['default'];\n }\n} /*global document*/\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wb2x5ZmlsbC5qcyJdLCJuYW1lcyI6WyJnZXRQb2x5ZmlsbCIsImRvYyIsImRvY3VtZW50IiwiaXRlciIsInJlZmVyZW5jZU5vZGUiLCJfIl0sIm1hcHBpbmdzIjoiOzs7cUJBTXdCQSxXOztBQUx4Qjs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUdlLFNBQVNBLFdBQVQsR0FBdUI7QUFDcEMsTUFBSTtBQUNGLFFBQU1DLE1BQU0sT0FBT0MsUUFBUCxLQUFxQixXQUFyQixHQUFtQyxFQUFuQyxHQUF3Q0EsUUFBcEQ7QUFDQSxRQUFNQyxPQUFPLDBCQUFRRixHQUFSLEVBQWEsVUFBYixFQUF5QixJQUF6QixFQUErQixLQUEvQixDQUFiO0FBQ0EsUUFBSUUsS0FBS0MsYUFBTCxLQUF1QkgsR0FBM0IsRUFBZ0M7QUFDaEM7QUFDRCxHQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1Y7QUFDRDtBQUNGLEMsQ0FmRCIsImZpbGUiOiJwb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBpbXBsZW1lbnRhdGlvbiBmcm9tICcuL2ltcGxlbWVudGF0aW9uJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICAgIGNvbnN0IGl0ZXIgPSBidWlsdGluKGRvYywgMHhGRkZGRkZGRiwgbnVsbCwgZmFsc2UpXG4gICAgaWYgKGl0ZXIucmVmZXJlbmNlTm9kZSA9PT0gZG9jKSByZXR1cm4gYnVpbHRpblxuICAgIHJldHVybiBhZGFwdGVyXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shim;\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/*global document*/\nfunction shim() {\n var doc = typeof document === 'undefined' ? {} : document;\n var polyfill = (0, _polyfill2['default'])();\n if (polyfill !== _builtin2['default']) doc.createNodeIterator = polyfill;\n return polyfill;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGltLmpzIl0sIm5hbWVzIjpbInNoaW0iLCJkb2MiLCJkb2N1bWVudCIsInBvbHlmaWxsIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIl0sIm1hcHBpbmdzIjoiOzs7cUJBS3dCQSxJOztBQUp4Qjs7OztBQUNBOzs7Ozs7QUFGQTtBQUtlLFNBQVNBLElBQVQsR0FBZ0I7QUFDN0IsTUFBTUMsTUFBTSxPQUFPQyxRQUFQLEtBQXFCLFdBQXJCLEdBQW1DLEVBQW5DLEdBQXdDQSxRQUFwRDtBQUNBLE1BQU1DLFdBQVcsNEJBQWpCO0FBQ0EsTUFBSUEsaUNBQUosRUFBMEJGLElBQUlHLGtCQUFKLEdBQXlCRCxRQUF6QjtBQUMxQixTQUFPQSxRQUFQO0FBQ0QiLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBnZXRQb2x5ZmlsbCBmcm9tICcuL3BvbHlmaWxsJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoaW0oKSB7XG4gIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICBjb25zdCBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKClcbiAgaWYgKHBvbHlmaWxsICE9PSBidWlsdGluKSBkb2MuY3JlYXRlTm9kZUl0ZXJhdG9yID0gcG9seWZpbGxcbiAgcmV0dXJuIHBvbHlmaWxsXG59XG4iXX0=","'use strict';\n\nexports.__esModule = true;\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nvar _shim = require('./shim');\n\nvar _shim2 = _interopRequireDefault(_shim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar polyfill = (0, _polyfill2['default'])();\npolyfill.implementation = _implementation2['default'];\npolyfill.shim = _shim2['default'];\n\nexports['default'] = polyfill;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwb2x5ZmlsbCIsImltcGxlbWVudGF0aW9uIiwic2hpbSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyw0QkFBakI7QUFDQUEsU0FBU0MsY0FBVDtBQUNBRCxTQUFTRSxJQUFUOztxQkFFZUYsUSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UG9seWZpbGwgfSBmcm9tICcuL3BvbHlmaWxsJ1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBpbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNoaW0gfSBmcm9tICcuL3NoaW0nXG5cbmNvbnN0IHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKVxucG9seWZpbGwuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvblxucG9seWZpbGwuc2hpbSA9IHNoaW1cblxuZXhwb3J0IGRlZmF1bHQgcG9seWZpbGxcbiJdfQ==","module.exports = require('./lib/polyfill')['default'];\n","module.exports = require('./lib/implementation')['default'];\n","module.exports = require('./lib/shim')['default'];\n","module.exports = require('./lib')['default'];\nmodule.exports.getPolyfill = require('./polyfill');\nmodule.exports.implementation = require('./implementation');\nmodule.exports.shim = require('./shim');\n","module.exports = parents\n\nfunction parents(node, filter) {\n var out = []\n\n filter = filter || noop\n\n do {\n out.push(node)\n node = node.parentNode\n } while(node && node.tagName && filter(node))\n\n return out.slice(1)\n}\n\nfunction noop(n) {\n return true\n}\n","/*!\n * index-of <https://github.com/jonschlinkert/index-of>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function indexOf(arr, ele, start) {\n start = start || 0;\n var idx = -1;\n\n if (arr == null) return idx;\n var len = arr.length;\n var i = start < 0\n ? (len + start)\n : start;\n\n if (i >= arr.length) {\n return -1;\n }\n\n while (i < len) {\n if (arr[i] === ele) {\n return i;\n }\n i++;\n }\n\n return -1;\n};\n","'use strict';\n\nexports.__esModule = true;\nexports['default'] = seek;\n\nvar _ancestors = require('ancestors');\n\nvar _ancestors2 = _interopRequireDefault(_ancestors);\n\nvar _indexOf = require('index-of');\n\nvar _indexOf2 = _interopRequireDefault(_indexOf);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be a number or a Text Node.';\n\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n throw new Error(E_SHOW);\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isNumber(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n var backward = function backward() {\n return node != where || !iter.pointerBeforeReferenceNode;\n };\n predicates = { forward: forward, backward: backward };\n } else {\n throw new Error(E_WHERE);\n }\n\n while (predicates.forward() && (node = iter.nextNode()) !== null) {\n count += node.nodeValue.length;\n }\n\n while (predicates.backward() && (node = iter.previousNode()) !== null) {\n count -= node.nodeValue.length;\n }\n\n return count;\n}\n\nfunction isNumber(n) {\n return !isNaN(parseInt(n)) && isFinite(n);\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n if (ref === node) return false;\n\n var common = null;\n var left = [ref].concat((0, _ancestors2['default'])(ref)).reverse();\n var right = [node].concat((0, _ancestors2['default'])(node)).reverse();\n\n while (left[0] === right[0]) {\n common = left.shift();\n right.shift();\n }\n\n left = left[0];\n right = right[0];\n\n var l = (0, _indexOf2['default'])(common.childNodes, left);\n var r = (0, _indexOf2['default'])(common.childNodes, right);\n\n return l > r;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzZWVrIiwiRV9TSE9XIiwiRV9XSEVSRSIsIlNIT1dfVEVYVCIsIlRFWFRfTk9ERSIsIml0ZXIiLCJ3aGVyZSIsIndoYXRUb1Nob3ciLCJFcnJvciIsImNvdW50Iiwibm9kZSIsInJlZmVyZW5jZU5vZGUiLCJwcmVkaWNhdGVzIiwiaXNOdW1iZXIiLCJmb3J3YXJkIiwiYmFja3dhcmQiLCJpc1RleHQiLCJiZWZvcmUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIm5leHROb2RlIiwibm9kZVZhbHVlIiwibGVuZ3RoIiwicHJldmlvdXNOb2RlIiwibiIsImlzTmFOIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsIm5vZGVUeXBlIiwicmVmIiwiY29tbW9uIiwibGVmdCIsImNvbmNhdCIsInJldmVyc2UiLCJyaWdodCIsInNoaWZ0IiwibCIsImNoaWxkTm9kZXMiLCJyIl0sIm1hcHBpbmdzIjoiOzs7cUJBVXdCQSxJOztBQVZ4Qjs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQyxTQUFTLDBEQUFmO0FBQ0EsSUFBTUMsVUFBVSxxREFBaEI7O0FBRUEsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLFlBQVksQ0FBbEI7O0FBR2UsU0FBU0osSUFBVCxDQUFjSyxJQUFkLEVBQW9CQyxLQUFwQixFQUEyQjtBQUN4QyxNQUFJRCxLQUFLRSxVQUFMLEtBQW9CSixTQUF4QixFQUFtQztBQUNqQyxVQUFNLElBQUlLLEtBQUosQ0FBVVAsTUFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSVEsUUFBUSxDQUFaO0FBQ0EsTUFBSUMsT0FBT0wsS0FBS00sYUFBaEI7QUFDQSxNQUFJQyxhQUFhLElBQWpCOztBQUVBLE1BQUlDLFNBQVNQLEtBQVQsQ0FBSixFQUFxQjtBQUNuQk0saUJBQWE7QUFDWEUsZUFBUztBQUFBLGVBQU1MLFFBQVFILEtBQWQ7QUFBQSxPQURFO0FBRVhTLGdCQUFVO0FBQUEsZUFBTU4sUUFBUUgsS0FBZDtBQUFBO0FBRkMsS0FBYjtBQUlELEdBTEQsTUFLTyxJQUFJVSxPQUFPVixLQUFQLENBQUosRUFBbUI7QUFDeEIsUUFBSVEsVUFBVUcsT0FBT1AsSUFBUCxFQUFhSixLQUFiLElBQXNCO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FBdEIsR0FBb0M7QUFBQSxhQUFNSSxTQUFTSixLQUFmO0FBQUEsS0FBbEQ7QUFDQSxRQUFJUyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxhQUFNTCxRQUFRSixLQUFSLElBQWlCLENBQUNELEtBQUthLDBCQUE3QjtBQUFBLEtBQWY7QUFDQU4saUJBQWEsRUFBQ0UsZ0JBQUQsRUFBVUMsa0JBQVYsRUFBYjtBQUNELEdBSk0sTUFJQTtBQUNMLFVBQU0sSUFBSVAsS0FBSixDQUFVTixPQUFWLENBQU47QUFDRDs7QUFFRCxTQUFPVSxXQUFXRSxPQUFYLE1BQXdCLENBQUNKLE9BQU9MLEtBQUtjLFFBQUwsRUFBUixNQUE2QixJQUE1RCxFQUFrRTtBQUNoRVYsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9ULFdBQVdHLFFBQVgsTUFBeUIsQ0FBQ0wsT0FBT0wsS0FBS2lCLFlBQUwsRUFBUixNQUFpQyxJQUFqRSxFQUF1RTtBQUNyRWIsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9aLEtBQVA7QUFDRDs7QUFHRCxTQUFTSSxRQUFULENBQWtCVSxDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNDLE1BQU1DLFNBQVNGLENBQVQsQ0FBTixDQUFELElBQXVCRyxTQUFTSCxDQUFULENBQTlCO0FBQ0Q7O0FBR0QsU0FBU1AsTUFBVCxDQUFnQk4sSUFBaEIsRUFBc0I7QUFDcEIsU0FBT0EsS0FBS2lCLFFBQUwsS0FBa0J2QixTQUF6QjtBQUNEOztBQUdELFNBQVNhLE1BQVQsQ0FBZ0JXLEdBQWhCLEVBQXFCbEIsSUFBckIsRUFBMkI7QUFDekIsTUFBSWtCLFFBQVFsQixJQUFaLEVBQWtCLE9BQU8sS0FBUDs7QUFFbEIsTUFBSW1CLFNBQVMsSUFBYjtBQUNBLE1BQUlDLE9BQU8sQ0FBQ0YsR0FBRCxFQUFNRyxNQUFOLENBQWEsNEJBQVVILEdBQVYsQ0FBYixFQUE2QkksT0FBN0IsRUFBWDtBQUNBLE1BQUlDLFFBQVEsQ0FBQ3ZCLElBQUQsRUFBT3FCLE1BQVAsQ0FBYyw0QkFBVXJCLElBQVYsQ0FBZCxFQUErQnNCLE9BQS9CLEVBQVo7O0FBRUEsU0FBT0YsS0FBSyxDQUFMLE1BQVlHLE1BQU0sQ0FBTixDQUFuQixFQUE2QjtBQUMzQkosYUFBU0MsS0FBS0ksS0FBTCxFQUFUO0FBQ0FELFVBQU1DLEtBQU47QUFDRDs7QUFFREosU0FBT0EsS0FBSyxDQUFMLENBQVA7QUFDQUcsVUFBUUEsTUFBTSxDQUFOLENBQVI7O0FBRUEsTUFBSUUsSUFBSSwwQkFBUU4sT0FBT08sVUFBZixFQUEyQk4sSUFBM0IsQ0FBUjtBQUNBLE1BQUlPLElBQUksMEJBQVFSLE9BQU9PLFVBQWYsRUFBMkJILEtBQTNCLENBQVI7O0FBRUEsU0FBT0UsSUFBSUUsQ0FBWDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFuY2VzdG9ycyBmcm9tICdhbmNlc3RvcnMnXG5pbXBvcnQgaW5kZXhPZiBmcm9tICdpbmRleC1vZidcblxuY29uc3QgRV9TSE9XID0gJ0FyZ3VtZW50IDEgb2Ygc2VlayBtdXN0IHVzZSBmaWx0ZXIgTm9kZUZpbHRlci5TSE9XX1RFWFQuJ1xuY29uc3QgRV9XSEVSRSA9ICdBcmd1bWVudCAyIG9mIHNlZWsgbXVzdCBiZSBhIG51bWJlciBvciBhIFRleHQgTm9kZS4nXG5cbmNvbnN0IFNIT1dfVEVYVCA9IDRcbmNvbnN0IFRFWFRfTk9ERSA9IDNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWVrKGl0ZXIsIHdoZXJlKSB7XG4gIGlmIChpdGVyLndoYXRUb1Nob3cgIT09IFNIT1dfVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1NIT1cpXG4gIH1cblxuICBsZXQgY291bnQgPSAwXG4gIGxldCBub2RlID0gaXRlci5yZWZlcmVuY2VOb2RlXG4gIGxldCBwcmVkaWNhdGVzID0gbnVsbFxuXG4gIGlmIChpc051bWJlcih3aGVyZSkpIHtcbiAgICBwcmVkaWNhdGVzID0ge1xuICAgICAgZm9yd2FyZDogKCkgPT4gY291bnQgPCB3aGVyZSxcbiAgICAgIGJhY2t3YXJkOiAoKSA9PiBjb3VudCA+IHdoZXJlLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHQod2hlcmUpKSB7XG4gICAgbGV0IGZvcndhcmQgPSBiZWZvcmUobm9kZSwgd2hlcmUpID8gKCkgPT4gZmFsc2UgOiAoKSA9PiBub2RlICE9PSB3aGVyZVxuICAgIGxldCBiYWNrd2FyZCA9ICgpID0+IG5vZGUgIT0gd2hlcmUgfHwgIWl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICBwcmVkaWNhdGVzID0ge2ZvcndhcmQsIGJhY2t3YXJkfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1dIRVJFKVxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuZm9yd2FyZCgpICYmIChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCkge1xuICAgIGNvdW50ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aFxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuYmFja3dhcmQoKSAmJiAobm9kZSA9IGl0ZXIucHJldmlvdXNOb2RlKCkpICE9PSBudWxsKSB7XG4gICAgY291bnQgLT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuXG5mdW5jdGlvbiBpc051bWJlcihuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobikpICYmIGlzRmluaXRlKG4pXG59XG5cblxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZShyZWYsIG5vZGUpIHtcbiAgaWYgKHJlZiA9PT0gbm9kZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNvbW1vbiA9IG51bGxcbiAgbGV0IGxlZnQgPSBbcmVmXS5jb25jYXQoYW5jZXN0b3JzKHJlZikpLnJldmVyc2UoKVxuICBsZXQgcmlnaHQgPSBbbm9kZV0uY29uY2F0KGFuY2VzdG9ycyhub2RlKSkucmV2ZXJzZSgpXG5cbiAgd2hpbGUgKGxlZnRbMF0gPT09IHJpZ2h0WzBdKSB7XG4gICAgY29tbW9uID0gbGVmdC5zaGlmdCgpXG4gICAgcmlnaHQuc2hpZnQoKVxuICB9XG5cbiAgbGVmdCA9IGxlZnRbMF1cbiAgcmlnaHQgPSByaWdodFswXVxuXG4gIGxldCBsID0gaW5kZXhPZihjb21tb24uY2hpbGROb2RlcywgbGVmdClcbiAgbGV0IHIgPSBpbmRleE9mKGNvbW1vbi5jaGlsZE5vZGVzLCByaWdodClcblxuICByZXR1cm4gbCA+IHJcbn1cbiJdfQ==","module.exports = require('./lib')['default'];\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rangeToString;\n/* global Node */\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n } while (node);\n\n /* istanbul ignore next */\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true /* skip children */);\n }\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true /* skip children */);\n }\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS10by1zdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBcUR3QixhO0FBckR4Qjs7QUFFQTs7O0FBR0EsU0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCLFlBQXhCLEVBQXNDO0FBQ3BDLE1BQUksQ0FBQyxZQUFELElBQWlCLEtBQUssVUFBMUIsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFFRCxLQUFHO0FBQ0QsUUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsYUFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELFdBQU8sS0FBSyxVQUFaO0FBQ0QsR0FMRCxRQUtTLElBTFQ7O0FBT0E7QUFDQSxTQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFDeEIsTUFBSSxNQUFNLGNBQU4sQ0FBcUIsUUFBckIsS0FBa0MsS0FBSyxZQUEzQyxFQUF5RDtBQUN2RCxRQUFNLE9BQU8sTUFBTSxjQUFOLENBQXFCLFVBQXJCLENBQWdDLE1BQU0sV0FBdEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sY0FBZixFQUErQixJQUEvQixDQUFvQyxtQkFBcEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxNQUFNLGNBQWI7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsS0FBeEIsRUFBK0I7QUFDN0IsTUFBSSxNQUFNLFlBQU4sQ0FBbUIsUUFBbkIsS0FBZ0MsS0FBSyxZQUF6QyxFQUF1RDtBQUNyRCxRQUFNLE9BQU8sTUFBTSxZQUFOLENBQW1CLFVBQW5CLENBQThCLE1BQU0sU0FBcEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sWUFBZixFQUE2QixJQUE3QixDQUFrQyxtQkFBbEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxTQUFTLE1BQU0sWUFBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxFQUF1QztBQUNyQyxNQUFJLE9BQU8sVUFBVSxLQUFWLENBQVg7QUFDQSxNQUFNLFVBQVUsZUFBZSxLQUFmLENBQWhCO0FBQ0EsU0FBTyxTQUFTLE9BQWhCLEVBQXlCO0FBQ3ZCLE9BQUcsSUFBSDtBQUNBLFdBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNGOztBQUVEOzs7Ozs7O0FBT2UsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCO0FBQzNDO0FBQ0E7QUFDQSxNQUFJLE9BQU8sRUFBWDtBQUNBLHFCQUFtQixLQUFuQixFQUEwQixVQUFDLElBQUQsRUFBVTtBQUNsQyxRQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFNBQTNCLEVBQXNDO0FBQ3BDO0FBQ0Q7QUFDRCxRQUFNLFFBQVEsU0FBUyxNQUFNLGNBQWYsR0FBZ0MsTUFBTSxXQUF0QyxHQUFvRCxDQUFsRTtBQUNBLFFBQU0sTUFBTSxTQUFTLE1BQU0sWUFBZixHQUE4QixNQUFNLFNBQXBDLEdBQWdELEtBQUssV0FBTCxDQUFpQixNQUE3RTtBQUNBLFlBQVEsS0FBSyxXQUFMLENBQWlCLEtBQWpCLENBQXVCLEtBQXZCLEVBQThCLEdBQTlCLENBQVI7QUFDRCxHQVBEO0FBUUEsU0FBTyxJQUFQO0FBQ0QiLCJmaWxlIjoicmFuZ2UtdG8tc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIE5vZGUgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgbm9kZSBhZnRlciBgbm9kZWAgaW4gYSB0cmVlIG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG5leHROb2RlKG5vZGUsIHNraXBDaGlsZHJlbikge1xuICBpZiAoIXNraXBDaGlsZHJlbiAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkXG4gIH1cblxuICBkbyB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgfSB3aGlsZSAobm9kZSlcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiBmaXJzdE5vZGUocmFuZ2UpIHtcbiAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XVxuICAgIHJldHVybiBub2RlIHx8IG5leHROb2RlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0cnVlIC8qIHNraXAgY2hpbGRyZW4gKi8pXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnN0YXJ0Q29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGZpcnN0Tm9kZUFmdGVyKHJhbmdlKSB7XG4gIGlmIChyYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF1cbiAgICByZXR1cm4gbm9kZSB8fCBuZXh0Tm9kZShyYW5nZS5lbmRDb250YWluZXIsIHRydWUgLyogc2tpcCBjaGlsZHJlbiAqLylcbiAgfVxuICByZXR1cm4gbmV4dE5vZGUocmFuZ2UuZW5kQ29udGFpbmVyKVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIGNiKSB7XG4gIGxldCBub2RlID0gZmlyc3ROb2RlKHJhbmdlKVxuICBjb25zdCBwYXN0RW5kID0gZmlyc3ROb2RlQWZ0ZXIocmFuZ2UpXG4gIHdoaWxlIChub2RlICE9PSBwYXN0RW5kKSB7XG4gICAgY2Iobm9kZSlcbiAgICBub2RlID0gbmV4dE5vZGUobm9kZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgcG9ueWZpbGwgZm9yIFJhbmdlLnRvU3RyaW5nKCkuXG4gKiBTcGVjOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yYW5nZS1zdHJpbmdpZmllclxuICpcbiAqIFdvcmtzIGFyb3VuZCB0aGUgYnVnZ3kgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBpbiBJRSBhbmQgRWRnZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGlsZ292aS9kb20tYW5jaG9yLXRleHQtcG9zaXRpb24vaXNzdWVzLzRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhyYW5nZSkge1xuICAvLyBUaGlzIGlzIGEgZmFpcmx5IGRpcmVjdCB0cmFuc2xhdGlvbiBvZiB0aGUgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvblxuICAvLyBpbiBCbGluay5cbiAgbGV0IHRleHQgPSAnJ1xuICBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlID09PSByYW5nZS5zdGFydENvbnRhaW5lciA/IHJhbmdlLnN0YXJ0T2Zmc2V0IDogMFxuICAgIGNvbnN0IGVuZCA9IG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lciA/IHJhbmdlLmVuZE9mZnNldCA6IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoXG4gICAgdGV4dCArPSBub2RlLnRleHRDb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0pXG4gIHJldHVybiB0ZXh0XG59XG5cbiJdfQ==","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domNodeIterator = require('dom-node-iterator');\n\nvar _domNodeIterator2 = _interopRequireDefault(_domNodeIterator);\n\nvar _domSeek = require('dom-seek');\n\nvar _domSeek2 = _interopRequireDefault(_domSeek);\n\nvar _rangeToString = require('./range-to-string');\n\nvar _rangeToString2 = _interopRequireDefault(_rangeToString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n\n var start = (0, _rangeToString2.default)(prefix).length;\n var end = start + (0, _rangeToString2.default)(range).length;\n\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = (0, _domNodeIterator2.default)(root, SHOW_TEXT);\n\n var start = selector.start || 0;\n var end = selector.end || start;\n var count = (0, _domSeek2.default)(iter, start);\n var remainder = start - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setStart(iter.referenceNode, remainder);\n } else {\n range.setStart(iter.nextNode(), remainder);\n iter.previousNode();\n }\n\n var length = end - start + remainder;\n count = (0, _domSeek2.default)(iter, length);\n remainder = length - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setEnd(iter.referenceNode, remainder);\n } else {\n range.setEnd(iter.nextNode(), remainder);\n }\n\n return range;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQU9nQixTLEdBQUEsUztRQTJCQSxPLEdBQUEsTzs7QUFsQ2hCOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxZQUFZLENBQWxCOztBQUVPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxNQUFJLFNBQVMsU0FBYixFQUF3QjtBQUN0QixVQUFNLElBQUksS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUksVUFBVSxTQUFkLEVBQXlCO0FBQ3ZCLFVBQU0sSUFBSSxLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxTQUFTLFNBQVMsV0FBVCxFQUFiOztBQUVBLE1BQUksWUFBWSxNQUFNLGNBQXRCO0FBQ0EsTUFBSSxjQUFjLE1BQU0sV0FBeEI7O0FBRUEsU0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLENBQXRCO0FBQ0EsU0FBTyxNQUFQLENBQWMsU0FBZCxFQUF5QixXQUF6Qjs7QUFFQSxNQUFJLFFBQVEsNkJBQWMsTUFBZCxFQUFzQixNQUFsQztBQUNBLE1BQUksTUFBTSxRQUFRLDZCQUFjLEtBQWQsRUFBcUIsTUFBdkM7O0FBRUEsU0FBTztBQUNMLFdBQU8sS0FERjtBQUVMLFNBQUs7QUFGQSxHQUFQO0FBSUQ7O0FBR00sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXNDO0FBQUEsTUFBZixRQUFlLHlEQUFKLEVBQUk7O0FBQzNDLE1BQUksU0FBUyxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSSxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxRQUFRLFNBQVMsV0FBVCxFQUFaO0FBQ0EsTUFBSSxPQUFPLCtCQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFYOztBQUVBLE1BQUksUUFBUSxTQUFTLEtBQVQsSUFBa0IsQ0FBOUI7QUFDQSxNQUFJLE1BQU0sU0FBUyxHQUFULElBQWdCLEtBQTFCO0FBQ0EsTUFBSSxRQUFRLHVCQUFLLElBQUwsRUFBVyxLQUFYLENBQVo7QUFDQSxNQUFJLFlBQVksUUFBUSxLQUF4Qjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxRQUFOLENBQWUsS0FBSyxhQUFwQixFQUFtQyxTQUFuQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sUUFBTixDQUFlLEtBQUssUUFBTCxFQUFmLEVBQWdDLFNBQWhDO0FBQ0EsU0FBSyxZQUFMO0FBQ0Q7O0FBRUQsTUFBSSxTQUFVLE1BQU0sS0FBUCxHQUFnQixTQUE3QjtBQUNBLFVBQVEsdUJBQUssSUFBTCxFQUFXLE1BQVgsQ0FBUjtBQUNBLGNBQVksU0FBUyxLQUFyQjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxNQUFOLENBQWEsS0FBSyxhQUFsQixFQUFpQyxTQUFqQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sTUFBTixDQUFhLEtBQUssUUFBTCxFQUFiLEVBQThCLFNBQTlCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTm9kZUl0ZXJhdG9yIGZyb20gJ2RvbS1ub2RlLWl0ZXJhdG9yJ1xuaW1wb3J0IHNlZWsgZnJvbSAnZG9tLXNlZWsnXG5cbmltcG9ydCByYW5nZVRvU3RyaW5nIGZyb20gJy4vcmFuZ2UtdG8tc3RyaW5nJ1xuXG5jb25zdCBTSE9XX1RFWFQgPSA0XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IGRvY3VtZW50ID0gcm9vdC5vd25lckRvY3VtZW50XG4gIGxldCBwcmVmaXggPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG5cbiAgbGV0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGxldCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG5cbiAgcHJlZml4LnNldFN0YXJ0KHJvb3QsIDApXG4gIHByZWZpeC5zZXRFbmQoc3RhcnROb2RlLCBzdGFydE9mZnNldClcblxuICBsZXQgc3RhcnQgPSByYW5nZVRvU3RyaW5nKHByZWZpeCkubGVuZ3RoXG4gIGxldCBlbmQgPSBzdGFydCArIHJhbmdlVG9TdHJpbmcocmFuZ2UpLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFuZ2Uocm9vdCwgc2VsZWN0b3IgPSB7fSkge1xuICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJvb3RcIicpXG4gIH1cblxuICBsZXQgZG9jdW1lbnQgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICBsZXQgaXRlciA9IGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCBTSE9XX1RFWFQpXG5cbiAgbGV0IHN0YXJ0ID0gc2VsZWN0b3Iuc3RhcnQgfHwgMFxuICBsZXQgZW5kID0gc2VsZWN0b3IuZW5kIHx8IHN0YXJ0XG4gIGxldCBjb3VudCA9IHNlZWsoaXRlciwgc3RhcnQpXG4gIGxldCByZW1haW5kZXIgPSBzdGFydCAtIGNvdW50XG5cbiAgaWYgKGl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGUpIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLnJlZmVyZW5jZU5vZGUsIHJlbWFpbmRlcilcbiAgfSBlbHNlIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgICBpdGVyLnByZXZpb3VzTm9kZSgpXG4gIH1cblxuICBsZXQgbGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSArIHJlbWFpbmRlclxuICBjb3VudCA9IHNlZWsoaXRlciwgbGVuZ3RoKVxuICByZW1haW5kZXIgPSBsZW5ndGggLSBjb3VudFxuXG4gIGlmIChpdGVyLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgcmFuZ2Uuc2V0RW5kKGl0ZXIucmVmZXJlbmNlTm9kZSwgcmVtYWluZGVyKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlLnNldEVuZChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgfVxuXG4gIHJldHVybiByYW5nZVxufVxuIl19","module.exports = require('./lib')\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.fromTextPosition = fromTextPosition;\nexports.toRange = toRange;\nexports.toTextPosition = toTextPosition;\n\nvar _diffMatchPatch = require('diff-match-patch');\n\nvar _diffMatchPatch2 = _interopRequireDefault(_diffMatchPatch);\n\nvar _domAnchorTextPosition = require('dom-anchor-text-position');\n\nvar textPosition = _interopRequireWildcard(_domAnchorTextPosition);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The DiffMatchPatch bitap has a hard 32-character pattern length limit.\nvar SLICE_LENGTH = 32;\nvar SLICE_RE = new RegExp('(.|[\\r\\n]){1,' + String(SLICE_LENGTH) + '}', 'g');\nvar CONTEXT_LENGTH = SLICE_LENGTH;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var position = textPosition.fromRange(root, range);\n return fromTextPosition(root, position);\n}\n\nfunction fromTextPosition(root, selector) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var start = selector.start;\n\n if (start === undefined) {\n throw new Error('selector missing required property \"start\"');\n }\n if (start < 0) {\n throw new Error('property \"start\" must be a non-negative integer');\n }\n\n var end = selector.end;\n\n if (end === undefined) {\n throw new Error('selector missing required property \"end\"');\n }\n if (end < 0) {\n throw new Error('property \"end\" must be a non-negative integer');\n }\n\n var exact = root.textContent.substr(start, end - start);\n\n var prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n var prefix = root.textContent.substr(prefixStart, start - prefixStart);\n\n var suffixEnd = Math.min(root.textContent.length, end + CONTEXT_LENGTH);\n var suffix = root.textContent.substr(end, suffixEnd - end);\n\n return { exact: exact, prefix: prefix, suffix: suffix };\n}\n\nfunction toRange(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var position = toTextPosition(root, selector, options);\n if (position === null) {\n return null;\n } else {\n return textPosition.toRange(root, position);\n }\n}\n\nfunction toTextPosition(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var exact = selector.exact;\n\n if (exact === undefined) {\n throw new Error('selector missing required property \"exact\"');\n }\n\n var prefix = selector.prefix,\n suffix = selector.suffix;\n var hint = options.hint;\n\n var dmp = new _diffMatchPatch2.default();\n\n dmp.Match_Distance = root.textContent.length * 2;\n\n // Work around a hard limit of the DiffMatchPatch bitap implementation.\n // The search pattern must be no more than SLICE_LENGTH characters.\n var slices = exact.match(SLICE_RE);\n var loc = hint === undefined ? root.textContent.length / 2 | 0 : hint;\n var start = Number.POSITIVE_INFINITY;\n var end = Number.NEGATIVE_INFINITY;\n var result = -1;\n var havePrefix = prefix !== undefined;\n var haveSuffix = suffix !== undefined;\n var foundPrefix = false;\n\n // If the prefix is known then search for that first.\n if (havePrefix) {\n result = dmp.match_main(root.textContent, prefix, loc);\n if (result > -1) {\n loc = result + prefix.length;\n foundPrefix = true;\n }\n }\n\n // If we have a suffix, and the prefix wasn't found, then search for it.\n if (haveSuffix && !foundPrefix) {\n result = dmp.match_main(root.textContent, suffix, loc + exact.length);\n if (result > -1) {\n loc = result - exact.length;\n }\n }\n\n // Search for the first slice.\n var firstSlice = slices.shift();\n result = dmp.match_main(root.textContent, firstSlice, loc);\n if (result > -1) {\n start = result;\n loc = end = start + firstSlice.length;\n } else {\n return null;\n }\n\n // Create a fold function that will reduce slices to positional extents.\n var foldSlices = function foldSlices(acc, slice) {\n if (!acc) {\n // A search for an earlier slice of the pattern failed to match.\n return null;\n }\n\n var result = dmp.match_main(root.textContent, slice, acc.loc);\n if (result === -1) {\n return null;\n }\n\n // The next slice should follow this one closely.\n acc.loc = result + slice.length;\n\n // Expand the start and end to a quote that includes all the slices.\n acc.start = Math.min(acc.start, result);\n acc.end = Math.max(acc.end, result + slice.length);\n\n return acc;\n };\n\n // Use the fold function to establish the full quote extents.\n // Expect the slices to be close to one another.\n // This distance is deliberately generous for now.\n dmp.Match_Distance = 64;\n var acc = slices.reduce(foldSlices, { start: start, end: end, loc: loc });\n if (!acc) {\n return null;\n }\n\n return { start: acc.start, end: acc.end };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JD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ZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/ICgocm9vdC50ZXh0Q29udGVudC5sZW5ndGggLyAyKSB8IDApIDogaGludFxuICBsZXQgc3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IGVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICBsZXQgcmVzdWx0ID0gLTFcbiAgbGV0IGhhdmVQcmVmaXggPSBwcmVmaXggIT09IHVuZGVmaW5lZFxuICBsZXQgaGF2ZVN1ZmZpeCA9IHN1ZmZpeCAhPT0gdW5kZWZpbmVkXG4gIGxldCBmb3VuZFByZWZpeCA9IGZhbHNlXG5cbiAgLy8gSWYgdGhlIHByZWZpeCBpcyBrbm93biB0aGVuIHNlYXJjaCBmb3IgdGhhdCBmaXJzdC5cbiAgaWYgKGhhdmVQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBwcmVmaXgsIGxvYylcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCArIHByZWZpeC5sZW5ndGhcbiAgICAgIGZvdW5kUHJlZml4ID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSBzdWZmaXgsIGFuZCB0aGUgcHJlZml4IHdhc24ndCBmb3VuZCwgdGhlbiBzZWFyY2ggZm9yIGl0LlxuICBpZiAoaGF2ZVN1ZmZpeCAmJiAhZm91bmRQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBzdWZmaXgsIGxvYyArIGV4YWN0Lmxlbmd0aClcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCAtIGV4YWN0Lmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsaWNlLlxuICBsZXQgZmlyc3RTbGljZSA9IHNsaWNlcy5zaGlmdCgpXG4gIHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIGZpcnN0U2xpY2UsIGxvYylcbiAgaWYgKHJlc3VsdCA+IC0xKSB7XG4gICAgc3RhcnQgPSByZXN1bHRcbiAgICBsb2MgPSBlbmQgPSBzdGFydCArIGZpcnN0U2xpY2UubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGZvbGQgZnVuY3Rpb24gdGhhdCB3aWxsIHJlZHVjZSBzbGljZXMgdG8gcG9zaXRpb25hbCBleHRlbnRzLlxuICBsZXQgZm9sZFNsaWNlcyA9IChhY2MsIHNsaWNlKSA9PiB7XG4gICAgaWYgKCFhY2MpIHtcbiAgICAgIC8vIEEgc2VhcmNoIGZvciBhbiBlYXJsaWVyIHNsaWNlIG9mIHRoZSBwYXR0ZXJuIGZhaWxlZCB0byBtYXRjaC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIHNsaWNlLCBhY2MubG9jKVxuICAgIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHNsaWNlIHNob3VsZCBmb2xsb3cgdGhpcyBvbmUgY2xvc2VseS5cbiAgICBhY2MubG9jID0gcmVzdWx0ICsgc2xpY2UubGVuZ3RoXG5cbiAgICAvLyBFeHBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgdG8gYSBxdW90ZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgc2xpY2VzLlxuICAgIGFjYy5zdGFydCA9IE1hdGgubWluKGFjYy5zdGFydCwgcmVzdWx0KVxuICAgIGFjYy5lbmQgPSBNYXRoLm1heChhY2MuZW5kLCByZXN1bHQgKyBzbGljZS5sZW5ndGgpXG5cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICAvLyBVc2UgdGhlIGZvbGQgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBmdWxsIHF1b3RlIGV4dGVudHMuXG4gIC8vIEV4cGVjdCB0aGUgc2xpY2VzIHRvIGJlIGNsb3NlIHRvIG9uZSBhbm90aGVyLlxuICAvLyBUaGlzIGRpc3RhbmNlIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3Igbm93LlxuICBkbXAuTWF0Y2hfRGlzdGFuY2UgPSA2NFxuICBjb25zdCBhY2MgPSBzbGljZXMucmVkdWNlKGZvbGRTbGljZXMsIHtzdGFydCwgZW5kLCBsb2N9KVxuICBpZiAoIWFjYykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge3N0YXJ0OiBhY2Muc3RhcnQsIGVuZDogYWNjLmVuZH1cbn1cbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = seek;\nvar E_END = 'Iterator exhausted before seek ended.';\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.';\nvar DOCUMENT_POSITION_PRECEDING = 2;\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n var error; // istanbul ignore next\n\n try {\n error = new DOMException(E_SHOW, 'InvalidStateError');\n } catch (_unused) {\n error = new Error(E_SHOW);\n error.code = 11;\n error.name = 'InvalidStateError';\n\n error.toString = function () {\n return \"InvalidStateError: \".concat(E_SHOW);\n };\n }\n\n throw error;\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isInteger(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where || !iter.pointerBeforeReferenceNode;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n\n var backward = function backward() {\n return node !== where || !iter.pointerBeforeReferenceNode;\n };\n\n predicates = {\n forward: forward,\n backward: backward\n };\n } else {\n throw new TypeError(E_WHERE);\n }\n\n while (predicates.forward()) {\n node = iter.nextNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count += node.nodeValue.length;\n }\n\n if (iter.nextNode()) {\n node = iter.previousNode();\n }\n\n while (predicates.backward()) {\n node = iter.previousNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count -= node.nodeValue.length;\n }\n\n if (!isText(iter.referenceNode)) {\n throw new RangeError(E_END);\n }\n\n return count;\n}\n\nfunction isInteger(n) {\n if (typeof n !== 'number') return false;\n return isFinite(n) && Math.floor(n) === n;\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING;\n}\n//# sourceMappingURL=index.js.map","module.exports = require('./lib')['default'];\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = rangeToString;\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n\n node = node.parentNode;\n } while (node);\n /* istanbul ignore next */\n\n\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true\n /* skip children */\n );\n }\n\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true\n /* skip children */\n );\n }\n\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\n\n\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=range-to-string.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domSeek = _interopRequireDefault(require(\"dom-seek\"));\n\nvar _rangeToString = _interopRequireDefault(require(\"./range-to-string\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n var start = (0, _rangeToString[\"default\"])(prefix).length;\n var end = start + (0, _rangeToString[\"default\"])(range).length;\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = document.createNodeIterator(root, SHOW_TEXT);\n var start = selector.start || 0;\n var end = selector.end || start;\n var startOffset = start - (0, _domSeek[\"default\"])(iter, start);\n var startNode = iter.referenceNode;\n var remainder = end - start + startOffset;\n var endOffset = remainder - (0, _domSeek[\"default\"])(iter, remainder);\n var endNode = iter.referenceNode;\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n return range;\n}\n//# sourceMappingURL=index.js.map","// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(key: string): Promise<any> {\n const value = localStorage.getItem(key);\n return value ? JSON.parse(value) : null;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n"],"names":["diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","i","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","a","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","j","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","delta","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","chars","lineStart","lineEnd","lineArrayLength","line","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","length","pattern","found","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","html","pattern_amp","pattern_lt","pattern_gt","pattern_para","data","levenshtein","insertions","deletions","diffsLength","tokens","param","n","s","match_bitapScore_","e","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","start","finish","rd","charMatch","patch","padding","prefix","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","mod","paddingLength","extraLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","m","sign","coords1","coords2","module","exports","_classCallCheck","instance","Constructor","createNodeIterator","root","whatToShow","filter","doc","iter","NodeIterator","result","node","before","getPolyfill","_adapter","require$$0","_adapter2","_interopRequireDefault","_builtin","require$$1","_builtin2","_implementation","require$$2","_implementation2","obj","shim","_polyfill","_polyfill2","polyfill","_shim","_shim2","implementation","domNodeIteratorModule","require$$3","ancestors","parents","out","noop","indexOf","arr","ele","idx","len","seek","_ancestors","_ancestors2","_indexOf","_indexOf2","E_SHOW","E_WHERE","SHOW_TEXT","TEXT_NODE","where","count","predicates","isNumber","isText","forward","backward","ref","common","left","right","l","r","domSeek","rangeToString_1","rangeToString","nextNode","skipChildren","firstNode","range","firstNodeAfter","forEachNodeInRange","cb","pastEnd","end","lib","fromRange","toRange","_domNodeIterator","_domNodeIterator2","_domSeek","_domSeek2","_rangeToString","_rangeToString2","document","startNode","startOffset","selector","remainder","domAnchorTextPosition","fromTextPosition","toTextPosition","_diffMatchPatch","_diffMatchPatch2","_domAnchorTextPosition","textPosition","_interopRequireWildcard","newObj","key","SLICE_LENGTH","SLICE_RE","CONTEXT_LENGTH","position","exact","prefixStart","suffixEnd","options","hint","slices","havePrefix","haveSuffix","foundPrefix","firstSlice","foldSlices","acc","slice","E_END","DOCUMENT_POSITION_PRECEDING","error","isInteger","endOffset","endNode","WebStorageAdapter","channelName","event","callback","value","oldValue","change"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-12
proxy/static/static/assets/web-Ts7v-0PE.js
··· 1 - var O={},J={exports:{}};(function(o){var f=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},v=-1,c=1,h=0;f.Diff=function(e,r){return[e,r]},f.prototype.diff_main=function(e,r,n,t){typeof t>"u"&&(this.Diff_Timeout<=0?t=Number.MAX_VALUE:t=new Date().getTime()+this.Diff_Timeout*1e3);var i=t;if(e==null||r==null)throw new Error("Null input. (diff_main)");if(e==r)return e?[new f.Diff(h,e)]:[];typeof n>"u"&&(n=!0);var a=n,s=this.diff_commonPrefix(e,r),l=e.substring(0,s);e=e.substring(s),r=r.substring(s),s=this.diff_commonSuffix(e,r);var u=e.substring(e.length-s);e=e.substring(0,e.length-s),r=r.substring(0,r.length-s);var g=this.diff_compute_(e,r,a,i);return l&&g.unshift(new f.Diff(h,l)),u&&g.push(new f.Diff(h,u)),this.diff_cleanupMerge(g),g},f.prototype.diff_compute_=function(e,r,n,t){var i;if(!e)return[new f.Diff(c,r)];if(!r)return[new f.Diff(v,e)];var a=e.length>r.length?e:r,s=e.length>r.length?r:e,l=a.indexOf(s);if(l!=-1)return i=[new f.Diff(c,a.substring(0,l)),new f.Diff(h,s),new f.Diff(c,a.substring(l+s.length))],e.length>r.length&&(i[0][0]=i[2][0]=v),i;if(s.length==1)return[new f.Diff(v,e),new f.Diff(c,r)];var u=this.diff_halfMatch_(e,r);if(u){var g=u[0],d=u[1],_=u[2],m=u[3],p=u[4],w=this.diff_main(g,_,n,t),b=this.diff_main(d,m,n,t);return w.concat([new f.Diff(h,p)],b)}return n&&e.length>100&&r.length>100?this.diff_lineMode_(e,r,t):this.diff_bisect_(e,r,t)},f.prototype.diff_lineMode_=function(e,r,n){var t=this.diff_linesToChars_(e,r);e=t.chars1,r=t.chars2;var i=t.lineArray,a=this.diff_main(e,r,!1,n);this.diff_charsToLines_(a,i),this.diff_cleanupSemantic(a),a.push(new f.Diff(h,""));for(var s=0,l=0,u=0,g="",d="";s<a.length;){switch(a[s][0]){case c:u++,d+=a[s][1];break;case v:l++,g+=a[s][1];break;case h:if(l>=1&&u>=1){a.splice(s-l-u,l+u),s=s-l-u;for(var _=this.diff_main(g,d,!1,n),m=_.length-1;m>=0;m--)a.splice(s,0,_[m]);s=s+_.length}u=0,l=0,g="",d="";break}s++}return a.pop(),a},f.prototype.diff_bisect_=function(e,r,n){for(var t=e.length,i=r.length,a=Math.ceil((t+i)/2),s=a,l=2*a,u=new Array(l),g=new Array(l),d=0;d<l;d++)u[d]=-1,g[d]=-1;u[s+1]=0,g[s+1]=0;for(var _=t-i,m=_%2!=0,p=0,w=0,b=0,E=0,N=0;N<a&&!(new Date().getTime()>n);N++){for(var M=-N+p;M<=N-w;M+=2){var D=s+M,T;M==-N||M!=N&&u[D-1]<u[D+1]?T=u[D+1]:T=u[D-1]+1;for(var C=T-M;T<t&&C<i&&e.charAt(T)==r.charAt(C);)T++,C++;if(u[D]=T,T>t)w+=2;else if(C>i)p+=2;else if(m){var I=s+_-M;if(I>=0&&I<l&&g[I]!=-1){var S=t-g[I];if(T>=S)return this.diff_bisectSplit_(e,r,T,C,n)}}}for(var R=-N+b;R<=N-E;R+=2){var I=s+R,S;R==-N||R!=N&&g[I-1]<g[I+1]?S=g[I+1]:S=g[I-1]+1;for(var y=S-R;S<t&&y<i&&e.charAt(t-S-1)==r.charAt(i-y-1);)S++,y++;if(g[I]=S,S>t)E+=2;else if(y>i)b+=2;else if(!m){var D=s+_-R;if(D>=0&&D<l&&u[D]!=-1){var T=u[D],C=s+T-D;if(S=t-S,T>=S)return this.diff_bisectSplit_(e,r,T,C,n)}}}}return[new f.Diff(v,e),new f.Diff(c,r)]},f.prototype.diff_bisectSplit_=function(e,r,n,t,i){var a=e.substring(0,n),s=r.substring(0,t),l=e.substring(n),u=r.substring(t),g=this.diff_main(a,s,!1,i),d=this.diff_main(l,u,!1,i);return g.concat(d)},f.prototype.diff_linesToChars_=function(e,r){var n=[],t={};n[0]="";function i(u){for(var g="",d=0,_=-1,m=n.length;_<u.length-1;){_=u.indexOf(` 2 - `,d),_==-1&&(_=u.length-1);var p=u.substring(d,_+1);(t.hasOwnProperty?t.hasOwnProperty(p):t[p]!==void 0)?g+=String.fromCharCode(t[p]):(m==a&&(p=u.substring(d),_=u.length),g+=String.fromCharCode(m),t[p]=m,n[m++]=p),d=_+1}return g}var a=4e4,s=i(e);a=65535;var l=i(r);return{chars1:s,chars2:l,lineArray:n}},f.prototype.diff_charsToLines_=function(e,r){for(var n=0;n<e.length;n++){for(var t=e[n][1],i=[],a=0;a<t.length;a++)i[a]=r[t.charCodeAt(a)];e[n][1]=i.join("")}},f.prototype.diff_commonPrefix=function(e,r){if(!e||!r||e.charAt(0)!=r.charAt(0))return 0;for(var n=0,t=Math.min(e.length,r.length),i=t,a=0;n<i;)e.substring(a,i)==r.substring(a,i)?(n=i,a=n):t=i,i=Math.floor((t-n)/2+n);return i},f.prototype.diff_commonSuffix=function(e,r){if(!e||!r||e.charAt(e.length-1)!=r.charAt(r.length-1))return 0;for(var n=0,t=Math.min(e.length,r.length),i=t,a=0;n<i;)e.substring(e.length-i,e.length-a)==r.substring(r.length-i,r.length-a)?(n=i,a=n):t=i,i=Math.floor((t-n)/2+n);return i},f.prototype.diff_commonOverlap_=function(e,r){var n=e.length,t=r.length;if(n==0||t==0)return 0;n>t?e=e.substring(n-t):n<t&&(r=r.substring(0,n));var i=Math.min(n,t);if(e==r)return i;for(var a=0,s=1;;){var l=e.substring(i-s),u=r.indexOf(l);if(u==-1)return a;s+=u,(u==0||e.substring(i-s)==r.substring(0,s))&&(a=s,s++)}},f.prototype.diff_halfMatch_=function(e,r){if(this.Diff_Timeout<=0)return null;var n=e.length>r.length?e:r,t=e.length>r.length?r:e;if(n.length<4||t.length*2<n.length)return null;var i=this;function a(w,b,E){for(var N=w.substring(E,E+Math.floor(w.length/4)),M=-1,D="",T,C,I,S;(M=b.indexOf(N,M+1))!=-1;){var R=i.diff_commonPrefix(w.substring(E),b.substring(M)),y=i.diff_commonSuffix(w.substring(0,E),b.substring(0,M));D.length<y+R&&(D=b.substring(M-y,M)+b.substring(M,M+R),T=w.substring(0,E-y),C=w.substring(E+R),I=b.substring(0,M-y),S=b.substring(M+R))}return D.length*2>=w.length?[T,C,I,S,D]:null}var s=a(n,t,Math.ceil(n.length/4)),l=a(n,t,Math.ceil(n.length/2)),u;if(!s&&!l)return null;l?s?u=s[4].length>l[4].length?s:l:u=l:u=s;var g,d,_,m;e.length>r.length?(g=u[0],d=u[1],_=u[2],m=u[3]):(_=u[0],m=u[1],g=u[2],d=u[3]);var p=u[4];return[g,d,_,m,p]},f.prototype.diff_cleanupSemantic=function(e){for(var r=!1,n=[],t=0,i=null,a=0,s=0,l=0,u=0,g=0;a<e.length;)e[a][0]==h?(n[t++]=a,s=u,l=g,u=0,g=0,i=e[a][1]):(e[a][0]==c?u+=e[a][1].length:g+=e[a][1].length,i&&i.length<=Math.max(s,l)&&i.length<=Math.max(u,g)&&(e.splice(n[t-1],0,new f.Diff(v,i)),e[n[t-1]+1][0]=c,t--,t--,a=t>0?n[t-1]:-1,s=0,l=0,u=0,g=0,i=null,r=!0)),a++;for(r&&this.diff_cleanupMerge(e),this.diff_cleanupSemanticLossless(e),a=1;a<e.length;){if(e[a-1][0]==v&&e[a][0]==c){var d=e[a-1][1],_=e[a][1],m=this.diff_commonOverlap_(d,_),p=this.diff_commonOverlap_(_,d);m>=p?(m>=d.length/2||m>=_.length/2)&&(e.splice(a,0,new f.Diff(h,_.substring(0,m))),e[a-1][1]=d.substring(0,d.length-m),e[a+1][1]=_.substring(m),a++):(p>=d.length/2||p>=_.length/2)&&(e.splice(a,0,new f.Diff(h,d.substring(0,p))),e[a-1][0]=c,e[a-1][1]=_.substring(0,_.length-p),e[a+1][0]=v,e[a+1][1]=d.substring(p),a++),a++}a++}},f.prototype.diff_cleanupSemanticLossless=function(e){function r(p,w){if(!p||!w)return 6;var b=p.charAt(p.length-1),E=w.charAt(0),N=b.match(f.nonAlphaNumericRegex_),M=E.match(f.nonAlphaNumericRegex_),D=N&&b.match(f.whitespaceRegex_),T=M&&E.match(f.whitespaceRegex_),C=D&&b.match(f.linebreakRegex_),I=T&&E.match(f.linebreakRegex_),S=C&&p.match(f.blanklineEndRegex_),R=I&&w.match(f.blanklineStartRegex_);return S||R?5:C||I?4:N&&!D&&T?3:D||T?2:N||M?1:0}for(var n=1;n<e.length-1;){if(e[n-1][0]==h&&e[n+1][0]==h){var t=e[n-1][1],i=e[n][1],a=e[n+1][1],s=this.diff_commonSuffix(t,i);if(s){var l=i.substring(i.length-s);t=t.substring(0,t.length-s),i=l+i.substring(0,i.length-s),a=l+a}for(var u=t,g=i,d=a,_=r(t,i)+r(i,a);i.charAt(0)===a.charAt(0);){t+=i.charAt(0),i=i.substring(1)+a.charAt(0),a=a.substring(1);var m=r(t,i)+r(i,a);m>=_&&(_=m,u=t,g=i,d=a)}e[n-1][1]!=u&&(u?e[n-1][1]=u:(e.splice(n-1,1),n--),e[n][1]=g,d?e[n+1][1]=d:(e.splice(n+1,1),n--))}n++}},f.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/,f.whitespaceRegex_=/\s/,f.linebreakRegex_=/[\r\n]/,f.blanklineEndRegex_=/\n\r?\n$/,f.blanklineStartRegex_=/^\r?\n\r?\n/,f.prototype.diff_cleanupEfficiency=function(e){for(var r=!1,n=[],t=0,i=null,a=0,s=!1,l=!1,u=!1,g=!1;a<e.length;)e[a][0]==h?(e[a][1].length<this.Diff_EditCost&&(u||g)?(n[t++]=a,s=u,l=g,i=e[a][1]):(t=0,i=null),u=g=!1):(e[a][0]==v?g=!0:u=!0,i&&(s&&l&&u&&g||i.length<this.Diff_EditCost/2&&s+l+u+g==3)&&(e.splice(n[t-1],0,new f.Diff(v,i)),e[n[t-1]+1][0]=c,t--,i=null,s&&l?(u=g=!0,t=0):(t--,a=t>0?n[t-1]:-1,u=g=!1),r=!0)),a++;r&&this.diff_cleanupMerge(e)},f.prototype.diff_cleanupMerge=function(e){e.push(new f.Diff(h,""));for(var r=0,n=0,t=0,i="",a="",s;r<e.length;)switch(e[r][0]){case c:t++,a+=e[r][1],r++;break;case v:n++,i+=e[r][1],r++;break;case h:n+t>1?(n!==0&&t!==0&&(s=this.diff_commonPrefix(a,i),s!==0&&(r-n-t>0&&e[r-n-t-1][0]==h?e[r-n-t-1][1]+=a.substring(0,s):(e.splice(0,0,new f.Diff(h,a.substring(0,s))),r++),a=a.substring(s),i=i.substring(s)),s=this.diff_commonSuffix(a,i),s!==0&&(e[r][1]=a.substring(a.length-s)+e[r][1],a=a.substring(0,a.length-s),i=i.substring(0,i.length-s))),r-=n+t,e.splice(r,n+t),i.length&&(e.splice(r,0,new f.Diff(v,i)),r++),a.length&&(e.splice(r,0,new f.Diff(c,a)),r++),r++):r!==0&&e[r-1][0]==h?(e[r-1][1]+=e[r][1],e.splice(r,1)):r++,t=0,n=0,i="",a="";break}e[e.length-1][1]===""&&e.pop();var l=!1;for(r=1;r<e.length-1;)e[r-1][0]==h&&e[r+1][0]==h&&(e[r][1].substring(e[r][1].length-e[r-1][1].length)==e[r-1][1]?(e[r][1]=e[r-1][1]+e[r][1].substring(0,e[r][1].length-e[r-1][1].length),e[r+1][1]=e[r-1][1]+e[r+1][1],e.splice(r-1,1),l=!0):e[r][1].substring(0,e[r+1][1].length)==e[r+1][1]&&(e[r-1][1]+=e[r+1][1],e[r][1]=e[r][1].substring(e[r+1][1].length)+e[r+1][1],e.splice(r+1,1),l=!0)),r++;l&&this.diff_cleanupMerge(e)},f.prototype.diff_xIndex=function(e,r){var n=0,t=0,i=0,a=0,s;for(s=0;s<e.length&&(e[s][0]!==c&&(n+=e[s][1].length),e[s][0]!==v&&(t+=e[s][1].length),!(n>r));s++)i=n,a=t;return e.length!=s&&e[s][0]===v?a:a+(r-i)},f.prototype.diff_prettyHtml=function(e){for(var r=[],n=/&/g,t=/</g,i=/>/g,a=/\n/g,s=0;s<e.length;s++){var l=e[s][0],u=e[s][1],g=u.replace(n,"&amp;").replace(t,"&lt;").replace(i,"&gt;").replace(a,"&para;<br>");switch(l){case c:r[s]='<ins style="background:#e6ffe6;">'+g+"</ins>";break;case v:r[s]='<del style="background:#ffe6e6;">'+g+"</del>";break;case h:r[s]="<span>"+g+"</span>";break}}return r.join("")},f.prototype.diff_text1=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==c&&(r[n]=e[n][1]);return r.join("")},f.prototype.diff_text2=function(e){for(var r=[],n=0;n<e.length;n++)e[n][0]!==v&&(r[n]=e[n][1]);return r.join("")},f.prototype.diff_levenshtein=function(e){for(var r=0,n=0,t=0,i=0;i<e.length;i++){var a=e[i][0],s=e[i][1];switch(a){case c:n+=s.length;break;case v:t+=s.length;break;case h:r+=Math.max(n,t),n=0,t=0;break}}return r+=Math.max(n,t),r},f.prototype.diff_toDelta=function(e){for(var r=[],n=0;n<e.length;n++)switch(e[n][0]){case c:r[n]="+"+encodeURI(e[n][1]);break;case v:r[n]="-"+e[n][1].length;break;case h:r[n]="="+e[n][1].length;break}return r.join(" ").replace(/%20/g," ")},f.prototype.diff_fromDelta=function(e,r){for(var n=[],t=0,i=0,a=r.split(/\t/g),s=0;s<a.length;s++){var l=a[s].substring(1);switch(a[s].charAt(0)){case"+":try{n[t++]=new f.Diff(c,decodeURI(l))}catch{throw new Error("Illegal escape in diff_fromDelta: "+l)}break;case"-":case"=":var u=parseInt(l,10);if(isNaN(u)||u<0)throw new Error("Invalid number in diff_fromDelta: "+l);var g=e.substring(i,i+=u);a[s].charAt(0)=="="?n[t++]=new f.Diff(h,g):n[t++]=new f.Diff(v,g);break;default:if(a[s])throw new Error("Invalid diff operation in diff_fromDelta: "+a[s])}}if(i!=e.length)throw new Error("Delta length ("+i+") does not equal source text length ("+e.length+").");return n},f.prototype.match_main=function(e,r,n){if(e==null||r==null||n==null)throw new Error("Null input. (match_main)");return n=Math.max(0,Math.min(n,e.length)),e==r?0:e.length?e.substring(n,n+r.length)==r?n:this.match_bitap_(e,r,n):-1},f.prototype.match_bitap_=function(e,r,n){if(r.length>this.Match_MaxBits)throw new Error("Pattern too long for this browser.");var t=this.match_alphabet_(r),i=this;function a(T,C){var I=T/r.length,S=Math.abs(n-C);return i.Match_Distance?I+S/i.Match_Distance:S?1:I}var s=this.Match_Threshold,l=e.indexOf(r,n);l!=-1&&(s=Math.min(a(0,l),s),l=e.lastIndexOf(r,n+r.length),l!=-1&&(s=Math.min(a(0,l),s)));var u=1<<r.length-1;l=-1;for(var g,d,_=r.length+e.length,m,p=0;p<r.length;p++){for(g=0,d=_;g<d;)a(p,n+d)<=s?g=d:_=d,d=Math.floor((_-g)/2+g);_=d;var w=Math.max(1,n-d+1),b=Math.min(n+d,e.length)+r.length,E=Array(b+2);E[b+1]=(1<<p)-1;for(var N=b;N>=w;N--){var M=t[e.charAt(N-1)];if(p===0?E[N]=(E[N+1]<<1|1)&M:E[N]=(E[N+1]<<1|1)&M|((m[N+1]|m[N])<<1|1)|m[N+1],E[N]&u){var D=a(p,N-1);if(D<=s)if(s=D,l=N-1,l>n)w=Math.max(1,2*n-l);else break}}if(a(p+1,n)>s)break;m=E}return l},f.prototype.match_alphabet_=function(e){for(var r={},n=0;n<e.length;n++)r[e.charAt(n)]=0;for(var n=0;n<e.length;n++)r[e.charAt(n)]|=1<<e.length-n-1;return r},f.prototype.patch_addContext_=function(e,r){if(r.length!=0){if(e.start2===null)throw Error("patch not initialized");for(var n=r.substring(e.start2,e.start2+e.length1),t=0;r.indexOf(n)!=r.lastIndexOf(n)&&n.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)t+=this.Patch_Margin,n=r.substring(e.start2-t,e.start2+e.length1+t);t+=this.Patch_Margin;var i=r.substring(e.start2-t,e.start2);i&&e.diffs.unshift(new f.Diff(h,i));var a=r.substring(e.start2+e.length1,e.start2+e.length1+t);a&&e.diffs.push(new f.Diff(h,a)),e.start1-=i.length,e.start2-=i.length,e.length1+=i.length+a.length,e.length2+=i.length+a.length}},f.prototype.patch_make=function(e,r,n){var t,i;if(typeof e=="string"&&typeof r=="string"&&typeof n>"u")t=e,i=this.diff_main(t,r,!0),i.length>2&&(this.diff_cleanupSemantic(i),this.diff_cleanupEfficiency(i));else if(e&&typeof e=="object"&&typeof r>"u"&&typeof n>"u")i=e,t=this.diff_text1(i);else if(typeof e=="string"&&r&&typeof r=="object"&&typeof n>"u")t=e,i=r;else if(typeof e=="string"&&typeof r=="string"&&n&&typeof n=="object")t=e,i=n;else throw new Error("Unknown call format to patch_make.");if(i.length===0)return[];for(var a=[],s=new f.patch_obj,l=0,u=0,g=0,d=t,_=t,m=0;m<i.length;m++){var p=i[m][0],w=i[m][1];switch(!l&&p!==h&&(s.start1=u,s.start2=g),p){case c:s.diffs[l++]=i[m],s.length2+=w.length,_=_.substring(0,g)+w+_.substring(g);break;case v:s.length1+=w.length,s.diffs[l++]=i[m],_=_.substring(0,g)+_.substring(g+w.length);break;case h:w.length<=2*this.Patch_Margin&&l&&i.length!=m+1?(s.diffs[l++]=i[m],s.length1+=w.length,s.length2+=w.length):w.length>=2*this.Patch_Margin&&l&&(this.patch_addContext_(s,d),a.push(s),s=new f.patch_obj,l=0,d=_,u=g);break}p!==c&&(u+=w.length),p!==v&&(g+=w.length)}return l&&(this.patch_addContext_(s,d),a.push(s)),a},f.prototype.patch_deepCopy=function(e){for(var r=[],n=0;n<e.length;n++){var t=e[n],i=new f.patch_obj;i.diffs=[];for(var a=0;a<t.diffs.length;a++)i.diffs[a]=new f.Diff(t.diffs[a][0],t.diffs[a][1]);i.start1=t.start1,i.start2=t.start2,i.length1=t.length1,i.length2=t.length2,r[n]=i}return r},f.prototype.patch_apply=function(e,r){if(e.length==0)return[r,[]];e=this.patch_deepCopy(e);var n=this.patch_addPadding(e);r=n+r+n,this.patch_splitMax(e);for(var t=0,i=[],a=0;a<e.length;a++){var s=e[a].start2+t,l=this.diff_text1(e[a].diffs),u,g=-1;if(l.length>this.Match_MaxBits?(u=this.match_main(r,l.substring(0,this.Match_MaxBits),s),u!=-1&&(g=this.match_main(r,l.substring(l.length-this.Match_MaxBits),s+l.length-this.Match_MaxBits),(g==-1||u>=g)&&(u=-1))):u=this.match_main(r,l,s),u==-1)i[a]=!1,t-=e[a].length2-e[a].length1;else{i[a]=!0,t=u-s;var d;if(g==-1?d=r.substring(u,u+l.length):d=r.substring(u,g+this.Match_MaxBits),l==d)r=r.substring(0,u)+this.diff_text2(e[a].diffs)+r.substring(u+l.length);else{var _=this.diff_main(l,d,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(_)/l.length>this.Patch_DeleteThreshold)i[a]=!1;else{this.diff_cleanupSemanticLossless(_);for(var m=0,p,w=0;w<e[a].diffs.length;w++){var b=e[a].diffs[w];b[0]!==h&&(p=this.diff_xIndex(_,m)),b[0]===c?r=r.substring(0,u+p)+b[1]+r.substring(u+p):b[0]===v&&(r=r.substring(0,u+p)+r.substring(u+this.diff_xIndex(_,m+b[1].length))),b[0]!==v&&(m+=b[1].length)}}}}}return r=r.substring(n.length,r.length-n.length),[r,i]},f.prototype.patch_addPadding=function(e){for(var r=this.Patch_Margin,n="",t=1;t<=r;t++)n+=String.fromCharCode(t);for(var t=0;t<e.length;t++)e[t].start1+=r,e[t].start2+=r;var i=e[0],a=i.diffs;if(a.length==0||a[0][0]!=h)a.unshift(new f.Diff(h,n)),i.start1-=r,i.start2-=r,i.length1+=r,i.length2+=r;else if(r>a[0][1].length){var s=r-a[0][1].length;a[0][1]=n.substring(a[0][1].length)+a[0][1],i.start1-=s,i.start2-=s,i.length1+=s,i.length2+=s}if(i=e[e.length-1],a=i.diffs,a.length==0||a[a.length-1][0]!=h)a.push(new f.Diff(h,n)),i.length1+=r,i.length2+=r;else if(r>a[a.length-1][1].length){var s=r-a[a.length-1][1].length;a[a.length-1][1]+=n.substring(0,s),i.length1+=s,i.length2+=s}return n},f.prototype.patch_splitMax=function(e){for(var r=this.Match_MaxBits,n=0;n<e.length;n++)if(!(e[n].length1<=r)){var t=e[n];e.splice(n--,1);for(var i=t.start1,a=t.start2,s="";t.diffs.length!==0;){var l=new f.patch_obj,u=!0;for(l.start1=i-s.length,l.start2=a-s.length,s!==""&&(l.length1=l.length2=s.length,l.diffs.push(new f.Diff(h,s)));t.diffs.length!==0&&l.length1<r-this.Patch_Margin;){var g=t.diffs[0][0],d=t.diffs[0][1];g===c?(l.length2+=d.length,a+=d.length,l.diffs.push(t.diffs.shift()),u=!1):g===v&&l.diffs.length==1&&l.diffs[0][0]==h&&d.length>2*r?(l.length1+=d.length,i+=d.length,u=!1,l.diffs.push(new f.Diff(g,d)),t.diffs.shift()):(d=d.substring(0,r-l.length1-this.Patch_Margin),l.length1+=d.length,i+=d.length,g===h?(l.length2+=d.length,a+=d.length):u=!1,l.diffs.push(new f.Diff(g,d)),d==t.diffs[0][1]?t.diffs.shift():t.diffs[0][1]=t.diffs[0][1].substring(d.length))}s=this.diff_text2(l.diffs),s=s.substring(s.length-this.Patch_Margin);var _=this.diff_text1(t.diffs).substring(0,this.Patch_Margin);_!==""&&(l.length1+=_.length,l.length2+=_.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===h?l.diffs[l.diffs.length-1][1]+=_:l.diffs.push(new f.Diff(h,_))),u||e.splice(++n,0,l)}}},f.prototype.patch_toText=function(e){for(var r=[],n=0;n<e.length;n++)r[n]=e[n];return r.join("")},f.prototype.patch_fromText=function(e){var r=[];if(!e)return r;for(var n=e.split(` 3 - `),t=0,i=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;t<n.length;){var a=n[t].match(i);if(!a)throw new Error("Invalid patch string: "+n[t]);var s=new f.patch_obj;for(r.push(s),s.start1=parseInt(a[1],10),a[2]===""?(s.start1--,s.length1=1):a[2]=="0"?s.length1=0:(s.start1--,s.length1=parseInt(a[2],10)),s.start2=parseInt(a[3],10),a[4]===""?(s.start2--,s.length2=1):a[4]=="0"?s.length2=0:(s.start2--,s.length2=parseInt(a[4],10)),t++;t<n.length;){var l=n[t].charAt(0);try{var u=decodeURI(n[t].substring(1))}catch{throw new Error("Illegal escape in patch_fromText: "+u)}if(l=="-")s.diffs.push(new f.Diff(v,u));else if(l=="+")s.diffs.push(new f.Diff(c,u));else if(l==" ")s.diffs.push(new f.Diff(h,u));else{if(l=="@")break;if(l!=="")throw new Error('Invalid patch mode "'+l+'" in: '+u)}t++}}return r},f.patch_obj=function(){this.diffs=[],this.start1=null,this.start2=null,this.length1=0,this.length2=0},f.patch_obj.prototype.toString=function(){var e,r;this.length1===0?e=this.start1+",0":this.length1==1?e=this.start1+1:e=this.start1+1+","+this.length1,this.length2===0?r=this.start2+",0":this.length2==1?r=this.start2+1:r=this.start2+1+","+this.length2;for(var n=["@@ -"+e+" +"+r+` @@ 4 - `],t,i=0;i<this.diffs.length;i++){switch(this.diffs[i][0]){case c:t="+";break;case v:t="-";break;case h:t=" ";break}n[i+1]=t+encodeURI(this.diffs[i][1])+` 5 - `}return n.join("").replace(/%20/g," ")},o.exports=f,o.exports.diff_match_patch=f,o.exports.DIFF_DELETE=v,o.exports.DIFF_INSERT=c,o.exports.DIFF_EQUAL=h})(J);var ie=J.exports,k={},P={exports:{}},Q={},A={},Y={};(function(o){o.__esModule=!0;function f(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}o.default=v;function v(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2],n=h.nodeType==9||h.ownerDocument,t=n.createNodeIterator(h,e,r,!1);return new c(t,h,e,r)}var c=function(){function h(e,r,n,t){f(this,h),this.root=r,this.whatToShow=n,this.filter=t,this.referenceNode=r,this.pointerBeforeReferenceNode=!0,this._iter=e}return h.prototype.nextNode=function(){var r=this._iter.nextNode();return this.pointerBeforeReferenceNode=!1,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.previousNode=function(){var r=this._iter.previousNode();return this.pointerBeforeReferenceNode=!0,r===null?null:(this.referenceNode=r,this.referenceNode)},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(Y);var $={};(function(o){o.__esModule=!0,o.default=f;function f(v){var c=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],h=arguments.length<=2||arguments[2]===void 0?null:arguments[2],e=v.ownerDocument;return e.createNodeIterator.call(e,v,c,h)}})($);var B={};(function(o){o.__esModule=!0;function f(h,e){if(!(h instanceof e))throw new TypeError("Cannot call a class as a function")}o.default=v;function v(h){var e=arguments.length<=1||arguments[1]===void 0?4294967295:arguments[1],r=arguments.length<=2||arguments[2]===void 0?null:arguments[2];return new c(h,e,r)}var c=function(){function h(e,r,n){f(this,h),this.root=e,this.whatToShow=r,this.filter=n,this.referenceNode=e,this.pointerBeforeReferenceNode=!0,this._filter=function(t){return n?n(t)===1:!0},this._show=function(t){return r>>t.nodeType-1&!0}}return h.prototype.nextNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!1;var n=this.referenceNode;if(r&&this._show(n)&&this._filter(n))return n;do{if(n.firstChild){n=n.firstChild;continue}do{if(n===this.root)return null;if(n.nextSibling)break;n=n.parentNode}while(n);n=n.nextSibling}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!1,n},h.prototype.previousNode=function(){var r=this.pointerBeforeReferenceNode;this.pointerBeforeReferenceNode=!0;var n=this.referenceNode;if(!r&&this._show(n)&&this._filter(n))return n;do{if(n===this.root)return null;if(n.previousSibling){for(n=n.previousSibling;n.lastChild;)n=n.lastChild;continue}n=n.parentNode}while(!this._show(n)||!this._filter(n));return this.referenceNode=n,this.pointerBeforeReferenceNode=!0,n},h.prototype.toString=function(){return"[object NodeIterator]"},h}()})(B);(function(o){o.__esModule=!0,o.default=t;var f=Y,v=n(f),c=$,h=n(c),e=B,r=n(e);function n(i){return i&&i.__esModule?i:{default:i}}function t(){try{var i=typeof document>"u"?{}:document,a=(0,h.default)(i,4294967295,null,!1);return a.referenceNode===i?h.default:v.default}catch{return r.default}}})(A);var L={};(function(o){o.__esModule=!0,o.default=r;var f=$,v=e(f),c=A,h=e(c);function e(n){return n&&n.__esModule?n:{default:n}}function r(){var n=typeof document>"u"?{}:document,t=(0,h.default)();return t!==v.default&&(n.createNodeIterator=t),t}})(L);(function(o){o.__esModule=!0;var f=A,v=n(f),c=B,h=n(c),e=L,r=n(e);function n(i){return i&&i.__esModule?i:{default:i}}var t=(0,v.default)();t.implementation=h.default,t.shim=r.default,o.default=t})(Q);var ae=A.default,se=B.default,fe=L.default;P.exports=Q.default;P.exports.getPolyfill=ae;P.exports.implementation=se;P.exports.shim=fe;var le=P.exports,Z={},oe=ue;function ue(o,f){var v=[];f=f||he;do v.push(o),o=o.parentNode;while(o&&o.tagName&&f(o));return v.slice(1)}function he(o){return!0}/*! 6 - * index-of <https://github.com/jonschlinkert/index-of> 7 - * 8 - * Copyright (c) 2014-2015 Jon Schlinkert. 9 - * Licensed under the MIT license. 10 - */var ge=function(f,v,c){c=c||0;var h=-1;if(f==null)return h;var e=f.length,r=c<0?e+c:c;if(r>=f.length)return-1;for(;r<e;){if(f[r]===v)return r;r++}return-1};(function(o){o.__esModule=!0,o.default=a;var f=oe,v=e(f),c=ge,h=e(c);function e(g){return g&&g.__esModule?g:{default:g}}var r="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",n="Argument 2 of seek must be a number or a Text Node.",t=4,i=3;function a(g,d){if(g.whatToShow!==t)throw new Error(r);var _=0,m=g.referenceNode,p=null;if(s(d))p={forward:function(){return _<d},backward:function(){return _>d}};else if(l(d)){var w=u(m,d)?function(){return!1}:function(){return m!==d},b=function(){return m!=d||!g.pointerBeforeReferenceNode};p={forward:w,backward:b}}else throw new Error(n);for(;p.forward()&&(m=g.nextNode())!==null;)_+=m.nodeValue.length;for(;p.backward()&&(m=g.previousNode())!==null;)_-=m.nodeValue.length;return _}function s(g){return!isNaN(parseInt(g))&&isFinite(g)}function l(g){return g.nodeType===i}function u(g,d){if(g===d)return!1;for(var _=null,m=[g].concat((0,v.default)(g)).reverse(),p=[d].concat((0,v.default)(d)).reverse();m[0]===p[0];)_=m.shift(),p.shift();m=m[0],p=p[0];var w=(0,h.default)(_.childNodes,m),b=(0,h.default)(_.childNodes,p);return w>b}})(Z);var ve=Z.default,H={};Object.defineProperty(H,"__esModule",{value:!0});H.default=me;function F(o,f){if(!f&&o.firstChild)return o.firstChild;do{if(o.nextSibling)return o.nextSibling;o=o.parentNode}while(o);return o}function ce(o){if(o.startContainer.nodeType===Node.ELEMENT_NODE){var f=o.startContainer.childNodes[o.startOffset];return f||F(o.startContainer,!0)}return o.startContainer}function de(o){if(o.endContainer.nodeType===Node.ELEMENT_NODE){var f=o.endContainer.childNodes[o.endOffset];return f||F(o.endContainer,!0)}return F(o.endContainer)}function _e(o,f){for(var v=ce(o),c=de(o);v!==c;)f(v),v=F(v)}function me(o){var f="";return _e(o,function(v){if(v.nodeType===Node.TEXT_NODE){var c=v===o.startContainer?o.startOffset:0,h=v===o.endContainer?o.endOffset:v.textContent.length;f+=v.textContent.slice(c,h)}}),f}Object.defineProperty(k,"__esModule",{value:!0});k.fromRange=Me;k.toRange=De;var pe=le,we=W(pe),be=ve,U=W(be),Ne=H,V=W(Ne);function W(o){return o&&o.__esModule?o:{default:o}}var Ee=4;function Me(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=o.ownerDocument,c=v.createRange(),h=f.startContainer,e=f.startOffset;c.setStart(o,0),c.setEnd(h,e);var r=(0,V.default)(c).length,n=r+(0,V.default)(f).length;return{start:r,end:n}}function De(o){var f=arguments.length<=1||arguments[1]===void 0?{}:arguments[1];if(o===void 0)throw new Error('missing required parameter "root"');var v=o.ownerDocument,c=v.createRange(),h=(0,we.default)(o,Ee),e=f.start||0,r=f.end||e,n=(0,U.default)(h,e),t=e-n;h.pointerBeforeReferenceNode?c.setStart(h.referenceNode,t):(c.setStart(h.nextNode(),t),h.previousNode());var i=r-e+t;return n=(0,U.default)(h,i),t=i-n,h.pointerBeforeReferenceNode?c.setEnd(h.referenceNode,t):c.setEnd(h.nextNode(),t),c}var Te=k;Object.defineProperty(O,"__esModule",{value:!0});O.fromRange=Pe;O.fromTextPosition=x;O.toRange=Fe;O.toTextPosition=ee;var Se=ie,Ie=ye(Se),Ce=Te,K=Re(Ce);function Re(o){if(o&&o.__esModule)return o;var f={};if(o!=null)for(var v in o)Object.prototype.hasOwnProperty.call(o,v)&&(f[v]=o[v]);return f.default=o,f}function ye(o){return o&&o.__esModule?o:{default:o}}var j=32,Oe=new RegExp(`(.|[\r 11 - ]){1,`+String(j)+"}","g"),q=j;function Pe(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=K.fromRange(o,f);return x(o,v)}function x(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "selector"');var v=f.start;if(v===void 0)throw new Error('selector missing required property "start"');if(v<0)throw new Error('property "start" must be a non-negative integer');var c=f.end;if(c===void 0)throw new Error('selector missing required property "end"');if(c<0)throw new Error('property "end" must be a non-negative integer');var h=o.textContent.substr(v,c-v),e=Math.max(0,v-q),r=o.textContent.substr(e,v-e),n=Math.min(o.textContent.length,c+q),t=o.textContent.substr(c,n-c);return{exact:h,prefix:r,suffix:t}}function Fe(o,f){var v=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},c=ee(o,f,v);return c===null?null:K.toRange(o,c)}function ee(o,f){var v=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "selector"');var c=f.exact;if(c===void 0)throw new Error('selector missing required property "exact"');var h=f.prefix,e=f.suffix,r=v.hint,n=new Ie.default;n.Match_Distance=o.textContent.length*2;var t=c.match(Oe),i=r===void 0?o.textContent.length/2|0:r,a=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=-1,u=h!==void 0,g=e!==void 0,d=!1;u&&(l=n.match_main(o.textContent,h,i),l>-1&&(i=l+h.length,d=!0)),g&&!d&&(l=n.match_main(o.textContent,e,i+c.length),l>-1&&(i=l-c.length));var _=t.shift();if(l=n.match_main(o.textContent,_,i),l>-1)a=l,i=s=a+_.length;else return null;var m=function(b,E){if(!b)return null;var N=n.match_main(o.textContent,E,b.loc);return N===-1?null:(b.loc=N+E.length,b.start=Math.min(b.start,N),b.end=Math.max(b.end,N+E.length),b)};n.Match_Distance=64;var p=t.reduce(m,{start:a,end:s,loc:i});return p?{start:p.start,end:p.end}:null}var X={},re={};(function(o){Object.defineProperty(o,"__esModule",{value:!0}),o.default=n;var f="Iterator exhausted before seek ended.",v="Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.",c="Argument 2 of seek must be an integer or a Text Node.",h=2,e=4,r=3;function n(s,l){if(s.whatToShow!==e){var u;try{u=new DOMException(v,"InvalidStateError")}catch{u=new Error(v),u.code=11,u.name="InvalidStateError",u.toString=function(){return"InvalidStateError: ".concat(v)}}throw u}var g=0,d=s.referenceNode,_=null;if(t(l))_={forward:function(){return g<l},backward:function(){return g>l||!s.pointerBeforeReferenceNode}};else if(i(l)){var m=a(d,l)?function(){return!1}:function(){return d!==l},p=function(){return d!==l||!s.pointerBeforeReferenceNode};_={forward:m,backward:p}}else throw new TypeError(c);for(;_.forward();){if(d=s.nextNode(),d===null)throw new RangeError(f);g+=d.nodeValue.length}for(s.nextNode()&&(d=s.previousNode());_.backward();){if(d=s.previousNode(),d===null)throw new RangeError(f);g-=d.nodeValue.length}if(!i(s.referenceNode))throw new RangeError(f);return g}function t(s){return typeof s!="number"?!1:isFinite(s)&&Math.floor(s)===s}function i(s){return s.nodeType===r}function a(s,l){return s.compareDocumentPosition(l)&h}})(re);var ke=re.default,ne={};(function(o){Object.defineProperty(o,"__esModule",{value:!0}),o.default=e;function f(r,n){if(!n&&r.firstChild)return r.firstChild;do{if(r.nextSibling)return r.nextSibling;r=r.parentNode}while(r);return r}function v(r){if(r.startContainer.nodeType===Node.ELEMENT_NODE){var n=r.startContainer.childNodes[r.startOffset];return n||f(r.startContainer,!0)}return r.startContainer}function c(r){if(r.endContainer.nodeType===Node.ELEMENT_NODE){var n=r.endContainer.childNodes[r.endOffset];return n||f(r.endContainer,!0)}return f(r.endContainer)}function h(r,n){for(var t=v(r),i=c(r);t!==i;)n(t),t=f(t)}function e(r){var n="";return h(r,function(t){if(t.nodeType===Node.TEXT_NODE){var i=t===r.startContainer?r.startOffset:0,a=t===r.endContainer?r.endOffset:t.textContent.length;n+=t.textContent.slice(i,a)}}),n}})(ne);Object.defineProperty(X,"__esModule",{value:!0});X.fromRange=Be;X.toRange=$e;var G=te(ke),z=te(ne);function te(o){return o&&o.__esModule?o:{default:o}}var Ae=4;function Be(o,f){if(o===void 0)throw new Error('missing required parameter "root"');if(f===void 0)throw new Error('missing required parameter "range"');var v=o.ownerDocument,c=v.createRange(),h=f.startContainer,e=f.startOffset;c.setStart(o,0),c.setEnd(h,e);var r=(0,z.default)(c).length,n=r+(0,z.default)(f).length;return{start:r,end:n}}function $e(o){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(o===void 0)throw new Error('missing required parameter "root"');var v=o.ownerDocument,c=v.createRange(),h=v.createNodeIterator(o,Ae),e=f.start||0,r=f.end||e,n=e-(0,G.default)(h,e),t=h.referenceNode,i=r-e+n,a=i-(0,G.default)(h,i),s=h.referenceNode;return c.setStart(t,n),c.setEnd(s,a),c}class Le{constructor(f="seams-storage"){this.listeners=[],this.channel=new BroadcastChannel(f),this.channel.onmessage=v=>{this.listeners.forEach(c=>c(v.data))}}async get(f){if(typeof f=="string"){const c=localStorage.getItem(f);return c?JSON.parse(c):null}const v={};return f.forEach(c=>{const h=localStorage.getItem(c);v[c]=h?JSON.parse(h):null}),v}async set(f,v){const c=await this.get(f);localStorage.setItem(f,JSON.stringify(v));const h={key:f,newValue:v,oldValue:c};this.channel.postMessage(h)}onChange(f){this.listeners.push(f)}close(){this.channel.close()}}export{Le as W,X as a,O as l}; 12 - //# sourceMappingURL=web-Ts7v-0PE.js.map
-1
proxy/static/static/assets/web-Ts7v-0PE.js.map
··· 1 - {"version":3,"file":"web-Ts7v-0PE.js","sources":["../../../node_modules/.pnpm/diff-match-patch@1.0.5/node_modules/diff-match-patch/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/adapter.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/builtin.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/lib/index.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/polyfill.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/implementation.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/shim.js","../../../node_modules/.pnpm/dom-node-iterator@3.5.3/node_modules/dom-node-iterator/index.js","../../../node_modules/.pnpm/ancestors@0.0.3/node_modules/ancestors/index.js","../../../node_modules/.pnpm/index-of@0.2.0/node_modules/index-of/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@4.0.3/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@4.0.0/node_modules/dom-anchor-text-position/index.js","../../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/lib/index.js","../../../node_modules/.pnpm/dom-seek@5.1.1/node_modules/dom-seek/index.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/range-to-string.js","../../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/lib/index.js","../../../packages/core/src/storage/web.ts"],"sourcesContent":["/**\n * Diff Match and Patch\n * Copyright 2018 The diff-match-patch Authors.\n * https://github.com/google/diff-match-patch\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Computes the difference between two texts to create a patch.\n * Applies the patch onto another text, allowing for errors.\n * @author fraser@google.com (Neil Fraser)\n */\n\n/**\n * Class containing the diff, match and patch methods.\n * @constructor\n */\nvar diff_match_patch = function() {\n\n // Defaults.\n // Redefine these in your program to override the defaults.\n\n // Number of seconds to map a diff before giving up (0 for infinity).\n this.Diff_Timeout = 1.0;\n // Cost of an empty edit operation in terms of edit characters.\n this.Diff_EditCost = 4;\n // At what point is no match declared (0.0 = perfection, 1.0 = very loose).\n this.Match_Threshold = 0.5;\n // How far to search for a match (0 = exact location, 1000+ = broad match).\n // A match this many characters away from the expected location will add\n // 1.0 to the score (0.0 is a perfect match).\n this.Match_Distance = 1000;\n // When deleting a large block of text (over ~64 characters), how close do\n // the contents have to be to match the expected contents. (0.0 = perfection,\n // 1.0 = very loose). Note that Match_Threshold controls how closely the\n // end points of a delete need to match.\n this.Patch_DeleteThreshold = 0.5;\n // Chunk size for context length.\n this.Patch_Margin = 4;\n\n // The number of bits in an int.\n this.Match_MaxBits = 32;\n};\n\n\n// DIFF FUNCTIONS\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n/**\n * Class representing one diff tuple.\n * ~Attempts to look like a two-element array (which is what this used to be).~\n * Constructor returns an actual two-element array, to allow destructing @JackuB\n * See https://github.com/JackuB/diff-match-patch/issues/14 for details\n * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL.\n * @param {string} text Text to be deleted, inserted, or retained.\n * @constructor\n */\ndiff_match_patch.Diff = function(op, text) {\n return [op, text];\n};\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} opt_checklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @param {number=} opt_deadline Optional time when the diff should be complete\n * by. Used internally for recursive calls. Users should set DiffTimeout\n * instead.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines,\n opt_deadline) {\n // Set a deadline by which time the diff must be complete.\n if (typeof opt_deadline == 'undefined') {\n if (this.Diff_Timeout <= 0) {\n opt_deadline = Number.MAX_VALUE;\n } else {\n opt_deadline = (new Date).getTime() + this.Diff_Timeout * 1000;\n }\n }\n var deadline = opt_deadline;\n\n // Check for null inputs.\n if (text1 == null || text2 == null) {\n throw new Error('Null input. (diff_main)');\n }\n\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [new diff_match_patch.Diff(DIFF_EQUAL, text1)];\n }\n return [];\n }\n\n if (typeof opt_checklines == 'undefined') {\n opt_checklines = true;\n }\n var checklines = opt_checklines;\n\n // Trim off common prefix (speedup).\n var commonlength = this.diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = this.diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = this.diff_compute_(text1, text2, checklines, deadline);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix));\n }\n if (commonsuffix) {\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix));\n }\n this.diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_compute_ = function(text1, text2, checklines,\n deadline) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [new diff_match_patch.Diff(DIFF_DELETE, text1)];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)),\n new diff_match_patch.Diff(DIFF_EQUAL, shorttext),\n new diff_match_patch.Diff(DIFF_INSERT,\n longtext.substring(i + shorttext.length))];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n }\n\n // Check to see if the problem can be split in two.\n var hm = this.diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline);\n var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline);\n // Merge the results.\n return diffs_a.concat([new diff_match_patch.Diff(DIFF_EQUAL, mid_common)],\n diffs_b);\n }\n\n if (checklines && text1.length > 100 && text2.length > 100) {\n return this.diff_lineMode_(text1, text2, deadline);\n }\n\n return this.diff_bisect_(text1, text2, deadline);\n};\n\n\n/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_lineMode_ = function(text1, text2, deadline) {\n // Scan the text on a line-by-line basis first.\n var a = this.diff_linesToChars_(text1, text2);\n text1 = a.chars1;\n text2 = a.chars2;\n var linearray = a.lineArray;\n\n var diffs = this.diff_main(text1, text2, false, deadline);\n\n // Convert the diff back to original text.\n this.diff_charsToLines_(diffs, linearray);\n // Eliminate freak matches (e.g. blank lines)\n this.diff_cleanupSemantic(diffs);\n\n // Rediff any replacement blocks, this time character-by-character.\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete >= 1 && count_insert >= 1) {\n // Delete the offending records and add the merged ones.\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert);\n pointer = pointer - count_delete - count_insert;\n var subDiff =\n this.diff_main(text_delete, text_insert, false, deadline);\n for (var j = subDiff.length - 1; j >= 0; j--) {\n diffs.splice(pointer, 0, subDiff[j]);\n }\n pointer = pointer + subDiff.length;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n pointer++;\n }\n diffs.pop(); // Remove the dummy entry at the end.\n\n return diffs;\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisect_ = function(text1, text2, deadline) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Bail out if deadline is reached.\n if ((new Date()).getTime() > deadline) {\n break;\n }\n\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return this.diff_bisectSplit_(text1, text2, x1, y1, deadline);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [new diff_match_patch.Diff(DIFF_DELETE, text1),\n new diff_match_patch.Diff(DIFF_INSERT, text2)];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @private\n */\ndiff_match_patch.prototype.diff_bisectSplit_ = function(text1, text2, x, y,\n deadline) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = this.diff_main(text1a, text2a, false, deadline);\n var diffsb = this.diff_main(text1b, text2b, false, deadline);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\ndiff_match_patch.prototype.diff_linesToChars_ = function(text1, text2) {\n var lineArray = []; // e.g. lineArray[4] == 'Hello\\n'\n var lineHash = {}; // e.g. lineHash['Hello\\n'] == 4\n\n // '\\x00' is a valid character, but various debuggers don't like it.\n // So we'll insert a junk entry to avoid generating a null character.\n lineArray[0] = '';\n\n /**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n function diff_linesToCharsMunge_(text) {\n var chars = '';\n // Walk the text, pulling out a substring for each line.\n // text.split('\\n') would would temporarily double our memory footprint.\n // Modifying text would create many large strings to garbage collect.\n var lineStart = 0;\n var lineEnd = -1;\n // Keeping our own length variable is faster than looking it up.\n var lineArrayLength = lineArray.length;\n while (lineEnd < text.length - 1) {\n lineEnd = text.indexOf('\\n', lineStart);\n if (lineEnd == -1) {\n lineEnd = text.length - 1;\n }\n var line = text.substring(lineStart, lineEnd + 1);\n\n if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :\n (lineHash[line] !== undefined)) {\n chars += String.fromCharCode(lineHash[line]);\n } else {\n if (lineArrayLength == maxLines) {\n // Bail out at 65535 because\n // String.fromCharCode(65536) == String.fromCharCode(0)\n line = text.substring(lineStart);\n lineEnd = text.length;\n }\n chars += String.fromCharCode(lineArrayLength);\n lineHash[line] = lineArrayLength;\n lineArray[lineArrayLength++] = line;\n }\n lineStart = lineEnd + 1;\n }\n return chars;\n }\n // Allocate 2/3rds of the space for text1, the rest for text2.\n var maxLines = 40000;\n var chars1 = diff_linesToCharsMunge_(text1);\n maxLines = 65535;\n var chars2 = diff_linesToCharsMunge_(text2);\n return {chars1: chars1, chars2: chars2, lineArray: lineArray};\n};\n\n\n/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\ndiff_match_patch.prototype.diff_charsToLines_ = function(diffs, lineArray) {\n for (var i = 0; i < diffs.length; i++) {\n var chars = diffs[i][1];\n var text = [];\n for (var j = 0; j < chars.length; j++) {\n text[j] = lineArray[chars.charCodeAt(j)];\n }\n diffs[i][1] = text.join('');\n }\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\ndiff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\ndiff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: https://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\ndiff_match_patch.prototype.diff_commonOverlap_ = function(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n // Eliminate the null case.\n if (text1_length == 0 || text2_length == 0) {\n return 0;\n }\n // Truncate the longer string.\n if (text1_length > text2_length) {\n text1 = text1.substring(text1_length - text2_length);\n } else if (text1_length < text2_length) {\n text2 = text2.substring(0, text1_length);\n }\n var text_length = Math.min(text1_length, text2_length);\n // Quick check for the worst case.\n if (text1 == text2) {\n return text_length;\n }\n\n // Start by looking for a single character match\n // and increase length until no match is found.\n // Performance analysis: https://neil.fraser.name/news/2010/11/04/\n var best = 0;\n var length = 1;\n while (true) {\n var pattern = text1.substring(text_length - length);\n var found = text2.indexOf(pattern);\n if (found == -1) {\n return best;\n }\n length += found;\n if (found == 0 || text1.substring(text_length - length) ==\n text2.substring(0, length)) {\n best = length;\n length++;\n }\n }\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\ndiff_match_patch.prototype.diff_halfMatch_ = function(text1, text2) {\n if (this.Diff_Timeout <= 0) {\n // Don't risk returning a non-optimal diff if we have unlimited time.\n return null;\n }\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Number of characters that changed prior to the equality.\n var length_insertions1 = 0;\n var length_deletions1 = 0;\n // Number of characters that changed after the equality.\n var length_insertions2 = 0;\n var length_deletions2 = 0;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n equalities[equalitiesLength++] = pointer;\n length_insertions1 = length_insertions2;\n length_deletions1 = length_deletions2;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = diffs[pointer][1];\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_INSERT) {\n length_insertions2 += diffs[pointer][1].length;\n } else {\n length_deletions2 += diffs[pointer][1].length;\n }\n // Eliminate an equality that is smaller or equal to the edits on both\n // sides of it.\n if (lastEquality && (lastEquality.length <=\n Math.max(length_insertions1, length_deletions1)) &&\n (lastEquality.length <= Math.max(length_insertions2,\n length_deletions2))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n // Throw away the equality we just deleted.\n equalitiesLength--;\n // Throw away the previous equality (it needs to be reevaluated).\n equalitiesLength--;\n pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n length_insertions1 = 0; // Reset the counters.\n length_deletions1 = 0;\n length_insertions2 = 0;\n length_deletions2 = 0;\n lastEquality = null;\n changes = true;\n }\n }\n pointer++;\n }\n\n // Normalize the diff.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n this.diff_cleanupSemanticLossless(diffs);\n\n // Find any overlaps between deletions and insertions.\n // e.g: <del>abcxxx</del><ins>xxxdef</ins>\n // -> <del>abc</del>xxx<ins>def</ins>\n // e.g: <del>xxxabc</del><ins>defxxx</ins>\n // -> <ins>def</ins>xxx<del>abc</del>\n // Only extract an overlap if it is as big as the edit ahead or behind it.\n pointer = 1;\n while (pointer < diffs.length) {\n if (diffs[pointer - 1][0] == DIFF_DELETE &&\n diffs[pointer][0] == DIFF_INSERT) {\n var deletion = diffs[pointer - 1][1];\n var insertion = diffs[pointer][1];\n var overlap_length1 = this.diff_commonOverlap_(deletion, insertion);\n var overlap_length2 = this.diff_commonOverlap_(insertion, deletion);\n if (overlap_length1 >= overlap_length2) {\n if (overlap_length1 >= deletion.length / 2 ||\n overlap_length1 >= insertion.length / 2) {\n // Overlap found. Insert an equality and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n insertion.substring(0, overlap_length1)));\n diffs[pointer - 1][1] =\n deletion.substring(0, deletion.length - overlap_length1);\n diffs[pointer + 1][1] = insertion.substring(overlap_length1);\n pointer++;\n }\n } else {\n if (overlap_length2 >= deletion.length / 2 ||\n overlap_length2 >= insertion.length / 2) {\n // Reverse overlap found.\n // Insert an equality and swap and trim the surrounding edits.\n diffs.splice(pointer, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n deletion.substring(0, overlap_length2)));\n diffs[pointer - 1][0] = DIFF_INSERT;\n diffs[pointer - 1][1] =\n insertion.substring(0, insertion.length - overlap_length2);\n diffs[pointer + 1][0] = DIFF_DELETE;\n diffs[pointer + 1][1] =\n deletion.substring(overlap_length2);\n pointer++;\n }\n }\n pointer++;\n }\n pointer++;\n }\n};\n\n\n/**\n * Look for single edits surrounded on both sides by equalities\n * which can be shifted sideways to align the edit to a word boundary.\n * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {\n /**\n * Given two strings, compute a score representing whether the internal\n * boundary falls on logical boundaries.\n * Scores range from 6 (best) to 0 (worst).\n * Closure, but does not reference any external variables.\n * @param {string} one First string.\n * @param {string} two Second string.\n * @return {number} The score.\n * @private\n */\n function diff_cleanupSemanticScore_(one, two) {\n if (!one || !two) {\n // Edges are the best.\n return 6;\n }\n\n // Each port of this function behaves slightly differently due to\n // subtle differences in each language's definition of things like\n // 'whitespace'. Since this function's purpose is largely cosmetic,\n // the choice has been made to use each language's native features\n // rather than force total conformity.\n var char1 = one.charAt(one.length - 1);\n var char2 = two.charAt(0);\n var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_);\n var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_);\n var whitespace1 = nonAlphaNumeric1 &&\n char1.match(diff_match_patch.whitespaceRegex_);\n var whitespace2 = nonAlphaNumeric2 &&\n char2.match(diff_match_patch.whitespaceRegex_);\n var lineBreak1 = whitespace1 &&\n char1.match(diff_match_patch.linebreakRegex_);\n var lineBreak2 = whitespace2 &&\n char2.match(diff_match_patch.linebreakRegex_);\n var blankLine1 = lineBreak1 &&\n one.match(diff_match_patch.blanklineEndRegex_);\n var blankLine2 = lineBreak2 &&\n two.match(diff_match_patch.blanklineStartRegex_);\n\n if (blankLine1 || blankLine2) {\n // Five points for blank lines.\n return 5;\n } else if (lineBreak1 || lineBreak2) {\n // Four points for line breaks.\n return 4;\n } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) {\n // Three points for end of sentences.\n return 3;\n } else if (whitespace1 || whitespace2) {\n // Two points for whitespace.\n return 2;\n } else if (nonAlphaNumeric1 || nonAlphaNumeric2) {\n // One point for non-alphanumeric.\n return 1;\n }\n return 0;\n }\n\n var pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n var equality1 = diffs[pointer - 1][1];\n var edit = diffs[pointer][1];\n var equality2 = diffs[pointer + 1][1];\n\n // First, shift the edit as far left as possible.\n var commonOffset = this.diff_commonSuffix(equality1, edit);\n if (commonOffset) {\n var commonString = edit.substring(edit.length - commonOffset);\n equality1 = equality1.substring(0, equality1.length - commonOffset);\n edit = commonString + edit.substring(0, edit.length - commonOffset);\n equality2 = commonString + equality2;\n }\n\n // Second, step character by character right, looking for the best fit.\n var bestEquality1 = equality1;\n var bestEdit = edit;\n var bestEquality2 = equality2;\n var bestScore = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n while (edit.charAt(0) === equality2.charAt(0)) {\n equality1 += edit.charAt(0);\n edit = edit.substring(1) + equality2.charAt(0);\n equality2 = equality2.substring(1);\n var score = diff_cleanupSemanticScore_(equality1, edit) +\n diff_cleanupSemanticScore_(edit, equality2);\n // The >= encourages trailing rather than leading whitespace on edits.\n if (score >= bestScore) {\n bestScore = score;\n bestEquality1 = equality1;\n bestEdit = edit;\n bestEquality2 = equality2;\n }\n }\n\n if (diffs[pointer - 1][1] != bestEquality1) {\n // We have an improvement, save it back to the diff.\n if (bestEquality1) {\n diffs[pointer - 1][1] = bestEquality1;\n } else {\n diffs.splice(pointer - 1, 1);\n pointer--;\n }\n diffs[pointer][1] = bestEdit;\n if (bestEquality2) {\n diffs[pointer + 1][1] = bestEquality2;\n } else {\n diffs.splice(pointer + 1, 1);\n pointer--;\n }\n }\n }\n pointer++;\n }\n};\n\n// Define some regex patterns for matching boundaries.\ndiff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/;\ndiff_match_patch.whitespaceRegex_ = /\\s/;\ndiff_match_patch.linebreakRegex_ = /[\\r\\n]/;\ndiff_match_patch.blanklineEndRegex_ = /\\n\\r?\\n$/;\ndiff_match_patch.blanklineStartRegex_ = /^\\r?\\n\\r?\\n/;\n\n/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {\n var changes = false;\n var equalities = []; // Stack of indices where equalities are found.\n var equalitiesLength = 0; // Keeping our own length var is faster in JS.\n /** @type {?string} */\n var lastEquality = null;\n // Always equal to diffs[equalities[equalitiesLength - 1]][1]\n var pointer = 0; // Index of current position.\n // Is there an insertion operation before the last equality.\n var pre_ins = false;\n // Is there a deletion operation before the last equality.\n var pre_del = false;\n // Is there an insertion operation after the last equality.\n var post_ins = false;\n // Is there a deletion operation after the last equality.\n var post_del = false;\n while (pointer < diffs.length) {\n if (diffs[pointer][0] == DIFF_EQUAL) { // Equality found.\n if (diffs[pointer][1].length < this.Diff_EditCost &&\n (post_ins || post_del)) {\n // Candidate found.\n equalities[equalitiesLength++] = pointer;\n pre_ins = post_ins;\n pre_del = post_del;\n lastEquality = diffs[pointer][1];\n } else {\n // Not a candidate, and can never become one.\n equalitiesLength = 0;\n lastEquality = null;\n }\n post_ins = post_del = false;\n } else { // An insertion or deletion.\n if (diffs[pointer][0] == DIFF_DELETE) {\n post_del = true;\n } else {\n post_ins = true;\n }\n /*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n if (lastEquality && ((pre_ins && pre_del && post_ins && post_del) ||\n ((lastEquality.length < this.Diff_EditCost / 2) &&\n (pre_ins + pre_del + post_ins + post_del) == 3))) {\n // Duplicate record.\n diffs.splice(equalities[equalitiesLength - 1], 0,\n new diff_match_patch.Diff(DIFF_DELETE, lastEquality));\n // Change second copy to insert.\n diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n equalitiesLength--; // Throw away the equality we just deleted;\n lastEquality = null;\n if (pre_ins && pre_del) {\n // No changes made which could affect previous entry, keep going.\n post_ins = post_del = true;\n equalitiesLength = 0;\n } else {\n equalitiesLength--; // Throw away the previous equality.\n pointer = equalitiesLength > 0 ?\n equalities[equalitiesLength - 1] : -1;\n post_ins = post_del = false;\n }\n changes = true;\n }\n }\n pointer++;\n }\n\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n */\ndiff_match_patch.prototype.diff_cleanupMerge = function(diffs) {\n // Add a dummy entry at the end.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, ''));\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = this.diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, new diff_match_patch.Diff(DIFF_EQUAL,\n text_insert.substring(0, commonlength)));\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = this.diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n pointer -= count_delete + count_insert;\n diffs.splice(pointer, count_delete + count_insert);\n if (text_delete.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_DELETE, text_delete));\n pointer++;\n }\n if (text_insert.length) {\n diffs.splice(pointer, 0,\n new diff_match_patch.Diff(DIFF_INSERT, text_insert));\n pointer++;\n }\n pointer++;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n this.diff_cleanupMerge(diffs);\n }\n};\n\n\n/**\n * loc is a location in text1, compute and return the equivalent location in\n * text2.\n * e.g. 'The cat' vs 'The big cat', 1->1, 5->8\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @param {number} loc Location within text1.\n * @return {number} Location within text2.\n */\ndiff_match_patch.prototype.diff_xIndex = function(diffs, loc) {\n var chars1 = 0;\n var chars2 = 0;\n var last_chars1 = 0;\n var last_chars2 = 0;\n var x;\n for (x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) { // Equality or deletion.\n chars1 += diffs[x][1].length;\n }\n if (diffs[x][0] !== DIFF_DELETE) { // Equality or insertion.\n chars2 += diffs[x][1].length;\n }\n if (chars1 > loc) { // Overshot the location.\n break;\n }\n last_chars1 = chars1;\n last_chars2 = chars2;\n }\n // Was the location was deleted?\n if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {\n return last_chars2;\n }\n // Add the remaining character length.\n return last_chars2 + (loc - last_chars1);\n};\n\n\n/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} HTML representation.\n */\ndiff_match_patch.prototype.diff_prettyHtml = function(diffs) {\n var html = [];\n var pattern_amp = /&/g;\n var pattern_lt = /</g;\n var pattern_gt = />/g;\n var pattern_para = /\\n/g;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0]; // Operation (insert, delete, equal)\n var data = diffs[x][1]; // Text of change.\n var text = data.replace(pattern_amp, '&amp;').replace(pattern_lt, '&lt;')\n .replace(pattern_gt, '&gt;').replace(pattern_para, '&para;<br>');\n switch (op) {\n case DIFF_INSERT:\n html[x] = '<ins style=\"background:#e6ffe6;\">' + text + '</ins>';\n break;\n case DIFF_DELETE:\n html[x] = '<del style=\"background:#ffe6e6;\">' + text + '</del>';\n break;\n case DIFF_EQUAL:\n html[x] = '<span>' + text + '</span>';\n break;\n }\n }\n return html.join('');\n};\n\n\n/**\n * Compute and return the source text (all equalities and deletions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Source text.\n */\ndiff_match_patch.prototype.diff_text1 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_INSERT) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute and return the destination text (all equalities and insertions).\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Destination text.\n */\ndiff_match_patch.prototype.diff_text2 = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n if (diffs[x][0] !== DIFF_DELETE) {\n text[x] = diffs[x][1];\n }\n }\n return text.join('');\n};\n\n\n/**\n * Compute the Levenshtein distance; the number of inserted, deleted or\n * substituted characters.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {number} Number of changes.\n */\ndiff_match_patch.prototype.diff_levenshtein = function(diffs) {\n var levenshtein = 0;\n var insertions = 0;\n var deletions = 0;\n for (var x = 0; x < diffs.length; x++) {\n var op = diffs[x][0];\n var data = diffs[x][1];\n switch (op) {\n case DIFF_INSERT:\n insertions += data.length;\n break;\n case DIFF_DELETE:\n deletions += data.length;\n break;\n case DIFF_EQUAL:\n // A deletion and an insertion is one substitution.\n levenshtein += Math.max(insertions, deletions);\n insertions = 0;\n deletions = 0;\n break;\n }\n }\n levenshtein += Math.max(insertions, deletions);\n return levenshtein;\n};\n\n\n/**\n * Crush the diff into an encoded string which describes the operations\n * required to transform text1 into text2.\n * E.g. =3\\t-2\\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'.\n * Operations are tab-separated. Inserted text is escaped using %xx notation.\n * @param {!Array.<!diff_match_patch.Diff>} diffs Array of diff tuples.\n * @return {string} Delta text.\n */\ndiff_match_patch.prototype.diff_toDelta = function(diffs) {\n var text = [];\n for (var x = 0; x < diffs.length; x++) {\n switch (diffs[x][0]) {\n case DIFF_INSERT:\n text[x] = '+' + encodeURI(diffs[x][1]);\n break;\n case DIFF_DELETE:\n text[x] = '-' + diffs[x][1].length;\n break;\n case DIFF_EQUAL:\n text[x] = '=' + diffs[x][1].length;\n break;\n }\n }\n return text.join('\\t').replace(/%20/g, ' ');\n};\n\n\n/**\n * Given the original text1, and an encoded string which describes the\n * operations required to transform text1 into text2, compute the full diff.\n * @param {string} text1 Source string for the diff.\n * @param {string} delta Delta text.\n * @return {!Array.<!diff_match_patch.Diff>} Array of diff tuples.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.diff_fromDelta = function(text1, delta) {\n var diffs = [];\n var diffsLength = 0; // Keeping our own length var is faster in JS.\n var pointer = 0; // Cursor in text1\n var tokens = delta.split(/\\t/g);\n for (var x = 0; x < tokens.length; x++) {\n // Each token begins with a one character parameter which specifies the\n // operation of this token (delete, insert, equality).\n var param = tokens[x].substring(1);\n switch (tokens[x].charAt(0)) {\n case '+':\n try {\n diffs[diffsLength++] =\n new diff_match_patch.Diff(DIFF_INSERT, decodeURI(param));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in diff_fromDelta: ' + param);\n }\n break;\n case '-':\n // Fall through.\n case '=':\n var n = parseInt(param, 10);\n if (isNaN(n) || n < 0) {\n throw new Error('Invalid number in diff_fromDelta: ' + param);\n }\n var text = text1.substring(pointer, pointer += n);\n if (tokens[x].charAt(0) == '=') {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text);\n } else {\n diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text);\n }\n break;\n default:\n // Blank tokens are ok (from a trailing \\t).\n // Anything else is an error.\n if (tokens[x]) {\n throw new Error('Invalid diff operation in diff_fromDelta: ' +\n tokens[x]);\n }\n }\n }\n if (pointer != text1.length) {\n throw new Error('Delta length (' + pointer +\n ') does not equal source text length (' + text1.length + ').');\n }\n return diffs;\n};\n\n\n// MATCH FUNCTIONS\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc'.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n */\ndiff_match_patch.prototype.match_main = function(text, pattern, loc) {\n // Check for null inputs.\n if (text == null || pattern == null || loc == null) {\n throw new Error('Null input. (match_main)');\n }\n\n loc = Math.max(0, Math.min(loc, text.length));\n if (text == pattern) {\n // Shortcut (potentially not guaranteed by the algorithm)\n return 0;\n } else if (!text.length) {\n // Nothing to match.\n return -1;\n } else if (text.substring(loc, loc + pattern.length) == pattern) {\n // Perfect match at the perfect spot! (Includes case of null pattern)\n return loc;\n } else {\n // Do a fuzzy compare.\n return this.match_bitap_(text, pattern, loc);\n }\n};\n\n\n/**\n * Locate the best instance of 'pattern' in 'text' near 'loc' using the\n * Bitap algorithm.\n * @param {string} text The text to search.\n * @param {string} pattern The pattern to search for.\n * @param {number} loc The location to search around.\n * @return {number} Best match index or -1.\n * @private\n */\ndiff_match_patch.prototype.match_bitap_ = function(text, pattern, loc) {\n if (pattern.length > this.Match_MaxBits) {\n throw new Error('Pattern too long for this browser.');\n }\n\n // Initialise the alphabet.\n var s = this.match_alphabet_(pattern);\n\n var dmp = this; // 'this' becomes 'window' in a closure.\n\n /**\n * Compute and return the score for a match with e errors and x location.\n * Accesses loc and pattern through being a closure.\n * @param {number} e Number of errors in match.\n * @param {number} x Location of match.\n * @return {number} Overall score for match (0.0 = good, 1.0 = bad).\n * @private\n */\n function match_bitapScore_(e, x) {\n var accuracy = e / pattern.length;\n var proximity = Math.abs(loc - x);\n if (!dmp.Match_Distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy;\n }\n return accuracy + (proximity / dmp.Match_Distance);\n }\n\n // Highest score beyond which we give up.\n var score_threshold = this.Match_Threshold;\n // Is there a nearby exact match? (speedup)\n var best_loc = text.indexOf(pattern, loc);\n if (best_loc != -1) {\n score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);\n // What about in the other direction? (speedup)\n best_loc = text.lastIndexOf(pattern, loc + pattern.length);\n if (best_loc != -1) {\n score_threshold =\n Math.min(match_bitapScore_(0, best_loc), score_threshold);\n }\n }\n\n // Initialise the bit arrays.\n var matchmask = 1 << (pattern.length - 1);\n best_loc = -1;\n\n var bin_min, bin_mid;\n var bin_max = pattern.length + text.length;\n var last_rd;\n for (var d = 0; d < pattern.length; d++) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from 'loc' we can stray at this\n // error level.\n bin_min = 0;\n bin_mid = bin_max;\n while (bin_min < bin_mid) {\n if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {\n bin_min = bin_mid;\n } else {\n bin_max = bin_mid;\n }\n bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\n }\n // Use the result from this iteration as the maximum for the next.\n bin_max = bin_mid;\n var start = Math.max(1, loc - bin_mid + 1);\n var finish = Math.min(loc + bin_mid, text.length) + pattern.length;\n\n var rd = Array(finish + 2);\n rd[finish + 1] = (1 << d) - 1;\n for (var j = finish; j >= start; j--) {\n // The alphabet (s) is a sparse hash, so the following line generates\n // warnings.\n var charMatch = s[text.charAt(j - 1)];\n if (d === 0) { // First pass: exact match.\n rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;\n } else { // Subsequent passes: fuzzy match.\n rd[j] = (((rd[j + 1] << 1) | 1) & charMatch) |\n (((last_rd[j + 1] | last_rd[j]) << 1) | 1) |\n last_rd[j + 1];\n }\n if (rd[j] & matchmask) {\n var score = match_bitapScore_(d, j - 1);\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (score <= score_threshold) {\n // Told you so.\n score_threshold = score;\n best_loc = j - 1;\n if (best_loc > loc) {\n // When passing loc, don't exceed our current distance from loc.\n start = Math.max(1, 2 * loc - best_loc);\n } else {\n // Already passed loc, downhill from here on in.\n break;\n }\n }\n }\n }\n // No hope for a (better) match at greater error levels.\n if (match_bitapScore_(d + 1, loc) > score_threshold) {\n break;\n }\n last_rd = rd;\n }\n return best_loc;\n};\n\n\n/**\n * Initialise the alphabet for the Bitap algorithm.\n * @param {string} pattern The text to encode.\n * @return {!Object} Hash of character locations.\n * @private\n */\ndiff_match_patch.prototype.match_alphabet_ = function(pattern) {\n var s = {};\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] = 0;\n }\n for (var i = 0; i < pattern.length; i++) {\n s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);\n }\n return s;\n};\n\n\n// PATCH FUNCTIONS\n\n\n/**\n * Increase the context until it is unique,\n * but don't let the pattern expand beyond Match_MaxBits.\n * @param {!diff_match_patch.patch_obj} patch The patch to grow.\n * @param {string} text Source text.\n * @private\n */\ndiff_match_patch.prototype.patch_addContext_ = function(patch, text) {\n if (text.length == 0) {\n return;\n }\n if (patch.start2 === null) {\n throw Error('patch not initialized');\n }\n var pattern = text.substring(patch.start2, patch.start2 + patch.length1);\n var padding = 0;\n\n // Look for the first and last matches of pattern in text. If two different\n // matches are found, increase the pattern length.\n while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&\n pattern.length < this.Match_MaxBits - this.Patch_Margin -\n this.Patch_Margin) {\n padding += this.Patch_Margin;\n pattern = text.substring(patch.start2 - padding,\n patch.start2 + patch.length1 + padding);\n }\n // Add one chunk for good luck.\n padding += this.Patch_Margin;\n\n // Add the prefix.\n var prefix = text.substring(patch.start2 - padding, patch.start2);\n if (prefix) {\n patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix));\n }\n // Add the suffix.\n var suffix = text.substring(patch.start2 + patch.length1,\n patch.start2 + patch.length1 + padding);\n if (suffix) {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix));\n }\n\n // Roll back the start points.\n patch.start1 -= prefix.length;\n patch.start2 -= prefix.length;\n // Extend the lengths.\n patch.length1 += prefix.length + suffix.length;\n patch.length2 += prefix.length + suffix.length;\n};\n\n\n/**\n * Compute a list of patches to turn text1 into text2.\n * Use diffs if provided, otherwise compute it ourselves.\n * There are four ways to call this function, depending on what data is\n * available to the caller:\n * Method 1:\n * a = text1, b = text2\n * Method 2:\n * a = diffs\n * Method 3 (optimal):\n * a = text1, b = diffs\n * Method 4 (deprecated, use method 3):\n * a = text1, b = text2, c = diffs\n *\n * @param {string|!Array.<!diff_match_patch.Diff>} a text1 (methods 1,3,4) or\n * Array of diff tuples for text1 to text2 (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_b text2 (methods 1,4) or\n * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2).\n * @param {string|!Array.<!diff_match_patch.Diff>=} opt_c Array of diff tuples\n * for text1 to text2 (method 4) or undefined (methods 1,2,3).\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {\n var text1, diffs;\n if (typeof a == 'string' && typeof opt_b == 'string' &&\n typeof opt_c == 'undefined') {\n // Method 1: text1, text2\n // Compute diffs from text1 and text2.\n text1 = /** @type {string} */(a);\n diffs = this.diff_main(text1, /** @type {string} */(opt_b), true);\n if (diffs.length > 2) {\n this.diff_cleanupSemantic(diffs);\n this.diff_cleanupEfficiency(diffs);\n }\n } else if (a && typeof a == 'object' && typeof opt_b == 'undefined' &&\n typeof opt_c == 'undefined') {\n // Method 2: diffs\n // Compute text1 from diffs.\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(a);\n text1 = this.diff_text1(diffs);\n } else if (typeof a == 'string' && opt_b && typeof opt_b == 'object' &&\n typeof opt_c == 'undefined') {\n // Method 3: text1, diffs\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_b);\n } else if (typeof a == 'string' && typeof opt_b == 'string' &&\n opt_c && typeof opt_c == 'object') {\n // Method 4: text1, text2, diffs\n // text2 is not used.\n text1 = /** @type {string} */(a);\n diffs = /** @type {!Array.<!diff_match_patch.Diff>} */(opt_c);\n } else {\n throw new Error('Unknown call format to patch_make.');\n }\n\n if (diffs.length === 0) {\n return []; // Get rid of the null case.\n }\n var patches = [];\n var patch = new diff_match_patch.patch_obj();\n var patchDiffLength = 0; // Keeping our own length var is faster in JS.\n var char_count1 = 0; // Number of characters into the text1 string.\n var char_count2 = 0; // Number of characters into the text2 string.\n // Start with text1 (prepatch_text) and apply the diffs until we arrive at\n // text2 (postpatch_text). We recreate the patches one by one to determine\n // context info.\n var prepatch_text = text1;\n var postpatch_text = text1;\n for (var x = 0; x < diffs.length; x++) {\n var diff_type = diffs[x][0];\n var diff_text = diffs[x][1];\n\n if (!patchDiffLength && diff_type !== DIFF_EQUAL) {\n // A new patch starts here.\n patch.start1 = char_count1;\n patch.start2 = char_count2;\n }\n\n switch (diff_type) {\n case DIFF_INSERT:\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length2 += diff_text.length;\n postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +\n postpatch_text.substring(char_count2);\n break;\n case DIFF_DELETE:\n patch.length1 += diff_text.length;\n patch.diffs[patchDiffLength++] = diffs[x];\n postpatch_text = postpatch_text.substring(0, char_count2) +\n postpatch_text.substring(char_count2 +\n diff_text.length);\n break;\n case DIFF_EQUAL:\n if (diff_text.length <= 2 * this.Patch_Margin &&\n patchDiffLength && diffs.length != x + 1) {\n // Small equality inside a patch.\n patch.diffs[patchDiffLength++] = diffs[x];\n patch.length1 += diff_text.length;\n patch.length2 += diff_text.length;\n } else if (diff_text.length >= 2 * this.Patch_Margin) {\n // Time for a new patch.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n patch = new diff_match_patch.patch_obj();\n patchDiffLength = 0;\n // Unlike Unidiff, our patch lists have a rolling context.\n // https://github.com/google/diff-match-patch/wiki/Unidiff\n // Update prepatch text & pos to reflect the application of the\n // just completed patch.\n prepatch_text = postpatch_text;\n char_count1 = char_count2;\n }\n }\n break;\n }\n\n // Update the current character count.\n if (diff_type !== DIFF_INSERT) {\n char_count1 += diff_text.length;\n }\n if (diff_type !== DIFF_DELETE) {\n char_count2 += diff_text.length;\n }\n }\n // Pick up the leftover patch if not empty.\n if (patchDiffLength) {\n this.patch_addContext_(patch, prepatch_text);\n patches.push(patch);\n }\n\n return patches;\n};\n\n\n/**\n * Given an array of patches, return another array that is identical.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_deepCopy = function(patches) {\n // Making deep copies is hard in JavaScript.\n var patchesCopy = [];\n for (var x = 0; x < patches.length; x++) {\n var patch = patches[x];\n var patchCopy = new diff_match_patch.patch_obj();\n patchCopy.diffs = [];\n for (var y = 0; y < patch.diffs.length; y++) {\n patchCopy.diffs[y] =\n new diff_match_patch.Diff(patch.diffs[y][0], patch.diffs[y][1]);\n }\n patchCopy.start1 = patch.start1;\n patchCopy.start2 = patch.start2;\n patchCopy.length1 = patch.length1;\n patchCopy.length2 = patch.length2;\n patchesCopy[x] = patchCopy;\n }\n return patchesCopy;\n};\n\n\n/**\n * Merge a set of patches onto the text. Return a patched text, as well\n * as a list of true/false values indicating which patches were applied.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @param {string} text Old text.\n * @return {!Array.<string|!Array.<boolean>>} Two element Array, containing the\n * new text and an array of boolean values.\n */\ndiff_match_patch.prototype.patch_apply = function(patches, text) {\n if (patches.length == 0) {\n return [text, []];\n }\n\n // Deep copy the patches so that no changes are made to originals.\n patches = this.patch_deepCopy(patches);\n\n var nullPadding = this.patch_addPadding(patches);\n text = nullPadding + text + nullPadding;\n\n this.patch_splitMax(patches);\n // delta keeps track of the offset between the expected and actual location\n // of the previous patch. If there are patches expected at positions 10 and\n // 20, but the first patch was found at 12, delta is 2 and the second patch\n // has an effective expected position of 22.\n var delta = 0;\n var results = [];\n for (var x = 0; x < patches.length; x++) {\n var expected_loc = patches[x].start2 + delta;\n var text1 = this.diff_text1(patches[x].diffs);\n var start_loc;\n var end_loc = -1;\n if (text1.length > this.Match_MaxBits) {\n // patch_splitMax will only provide an oversized pattern in the case of\n // a monster delete.\n start_loc = this.match_main(text, text1.substring(0, this.Match_MaxBits),\n expected_loc);\n if (start_loc != -1) {\n end_loc = this.match_main(text,\n text1.substring(text1.length - this.Match_MaxBits),\n expected_loc + text1.length - this.Match_MaxBits);\n if (end_loc == -1 || start_loc >= end_loc) {\n // Can't find valid trailing context. Drop this patch.\n start_loc = -1;\n }\n }\n } else {\n start_loc = this.match_main(text, text1, expected_loc);\n }\n if (start_loc == -1) {\n // No match found. :(\n results[x] = false;\n // Subtract the delta for this failed patch from subsequent patches.\n delta -= patches[x].length2 - patches[x].length1;\n } else {\n // Found a match. :)\n results[x] = true;\n delta = start_loc - expected_loc;\n var text2;\n if (end_loc == -1) {\n text2 = text.substring(start_loc, start_loc + text1.length);\n } else {\n text2 = text.substring(start_loc, end_loc + this.Match_MaxBits);\n }\n if (text1 == text2) {\n // Perfect match, just shove the replacement text in.\n text = text.substring(0, start_loc) +\n this.diff_text2(patches[x].diffs) +\n text.substring(start_loc + text1.length);\n } else {\n // Imperfect match. Run a diff to get a framework of equivalent\n // indices.\n var diffs = this.diff_main(text1, text2, false);\n if (text1.length > this.Match_MaxBits &&\n this.diff_levenshtein(diffs) / text1.length >\n this.Patch_DeleteThreshold) {\n // The end points match, but the content is unacceptably bad.\n results[x] = false;\n } else {\n this.diff_cleanupSemanticLossless(diffs);\n var index1 = 0;\n var index2;\n for (var y = 0; y < patches[x].diffs.length; y++) {\n var mod = patches[x].diffs[y];\n if (mod[0] !== DIFF_EQUAL) {\n index2 = this.diff_xIndex(diffs, index1);\n }\n if (mod[0] === DIFF_INSERT) { // Insertion\n text = text.substring(0, start_loc + index2) + mod[1] +\n text.substring(start_loc + index2);\n } else if (mod[0] === DIFF_DELETE) { // Deletion\n text = text.substring(0, start_loc + index2) +\n text.substring(start_loc + this.diff_xIndex(diffs,\n index1 + mod[1].length));\n }\n if (mod[0] !== DIFF_DELETE) {\n index1 += mod[1].length;\n }\n }\n }\n }\n }\n }\n // Strip the padding off.\n text = text.substring(nullPadding.length, text.length - nullPadding.length);\n return [text, results];\n};\n\n\n/**\n * Add some padding on text start and end so that edges can match something.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} The padding string added to each side.\n */\ndiff_match_patch.prototype.patch_addPadding = function(patches) {\n var paddingLength = this.Patch_Margin;\n var nullPadding = '';\n for (var x = 1; x <= paddingLength; x++) {\n nullPadding += String.fromCharCode(x);\n }\n\n // Bump all the patches forward.\n for (var x = 0; x < patches.length; x++) {\n patches[x].start1 += paddingLength;\n patches[x].start2 += paddingLength;\n }\n\n // Add some padding on start of first diff.\n var patch = patches[0];\n var diffs = patch.diffs;\n if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.start1 -= paddingLength; // Should be 0.\n patch.start2 -= paddingLength; // Should be 0.\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[0][1].length) {\n // Grow first equality.\n var extraLength = paddingLength - diffs[0][1].length;\n diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];\n patch.start1 -= extraLength;\n patch.start2 -= extraLength;\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n // Add some padding on end of last diff.\n patch = patches[patches.length - 1];\n diffs = patch.diffs;\n if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {\n // Add nullPadding equality.\n diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding));\n patch.length1 += paddingLength;\n patch.length2 += paddingLength;\n } else if (paddingLength > diffs[diffs.length - 1][1].length) {\n // Grow last equality.\n var extraLength = paddingLength - diffs[diffs.length - 1][1].length;\n diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);\n patch.length1 += extraLength;\n patch.length2 += extraLength;\n }\n\n return nullPadding;\n};\n\n\n/**\n * Look through the patches and break up any which are longer than the maximum\n * limit of the match algorithm.\n * Intended to be called only from within patch_apply.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n */\ndiff_match_patch.prototype.patch_splitMax = function(patches) {\n var patch_size = this.Match_MaxBits;\n for (var x = 0; x < patches.length; x++) {\n if (patches[x].length1 <= patch_size) {\n continue;\n }\n var bigpatch = patches[x];\n // Remove the big old patch.\n patches.splice(x--, 1);\n var start1 = bigpatch.start1;\n var start2 = bigpatch.start2;\n var precontext = '';\n while (bigpatch.diffs.length !== 0) {\n // Create one of several smaller patches.\n var patch = new diff_match_patch.patch_obj();\n var empty = true;\n patch.start1 = start1 - precontext.length;\n patch.start2 = start2 - precontext.length;\n if (precontext !== '') {\n patch.length1 = patch.length2 = precontext.length;\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext));\n }\n while (bigpatch.diffs.length !== 0 &&\n patch.length1 < patch_size - this.Patch_Margin) {\n var diff_type = bigpatch.diffs[0][0];\n var diff_text = bigpatch.diffs[0][1];\n if (diff_type === DIFF_INSERT) {\n // Insertions are harmless.\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n patch.diffs.push(bigpatch.diffs.shift());\n empty = false;\n } else if (diff_type === DIFF_DELETE && patch.diffs.length == 1 &&\n patch.diffs[0][0] == DIFF_EQUAL &&\n diff_text.length > 2 * patch_size) {\n // This is a large deletion. Let it pass in one chunk.\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n empty = false;\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n bigpatch.diffs.shift();\n } else {\n // Deletion or equality. Only take as much as we can stomach.\n diff_text = diff_text.substring(0,\n patch_size - patch.length1 - this.Patch_Margin);\n patch.length1 += diff_text.length;\n start1 += diff_text.length;\n if (diff_type === DIFF_EQUAL) {\n patch.length2 += diff_text.length;\n start2 += diff_text.length;\n } else {\n empty = false;\n }\n patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text));\n if (diff_text == bigpatch.diffs[0][1]) {\n bigpatch.diffs.shift();\n } else {\n bigpatch.diffs[0][1] =\n bigpatch.diffs[0][1].substring(diff_text.length);\n }\n }\n }\n // Compute the head context for the next patch.\n precontext = this.diff_text2(patch.diffs);\n precontext =\n precontext.substring(precontext.length - this.Patch_Margin);\n // Append the end context for this patch.\n var postcontext = this.diff_text1(bigpatch.diffs)\n .substring(0, this.Patch_Margin);\n if (postcontext !== '') {\n patch.length1 += postcontext.length;\n patch.length2 += postcontext.length;\n if (patch.diffs.length !== 0 &&\n patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {\n patch.diffs[patch.diffs.length - 1][1] += postcontext;\n } else {\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext));\n }\n }\n if (!empty) {\n patches.splice(++x, 0, patch);\n }\n }\n }\n};\n\n\n/**\n * Take a list of patches and return a textual representation.\n * @param {!Array.<!diff_match_patch.patch_obj>} patches Array of Patch objects.\n * @return {string} Text representation of patches.\n */\ndiff_match_patch.prototype.patch_toText = function(patches) {\n var text = [];\n for (var x = 0; x < patches.length; x++) {\n text[x] = patches[x];\n }\n return text.join('');\n};\n\n\n/**\n * Parse a textual representation of patches and return a list of Patch objects.\n * @param {string} textline Text representation of patches.\n * @return {!Array.<!diff_match_patch.patch_obj>} Array of Patch objects.\n * @throws {!Error} If invalid input.\n */\ndiff_match_patch.prototype.patch_fromText = function(textline) {\n var patches = [];\n if (!textline) {\n return patches;\n }\n var text = textline.split('\\n');\n var textPointer = 0;\n var patchHeader = /^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;\n while (textPointer < text.length) {\n var m = text[textPointer].match(patchHeader);\n if (!m) {\n throw new Error('Invalid patch string: ' + text[textPointer]);\n }\n var patch = new diff_match_patch.patch_obj();\n patches.push(patch);\n patch.start1 = parseInt(m[1], 10);\n if (m[2] === '') {\n patch.start1--;\n patch.length1 = 1;\n } else if (m[2] == '0') {\n patch.length1 = 0;\n } else {\n patch.start1--;\n patch.length1 = parseInt(m[2], 10);\n }\n\n patch.start2 = parseInt(m[3], 10);\n if (m[4] === '') {\n patch.start2--;\n patch.length2 = 1;\n } else if (m[4] == '0') {\n patch.length2 = 0;\n } else {\n patch.start2--;\n patch.length2 = parseInt(m[4], 10);\n }\n textPointer++;\n\n while (textPointer < text.length) {\n var sign = text[textPointer].charAt(0);\n try {\n var line = decodeURI(text[textPointer].substring(1));\n } catch (ex) {\n // Malformed URI sequence.\n throw new Error('Illegal escape in patch_fromText: ' + line);\n }\n if (sign == '-') {\n // Deletion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line));\n } else if (sign == '+') {\n // Insertion.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line));\n } else if (sign == ' ') {\n // Minor equality.\n patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line));\n } else if (sign == '@') {\n // Start of next patch.\n break;\n } else if (sign === '') {\n // Blank line? Whatever.\n } else {\n // WTF?\n throw new Error('Invalid patch mode \"' + sign + '\" in: ' + line);\n }\n textPointer++;\n }\n }\n return patches;\n};\n\n\n/**\n * Class representing one patch operation.\n * @constructor\n */\ndiff_match_patch.patch_obj = function() {\n /** @type {!Array.<!diff_match_patch.Diff>} */\n this.diffs = [];\n /** @type {?number} */\n this.start1 = null;\n /** @type {?number} */\n this.start2 = null;\n /** @type {number} */\n this.length1 = 0;\n /** @type {number} */\n this.length2 = 0;\n};\n\n\n/**\n * Emulate GNU diff's format.\n * Header: @@ -382,8 +481,9 @@\n * Indices are printed as 1-based, not 0-based.\n * @return {string} The GNU diff string.\n */\ndiff_match_patch.patch_obj.prototype.toString = function() {\n var coords1, coords2;\n if (this.length1 === 0) {\n coords1 = this.start1 + ',0';\n } else if (this.length1 == 1) {\n coords1 = this.start1 + 1;\n } else {\n coords1 = (this.start1 + 1) + ',' + this.length1;\n }\n if (this.length2 === 0) {\n coords2 = this.start2 + ',0';\n } else if (this.length2 == 1) {\n coords2 = this.start2 + 1;\n } else {\n coords2 = (this.start2 + 1) + ',' + this.length2;\n }\n var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\\n'];\n var op;\n // Escape the body of the patch with %xx notation.\n for (var x = 0; x < this.diffs.length; x++) {\n switch (this.diffs[x][0]) {\n case DIFF_INSERT:\n op = '+';\n break;\n case DIFF_DELETE:\n op = '-';\n break;\n case DIFF_EQUAL:\n op = ' ';\n break;\n }\n text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\\n';\n }\n return text.join('').replace(/%20/g, ' ');\n};\n\n\n// The following export code was added by @ForbesLindesay\nmodule.exports = diff_match_patch;\nmodule.exports['diff_match_patch'] = diff_match_patch;\nmodule.exports['DIFF_DELETE'] = DIFF_DELETE;\nmodule.exports['DIFF_INSERT'] = DIFF_INSERT;\nmodule.exports['DIFF_EQUAL'] = DIFF_EQUAL;","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.nodeType == 9 || root.ownerDocument;\n var iter = doc.createNodeIterator(root, whatToShow, filter, false);\n return new NodeIterator(iter, root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(iter, root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._iter = iter;\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var result = this._iter.nextNode();\n this.pointerBeforeReferenceNode = false;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var result = this._iter.previousNode();\n this.pointerBeforeReferenceNode = true;\n if (result === null) return null;\n this.referenceNode = result;\n return this.referenceNode;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZGFwdGVyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwibm9kZVR5cGUiLCJvd25lckRvY3VtZW50IiwiaXRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9pdGVyIiwibmV4dE5vZGUiLCJyZXN1bHQiLCJwcmV2aW91c05vZGUiLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFlQSxrQjs7O0FBR2YsU0FBU0Esa0JBQVQsQ0FBNEJDLElBQTVCLEVBQTBFO0FBQUEsTUFBeENDLFVBQXdDLHlEQUEzQixVQUEyQjtBQUFBLE1BQWZDLE1BQWUseURBQU4sSUFBTTs7QUFDeEUsTUFBTUMsTUFBT0gsS0FBS0ksUUFBTCxJQUFpQixDQUFsQixJQUF3QkosS0FBS0ssYUFBekM7QUFDQSxNQUFNQyxPQUFPSCxJQUFJSixrQkFBSixDQUF1QkMsSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxFQUFpRCxLQUFqRCxDQUFiO0FBQ0EsU0FBTyxJQUFJSyxZQUFKLENBQWlCRCxJQUFqQixFQUF1Qk4sSUFBdkIsRUFBNkJDLFVBQTdCLEVBQXlDQyxNQUF6QyxDQUFQO0FBQ0Q7O0lBR0tLLFk7QUFDSix3QkFBWUQsSUFBWixFQUFrQk4sSUFBbEIsRUFBd0JDLFVBQXhCLEVBQW9DQyxNQUFwQyxFQUE0QztBQUFBOztBQUMxQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLGFBQUwsR0FBcUJSLElBQXJCO0FBQ0EsU0FBS1MsMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxLQUFMLEdBQWFKLElBQWI7QUFDRDs7eUJBRURLLFEsdUJBQVc7QUFDVCxRQUFNQyxTQUFTLEtBQUtGLEtBQUwsQ0FBV0MsUUFBWCxFQUFmO0FBQ0EsU0FBS0YsMEJBQUwsR0FBa0MsS0FBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURLLFksMkJBQWU7QUFDYixRQUFNRCxTQUFTLEtBQUtGLEtBQUwsQ0FBV0csWUFBWCxFQUFmO0FBQ0EsU0FBS0osMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxRQUFJRyxXQUFXLElBQWYsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLFNBQUtKLGFBQUwsR0FBcUJJLE1BQXJCO0FBQ0EsV0FBTyxLQUFLSixhQUFaO0FBQ0QsRzs7eUJBRURNLFEsdUJBQVc7QUFDVCxXQUFPLHVCQUFQO0FBQ0QsRyIsImZpbGUiOiJhZGFwdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY3JlYXRlTm9kZUl0ZXJhdG9yXG5cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUl0ZXJhdG9yKHJvb3QsIHdoYXRUb1Nob3cgPSAweEZGRkZGRkZGLCBmaWx0ZXIgPSBudWxsKSB7XG4gIGNvbnN0IGRvYyA9IChyb290Lm5vZGVUeXBlID09IDkpIHx8IHJvb3Qub3duZXJEb2N1bWVudFxuICBjb25zdCBpdGVyID0gZG9jLmNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGZhbHNlKVxuICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihpdGVyLCByb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpXG59XG5cblxuY2xhc3MgTm9kZUl0ZXJhdG9yIHtcbiAgY29uc3RydWN0b3IoaXRlciwgcm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKSB7XG4gICAgdGhpcy5yb290ID0gcm9vdFxuICAgIHRoaXMud2hhdFRvU2hvdyA9IHdoYXRUb1Nob3dcbiAgICB0aGlzLmZpbHRlciA9IGZpbHRlclxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJvb3RcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHRoaXMuX2l0ZXIgPSBpdGVyXG4gIH1cblxuICBuZXh0Tm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLm5leHROb2RlKClcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHByZXZpb3VzTm9kZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9pdGVyLnByZXZpb3VzTm9kZSgpXG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlc3VsdFxuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBOb2RlSXRlcmF0b3JdJ1xuICB9XG59XG4iXX0=","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n var doc = root.ownerDocument;\n return doc.createNodeIterator.call(doc, root, whatToShow, filter);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsdGluLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5vZGVJdGVyYXRvciIsInJvb3QiLCJ3aGF0VG9TaG93IiwiZmlsdGVyIiwiZG9jIiwib3duZXJEb2N1bWVudCIsImNhbGwiXSwibWFwcGluZ3MiOiI7OztxQkFBZUEsa0I7OztBQUdmLFNBQVNBLGtCQUFULENBQTRCQyxJQUE1QixFQUEwRTtBQUFBLE1BQXhDQyxVQUF3Qyx5REFBM0IsVUFBMkI7QUFBQSxNQUFmQyxNQUFlLHlEQUFOLElBQU07O0FBQ3hFLE1BQU1DLE1BQU1ILEtBQUtJLGFBQWpCO0FBQ0EsU0FBT0QsSUFBSUosa0JBQUosQ0FBdUJNLElBQXZCLENBQTRCRixHQUE1QixFQUFpQ0gsSUFBakMsRUFBdUNDLFVBQXZDLEVBQW1EQyxNQUFuRCxDQUFQO0FBQ0QiLCJmaWxlIjoiYnVpbHRpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyZWF0ZU5vZGVJdGVyYXRvclxuXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCB3aGF0VG9TaG93ID0gMHhGRkZGRkZGRiwgZmlsdGVyID0gbnVsbCkge1xuICBjb25zdCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgcmV0dXJuIGRvYy5jcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChkb2MsIHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcilcbn1cbiJdfQ==","'use strict';\n\nexports.__esModule = true;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nexports['default'] = createNodeIterator;\n\n\nfunction createNodeIterator(root) {\n var whatToShow = arguments.length <= 1 || arguments[1] === undefined ? 0xFFFFFFFF : arguments[1];\n var filter = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\n return new NodeIterator(root, whatToShow, filter);\n}\n\nvar NodeIterator = function () {\n function NodeIterator(root, whatToShow, filter) {\n _classCallCheck(this, NodeIterator);\n\n this.root = root;\n this.whatToShow = whatToShow;\n this.filter = filter;\n this.referenceNode = root;\n this.pointerBeforeReferenceNode = true;\n this._filter = function (node) {\n return filter ? filter(node) === 1 : true;\n };\n this._show = function (node) {\n return whatToShow >> node.nodeType - 1 & 1 === 1;\n };\n }\n\n NodeIterator.prototype.nextNode = function nextNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = false;\n\n var node = this.referenceNode;\n if (before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node.firstChild) {\n node = node.firstChild;\n continue;\n }\n\n do {\n if (node === this.root) return null;\n if (node.nextSibling) break;\n node = node.parentNode;\n } while (node);\n\n node = node.nextSibling;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = false;\n return node;\n };\n\n NodeIterator.prototype.previousNode = function previousNode() {\n var before = this.pointerBeforeReferenceNode;\n this.pointerBeforeReferenceNode = true;\n\n var node = this.referenceNode;\n if (!before && this._show(node) && this._filter(node)) return node;\n\n do {\n if (node === this.root) return null;\n\n if (node.previousSibling) {\n node = node.previousSibling;\n while (node.lastChild) {\n node = node.lastChild;\n }continue;\n }\n\n node = node.parentNode;\n } while (!this._show(node) || !this._filter(node));\n\n this.referenceNode = node;\n this.pointerBeforeReferenceNode = true;\n return node;\n };\n\n NodeIterator.prototype.toString = function toString() {\n return '[object NodeIterator]';\n };\n\n return NodeIterator;\n}();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBsZW1lbnRhdGlvbi5qcyJdLCJuYW1lcyI6WyJjcmVhdGVOb2RlSXRlcmF0b3IiLCJyb290Iiwid2hhdFRvU2hvdyIsImZpbHRlciIsIk5vZGVJdGVyYXRvciIsInJlZmVyZW5jZU5vZGUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIl9maWx0ZXIiLCJub2RlIiwiX3Nob3ciLCJub2RlVHlwZSIsIm5leHROb2RlIiwiYmVmb3JlIiwiZmlyc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicGFyZW50Tm9kZSIsInByZXZpb3VzTm9kZSIsInByZXZpb3VzU2libGluZyIsImxhc3RDaGlsZCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7cUJBQWVBLGtCOzs7QUFHZixTQUFTQSxrQkFBVCxDQUE0QkMsSUFBNUIsRUFBMEU7QUFBQSxNQUF4Q0MsVUFBd0MseURBQTNCLFVBQTJCO0FBQUEsTUFBZkMsTUFBZSx5REFBTixJQUFNOztBQUN4RSxTQUFPLElBQUlDLFlBQUosQ0FBaUJILElBQWpCLEVBQXVCQyxVQUF2QixFQUFtQ0MsTUFBbkMsQ0FBUDtBQUNEOztJQUdLQyxZO0FBQ0osd0JBQVlILElBQVosRUFBa0JDLFVBQWxCLEVBQThCQyxNQUE5QixFQUFzQztBQUFBOztBQUNwQyxTQUFLRixJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtBQUNBLFNBQUtDLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtFLGFBQUwsR0FBcUJKLElBQXJCO0FBQ0EsU0FBS0ssMEJBQUwsR0FBa0MsSUFBbEM7QUFDQSxTQUFLQyxPQUFMLEdBQWUsVUFBQ0MsSUFBRDtBQUFBLGFBQVVMLFNBQVNBLE9BQU9LLElBQVAsTUFBaUIsQ0FBMUIsR0FBOEIsSUFBeEM7QUFBQSxLQUFmO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLFVBQUNELElBQUQ7QUFBQSxhQUFVTixjQUFjTSxLQUFLRSxRQUFMLEdBQWdCLENBQTlCLEdBQWtDLE1BQU0sQ0FBbEQ7QUFBQSxLQUFiO0FBQ0Q7O3lCQUVEQyxRLHVCQUFXO0FBQ1QsUUFBTUMsU0FBUyxLQUFLTiwwQkFBcEI7QUFDQSxTQUFLQSwwQkFBTCxHQUFrQyxLQUFsQzs7QUFFQSxRQUFJRSxPQUFPLEtBQUtILGFBQWhCO0FBQ0EsUUFBSU8sVUFBVSxLQUFLSCxLQUFMLENBQVdELElBQVgsQ0FBVixJQUE4QixLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FBbEMsRUFBc0QsT0FBT0EsSUFBUDs7QUFFdEQsT0FBRztBQUNELFVBQUlBLEtBQUtLLFVBQVQsRUFBcUI7QUFDbkJMLGVBQU9BLEtBQUtLLFVBQVo7QUFDQTtBQUNEOztBQUVELFNBQUc7QUFDRCxZQUFJTCxTQUFTLEtBQUtQLElBQWxCLEVBQXdCLE9BQU8sSUFBUDtBQUN4QixZQUFJTyxLQUFLTSxXQUFULEVBQXNCO0FBQ3RCTixlQUFPQSxLQUFLTyxVQUFaO0FBQ0QsT0FKRCxRQUlTUCxJQUpUOztBQU1BQSxhQUFPQSxLQUFLTSxXQUFaO0FBQ0QsS0FiRCxRQWFRLENBQUMsS0FBS0wsS0FBTCxDQUFXRCxJQUFYLENBQUQsSUFBcUIsQ0FBQyxLQUFLRCxPQUFMLENBQWFDLElBQWIsQ0FiOUI7O0FBZUEsU0FBS0gsYUFBTCxHQUFxQkcsSUFBckI7QUFDQSxTQUFLRiwwQkFBTCxHQUFrQyxLQUFsQztBQUNBLFdBQU9FLElBQVA7QUFDRCxHOzt5QkFFRFEsWSwyQkFBZTtBQUNiLFFBQU1KLFNBQVMsS0FBS04sMEJBQXBCO0FBQ0EsU0FBS0EsMEJBQUwsR0FBa0MsSUFBbEM7O0FBRUEsUUFBSUUsT0FBTyxLQUFLSCxhQUFoQjtBQUNBLFFBQUksQ0FBQ08sTUFBRCxJQUFXLEtBQUtILEtBQUwsQ0FBV0QsSUFBWCxDQUFYLElBQStCLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQUFuQyxFQUF1RCxPQUFPQSxJQUFQOztBQUV2RCxPQUFHO0FBQ0QsVUFBSUEsU0FBUyxLQUFLUCxJQUFsQixFQUF3QixPQUFPLElBQVA7O0FBRXhCLFVBQUlPLEtBQUtTLGVBQVQsRUFBMEI7QUFDeEJULGVBQU9BLEtBQUtTLGVBQVo7QUFDQSxlQUFPVCxLQUFLVSxTQUFaO0FBQXVCVixpQkFBT0EsS0FBS1UsU0FBWjtBQUF2QixTQUNBO0FBQ0Q7O0FBRURWLGFBQU9BLEtBQUtPLFVBQVo7QUFDRCxLQVZELFFBVVEsQ0FBQyxLQUFLTixLQUFMLENBQVdELElBQVgsQ0FBRCxJQUFxQixDQUFDLEtBQUtELE9BQUwsQ0FBYUMsSUFBYixDQVY5Qjs7QUFZQSxTQUFLSCxhQUFMLEdBQXFCRyxJQUFyQjtBQUNBLFNBQUtGLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0EsV0FBT0UsSUFBUDtBQUNELEc7O3lCQUVEVyxRLHVCQUFXO0FBQ1QsV0FBTyx1QkFBUDtBQUNELEciLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjcmVhdGVOb2RlSXRlcmF0b3JcblxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdyA9IDB4RkZGRkZGRkYsIGZpbHRlciA9IG51bGwpIHtcbiAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyKVxufVxuXG5cbmNsYXNzIE5vZGVJdGVyYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcikge1xuICAgIHRoaXMucm9vdCA9IHJvb3RcbiAgICB0aGlzLndoYXRUb1Nob3cgPSB3aGF0VG9TaG93XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcbiAgICB0aGlzLnJlZmVyZW5jZU5vZGUgPSByb290XG4gICAgdGhpcy5wb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSA9IHRydWVcbiAgICB0aGlzLl9maWx0ZXIgPSAobm9kZSkgPT4gZmlsdGVyID8gZmlsdGVyKG5vZGUpID09PSAxIDogdHJ1ZVxuICAgIHRoaXMuX3Nob3cgPSAobm9kZSkgPT4gd2hhdFRvU2hvdyA+PiBub2RlLm5vZGVUeXBlIC0gMSAmIDEgPT09IDFcbiAgfVxuXG4gIG5leHROb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcblxuICAgIGxldCBub2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlXG4gICAgaWYgKGJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG4gICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSBicmVha1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlXG4gICAgICB9IHdoaWxlIChub2RlKVxuXG4gICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZ1xuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gZmFsc2VcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJldmlvdXNOb2RlKCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuXG4gICAgbGV0IG5vZGUgPSB0aGlzLnJlZmVyZW5jZU5vZGVcbiAgICBpZiAoIWJlZm9yZSAmJiB0aGlzLl9zaG93KG5vZGUpICYmIHRoaXMuX2ZpbHRlcihub2RlKSkgcmV0dXJuIG5vZGVcblxuICAgIGRvIHtcbiAgICAgIGlmIChub2RlID09PSB0aGlzLnJvb3QpIHJldHVybiBudWxsXG5cbiAgICAgIGlmIChub2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSBub2RlID0gbm9kZS5sYXN0Q2hpbGRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZVxuICAgIH0gd2hpbGUoIXRoaXMuX3Nob3cobm9kZSkgfHwgIXRoaXMuX2ZpbHRlcihub2RlKSlcblxuICAgIHRoaXMucmVmZXJlbmNlTm9kZSA9IG5vZGVcbiAgICB0aGlzLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlID0gdHJ1ZVxuICAgIHJldHVybiBub2RlXG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgTm9kZUl0ZXJhdG9yXSdcbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = getPolyfill;\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nfunction getPolyfill() {\n try {\n var doc = typeof document === 'undefined' ? {} : document;\n var iter = (0, _builtin2['default'])(doc, 0xFFFFFFFF, null, false);\n if (iter.referenceNode === doc) return _builtin2['default'];\n return _adapter2['default'];\n } catch (_) {\n return _implementation2['default'];\n }\n} /*global document*/\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wb2x5ZmlsbC5qcyJdLCJuYW1lcyI6WyJnZXRQb2x5ZmlsbCIsImRvYyIsImRvY3VtZW50IiwiaXRlciIsInJlZmVyZW5jZU5vZGUiLCJfIl0sIm1hcHBpbmdzIjoiOzs7cUJBTXdCQSxXOztBQUx4Qjs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUdlLFNBQVNBLFdBQVQsR0FBdUI7QUFDcEMsTUFBSTtBQUNGLFFBQU1DLE1BQU0sT0FBT0MsUUFBUCxLQUFxQixXQUFyQixHQUFtQyxFQUFuQyxHQUF3Q0EsUUFBcEQ7QUFDQSxRQUFNQyxPQUFPLDBCQUFRRixHQUFSLEVBQWEsVUFBYixFQUF5QixJQUF6QixFQUErQixLQUEvQixDQUFiO0FBQ0EsUUFBSUUsS0FBS0MsYUFBTCxLQUF1QkgsR0FBM0IsRUFBZ0M7QUFDaEM7QUFDRCxHQUxELENBS0UsT0FBT0ksQ0FBUCxFQUFVO0FBQ1Y7QUFDRDtBQUNGLEMsQ0FmRCIsImZpbGUiOiJwb2x5ZmlsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBpbXBsZW1lbnRhdGlvbiBmcm9tICcuL2ltcGxlbWVudGF0aW9uJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICB0cnkge1xuICAgIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICAgIGNvbnN0IGl0ZXIgPSBidWlsdGluKGRvYywgMHhGRkZGRkZGRiwgbnVsbCwgZmFsc2UpXG4gICAgaWYgKGl0ZXIucmVmZXJlbmNlTm9kZSA9PT0gZG9jKSByZXR1cm4gYnVpbHRpblxuICAgIHJldHVybiBhZGFwdGVyXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb25cbiAgfVxufVxuIl19","'use strict';\n\nexports.__esModule = true;\nexports['default'] = shim;\n\nvar _builtin = require('./builtin');\n\nvar _builtin2 = _interopRequireDefault(_builtin);\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n/*global document*/\nfunction shim() {\n var doc = typeof document === 'undefined' ? {} : document;\n var polyfill = (0, _polyfill2['default'])();\n if (polyfill !== _builtin2['default']) doc.createNodeIterator = polyfill;\n return polyfill;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGltLmpzIl0sIm5hbWVzIjpbInNoaW0iLCJkb2MiLCJkb2N1bWVudCIsInBvbHlmaWxsIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIl0sIm1hcHBpbmdzIjoiOzs7cUJBS3dCQSxJOztBQUp4Qjs7OztBQUNBOzs7Ozs7QUFGQTtBQUtlLFNBQVNBLElBQVQsR0FBZ0I7QUFDN0IsTUFBTUMsTUFBTSxPQUFPQyxRQUFQLEtBQXFCLFdBQXJCLEdBQW1DLEVBQW5DLEdBQXdDQSxRQUFwRDtBQUNBLE1BQU1DLFdBQVcsNEJBQWpCO0FBQ0EsTUFBSUEsaUNBQUosRUFBMEJGLElBQUlHLGtCQUFKLEdBQXlCRCxRQUF6QjtBQUMxQixTQUFPQSxRQUFQO0FBQ0QiLCJmaWxlIjoic2hpbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qZ2xvYmFsIGRvY3VtZW50Ki9cbmltcG9ydCBidWlsdGluIGZyb20gJy4vYnVpbHRpbidcbmltcG9ydCBnZXRQb2x5ZmlsbCBmcm9tICcuL3BvbHlmaWxsJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoaW0oKSB7XG4gIGNvbnN0IGRvYyA9IHR5cGVvZihkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnID8ge30gOiBkb2N1bWVudFxuICBjb25zdCBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKClcbiAgaWYgKHBvbHlmaWxsICE9PSBidWlsdGluKSBkb2MuY3JlYXRlTm9kZUl0ZXJhdG9yID0gcG9seWZpbGxcbiAgcmV0dXJuIHBvbHlmaWxsXG59XG4iXX0=","'use strict';\n\nexports.__esModule = true;\n\nvar _polyfill = require('./polyfill');\n\nvar _polyfill2 = _interopRequireDefault(_polyfill);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nvar _shim = require('./shim');\n\nvar _shim2 = _interopRequireDefault(_shim);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar polyfill = (0, _polyfill2['default'])();\npolyfill.implementation = _implementation2['default'];\npolyfill.shim = _shim2['default'];\n\nexports['default'] = polyfill;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwb2x5ZmlsbCIsImltcGxlbWVudGF0aW9uIiwic2hpbSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsV0FBVyw0QkFBakI7QUFDQUEsU0FBU0MsY0FBVDtBQUNBRCxTQUFTRSxJQUFUOztxQkFFZUYsUSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0UG9seWZpbGwgfSBmcm9tICcuL3BvbHlmaWxsJ1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBpbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHNoaW0gfSBmcm9tICcuL3NoaW0nXG5cbmNvbnN0IHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKVxucG9seWZpbGwuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvblxucG9seWZpbGwuc2hpbSA9IHNoaW1cblxuZXhwb3J0IGRlZmF1bHQgcG9seWZpbGxcbiJdfQ==","module.exports = require('./lib/polyfill')['default'];\n","module.exports = require('./lib/implementation')['default'];\n","module.exports = require('./lib/shim')['default'];\n","module.exports = require('./lib')['default'];\nmodule.exports.getPolyfill = require('./polyfill');\nmodule.exports.implementation = require('./implementation');\nmodule.exports.shim = require('./shim');\n","module.exports = parents\n\nfunction parents(node, filter) {\n var out = []\n\n filter = filter || noop\n\n do {\n out.push(node)\n node = node.parentNode\n } while(node && node.tagName && filter(node))\n\n return out.slice(1)\n}\n\nfunction noop(n) {\n return true\n}\n","/*!\n * index-of <https://github.com/jonschlinkert/index-of>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function indexOf(arr, ele, start) {\n start = start || 0;\n var idx = -1;\n\n if (arr == null) return idx;\n var len = arr.length;\n var i = start < 0\n ? (len + start)\n : start;\n\n if (i >= arr.length) {\n return -1;\n }\n\n while (i < len) {\n if (arr[i] === ele) {\n return i;\n }\n i++;\n }\n\n return -1;\n};\n","'use strict';\n\nexports.__esModule = true;\nexports['default'] = seek;\n\nvar _ancestors = require('ancestors');\n\nvar _ancestors2 = _interopRequireDefault(_ancestors);\n\nvar _indexOf = require('index-of');\n\nvar _indexOf2 = _interopRequireDefault(_indexOf);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be a number or a Text Node.';\n\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n throw new Error(E_SHOW);\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isNumber(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n var backward = function backward() {\n return node != where || !iter.pointerBeforeReferenceNode;\n };\n predicates = { forward: forward, backward: backward };\n } else {\n throw new Error(E_WHERE);\n }\n\n while (predicates.forward() && (node = iter.nextNode()) !== null) {\n count += node.nodeValue.length;\n }\n\n while (predicates.backward() && (node = iter.previousNode()) !== null) {\n count -= node.nodeValue.length;\n }\n\n return count;\n}\n\nfunction isNumber(n) {\n return !isNaN(parseInt(n)) && isFinite(n);\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n if (ref === node) return false;\n\n var common = null;\n var left = [ref].concat((0, _ancestors2['default'])(ref)).reverse();\n var right = [node].concat((0, _ancestors2['default'])(node)).reverse();\n\n while (left[0] === right[0]) {\n common = left.shift();\n right.shift();\n }\n\n left = left[0];\n right = right[0];\n\n var l = (0, _indexOf2['default'])(common.childNodes, left);\n var r = (0, _indexOf2['default'])(common.childNodes, right);\n\n return l > r;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJzZWVrIiwiRV9TSE9XIiwiRV9XSEVSRSIsIlNIT1dfVEVYVCIsIlRFWFRfTk9ERSIsIml0ZXIiLCJ3aGVyZSIsIndoYXRUb1Nob3ciLCJFcnJvciIsImNvdW50Iiwibm9kZSIsInJlZmVyZW5jZU5vZGUiLCJwcmVkaWNhdGVzIiwiaXNOdW1iZXIiLCJmb3J3YXJkIiwiYmFja3dhcmQiLCJpc1RleHQiLCJiZWZvcmUiLCJwb2ludGVyQmVmb3JlUmVmZXJlbmNlTm9kZSIsIm5leHROb2RlIiwibm9kZVZhbHVlIiwibGVuZ3RoIiwicHJldmlvdXNOb2RlIiwibiIsImlzTmFOIiwicGFyc2VJbnQiLCJpc0Zpbml0ZSIsIm5vZGVUeXBlIiwicmVmIiwiY29tbW9uIiwibGVmdCIsImNvbmNhdCIsInJldmVyc2UiLCJyaWdodCIsInNoaWZ0IiwibCIsImNoaWxkTm9kZXMiLCJyIl0sIm1hcHBpbmdzIjoiOzs7cUJBVXdCQSxJOztBQVZ4Qjs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNQyxTQUFTLDBEQUFmO0FBQ0EsSUFBTUMsVUFBVSxxREFBaEI7O0FBRUEsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLFlBQVksQ0FBbEI7O0FBR2UsU0FBU0osSUFBVCxDQUFjSyxJQUFkLEVBQW9CQyxLQUFwQixFQUEyQjtBQUN4QyxNQUFJRCxLQUFLRSxVQUFMLEtBQW9CSixTQUF4QixFQUFtQztBQUNqQyxVQUFNLElBQUlLLEtBQUosQ0FBVVAsTUFBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSVEsUUFBUSxDQUFaO0FBQ0EsTUFBSUMsT0FBT0wsS0FBS00sYUFBaEI7QUFDQSxNQUFJQyxhQUFhLElBQWpCOztBQUVBLE1BQUlDLFNBQVNQLEtBQVQsQ0FBSixFQUFxQjtBQUNuQk0saUJBQWE7QUFDWEUsZUFBUztBQUFBLGVBQU1MLFFBQVFILEtBQWQ7QUFBQSxPQURFO0FBRVhTLGdCQUFVO0FBQUEsZUFBTU4sUUFBUUgsS0FBZDtBQUFBO0FBRkMsS0FBYjtBQUlELEdBTEQsTUFLTyxJQUFJVSxPQUFPVixLQUFQLENBQUosRUFBbUI7QUFDeEIsUUFBSVEsVUFBVUcsT0FBT1AsSUFBUCxFQUFhSixLQUFiLElBQXNCO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FBdEIsR0FBb0M7QUFBQSxhQUFNSSxTQUFTSixLQUFmO0FBQUEsS0FBbEQ7QUFDQSxRQUFJUyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxhQUFNTCxRQUFRSixLQUFSLElBQWlCLENBQUNELEtBQUthLDBCQUE3QjtBQUFBLEtBQWY7QUFDQU4saUJBQWEsRUFBQ0UsZ0JBQUQsRUFBVUMsa0JBQVYsRUFBYjtBQUNELEdBSk0sTUFJQTtBQUNMLFVBQU0sSUFBSVAsS0FBSixDQUFVTixPQUFWLENBQU47QUFDRDs7QUFFRCxTQUFPVSxXQUFXRSxPQUFYLE1BQXdCLENBQUNKLE9BQU9MLEtBQUtjLFFBQUwsRUFBUixNQUE2QixJQUE1RCxFQUFrRTtBQUNoRVYsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9ULFdBQVdHLFFBQVgsTUFBeUIsQ0FBQ0wsT0FBT0wsS0FBS2lCLFlBQUwsRUFBUixNQUFpQyxJQUFqRSxFQUF1RTtBQUNyRWIsYUFBU0MsS0FBS1UsU0FBTCxDQUFlQyxNQUF4QjtBQUNEOztBQUVELFNBQU9aLEtBQVA7QUFDRDs7QUFHRCxTQUFTSSxRQUFULENBQWtCVSxDQUFsQixFQUFxQjtBQUNuQixTQUFPLENBQUNDLE1BQU1DLFNBQVNGLENBQVQsQ0FBTixDQUFELElBQXVCRyxTQUFTSCxDQUFULENBQTlCO0FBQ0Q7O0FBR0QsU0FBU1AsTUFBVCxDQUFnQk4sSUFBaEIsRUFBc0I7QUFDcEIsU0FBT0EsS0FBS2lCLFFBQUwsS0FBa0J2QixTQUF6QjtBQUNEOztBQUdELFNBQVNhLE1BQVQsQ0FBZ0JXLEdBQWhCLEVBQXFCbEIsSUFBckIsRUFBMkI7QUFDekIsTUFBSWtCLFFBQVFsQixJQUFaLEVBQWtCLE9BQU8sS0FBUDs7QUFFbEIsTUFBSW1CLFNBQVMsSUFBYjtBQUNBLE1BQUlDLE9BQU8sQ0FBQ0YsR0FBRCxFQUFNRyxNQUFOLENBQWEsNEJBQVVILEdBQVYsQ0FBYixFQUE2QkksT0FBN0IsRUFBWDtBQUNBLE1BQUlDLFFBQVEsQ0FBQ3ZCLElBQUQsRUFBT3FCLE1BQVAsQ0FBYyw0QkFBVXJCLElBQVYsQ0FBZCxFQUErQnNCLE9BQS9CLEVBQVo7O0FBRUEsU0FBT0YsS0FBSyxDQUFMLE1BQVlHLE1BQU0sQ0FBTixDQUFuQixFQUE2QjtBQUMzQkosYUFBU0MsS0FBS0ksS0FBTCxFQUFUO0FBQ0FELFVBQU1DLEtBQU47QUFDRDs7QUFFREosU0FBT0EsS0FBSyxDQUFMLENBQVA7QUFDQUcsVUFBUUEsTUFBTSxDQUFOLENBQVI7O0FBRUEsTUFBSUUsSUFBSSwwQkFBUU4sT0FBT08sVUFBZixFQUEyQk4sSUFBM0IsQ0FBUjtBQUNBLE1BQUlPLElBQUksMEJBQVFSLE9BQU9PLFVBQWYsRUFBMkJILEtBQTNCLENBQVI7O0FBRUEsU0FBT0UsSUFBSUUsQ0FBWDtBQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFuY2VzdG9ycyBmcm9tICdhbmNlc3RvcnMnXG5pbXBvcnQgaW5kZXhPZiBmcm9tICdpbmRleC1vZidcblxuY29uc3QgRV9TSE9XID0gJ0FyZ3VtZW50IDEgb2Ygc2VlayBtdXN0IHVzZSBmaWx0ZXIgTm9kZUZpbHRlci5TSE9XX1RFWFQuJ1xuY29uc3QgRV9XSEVSRSA9ICdBcmd1bWVudCAyIG9mIHNlZWsgbXVzdCBiZSBhIG51bWJlciBvciBhIFRleHQgTm9kZS4nXG5cbmNvbnN0IFNIT1dfVEVYVCA9IDRcbmNvbnN0IFRFWFRfTk9ERSA9IDNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWVrKGl0ZXIsIHdoZXJlKSB7XG4gIGlmIChpdGVyLndoYXRUb1Nob3cgIT09IFNIT1dfVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1NIT1cpXG4gIH1cblxuICBsZXQgY291bnQgPSAwXG4gIGxldCBub2RlID0gaXRlci5yZWZlcmVuY2VOb2RlXG4gIGxldCBwcmVkaWNhdGVzID0gbnVsbFxuXG4gIGlmIChpc051bWJlcih3aGVyZSkpIHtcbiAgICBwcmVkaWNhdGVzID0ge1xuICAgICAgZm9yd2FyZDogKCkgPT4gY291bnQgPCB3aGVyZSxcbiAgICAgIGJhY2t3YXJkOiAoKSA9PiBjb3VudCA+IHdoZXJlLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1RleHQod2hlcmUpKSB7XG4gICAgbGV0IGZvcndhcmQgPSBiZWZvcmUobm9kZSwgd2hlcmUpID8gKCkgPT4gZmFsc2UgOiAoKSA9PiBub2RlICE9PSB3aGVyZVxuICAgIGxldCBiYWNrd2FyZCA9ICgpID0+IG5vZGUgIT0gd2hlcmUgfHwgIWl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGVcbiAgICBwcmVkaWNhdGVzID0ge2ZvcndhcmQsIGJhY2t3YXJkfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihFX1dIRVJFKVxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuZm9yd2FyZCgpICYmIChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCkge1xuICAgIGNvdW50ICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aFxuICB9XG5cbiAgd2hpbGUgKHByZWRpY2F0ZXMuYmFja3dhcmQoKSAmJiAobm9kZSA9IGl0ZXIucHJldmlvdXNOb2RlKCkpICE9PSBudWxsKSB7XG4gICAgY291bnQgLT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoXG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuXG5mdW5jdGlvbiBpc051bWJlcihuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobikpICYmIGlzRmluaXRlKG4pXG59XG5cblxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZShyZWYsIG5vZGUpIHtcbiAgaWYgKHJlZiA9PT0gbm9kZSkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNvbW1vbiA9IG51bGxcbiAgbGV0IGxlZnQgPSBbcmVmXS5jb25jYXQoYW5jZXN0b3JzKHJlZikpLnJldmVyc2UoKVxuICBsZXQgcmlnaHQgPSBbbm9kZV0uY29uY2F0KGFuY2VzdG9ycyhub2RlKSkucmV2ZXJzZSgpXG5cbiAgd2hpbGUgKGxlZnRbMF0gPT09IHJpZ2h0WzBdKSB7XG4gICAgY29tbW9uID0gbGVmdC5zaGlmdCgpXG4gICAgcmlnaHQuc2hpZnQoKVxuICB9XG5cbiAgbGVmdCA9IGxlZnRbMF1cbiAgcmlnaHQgPSByaWdodFswXVxuXG4gIGxldCBsID0gaW5kZXhPZihjb21tb24uY2hpbGROb2RlcywgbGVmdClcbiAgbGV0IHIgPSBpbmRleE9mKGNvbW1vbi5jaGlsZE5vZGVzLCByaWdodClcblxuICByZXR1cm4gbCA+IHJcbn1cbiJdfQ==","module.exports = require('./lib')['default'];\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rangeToString;\n/* global Node */\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n } while (node);\n\n /* istanbul ignore next */\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true /* skip children */);\n }\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true /* skip children */);\n }\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZS10by1zdHJpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBcUR3QixhO0FBckR4Qjs7QUFFQTs7O0FBR0EsU0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdCLFlBQXhCLEVBQXNDO0FBQ3BDLE1BQUksQ0FBQyxZQUFELElBQWlCLEtBQUssVUFBMUIsRUFBc0M7QUFDcEMsV0FBTyxLQUFLLFVBQVo7QUFDRDs7QUFFRCxLQUFHO0FBQ0QsUUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsYUFBTyxLQUFLLFdBQVo7QUFDRDtBQUNELFdBQU8sS0FBSyxVQUFaO0FBQ0QsR0FMRCxRQUtTLElBTFQ7O0FBT0E7QUFDQSxTQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEI7QUFDeEIsTUFBSSxNQUFNLGNBQU4sQ0FBcUIsUUFBckIsS0FBa0MsS0FBSyxZQUEzQyxFQUF5RDtBQUN2RCxRQUFNLE9BQU8sTUFBTSxjQUFOLENBQXFCLFVBQXJCLENBQWdDLE1BQU0sV0FBdEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sY0FBZixFQUErQixJQUEvQixDQUFvQyxtQkFBcEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxNQUFNLGNBQWI7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsS0FBeEIsRUFBK0I7QUFDN0IsTUFBSSxNQUFNLFlBQU4sQ0FBbUIsUUFBbkIsS0FBZ0MsS0FBSyxZQUF6QyxFQUF1RDtBQUNyRCxRQUFNLE9BQU8sTUFBTSxZQUFOLENBQW1CLFVBQW5CLENBQThCLE1BQU0sU0FBcEMsQ0FBYjtBQUNBLFdBQU8sUUFBUSxTQUFTLE1BQU0sWUFBZixFQUE2QixJQUE3QixDQUFrQyxtQkFBbEMsQ0FBZjtBQUNEO0FBQ0QsU0FBTyxTQUFTLE1BQU0sWUFBZixDQUFQO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixLQUE1QixFQUFtQyxFQUFuQyxFQUF1QztBQUNyQyxNQUFJLE9BQU8sVUFBVSxLQUFWLENBQVg7QUFDQSxNQUFNLFVBQVUsZUFBZSxLQUFmLENBQWhCO0FBQ0EsU0FBTyxTQUFTLE9BQWhCLEVBQXlCO0FBQ3ZCLE9BQUcsSUFBSDtBQUNBLFdBQU8sU0FBUyxJQUFULENBQVA7QUFDRDtBQUNGOztBQUVEOzs7Ozs7O0FBT2UsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCO0FBQzNDO0FBQ0E7QUFDQSxNQUFJLE9BQU8sRUFBWDtBQUNBLHFCQUFtQixLQUFuQixFQUEwQixVQUFDLElBQUQsRUFBVTtBQUNsQyxRQUFJLEtBQUssUUFBTCxLQUFrQixLQUFLLFNBQTNCLEVBQXNDO0FBQ3BDO0FBQ0Q7QUFDRCxRQUFNLFFBQVEsU0FBUyxNQUFNLGNBQWYsR0FBZ0MsTUFBTSxXQUF0QyxHQUFvRCxDQUFsRTtBQUNBLFFBQU0sTUFBTSxTQUFTLE1BQU0sWUFBZixHQUE4QixNQUFNLFNBQXBDLEdBQWdELEtBQUssV0FBTCxDQUFpQixNQUE3RTtBQUNBLFlBQVEsS0FBSyxXQUFMLENBQWlCLEtBQWpCLENBQXVCLEtBQXZCLEVBQThCLEdBQTlCLENBQVI7QUFDRCxHQVBEO0FBUUEsU0FBTyxJQUFQO0FBQ0QiLCJmaWxlIjoicmFuZ2UtdG8tc3RyaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIE5vZGUgKi9cblxuLyoqXG4gKiBSZXR1cm4gdGhlIG5leHQgbm9kZSBhZnRlciBgbm9kZWAgaW4gYSB0cmVlIG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIG5leHROb2RlKG5vZGUsIHNraXBDaGlsZHJlbikge1xuICBpZiAoIXNraXBDaGlsZHJlbiAmJiBub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkXG4gIH1cblxuICBkbyB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nXG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGVcbiAgfSB3aGlsZSAobm9kZSlcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiBmaXJzdE5vZGUocmFuZ2UpIHtcbiAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnN0IG5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLnN0YXJ0T2Zmc2V0XVxuICAgIHJldHVybiBub2RlIHx8IG5leHROb2RlKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0cnVlIC8qIHNraXAgY2hpbGRyZW4gKi8pXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnN0YXJ0Q29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGZpcnN0Tm9kZUFmdGVyKHJhbmdlKSB7XG4gIGlmIChyYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgY29uc3Qgbm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lci5jaGlsZE5vZGVzW3JhbmdlLmVuZE9mZnNldF1cbiAgICByZXR1cm4gbm9kZSB8fCBuZXh0Tm9kZShyYW5nZS5lbmRDb250YWluZXIsIHRydWUgLyogc2tpcCBjaGlsZHJlbiAqLylcbiAgfVxuICByZXR1cm4gbmV4dE5vZGUocmFuZ2UuZW5kQ29udGFpbmVyKVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIGNiKSB7XG4gIGxldCBub2RlID0gZmlyc3ROb2RlKHJhbmdlKVxuICBjb25zdCBwYXN0RW5kID0gZmlyc3ROb2RlQWZ0ZXIocmFuZ2UpXG4gIHdoaWxlIChub2RlICE9PSBwYXN0RW5kKSB7XG4gICAgY2Iobm9kZSlcbiAgICBub2RlID0gbmV4dE5vZGUobm9kZSlcbiAgfVxufVxuXG4vKipcbiAqIEEgcG9ueWZpbGwgZm9yIFJhbmdlLnRvU3RyaW5nKCkuXG4gKiBTcGVjOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1yYW5nZS1zdHJpbmdpZmllclxuICpcbiAqIFdvcmtzIGFyb3VuZCB0aGUgYnVnZ3kgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvbiBpbiBJRSBhbmQgRWRnZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGlsZ292aS9kb20tYW5jaG9yLXRleHQtcG9zaXRpb24vaXNzdWVzLzRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmFuZ2VUb1N0cmluZyhyYW5nZSkge1xuICAvLyBUaGlzIGlzIGEgZmFpcmx5IGRpcmVjdCB0cmFuc2xhdGlvbiBvZiB0aGUgUmFuZ2UudG9TdHJpbmcoKSBpbXBsZW1lbnRhdGlvblxuICAvLyBpbiBCbGluay5cbiAgbGV0IHRleHQgPSAnJ1xuICBmb3JFYWNoTm9kZUluUmFuZ2UocmFuZ2UsIChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBub2RlID09PSByYW5nZS5zdGFydENvbnRhaW5lciA/IHJhbmdlLnN0YXJ0T2Zmc2V0IDogMFxuICAgIGNvbnN0IGVuZCA9IG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lciA/IHJhbmdlLmVuZE9mZnNldCA6IG5vZGUudGV4dENvbnRlbnQubGVuZ3RoXG4gICAgdGV4dCArPSBub2RlLnRleHRDb250ZW50LnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH0pXG4gIHJldHVybiB0ZXh0XG59XG5cbiJdfQ==","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domNodeIterator = require('dom-node-iterator');\n\nvar _domNodeIterator2 = _interopRequireDefault(_domNodeIterator);\n\nvar _domSeek = require('dom-seek');\n\nvar _domSeek2 = _interopRequireDefault(_domSeek);\n\nvar _rangeToString = require('./range-to-string');\n\nvar _rangeToString2 = _interopRequireDefault(_rangeToString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n\n var start = (0, _rangeToString2.default)(prefix).length;\n var end = start + (0, _rangeToString2.default)(range).length;\n\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = (0, _domNodeIterator2.default)(root, SHOW_TEXT);\n\n var start = selector.start || 0;\n var end = selector.end || start;\n var count = (0, _domSeek2.default)(iter, start);\n var remainder = start - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setStart(iter.referenceNode, remainder);\n } else {\n range.setStart(iter.nextNode(), remainder);\n iter.previousNode();\n }\n\n var length = end - start + remainder;\n count = (0, _domSeek2.default)(iter, length);\n remainder = length - count;\n\n if (iter.pointerBeforeReferenceNode) {\n range.setEnd(iter.referenceNode, remainder);\n } else {\n range.setEnd(iter.nextNode(), remainder);\n }\n\n return range;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztRQU9nQixTLEdBQUEsUztRQTJCQSxPLEdBQUEsTzs7QUFsQ2hCOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxZQUFZLENBQWxCOztBQUVPLFNBQVMsU0FBVCxDQUFtQixJQUFuQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxNQUFJLFNBQVMsU0FBYixFQUF3QjtBQUN0QixVQUFNLElBQUksS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUksVUFBVSxTQUFkLEVBQXlCO0FBQ3ZCLFVBQU0sSUFBSSxLQUFKLENBQVUsb0NBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxTQUFTLFNBQVMsV0FBVCxFQUFiOztBQUVBLE1BQUksWUFBWSxNQUFNLGNBQXRCO0FBQ0EsTUFBSSxjQUFjLE1BQU0sV0FBeEI7O0FBRUEsU0FBTyxRQUFQLENBQWdCLElBQWhCLEVBQXNCLENBQXRCO0FBQ0EsU0FBTyxNQUFQLENBQWMsU0FBZCxFQUF5QixXQUF6Qjs7QUFFQSxNQUFJLFFBQVEsNkJBQWMsTUFBZCxFQUFzQixNQUFsQztBQUNBLE1BQUksTUFBTSxRQUFRLDZCQUFjLEtBQWQsRUFBcUIsTUFBdkM7O0FBRUEsU0FBTztBQUNMLFdBQU8sS0FERjtBQUVMLFNBQUs7QUFGQSxHQUFQO0FBSUQ7O0FBR00sU0FBUyxPQUFULENBQWlCLElBQWpCLEVBQXNDO0FBQUEsTUFBZixRQUFlLHlEQUFKLEVBQUk7O0FBQzNDLE1BQUksU0FBUyxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSSxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEOztBQUVELE1BQUksV0FBVyxLQUFLLGFBQXBCO0FBQ0EsTUFBSSxRQUFRLFNBQVMsV0FBVCxFQUFaO0FBQ0EsTUFBSSxPQUFPLCtCQUFtQixJQUFuQixFQUF5QixTQUF6QixDQUFYOztBQUVBLE1BQUksUUFBUSxTQUFTLEtBQVQsSUFBa0IsQ0FBOUI7QUFDQSxNQUFJLE1BQU0sU0FBUyxHQUFULElBQWdCLEtBQTFCO0FBQ0EsTUFBSSxRQUFRLHVCQUFLLElBQUwsRUFBVyxLQUFYLENBQVo7QUFDQSxNQUFJLFlBQVksUUFBUSxLQUF4Qjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxRQUFOLENBQWUsS0FBSyxhQUFwQixFQUFtQyxTQUFuQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sUUFBTixDQUFlLEtBQUssUUFBTCxFQUFmLEVBQWdDLFNBQWhDO0FBQ0EsU0FBSyxZQUFMO0FBQ0Q7O0FBRUQsTUFBSSxTQUFVLE1BQU0sS0FBUCxHQUFnQixTQUE3QjtBQUNBLFVBQVEsdUJBQUssSUFBTCxFQUFXLE1BQVgsQ0FBUjtBQUNBLGNBQVksU0FBUyxLQUFyQjs7QUFFQSxNQUFJLEtBQUssMEJBQVQsRUFBcUM7QUFDbkMsVUFBTSxNQUFOLENBQWEsS0FBSyxhQUFsQixFQUFpQyxTQUFqQztBQUNELEdBRkQsTUFFTztBQUNMLFVBQU0sTUFBTixDQUFhLEtBQUssUUFBTCxFQUFiLEVBQThCLFNBQTlCO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3JlYXRlTm9kZUl0ZXJhdG9yIGZyb20gJ2RvbS1ub2RlLWl0ZXJhdG9yJ1xuaW1wb3J0IHNlZWsgZnJvbSAnZG9tLXNlZWsnXG5cbmltcG9ydCByYW5nZVRvU3RyaW5nIGZyb20gJy4vcmFuZ2UtdG8tc3RyaW5nJ1xuXG5jb25zdCBTSE9XX1RFWFQgPSA0XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IGRvY3VtZW50ID0gcm9vdC5vd25lckRvY3VtZW50XG4gIGxldCBwcmVmaXggPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG5cbiAgbGV0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gIGxldCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0XG5cbiAgcHJlZml4LnNldFN0YXJ0KHJvb3QsIDApXG4gIHByZWZpeC5zZXRFbmQoc3RhcnROb2RlLCBzdGFydE9mZnNldClcblxuICBsZXQgc3RhcnQgPSByYW5nZVRvU3RyaW5nKHByZWZpeCkubGVuZ3RoXG4gIGxldCBlbmQgPSBzdGFydCArIHJhbmdlVG9TdHJpbmcocmFuZ2UpLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGVuZDogZW5kLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFuZ2Uocm9vdCwgc2VsZWN0b3IgPSB7fSkge1xuICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJvb3RcIicpXG4gIH1cblxuICBsZXQgZG9jdW1lbnQgPSByb290Lm93bmVyRG9jdW1lbnRcbiAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICBsZXQgaXRlciA9IGNyZWF0ZU5vZGVJdGVyYXRvcihyb290LCBTSE9XX1RFWFQpXG5cbiAgbGV0IHN0YXJ0ID0gc2VsZWN0b3Iuc3RhcnQgfHwgMFxuICBsZXQgZW5kID0gc2VsZWN0b3IuZW5kIHx8IHN0YXJ0XG4gIGxldCBjb3VudCA9IHNlZWsoaXRlciwgc3RhcnQpXG4gIGxldCByZW1haW5kZXIgPSBzdGFydCAtIGNvdW50XG5cbiAgaWYgKGl0ZXIucG9pbnRlckJlZm9yZVJlZmVyZW5jZU5vZGUpIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLnJlZmVyZW5jZU5vZGUsIHJlbWFpbmRlcilcbiAgfSBlbHNlIHtcbiAgICByYW5nZS5zZXRTdGFydChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgICBpdGVyLnByZXZpb3VzTm9kZSgpXG4gIH1cblxuICBsZXQgbGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSArIHJlbWFpbmRlclxuICBjb3VudCA9IHNlZWsoaXRlciwgbGVuZ3RoKVxuICByZW1haW5kZXIgPSBsZW5ndGggLSBjb3VudFxuXG4gIGlmIChpdGVyLnBvaW50ZXJCZWZvcmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgcmFuZ2Uuc2V0RW5kKGl0ZXIucmVmZXJlbmNlTm9kZSwgcmVtYWluZGVyKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlLnNldEVuZChpdGVyLm5leHROb2RlKCksIHJlbWFpbmRlcilcbiAgfVxuXG4gIHJldHVybiByYW5nZVxufVxuIl19","module.exports = require('./lib')\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.fromTextPosition = fromTextPosition;\nexports.toRange = toRange;\nexports.toTextPosition = toTextPosition;\n\nvar _diffMatchPatch = require('diff-match-patch');\n\nvar _diffMatchPatch2 = _interopRequireDefault(_diffMatchPatch);\n\nvar _domAnchorTextPosition = require('dom-anchor-text-position');\n\nvar textPosition = _interopRequireWildcard(_domAnchorTextPosition);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The DiffMatchPatch bitap has a hard 32-character pattern length limit.\nvar SLICE_LENGTH = 32;\nvar SLICE_RE = new RegExp('(.|[\\r\\n]){1,' + String(SLICE_LENGTH) + '}', 'g');\nvar CONTEXT_LENGTH = SLICE_LENGTH;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var position = textPosition.fromRange(root, range);\n return fromTextPosition(root, position);\n}\n\nfunction fromTextPosition(root, selector) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var start = selector.start;\n\n if (start === undefined) {\n throw new Error('selector missing required property \"start\"');\n }\n if (start < 0) {\n throw new Error('property \"start\" must be a non-negative integer');\n }\n\n var end = selector.end;\n\n if (end === undefined) {\n throw new Error('selector missing required property \"end\"');\n }\n if (end < 0) {\n throw new Error('property \"end\" must be a non-negative integer');\n }\n\n var exact = root.textContent.substr(start, end - start);\n\n var prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n var prefix = root.textContent.substr(prefixStart, start - prefixStart);\n\n var suffixEnd = Math.min(root.textContent.length, end + CONTEXT_LENGTH);\n var suffix = root.textContent.substr(end, suffixEnd - end);\n\n return { exact: exact, prefix: prefix, suffix: suffix };\n}\n\nfunction toRange(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var position = toTextPosition(root, selector, options);\n if (position === null) {\n return null;\n } else {\n return textPosition.toRange(root, position);\n }\n}\n\nfunction toTextPosition(root, selector) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n if (selector === undefined) {\n throw new Error('missing required parameter \"selector\"');\n }\n\n var exact = selector.exact;\n\n if (exact === undefined) {\n throw new Error('selector missing required property \"exact\"');\n }\n\n var prefix = selector.prefix,\n suffix = selector.suffix;\n var hint = options.hint;\n\n var dmp = new _diffMatchPatch2.default();\n\n dmp.Match_Distance = root.textContent.length * 2;\n\n // Work around a hard limit of the DiffMatchPatch bitap implementation.\n // The search pattern must be no more than SLICE_LENGTH characters.\n var slices = exact.match(SLICE_RE);\n var loc = hint === undefined ? root.textContent.length / 2 | 0 : hint;\n var start = Number.POSITIVE_INFINITY;\n var end = Number.NEGATIVE_INFINITY;\n var result = -1;\n var havePrefix = prefix !== undefined;\n var haveSuffix = suffix !== undefined;\n var foundPrefix = false;\n\n // If the prefix is known then search for that first.\n if (havePrefix) {\n result = dmp.match_main(root.textContent, prefix, loc);\n if (result > -1) {\n loc = result + prefix.length;\n foundPrefix = true;\n }\n }\n\n // If we have a suffix, and the prefix wasn't found, then search for it.\n if (haveSuffix && !foundPrefix) {\n result = dmp.match_main(root.textContent, suffix, loc + exact.length);\n if (result > -1) {\n loc = result - exact.length;\n }\n }\n\n // Search for the first slice.\n var firstSlice = slices.shift();\n result = dmp.match_main(root.textContent, firstSlice, loc);\n if (result > -1) {\n start = result;\n loc = end = start + firstSlice.length;\n } else {\n return null;\n }\n\n // Create a fold function that will reduce slices to positional extents.\n var foldSlices = function foldSlices(acc, slice) {\n if (!acc) {\n // A search for an earlier slice of the pattern failed to match.\n return null;\n }\n\n var result = dmp.match_main(root.textContent, slice, acc.loc);\n if (result === -1) {\n return null;\n }\n\n // The next slice should follow this one closely.\n acc.loc = result + slice.length;\n\n // Expand the start and end to a quote that includes all the slices.\n acc.start = Math.min(acc.start, result);\n acc.end = Math.max(acc.end, result + slice.length);\n\n return acc;\n };\n\n // Use the fold function to establish the full quote extents.\n // Expect the slices to be close to one another.\n // This distance is deliberately generous for now.\n dmp.Match_Distance = 64;\n var acc = slices.reduce(foldSlices, { start: start, end: end, loc: loc });\n if (!acc) {\n return null;\n }\n\n return { start: acc.start, end: acc.end };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JD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ZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/ICgocm9vdC50ZXh0Q29udGVudC5sZW5ndGggLyAyKSB8IDApIDogaGludFxuICBsZXQgc3RhcnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgbGV0IGVuZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICBsZXQgcmVzdWx0ID0gLTFcbiAgbGV0IGhhdmVQcmVmaXggPSBwcmVmaXggIT09IHVuZGVmaW5lZFxuICBsZXQgaGF2ZVN1ZmZpeCA9IHN1ZmZpeCAhPT0gdW5kZWZpbmVkXG4gIGxldCBmb3VuZFByZWZpeCA9IGZhbHNlXG5cbiAgLy8gSWYgdGhlIHByZWZpeCBpcyBrbm93biB0aGVuIHNlYXJjaCBmb3IgdGhhdCBmaXJzdC5cbiAgaWYgKGhhdmVQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBwcmVmaXgsIGxvYylcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCArIHByZWZpeC5sZW5ndGhcbiAgICAgIGZvdW5kUHJlZml4ID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUgYSBzdWZmaXgsIGFuZCB0aGUgcHJlZml4IHdhc24ndCBmb3VuZCwgdGhlbiBzZWFyY2ggZm9yIGl0LlxuICBpZiAoaGF2ZVN1ZmZpeCAmJiAhZm91bmRQcmVmaXgpIHtcbiAgICByZXN1bHQgPSBkbXAubWF0Y2hfbWFpbihyb290LnRleHRDb250ZW50LCBzdWZmaXgsIGxvYyArIGV4YWN0Lmxlbmd0aClcbiAgICBpZiAocmVzdWx0ID4gLTEpIHtcbiAgICAgIGxvYyA9IHJlc3VsdCAtIGV4YWN0Lmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHNsaWNlLlxuICBsZXQgZmlyc3RTbGljZSA9IHNsaWNlcy5zaGlmdCgpXG4gIHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIGZpcnN0U2xpY2UsIGxvYylcbiAgaWYgKHJlc3VsdCA+IC0xKSB7XG4gICAgc3RhcnQgPSByZXN1bHRcbiAgICBsb2MgPSBlbmQgPSBzdGFydCArIGZpcnN0U2xpY2UubGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGZvbGQgZnVuY3Rpb24gdGhhdCB3aWxsIHJlZHVjZSBzbGljZXMgdG8gcG9zaXRpb25hbCBleHRlbnRzLlxuICBsZXQgZm9sZFNsaWNlcyA9IChhY2MsIHNsaWNlKSA9PiB7XG4gICAgaWYgKCFhY2MpIHtcbiAgICAgIC8vIEEgc2VhcmNoIGZvciBhbiBlYXJsaWVyIHNsaWNlIG9mIHRoZSBwYXR0ZXJuIGZhaWxlZCB0byBtYXRjaC5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IGRtcC5tYXRjaF9tYWluKHJvb3QudGV4dENvbnRlbnQsIHNsaWNlLCBhY2MubG9jKVxuICAgIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHNsaWNlIHNob3VsZCBmb2xsb3cgdGhpcyBvbmUgY2xvc2VseS5cbiAgICBhY2MubG9jID0gcmVzdWx0ICsgc2xpY2UubGVuZ3RoXG5cbiAgICAvLyBFeHBhbmQgdGhlIHN0YXJ0IGFuZCBlbmQgdG8gYSBxdW90ZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgc2xpY2VzLlxuICAgIGFjYy5zdGFydCA9IE1hdGgubWluKGFjYy5zdGFydCwgcmVzdWx0KVxuICAgIGFjYy5lbmQgPSBNYXRoLm1heChhY2MuZW5kLCByZXN1bHQgKyBzbGljZS5sZW5ndGgpXG5cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICAvLyBVc2UgdGhlIGZvbGQgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBmdWxsIHF1b3RlIGV4dGVudHMuXG4gIC8vIEV4cGVjdCB0aGUgc2xpY2VzIHRvIGJlIGNsb3NlIHRvIG9uZSBhbm90aGVyLlxuICAvLyBUaGlzIGRpc3RhbmNlIGlzIGRlbGliZXJhdGVseSBnZW5lcm91cyBmb3Igbm93LlxuICBkbXAuTWF0Y2hfRGlzdGFuY2UgPSA2NFxuICBjb25zdCBhY2MgPSBzbGljZXMucmVkdWNlKGZvbGRTbGljZXMsIHtzdGFydCwgZW5kLCBsb2N9KVxuICBpZiAoIWFjYykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge3N0YXJ0OiBhY2Muc3RhcnQsIGVuZDogYWNjLmVuZH1cbn1cbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = seek;\nvar E_END = 'Iterator exhausted before seek ended.';\nvar E_SHOW = 'Argument 1 of seek must use filter NodeFilter.SHOW_TEXT.';\nvar E_WHERE = 'Argument 2 of seek must be an integer or a Text Node.';\nvar DOCUMENT_POSITION_PRECEDING = 2;\nvar SHOW_TEXT = 4;\nvar TEXT_NODE = 3;\n\nfunction seek(iter, where) {\n if (iter.whatToShow !== SHOW_TEXT) {\n var error; // istanbul ignore next\n\n try {\n error = new DOMException(E_SHOW, 'InvalidStateError');\n } catch (_unused) {\n error = new Error(E_SHOW);\n error.code = 11;\n error.name = 'InvalidStateError';\n\n error.toString = function () {\n return \"InvalidStateError: \".concat(E_SHOW);\n };\n }\n\n throw error;\n }\n\n var count = 0;\n var node = iter.referenceNode;\n var predicates = null;\n\n if (isInteger(where)) {\n predicates = {\n forward: function forward() {\n return count < where;\n },\n backward: function backward() {\n return count > where || !iter.pointerBeforeReferenceNode;\n }\n };\n } else if (isText(where)) {\n var forward = before(node, where) ? function () {\n return false;\n } : function () {\n return node !== where;\n };\n\n var backward = function backward() {\n return node !== where || !iter.pointerBeforeReferenceNode;\n };\n\n predicates = {\n forward: forward,\n backward: backward\n };\n } else {\n throw new TypeError(E_WHERE);\n }\n\n while (predicates.forward()) {\n node = iter.nextNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count += node.nodeValue.length;\n }\n\n if (iter.nextNode()) {\n node = iter.previousNode();\n }\n\n while (predicates.backward()) {\n node = iter.previousNode();\n\n if (node === null) {\n throw new RangeError(E_END);\n }\n\n count -= node.nodeValue.length;\n }\n\n if (!isText(iter.referenceNode)) {\n throw new RangeError(E_END);\n }\n\n return count;\n}\n\nfunction isInteger(n) {\n if (typeof n !== 'number') return false;\n return isFinite(n) && Math.floor(n) === n;\n}\n\nfunction isText(node) {\n return node.nodeType === TEXT_NODE;\n}\n\nfunction before(ref, node) {\n return ref.compareDocumentPosition(node) & DOCUMENT_POSITION_PRECEDING;\n}\n//# sourceMappingURL=index.js.map","module.exports = require('./lib')['default'];\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = rangeToString;\n\n/**\n * Return the next node after `node` in a tree order traversal of the document.\n */\nfunction nextNode(node, skipChildren) {\n if (!skipChildren && node.firstChild) {\n return node.firstChild;\n }\n\n do {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n\n node = node.parentNode;\n } while (node);\n /* istanbul ignore next */\n\n\n return node;\n}\n\nfunction firstNode(range) {\n if (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.startContainer.childNodes[range.startOffset];\n return node || nextNode(range.startContainer, true\n /* skip children */\n );\n }\n\n return range.startContainer;\n}\n\nfunction firstNodeAfter(range) {\n if (range.endContainer.nodeType === Node.ELEMENT_NODE) {\n var node = range.endContainer.childNodes[range.endOffset];\n return node || nextNode(range.endContainer, true\n /* skip children */\n );\n }\n\n return nextNode(range.endContainer);\n}\n\nfunction forEachNodeInRange(range, cb) {\n var node = firstNode(range);\n var pastEnd = firstNodeAfter(range);\n\n while (node !== pastEnd) {\n cb(node);\n node = nextNode(node);\n }\n}\n/**\n * A ponyfill for Range.toString().\n * Spec: https://dom.spec.whatwg.org/#dom-range-stringifier\n *\n * Works around the buggy Range.toString() implementation in IE and Edge.\n * See https://github.com/tilgovi/dom-anchor-text-position/issues/4\n */\n\n\nfunction rangeToString(range) {\n // This is a fairly direct translation of the Range.toString() implementation\n // in Blink.\n var text = '';\n forEachNodeInRange(range, function (node) {\n if (node.nodeType !== Node.TEXT_NODE) {\n return;\n }\n\n var start = node === range.startContainer ? range.startOffset : 0;\n var end = node === range.endContainer ? range.endOffset : node.textContent.length;\n text += node.textContent.slice(start, end);\n });\n return text;\n}\n//# sourceMappingURL=range-to-string.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fromRange = fromRange;\nexports.toRange = toRange;\n\nvar _domSeek = _interopRequireDefault(require(\"dom-seek\"));\n\nvar _rangeToString = _interopRequireDefault(require(\"./range-to-string\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar SHOW_TEXT = 4;\n\nfunction fromRange(root, range) {\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n if (range === undefined) {\n throw new Error('missing required parameter \"range\"');\n }\n\n var document = root.ownerDocument;\n var prefix = document.createRange();\n var startNode = range.startContainer;\n var startOffset = range.startOffset;\n prefix.setStart(root, 0);\n prefix.setEnd(startNode, startOffset);\n var start = (0, _rangeToString[\"default\"])(prefix).length;\n var end = start + (0, _rangeToString[\"default\"])(range).length;\n return {\n start: start,\n end: end\n };\n}\n\nfunction toRange(root) {\n var selector = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (root === undefined) {\n throw new Error('missing required parameter \"root\"');\n }\n\n var document = root.ownerDocument;\n var range = document.createRange();\n var iter = document.createNodeIterator(root, SHOW_TEXT);\n var start = selector.start || 0;\n var end = selector.end || start;\n var startOffset = start - (0, _domSeek[\"default\"])(iter, start);\n var startNode = iter.referenceNode;\n var remainder = end - start + startOffset;\n var endOffset = remainder - (0, _domSeek[\"default\"])(iter, remainder);\n var endNode = iter.referenceNode;\n range.setStart(startNode, startOffset);\n range.setEnd(endNode, endOffset);\n return range;\n}\n//# sourceMappingURL=index.js.map","// Web storage adapter using localStorage + BroadcastChannel\nimport type { StorageAdapter, StorageChange } from './adapter';\n\nexport class WebStorageAdapter implements StorageAdapter {\n private channel: BroadcastChannel;\n private listeners: Array<(change: StorageChange) => void> = [];\n\n constructor(channelName: string = 'seams-storage') {\n this.channel = new BroadcastChannel(channelName);\n \n this.channel.onmessage = (event) => {\n this.listeners.forEach(callback => callback(event.data));\n };\n }\n\n async get(keys: string | string[]): Promise<any> {\n if (typeof keys === 'string') {\n const value = localStorage.getItem(keys);\n return value ? JSON.parse(value) : null;\n }\n \n const result: Record<string, any> = {};\n keys.forEach(key => {\n const value = localStorage.getItem(key);\n result[key] = value ? JSON.parse(value) : null;\n });\n return result;\n }\n\n async set(key: string, value: any): Promise<void> {\n const oldValue = await this.get(key);\n localStorage.setItem(key, JSON.stringify(value));\n \n const change: StorageChange = { key, newValue: value, oldValue };\n this.channel.postMessage(change);\n }\n\n onChange(callback: (change: StorageChange) => void): void {\n this.listeners.push(callback);\n }\n\n close(): void {\n this.channel.close();\n }\n}\n"],"names":["diff_match_patch","DIFF_DELETE","DIFF_INSERT","DIFF_EQUAL","op","text","text1","text2","opt_checklines","opt_deadline","deadline","checklines","commonlength","commonprefix","commonsuffix","diffs","longtext","shorttext","i","hm","text1_a","text1_b","text2_a","text2_b","mid_common","diffs_a","diffs_b","a","linearray","pointer","count_delete","count_insert","text_delete","text_insert","subDiff","j","text1_length","text2_length","max_d","v_offset","v_length","v1","v2","x","delta","front","k1start","k1end","k2start","k2end","d","k1","k1_offset","x1","y1","k2_offset","x2","k2","y2","y","text1a","text2a","text1b","text2b","diffsb","lineArray","lineHash","diff_linesToCharsMunge_","chars","lineStart","lineEnd","lineArrayLength","line","maxLines","chars1","chars2","pointermin","pointermax","pointermid","pointerstart","pointerend","text_length","best","length","pattern","found","dmp","diff_halfMatchI_","seed","best_common","best_longtext_a","best_longtext_b","best_shorttext_a","best_shorttext_b","prefixLength","suffixLength","hm1","hm2","changes","equalities","equalitiesLength","lastEquality","length_insertions1","length_deletions1","length_insertions2","length_deletions2","deletion","insertion","overlap_length1","overlap_length2","diff_cleanupSemanticScore_","one","two","char1","char2","nonAlphaNumeric1","nonAlphaNumeric2","whitespace1","whitespace2","lineBreak1","lineBreak2","blankLine1","blankLine2","equality1","edit","equality2","commonOffset","commonString","bestEquality1","bestEdit","bestEquality2","bestScore","score","pre_ins","pre_del","post_ins","post_del","loc","last_chars1","last_chars2","html","pattern_amp","pattern_lt","pattern_gt","pattern_para","data","levenshtein","insertions","deletions","diffsLength","tokens","param","n","s","match_bitapScore_","e","accuracy","proximity","score_threshold","best_loc","matchmask","bin_min","bin_mid","bin_max","last_rd","start","finish","rd","charMatch","patch","padding","prefix","suffix","opt_b","opt_c","patches","patchDiffLength","char_count1","char_count2","prepatch_text","postpatch_text","diff_type","diff_text","patchesCopy","patchCopy","nullPadding","results","expected_loc","start_loc","end_loc","index1","index2","mod","paddingLength","extraLength","patch_size","bigpatch","start1","start2","precontext","empty","postcontext","textline","textPointer","patchHeader","m","sign","coords1","coords2","module","exports","_classCallCheck","instance","Constructor","createNodeIterator","root","whatToShow","filter","doc","iter","NodeIterator","result","node","before","getPolyfill","_adapter","require$$0","_adapter2","_interopRequireDefault","_builtin","require$$1","_builtin2","_implementation","require$$2","_implementation2","obj","shim","_polyfill","_polyfill2","polyfill","_shim","_shim2","implementation","domNodeIteratorModule","require$$3","ancestors","parents","out","noop","indexOf","arr","ele","idx","len","seek","_ancestors","_ancestors2","_indexOf","_indexOf2","E_SHOW","E_WHERE","SHOW_TEXT","TEXT_NODE","where","count","predicates","isNumber","isText","forward","backward","ref","common","left","right","l","r","domSeek","rangeToString_1","rangeToString","nextNode","skipChildren","firstNode","range","firstNodeAfter","forEachNodeInRange","cb","pastEnd","end","lib","fromRange","toRange","_domNodeIterator","_domNodeIterator2","_domSeek","_domSeek2","_rangeToString","_rangeToString2","document","startNode","startOffset","selector","remainder","domAnchorTextPosition","fromTextPosition","toTextPosition","_diffMatchPatch","_diffMatchPatch2","_domAnchorTextPosition","textPosition","_interopRequireWildcard","newObj","key","SLICE_LENGTH","SLICE_RE","CONTEXT_LENGTH","position","exact","prefixStart","suffixEnd","options","hint","slices","havePrefix","haveSuffix","foundPrefix","firstSlice","foldSlices","acc","slice","E_END","DOCUMENT_POSITION_PRECEDING","error","isInteger","endOffset","endNode","WebStorageAdapter","channelName","event","callback","keys","value","oldValue","change"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
-238
proxy/static/static/landing.js
··· 1 - function v(e) { 2 - const t = new Date(e), a = (/* @__PURE__ */ new Date()).getTime() - t.getTime(), o = Math.floor(a / 1e3), i = Math.floor(o / 60), r = Math.floor(i / 60), s = Math.floor(r / 24); 3 - return o < 60 ? "just now" : i < 60 ? `${i}m ago` : r < 24 ? `${r}h ago` : s < 7 ? `${s}d ago` : t.toLocaleDateString(); 4 - } 5 - class x extends HTMLElement { 6 - constructor() { 7 - super(), this._annotation = null, this.attachShadow({ mode: "open" }); 8 - } 9 - static get observedAttributes() { 10 - return ["annotation"]; 11 - } 12 - attributeChangedCallback(t, n, a) { 13 - if (t === "annotation" && n !== a) 14 - try { 15 - this._annotation = JSON.parse(a), this.render(); 16 - } catch (o) { 17 - console.error("Failed to parse annotation attribute", o); 18 - } 19 - } 20 - set annotation(t) { 21 - this._annotation = t, this.render(); 22 - } 23 - get annotation() { 24 - return this._annotation; 25 - } 26 - connectedCallback() { 27 - this.render(); 28 - } 29 - async render() { 30 - var m; 31 - if (!this._annotation || !this.shadowRoot) return; 32 - const { value: t, author: n } = this._annotation, a = t.target, o = t.body, i = t.createdAt, r = (m = a.selector) == null ? void 0 : m.find( 33 - (b) => b.$type === "community.lexicon.annotation.annotation#textQuoteSelector" 34 - ), s = r == null ? void 0 : r.exact, f = a.url, u = f ? this.getDomain(f) : "", g = this.buildTextFragmentUrl(f, s), l = (n == null ? void 0 : n.did) || "unknown", h = (n == null ? void 0 : n.handle) || (l.includes(":") ? l.split(":").pop() : l), y = (n == null ? void 0 : n.avatar) || `https://api.dicebear.com/7.x/initials/svg?seed=${encodeURIComponent(h)}`; 35 - this.shadowRoot.innerHTML = ` 36 - <style> 37 - :host { 38 - display: block; 39 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; 40 - } 41 - 42 - .card { 43 - background: white; 44 - border: 1px solid #e0e0e0; 45 - border-radius: 12px; 46 - padding: 16px; 47 - margin-bottom: 16px; 48 - box-shadow: 0 2px 4px rgba(0,0,0,0.05); 49 - transition: transform 0.2s, box-shadow 0.2s; 50 - } 51 - 52 - .card:hover { 53 - transform: translateY(-1px); 54 - box-shadow: 0 4px 8px rgba(0,0,0,0.1); 55 - } 56 - 57 - .quote { 58 - margin: 0 0 12px 0; 59 - padding-left: 12px; 60 - border-left: 3px solid #FFD700; 61 - color: #444; 62 - font-style: italic; 63 - font-size: 0.95em; 64 - line-height: 1.5; 65 - } 66 - 67 - .body { 68 - color: #1a1a1a; 69 - font-size: 1em; 70 - line-height: 1.6; 71 - margin-bottom: 16px; 72 - white-space: pre-wrap; 73 - } 74 - 75 - .meta { 76 - display: flex; 77 - align-items: center; 78 - justify-content: space-between; 79 - font-size: 0.85em; 80 - color: #666; 81 - border-top: 1px solid #f0f0f0; 82 - padding-top: 12px; 83 - } 84 - 85 - .author { 86 - display: flex; 87 - align-items: center; 88 - gap: 8px; 89 - text-decoration: none; 90 - color: inherit; 91 - } 92 - 93 - .author:hover { 94 - color: #2E7D32; 95 - } 96 - 97 - .avatar { 98 - width: 24px; 99 - height: 24px; 100 - border-radius: 50%; 101 - object-fit: cover; 102 - background: #eee; 103 - } 104 - 105 - .handle { 106 - font-weight: 500; 107 - } 108 - 109 - .source-link { 110 - color: #666; 111 - text-decoration: none; 112 - display: flex; 113 - align-items: center; 114 - gap: 4px; 115 - } 116 - 117 - .source-link:hover { 118 - color: #2E7D32; 119 - text-decoration: underline; 120 - } 121 - 122 - .time { 123 - color: #999; 124 - } 125 - </style> 126 - 127 - <article class="card"> 128 - ${s ? `<blockquote class="quote">"${s}"</blockquote>` : ""} 129 - ${o ? `<div class="body">${this.escapeHtml(o)}</div>` : ""} 130 - 131 - <div class="meta"> 132 - <div class="left"> 133 - <a href="https://bsky.app/profile/${l}" target="_blank" rel="noopener noreferrer" class="author"> 134 - <img class="avatar" src="${y}" alt="${h}'s avatar" loading="lazy" /> 135 - <span class="handle">@${h}</span> 136 - </a> 137 - </div> 138 - 139 - <div class="right"> 140 - <span class="time">${v(i)}</span> 141 - ${u ? ` 142 - <span style="margin: 0 6px;">•</span> 143 - <a href="${g}" target="_blank" rel="noopener noreferrer" class="source-link"> 144 - ${u} ↗ 145 - </a> 146 - ` : ""} 147 - </div> 148 - </div> 149 - </article> 150 - `; 151 - } 152 - getDomain(t) { 153 - try { 154 - return new URL(t).hostname; 155 - } catch { 156 - return t; 157 - } 158 - } 159 - buildTextFragmentUrl(t, n) { 160 - if (!t || !n) return t; 161 - try { 162 - const a = new URL(t); 163 - return a.hash = `:~:text=${encodeURIComponent(n)}`, a.toString(); 164 - } catch { 165 - return t; 166 - } 167 - } 168 - escapeHtml(t) { 169 - const n = document.createElement("div"); 170 - return n.textContent = t, n.innerHTML; 171 - } 172 - } 173 - customElements.get("seams-annotation-card") || customElements.define("seams-annotation-card", x); 174 - const w = window.BACKEND_URL || ""; 175 - let p = !1; 176 - const d = /* @__PURE__ */ new Map(), c = document.getElementById("annotations-feed"), $ = document.getElementById("load-more"); 177 - document.getElementById("load-more-btn"); 178 - async function k(e) { 179 - if (d.has(e)) 180 - return d.get(e); 181 - try { 182 - const t = await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${e}`); 183 - if (!t.ok) 184 - throw new Error("Profile fetch failed"); 185 - const a = (await t.json()).avatar || null; 186 - return d.set(e, a), a; 187 - } catch (t) { 188 - return console.error("Failed to fetch profile for", e, t), d.set(e, null), null; 189 - } 190 - } 191 - async function M(e = 20) { 192 - if (!p) { 193 - p = !0; 194 - try { 195 - const t = await fetch(`${w}/api/annotations?limit=${e}`); 196 - if (!t.ok) 197 - throw new Error(`HTTP error! status: ${t.status}`); 198 - return (await t.json()).annotations || []; 199 - } catch (t) { 200 - throw console.error("Failed to fetch annotations:", t), t; 201 - } finally { 202 - p = !1; 203 - } 204 - } 205 - } 206 - async function A(e) { 207 - var o, i; 208 - const t = (o = e.author) == null ? void 0 : o.did; 209 - if (!((i = e.author) == null ? void 0 : i.avatar) && t && t !== "unknown") { 210 - const r = await k(t); 211 - r && (e.author || (e.author = {}), e.author.avatar = r); 212 - } 213 - const a = document.createElement("seams-annotation-card"); 214 - return a.annotation = e, a; 215 - } 216 - async function E(e, t = !1) { 217 - if (t || (c.innerHTML = ""), e.length === 0 && !t) { 218 - c.innerHTML = '<div class="empty">No annotations yet. Install the browser extension to start annotating!</div>'; 219 - return; 220 - } 221 - const n = document.createDocumentFragment(); 222 - for (const a of e) { 223 - const o = await A(a); 224 - n.appendChild(o); 225 - } 226 - c.appendChild(n); 227 - } 228 - async function T() { 229 - try { 230 - c.innerHTML = '<div class="loading">Tending the garden...</div>'; 231 - const e = await M(20); 232 - await E(e), $.style.display = "none"; 233 - } catch (e) { 234 - c.innerHTML = '<div class="error">Failed to load annotations. Please try again later.</div>', console.error("Error loading annotations:", e); 235 - } 236 - } 237 - T(); 238 - //# sourceMappingURL=landing.mjs.map
-50
proxy/static/static/seams-client.js
··· 1 - import{l as Q,a as X,W as Y}from"./assets/index-BKdQD0EM.js";function w(n){try{const t=new URL(n);t.hash="";let e=t.pathname;return e.endsWith("/")&&e!=="/"&&(e=e.slice(0,-1)),t.pathname=e,t.toString()}catch{return n}}var M=Q,D=X;function G(n,t){if(!n.rangeCount)return[];const e=n.getRangeAt(0),o=t||document.body,s=[],i=V(e,o);i&&s.push(i);const r=J(e,o);return r&&s.push(r),s}function V(n,t){if(!n.toString().trim())return null;try{const o=M.fromRange(t,n);return{$type:"community.lexicon.annotation.annotation#textQuoteSelector",exact:o.exact,prefix:o.prefix||void 0,suffix:o.suffix||void 0}}catch(o){return console.warn("Failed to generate TextQuoteSelector:",o),null}}function J(n,t){if(!n.toString().trim())return null;try{const o=D.fromRange(t,n);return{$type:"community.lexicon.annotation.annotation#textPositionSelector",start:o.start,end:o.end}}catch(o){return console.warn("Failed to generate TextPositionSelector:",o),null}}function K(n,t=document.body){var r,l,a;let e=(l=(r=n.value)==null?void 0:r.target)==null?void 0:l.selector;if(!e&&Array.isArray(n.target)&&(e=(a=n.target[0])==null?void 0:a.selector),!e||e.length===0)return console.warn("[synthesis] No selectors found in annotation"),null;console.log("[synthesis] Trying to match annotation with",e.length,"selectors");const o=e.find(c=>c.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),s=e.find(c=>c.$type==="community.lexicon.annotation.annotation#textPositionSelector"),i=[o,s].filter(Boolean);for(const c of i){let d=null;switch(console.log("[synthesis] Trying selector type:",c.$type),c.$type){case"community.lexicon.annotation.annotation#textPositionSelector":d=Z(c,t);break;case"community.lexicon.annotation.annotation#textQuoteSelector":d=tt(c,t);break}if(d)return console.log("[synthesis] Successfully matched with",c.$type),d}return console.warn("[synthesis] Could not match any selector"),null}function Z(n,t){try{return D.toRange(t,n)}catch(e){return console.warn("TextPositionSelector match failed:",e),null}}function tt(n,t){try{return M.toRange(t,n)}catch(e){return console.warn("TextQuoteSelector match failed:",e),null}}let S=null;function k(n,t,e,o){var a,c;H();const s=document.createElement("div");s.className="synthesis-popover",s.style.cssText=` 2 - position: absolute; 3 - z-index: 999999; 4 - background: white; 5 - border: 1px solid #ccc; 6 - border-radius: 8px; 7 - padding: 12px; 8 - box-shadow: 0 2px 8px rgba(0,0,0,0.15); 9 - min-width: 300px; 10 - max-width: 400px; 11 - `;const i=t.getBoundingClientRect();s.style.left=`${i.left+window.scrollX}px`,s.style.top=`${i.bottom+window.scrollY+5}px`;const r=(c=(a=n.target[0])==null?void 0:a.selector)==null?void 0:c.find(d=>d.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),l=(r==null?void 0:r.exact)||"";s.innerHTML=` 12 - <div style="margin-bottom: 8px; font-size: 13px; color: #666; font-style: italic; border-left: 3px solid #0085ff; padding-left: 8px;"> 13 - ${l} 14 - </div> 15 - <div style="padding: 8px 0; font-size: 14px; color: #333;"> 16 - ${n.body||'<em style="color: #999;">No note</em>'} 17 - </div> 18 - `,document.body.appendChild(s),S=s,setTimeout(()=>{document.addEventListener("click",z)},0),s.addEventListener("click",d=>{d.stopPropagation()})}function z(){H()}function H(){S&&(S.remove(),S=null,document.removeEventListener("click",z))}function W(n){var t;switch(n.nodeType){case Node.ELEMENT_NODE:case Node.TEXT_NODE:return((t=n.textContent)==null?void 0:t.length)??0;default:return 0}}function $(n){let t=n.previousSibling,e=0;for(;t;)e+=W(t),t=t.previousSibling;return e}class p{constructor(t,e){if(e<0)throw new Error("Offset is invalid");this.element=t,this.offset=e}static fromPoint(t,e){switch(t.nodeType){case Node.TEXT_NODE:{if(!t.parentElement)throw new Error("Text node has no parent");const o=$(t)+e;return new p(t.parentElement,o)}case Node.ELEMENT_NODE:{let o=0;for(let s=0;s<e;s++)o+=W(t.childNodes[s]);return new p(t,o)}default:throw new Error("Node is not an element or text node")}}relativeTo(t){if(!t.contains(this.element))throw new Error("Parent is not an ancestor of current element");let e=this.element,o=this.offset;for(;e!==t;)o+=$(e),e=e.parentElement;return new p(e,o)}resolve(){const t=j(this.element,this.offset);if(t.length===0)throw new RangeError("Offset exceeds text length");return t[0]}}function j(n,...t){let e=t.shift();const o=n.ownerDocument.createNodeIterator(n,NodeFilter.SHOW_TEXT),s=[];let i=o.nextNode(),r=null,l=0;for(;e!==void 0&&i;)r=i,l+r.data.length>e?(s.push({node:r,offset:e-l}),e=t.shift()):(i=o.nextNode(),l+=r.data.length);for(;e!==void 0&&r&&l===e;)s.push({node:r,offset:r.data.length}),e=t.shift();if(e!==void 0)throw new RangeError("Offset exceeds text length");return s}class N{constructor(t,e){this.start=t,this.end=e}static fromRange(t){const e=p.fromPoint(t.startContainer,t.startOffset),o=p.fromPoint(t.endContainer,t.endOffset);return new N(e,o)}toRange(){let t,e;if(this.start.element===this.end.element&&this.start.offset<=this.end.offset){const s=j(this.start.element,this.start.offset,this.end.offset);t=s[0],e=s[1]}else t=this.start.resolve(),e=this.end.resolve();const o=new Range;return o.setStart(t.node,t.offset),o.setEnd(e.node,e.offset),o}}function et(n,t){var e;try{const o=((e=t.nodeValue)==null?void 0:e.length)??t.childNodes.length;return n.comparePoint(t,0)<=0&&n.comparePoint(t,o)>=0}catch{return!1}}function nt(n){if(n.collapsed)return[];let t=n.commonAncestorContainer;if(t&&t.nodeType!==Node.ELEMENT_NODE&&(t=t.parentElement),!t)return[];const e=[],o=t.ownerDocument.createNodeIterator(t,NodeFilter.SHOW_TEXT);let s;for(;s=o.nextNode();){if(!et(n,s))continue;const i=s;if(i===n.startContainer&&n.startOffset>0){i.splitText(n.startOffset);continue}i===n.endContainer&&n.endOffset<i.data.length&&i.splitText(n.endOffset),e.push(i)}return e}function ot(n,t,e){const o=e||document.querySelector("main")||document.querySelector("article")||document.body;_(o),console.log(`[synthesis] Applying ${n.length} highlights`);const s=[];n.forEach((i,r)=>{console.log(`[synthesis] Finding range for annotation ${r+1}/${n.length}`);const l=K(i,o);if(!l){console.warn("[synthesis] Could not anchor annotation:",i);return}let a=l.commonAncestorContainer;for(;a&&a!==e;){if(a.nodeName==="SCRIPT"||a.nodeName==="STYLE"){console.warn("[synthesis] Skipping highlight inside",a.nodeName,"tag");return}a=a.parentNode}const c=N.fromRange(l);s.push({textRange:c,annotation:i})}),console.log(`[synthesis] Found ${s.length} valid annotations`),s.forEach(({textRange:i,annotation:r},l)=>{console.log(`[synthesis] Applying highlight ${l+1}/${s.length}`);try{const a=i.toRange();st(a,r,t),console.log("[synthesis] Successfully highlighted annotation")}catch(a){console.warn("[synthesis] Failed to highlight range:",a)}}),console.log("[synthesis] Finished applying highlights")}function st(n,t,e){var l;console.log("[synthesis] Highlighting range:",n.toString().substring(0,50));const o=t.uri,s=((l=t.value)==null?void 0:l.createdAt)||t.createdAt,i=o||s,r=document.createElement("span");r.className="synthesis-highlight",r.dataset.annotationId=i,r.style.cssText=` 19 - background-color: rgba(255, 235, 59, 0.6) !important; 20 - cursor: pointer !important; 21 - transition: background-color 0.2s !important; 22 - `,r.addEventListener("mouseenter",()=>{r.style.cssText=` 23 - background-color: rgba(255, 235, 59, 0.8) !important; 24 - cursor: pointer !important; 25 - transition: background-color 0.2s !important; 26 - `}),r.addEventListener("mouseleave",()=>{r.style.cssText=` 27 - background-color: rgba(255, 235, 59, 0.6) !important; 28 - cursor: pointer !important; 29 - transition: background-color 0.2s !important; 30 - `}),r.addEventListener("click",a=>{a.preventDefault(),a.stopPropagation(),console.log("[synthesis] Clicked annotation:",t),k(t,r)});try{const a=nt(n);if(console.log("[synthesis] Found",a.length,"text nodes to highlight"),a.length===0){console.warn("[synthesis] No text nodes found in range");return}a.forEach(c=>{var O;const d=t.uri,q=((O=t.value)==null?void 0:O.createdAt)||t.createdAt,y=d||q,u=document.createElement("span");u.className="synthesis-highlight",u.dataset.annotationId=y,u.style.cssText=r.style.cssText,u.addEventListener("mouseenter",()=>{document.querySelectorAll(`.synthesis-highlight[data-annotation-id="${y}"]`).forEach(h=>{h.style.cssText=` 31 - background-color: rgba(255, 235, 59, 0.8) !important; 32 - cursor: pointer !important; 33 - transition: background-color 0.2s !important; 34 - `})}),u.addEventListener("mouseleave",()=>{document.querySelectorAll(`.synthesis-highlight[data-annotation-id="${y}"]`).forEach(h=>{h.style.cssText=` 35 - background-color: rgba(255, 235, 59, 0.6) !important; 36 - cursor: pointer !important; 37 - transition: background-color 0.2s !important; 38 - `})}),u.addEventListener("click",b=>{b.preventDefault(),b.stopPropagation(),console.log("[synthesis] Clicked annotation:",t),k(t,u,async h=>{const C=await e.get("annotations"),f=C.annotations||C||[],T=f.findIndex(g=>{var m,x;const A=((m=g.value)==null?void 0:m.createdAt)||g.createdAt,R=((x=h.value)==null?void 0:x.createdAt)||h.createdAt;return A===R});T!==-1&&(f[T]=h,await e.set("annotations",f),console.log("[synthesis] Annotation updated:",h),Object.assign(t,h))},async()=>{const h=await e.get("annotations"),f=(h.annotations||h||[]).filter(g=>{var m,x;const A=((m=g.value)==null?void 0:m.createdAt)||g.createdAt,R=((x=t.value)==null?void 0:x.createdAt)||t.createdAt;return A!==R});await e.set("annotations",f),console.log("[synthesis] Annotation deleted"),document.querySelectorAll(`.synthesis-highlight[data-annotation-id="${y}"]`).forEach(g=>g.remove())})});const L=c.parentNode;L&&(L.replaceChild(u,c),u.appendChild(c))}),console.log("[synthesis] Successfully applied highlight across",a.length,"text nodes")}catch(a){console.error("[synthesis] Failed to apply highlight:",a)}}function _(n=document.body){const t=n.querySelectorAll(".synthesis-highlight");console.log(`[synthesis] Clearing ${t.length} highlights`),t.forEach(e=>{const o=e.parentNode;if(o){for(;e.firstChild;)o.insertBefore(e.firstChild,e);o.removeChild(e),o.normalize()}})}class rt{constructor(t){this.currentSelection=null,this.adapter=t,this.currentUrl=w(t.getCurrentUrl())}async start(){console.log("[content] BaseContentScript starting..."),await this.loadAndRenderHighlights(),this.adapter.storage.onChange(({key:t})=>{t==="annotations"&&(console.log("[content] Annotations cache updated, re-rendering"),this.loadAndRenderHighlights())}),this.setupSelectionTracking(),this.setupDomObserver()}async loadAndRenderHighlights(){this.adapter.clearHighlights();const t=w(this.adapter.getCurrentUrl()),o=(await this.adapter.storage.get("annotations")||[]).filter(s=>!s||!s.value||!s.value.target?!1:w(s.value.target.url)===t);console.log(`[content] Found ${o.length} annotations in cache for ${t}`),o.length>0&&this.adapter.applyHighlights(o,this.adapter.storage)}handleUrlChange(){const t=w(this.adapter.getCurrentUrl());t!==this.currentUrl&&(console.log("[content] URL changed:",this.currentUrl,"→",t),this.currentUrl=t,this.currentSelection=null,this.loadAndRenderHighlights())}setupSelectionTracking(){document.addEventListener("mouseup",t=>{const e=window.getSelection();if(e&&e.toString().trim().length>0){const o=e.toString().trim(),s=document.querySelector("main")||document.querySelector("article")||document.body;try{const i=this.adapter.generateSelectors(e,s);this.currentSelection={text:o,selectors:i},console.log("[content] Text selected:",o),this.adapter.notifySelectionChange(this.currentSelection)}catch(i){console.error("[content] Failed to generate selectors:",i)}}else this.currentSelection&&(this.currentSelection=null,this.adapter.notifySelectionChange(null))})}setupDomObserver(){new MutationObserver(e=>{let o=!1;for(const s of e)if(s.addedNodes.length>0||s.type==="characterData"){o=!0;break}o&&(this.renderTimeout&&clearTimeout(this.renderTimeout),this.renderTimeout=setTimeout(()=>{console.log("[content] DOM changed, re-rendering highlights"),this.loadAndRenderHighlights()},500))}).observe(document.body,{childList:!0,subtree:!0,characterData:!0})}}class it extends rt{constructor(t){const e={storage:t.storage,getCurrentUrl:t.getCurrentUrl,applyHighlights:t.applyHighlights,clearHighlights:t.clearHighlights,generateSelectors:t.generateSelectors||((o,s)=>[]),notifySelectionChange:o=>{t.onSelectionChange&&t.onSelectionChange(o)}};super(e)}}function at(n,t,e){const o=document.createElement("button");return o.textContent="Annotate",o.className="seams-mobile-annotate-btn",Object.assign(o.style,{position:"fixed",top:`${t+20}px`,left:`${n}px`,transform:"translateX(-50%)",zIndex:"2147483647",padding:"8px 16px",background:"#2d5016",color:"white",border:"none",borderRadius:"20px",boxShadow:"0 2px 8px rgba(0,0,0,0.2)",fontSize:"14px",fontWeight:"600",cursor:"pointer"}),o.addEventListener("mousedown",s=>{s.stopPropagation()}),o.addEventListener("mouseup",s=>{s.stopPropagation()}),o.addEventListener("click",s=>{s.stopPropagation(),e()}),document.body.appendChild(o),o}function lt(n){const t=document.createElement("button");return t.className="seams-mobile-toggle-btn",t.textContent="<<",Object.assign(t.style,{position:"fixed",top:"10px",right:"10px",zIndex:"2147483647",width:"40px",height:"40px",background:"white",color:"#2d5016",border:"1px solid #ddd",borderRadius:"50%",boxShadow:"0 2px 8px rgba(0,0,0,0.1)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"14px",fontWeight:"bold",cursor:"pointer"}),t.addEventListener("click",e=>{e.stopPropagation(),n()}),document.body.appendChild(t),t}function ct(n,t,e){const o=document.createElement("div");Object.assign(o.style,{position:"fixed",top:"0",left:"0",width:"100%",height:"100%",background:"rgba(0,0,0,0.5)",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",padding:"20px",boxSizing:"border-box"});const s=document.createElement("div");Object.assign(s.style,{background:"white",borderRadius:"12px",width:"100%",maxWidth:"400px",padding:"20px",boxShadow:"0 4px 12px rgba(0,0,0,0.2)",display:"flex",flexDirection:"column",gap:"12px"});const i=document.createElement("blockquote");i.textContent=n,Object.assign(i.style,{borderLeft:"3px solid #2d5016",margin:"0",paddingLeft:"10px",color:"#666",fontSize:"14px",maxHeight:"100px",overflowY:"auto"});const r=document.createElement("textarea");r.placeholder="Add your note...",Object.assign(r.style,{width:"100%",height:"100px",padding:"10px",border:"1px solid #ddd",borderRadius:"8px",resize:"none",fontFamily:"inherit",boxSizing:"border-box"});const l=document.createElement("div");Object.assign(l.style,{display:"flex",justifyContent:"flex-end",gap:"8px"});const a=document.createElement("button");a.textContent="Cancel",Object.assign(a.style,{padding:"8px 16px",background:"transparent",border:"1px solid #ddd",borderRadius:"6px",cursor:"pointer",color:"#666"}),a.onclick=()=>{document.body.removeChild(o)};const c=document.createElement("button");return c.textContent="Save",Object.assign(c.style,{padding:"8px 16px",background:"#2d5016",color:"white",border:"none",borderRadius:"6px",cursor:"pointer"}),c.onclick=()=>{const d=r.value.trim();d&&(t(d),document.body.removeChild(o))},l.appendChild(a),l.appendChild(c),s.appendChild(i),s.appendChild(r),s.appendChild(l),o.appendChild(s),document.body.appendChild(o),setTimeout(()=>r.focus(),50),o}class dt{constructor(t){this.options=t,this.activeBtn=null}showButton(t,e,o){this.removeButton(),setTimeout(()=>{this.activeBtn=at(t.left+t.width/2,t.top,()=>{this.options.isMobile?ct(e,s=>{this.options.onAnnotate({text:e,selectors:o,body:s})}):this.options.onAnnotate({text:e,selectors:o}),this.removeButton()})},0)}removeButton(){this.activeBtn&&(this.activeBtn.remove(),this.activeBtn=null)}}console.log("🔬 Seams via client loaded!");const ht=new Y,v="seams-sidebar-iframe",U=400,E=window.innerWidth<=768,I=new dt({isMobile:E,onAnnotate:n=>{const t=document.getElementById(v);E?n.body&&t&&t.contentWindow&&t.contentWindow.postMessage({type:"SEAMS_CREATE_ANNOTATION",payload:{text:n.text,selectors:n.selectors,body:n.body}},"*"):t&&t.contentWindow&&t.contentWindow.postMessage({type:"SEAMS_TEXT_SELECTED",payload:{text:n.text,selectors:n.selectors}},"*")}}),ut=new it({storage:ht,getCurrentUrl:F,applyHighlights:ot,clearHighlights:_,generateSelectors:G,onSelectionChange:n=>{const t=document.getElementById(v);if(n&&n.text){const e=window.getSelection();if(e&&e.rangeCount>0){const s=e.getRangeAt(0).getBoundingClientRect();I.showButton(s,n.text,n.selectors)}}else I.removeButton(),t&&t.contentWindow&&t.contentWindow.postMessage({type:"SEAMS_TEXT_SELECTED",payload:null},"*")}});function B(){if(document.getElementById(v)){console.log("[seams-via] Sidebar already injected");return}const n=document.createElement("iframe");if(n.id=v,n.src="/static/seams-sidebar.html",n.style.cssText=` 39 - position: fixed; 40 - top: 0; 41 - right: 0; 42 - width: ${U}px; 43 - height: 100vh; 44 - border: none; 45 - border-left: 1px solid #ccc; 46 - z-index: 2147483647; 47 - background: white; 48 - box-shadow: -2px 0 8px rgba(0,0,0,0.1); 49 - `,document.body.appendChild(n),console.log("[seams-via] Sidebar injected"),E?(n.style.width="100%",n.style.display="none"):document.body.style.marginRight=`${U}px`,n.onload=()=>{var t;console.log("[seams-via] Sidebar iframe loaded, sending URL"),(t=n.contentWindow)==null||t.postMessage({type:"SEAMS_PAGE_URL",url:F()},"*")},E){const t=lt(()=>{const e=n.style.display==="none";n.style.display=e?"block":"none",t.textContent=e?">>":"<<"})}}function P(n){try{const t=new URL(n);t.hash="";let e=t.pathname;return e.endsWith("/")&&e!=="/"&&(e=e.slice(0,-1)),t.pathname=e,t.toString()}catch{return n}}function F(){const n=window.location.href,t=window.wbinfo;if(t&&t.url){const o=t.url,s=P(o);return console.log("[seams-via] Got URL from wbinfo:",o),console.log("[seams-via] Normalized URL:",s),s}const e=n.match(/\/proxy\/(https?:\/\/.+)/);if(e){const o=e[1],s=P(o);return console.log("[seams-via] Extracted URL from proxy path:",o),console.log("[seams-via] Normalized URL:",s),s}return console.warn("[seams-via] Could not extract actual URL, using:",n),n}function gt(){document.body?B():document.addEventListener("DOMContentLoaded",()=>{B()}),ut.start()}gt(); 50 - //# sourceMappingURL=seams-client.js.map
-1
proxy/static/static/seams-client.js.map
··· 1 - {"version":3,"file":"seams-client.js","sources":["../../packages/core/src/utils/url.ts","../../node_modules/.pnpm/dom-anchor-text-quote@4.0.2/node_modules/dom-anchor-text-quote/index.js","../../node_modules/.pnpm/dom-anchor-text-position@5.0.0/node_modules/dom-anchor-text-position/index.js","../../packages/core/src/utils/selectors/generate.ts","../../packages/core/src/utils/selectors/match.ts","../../packages/core/src/utils/highlights/popover.ts","../../packages/core/src/utils/highlights/text-range.ts","../../packages/core/src/utils/highlights/range-util.ts","../../packages/core/src/utils/highlights/apply.ts","../../packages/core/src/content/base.ts","../../packages/core/src/content/script.ts","../../packages/core/src/content/mobile.ts","../../packages/core/src/content/ui.ts","../../entrypoints/via-client/main.ts"],"sourcesContent":["// URL normalization utilities\n\nexport function normalizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n // Remove fragment\n parsed.hash = '';\n // Remove trailing slash\n let path = parsed.pathname;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n parsed.pathname = path;\n return parsed.toString();\n } catch {\n return url;\n }\n}\n","module.exports = require('./lib');\n","module.exports = require('./lib')\n","import * as textQuote from 'dom-anchor-text-quote';\nimport * as textPosition from 'dom-anchor-text-position';\n\ninterface Selector {\n $type: string;\n exact?: string;\n prefix?: string;\n suffix?: string;\n start?: number;\n end?: number;\n}\n\n/**\n * Generate W3C selectors from a DOM selection using Hypothesis libraries\n */\nexport function generateSelectors(selection: Selection, root?: HTMLElement): Selector[] {\n if (!selection.rangeCount) return [];\n \n const range = selection.getRangeAt(0);\n const container = root || document.body;\n const selectors: Selector[] = [];\n \n // TextQuoteSelector - most robust for content changes\n const textQuoteSelector = generateTextQuoteSelector(range, container);\n if (textQuoteSelector) selectors.push(textQuoteSelector);\n \n // TextPositionSelector - precise but fragile\n const textPositionSelector = generateTextPositionSelector(range, container);\n if (textPositionSelector) selectors.push(textPositionSelector);\n \n return selectors;\n}\n\nfunction generateTextQuoteSelector(\n range: Range, \n root: HTMLElement\n): Selector | null {\n const exact = range.toString().trim();\n if (!exact) return null;\n \n try {\n const selector = textQuote.fromRange(root, range);\n \n return {\n $type: 'community.lexicon.annotation.annotation#textQuoteSelector',\n exact: selector.exact,\n prefix: selector.prefix || undefined,\n suffix: selector.suffix || undefined\n };\n } catch (error) {\n console.warn('Failed to generate TextQuoteSelector:', error);\n return null;\n }\n}\n\nfunction generateTextPositionSelector(\n range: Range,\n root: HTMLElement\n): Selector | null {\n const exact = range.toString().trim();\n if (!exact) return null;\n \n try {\n const selector = textPosition.fromRange(root, range);\n \n return {\n $type: 'community.lexicon.annotation.annotation#textPositionSelector',\n start: selector.start,\n end: selector.end\n };\n } catch (error) {\n console.warn('Failed to generate TextPositionSelector:', error);\n return null;\n }\n}\n","import * as textQuote from 'dom-anchor-text-quote';\nimport * as textPosition from 'dom-anchor-text-position';\nimport type { Annotation, TextQuoteSelector, TextPositionSelector } from '../types/annotation';\n\n/**\n * Find the DOM Range for an annotation using its selectors\n */\nexport function findAnnotationRange(\n annotation: Annotation,\n container: HTMLElement = document.body\n): Range | null {\n // Support both new nested schema (value.target.selector) and old flat schema (target[0].selector)\n let selectors = annotation.value?.target?.selector;\n \n if (!selectors && Array.isArray((annotation as any).target)) {\n selectors = (annotation as any).target[0]?.selector;\n }\n\n if (!selectors || selectors.length === 0) {\n console.warn('[synthesis] No selectors found in annotation');\n return null;\n }\n \n console.log('[synthesis] Trying to match annotation with', selectors.length, 'selectors');\n \n // Try TextQuoteSelector first (position-independent, works after DOM mutations)\n // Then fall back to TextPositionSelector (faster but fragile)\n const quoteSelector = selectors.find(s => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector');\n const positionSelector = selectors.find(s => s.$type === 'community.lexicon.annotation.annotation#textPositionSelector');\n \n const selectorsToTry = [quoteSelector, positionSelector].filter(Boolean);\n \n for (const selector of selectorsToTry) {\n let range: Range | null = null;\n \n console.log('[synthesis] Trying selector type:', selector.$type);\n \n switch (selector.$type) {\n case 'community.lexicon.annotation.annotation#textPositionSelector':\n range = matchTextPositionSelector(selector as TextPositionSelector, container);\n break;\n case 'community.lexicon.annotation.annotation#textQuoteSelector':\n range = matchTextQuoteSelector(selector as TextQuoteSelector, container);\n break;\n }\n \n if (range) {\n console.log('[synthesis] Successfully matched with', selector.$type);\n return range;\n }\n }\n \n console.warn('[synthesis] Could not match any selector');\n return null;\n}\n\nfunction matchTextPositionSelector(\n selector: TextPositionSelector,\n container: HTMLElement\n): Range | null {\n try {\n return textPosition.toRange(container, selector);\n } catch (e) {\n console.warn('TextPositionSelector match failed:', e);\n return null;\n }\n}\n\nfunction matchTextQuoteSelector(\n selector: TextQuoteSelector,\n container: HTMLElement\n): Range | null {\n try {\n return textQuote.toRange(container, selector);\n } catch (e) {\n console.warn('TextQuoteSelector match failed:', e);\n return null;\n }\n}\n","import type { Annotation } from '../types/annotation';\n\nlet currentPopover: HTMLElement | null = null;\n\nexport function showAnnotationPopover(\n annotation: Annotation,\n targetElement: HTMLElement,\n onSave: (updatedAnnotation: Annotation) => void,\n onDelete: () => void\n) {\n // Remove existing popover\n hidePopover();\n\n const popover = document.createElement('div');\n popover.className = 'synthesis-popover';\n popover.style.cssText = `\n position: absolute;\n z-index: 999999;\n background: white;\n border: 1px solid #ccc;\n border-radius: 8px;\n padding: 12px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n min-width: 300px;\n max-width: 400px;\n `;\n\n const rect = targetElement.getBoundingClientRect();\n popover.style.left = `${rect.left + window.scrollX}px`;\n popover.style.top = `${rect.bottom + window.scrollY + 5}px`;\n\n const quote = annotation.target[0]?.selector?.find((s: any) => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector');\n const quotedText = quote?.exact || '';\n\n popover.innerHTML = `\n <div style=\"margin-bottom: 8px; font-size: 13px; color: #666; font-style: italic; border-left: 3px solid #0085ff; padding-left: 8px;\">\n ${quotedText}\n </div>\n <div style=\"padding: 8px 0; font-size: 14px; color: #333;\">\n ${annotation.body || '<em style=\"color: #999;\">No note</em>'}\n </div>\n `;\n\n document.body.appendChild(popover);\n currentPopover = popover;\n\n // Close on click outside\n setTimeout(() => {\n document.addEventListener('click', handleClickOutside);\n }, 0);\n\n // Stop propagation on popover clicks\n popover.addEventListener('click', (e) => {\n e.stopPropagation();\n });\n}\n\nfunction handleClickOutside() {\n hidePopover();\n}\n\nexport function hidePopover() {\n if (currentPopover) {\n currentPopover.remove();\n currentPopover = null;\n document.removeEventListener('click', handleClickOutside);\n }\n}\n","// TextRange and TextPosition utilities\n// Adapted from Hypothesis client (BSD/MIT licensed)\n// https://github.com/hypothesis/client/blob/main/src/annotator/anchoring/text-range.ts\n\nfunction nodeTextLength(node: Node): number {\n switch (node.nodeType) {\n case Node.ELEMENT_NODE:\n case Node.TEXT_NODE:\n return node.textContent?.length ?? 0;\n default:\n return 0;\n }\n}\n\nfunction previousSiblingsTextLength(node: Node): number {\n let sibling = node.previousSibling;\n let length = 0;\n while (sibling) {\n length += nodeTextLength(sibling);\n sibling = sibling.previousSibling;\n }\n return length;\n}\n\nexport class TextPosition {\n public element: Element;\n public offset: number;\n\n constructor(element: Element, offset: number) {\n if (offset < 0) {\n throw new Error('Offset is invalid');\n }\n this.element = element;\n this.offset = offset;\n }\n\n static fromPoint(node: Node, offset: number): TextPosition {\n switch (node.nodeType) {\n case Node.TEXT_NODE: {\n if (!node.parentElement) {\n throw new Error('Text node has no parent');\n }\n const textOffset = previousSiblingsTextLength(node) + offset;\n return new TextPosition(node.parentElement, textOffset);\n }\n case Node.ELEMENT_NODE: {\n let textOffset = 0;\n for (let i = 0; i < offset; i++) {\n textOffset += nodeTextLength(node.childNodes[i]);\n }\n return new TextPosition(node as Element, textOffset);\n }\n default:\n throw new Error('Node is not an element or text node');\n }\n }\n\n relativeTo(parent: Element): TextPosition {\n if (!parent.contains(this.element)) {\n throw new Error('Parent is not an ancestor of current element');\n }\n\n let el = this.element;\n let offset = this.offset;\n while (el !== parent) {\n offset += previousSiblingsTextLength(el);\n el = el.parentElement!;\n }\n\n return new TextPosition(el, offset);\n }\n\n resolve(): { node: Text; offset: number } {\n const result = resolveOffsets(this.element, this.offset);\n if (result.length === 0) {\n throw new RangeError('Offset exceeds text length');\n }\n return result[0];\n }\n}\n\nfunction resolveOffsets(\n element: Element,\n ...offsets: number[]\n): Array<{ node: Text; offset: number }> {\n let nextOffset = offsets.shift();\n const nodeIter = element.ownerDocument.createNodeIterator(\n element,\n NodeFilter.SHOW_TEXT\n );\n const results: Array<{ node: Text; offset: number }> = [];\n\n let currentNode = nodeIter.nextNode() as Text | null;\n let textNode: Text | null = null;\n let length = 0;\n\n while (nextOffset !== undefined && currentNode) {\n textNode = currentNode;\n if (length + textNode.data.length > nextOffset) {\n results.push({ node: textNode, offset: nextOffset - length });\n nextOffset = offsets.shift();\n } else {\n currentNode = nodeIter.nextNode() as Text | null;\n length += textNode.data.length;\n }\n }\n\n // Boundary case\n while (nextOffset !== undefined && textNode && length === nextOffset) {\n results.push({ node: textNode, offset: textNode.data.length });\n nextOffset = offsets.shift();\n }\n\n if (nextOffset !== undefined) {\n throw new RangeError('Offset exceeds text length');\n }\n\n return results;\n}\n\nexport class TextRange {\n public start: TextPosition;\n public end: TextPosition;\n\n constructor(start: TextPosition, end: TextPosition) {\n this.start = start;\n this.end = end;\n }\n\n static fromRange(range: Range): TextRange {\n const start = TextPosition.fromPoint(\n range.startContainer,\n range.startOffset\n );\n const end = TextPosition.fromPoint(range.endContainer, range.endOffset);\n return new TextRange(start, end);\n }\n\n toRange(): Range {\n let start;\n let end;\n\n if (\n this.start.element === this.end.element &&\n this.start.offset <= this.end.offset\n ) {\n const resolved = resolveOffsets(\n this.start.element,\n this.start.offset,\n this.end.offset\n );\n start = resolved[0];\n end = resolved[1];\n } else {\n start = this.start.resolve();\n end = this.end.resolve();\n }\n\n const range = new Range();\n range.setStart(start.node, start.offset);\n range.setEnd(end.node, end.offset);\n return range;\n }\n}\n","// Range utility functions\n// Adapted from Hypothesis client (BSD/MIT licensed)\n// https://github.com/hypothesis/client/blob/main/src/annotator/range-util.ts\n\nexport function isNodeInRange(range: Range, node: Node): boolean {\n try {\n const length = node.nodeValue?.length ?? node.childNodes.length;\n return (\n range.comparePoint(node, 0) <= 0 &&\n range.comparePoint(node, length) >= 0\n );\n } catch {\n return false;\n }\n}\n\nexport function wholeTextNodesInRange(range: Range): Text[] {\n if (range.collapsed) {\n return [];\n }\n\n let root = range.commonAncestorContainer as Node | null;\n if (root && root.nodeType !== Node.ELEMENT_NODE) {\n root = root.parentElement;\n }\n if (!root) {\n return [];\n }\n\n const textNodes: Text[] = [];\n const nodeIter = root.ownerDocument!.createNodeIterator(\n root,\n NodeFilter.SHOW_TEXT\n );\n \n let node;\n while ((node = nodeIter.nextNode())) {\n if (!isNodeInRange(range, node)) {\n continue;\n }\n const text = node as Text;\n\n if (text === range.startContainer && range.startOffset > 0) {\n text.splitText(range.startOffset);\n continue;\n }\n\n if (text === range.endContainer && range.endOffset < text.data.length) {\n text.splitText(range.endOffset);\n }\n\n textNodes.push(text);\n }\n\n return textNodes;\n}\n","import { findAnnotationRange } from '../selectors/match';\nimport { showAnnotationPopover } from './popover';\nimport type { Annotation } from '../../types';\nimport { TextRange } from './text-range';\nimport { wholeTextNodesInRange } from './range-util';\n\nimport type { StorageAdapter } from '../../storage/adapter';\n\nexport function applyHighlights(annotations: Annotation[], storage: StorageAdapter, container?: HTMLElement) {\n const root = container || document.querySelector('main') || document.querySelector('article') || document.body;\n \n clearHighlights(root);\n \n console.log(`[synthesis] Applying ${annotations.length} highlights`);\n \n // Convert all ranges to TextRange immediately (immune to DOM mutations)\n const textRangesWithAnnotations: Array<{ textRange: TextRange; annotation: Annotation }> = [];\n \n annotations.forEach((annotation, index) => {\n console.log(`[synthesis] Finding range for annotation ${index + 1}/${annotations.length}`);\n const range = findAnnotationRange(annotation, root);\n \n if (!range) {\n console.warn('[synthesis] Could not anchor annotation:', annotation);\n return;\n }\n \n // Check if range is inside a script/style tag\n let node = range.commonAncestorContainer;\n while (node && node !== container) {\n if (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE') {\n console.warn('[synthesis] Skipping highlight inside', node.nodeName, 'tag');\n return;\n }\n node = node.parentNode as HTMLElement;\n }\n \n // Convert to TextRange immediately - immune to DOM mutations\n const textRange = TextRange.fromRange(range);\n textRangesWithAnnotations.push({ textRange, annotation });\n });\n \n console.log(`[synthesis] Found ${textRangesWithAnnotations.length} valid annotations`);\n \n // Apply highlights in any order - TextRange protects us from invalidation\n textRangesWithAnnotations.forEach(({ textRange, annotation }, index) => {\n console.log(`[synthesis] Applying highlight ${index + 1}/${textRangesWithAnnotations.length}`);\n try {\n // Convert TextRange back to fresh DOM Range\n const range = textRange.toRange();\n highlightRange(range, annotation, storage);\n console.log('[synthesis] Successfully highlighted annotation');\n } catch (error) {\n console.warn('[synthesis] Failed to highlight range:', error);\n }\n });\n \n console.log('[synthesis] Finished applying highlights');\n}\n\nfunction highlightRange(range: Range, annotation: Annotation, storage: StorageAdapter) {\n console.log('[synthesis] Highlighting range:', range.toString().substring(0, 50));\n \n const uri = annotation.uri;\n const createdAt = annotation.value?.createdAt || (annotation as any).createdAt;\n const annotationId = uri || createdAt;\n\n const highlight = document.createElement('span');\n highlight.className = 'synthesis-highlight';\n highlight.dataset.annotationId = annotationId;\n highlight.style.cssText = `\n background-color: rgba(255, 235, 59, 0.6) !important;\n cursor: pointer !important;\n transition: background-color 0.2s !important;\n `;\n \n // Hover effect\n highlight.addEventListener('mouseenter', () => {\n highlight.style.cssText = `\n background-color: rgba(255, 235, 59, 0.8) !important;\n cursor: pointer !important;\n transition: background-color 0.2s !important;\n `;\n });\n \n highlight.addEventListener('mouseleave', () => {\n highlight.style.cssText = `\n background-color: rgba(255, 235, 59, 0.6) !important;\n cursor: pointer !important;\n transition: background-color 0.2s !important;\n `;\n });\n \n // Click to show annotation popover\n highlight.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n console.log('[synthesis] Clicked annotation:', annotation);\n \n showAnnotationPopover(\n annotation,\n highlight,\n // On save\n async (updatedAnnotation) => {\n const stored = await storage.get('annotations');\n const annotations = stored.annotations || stored || []; // Handle both {annotations: [...]} and [...]\n const index = annotations.findIndex((a: Annotation) => {\n const aCreated = a.value?.createdAt || (a as any).createdAt;\n const uCreated = updatedAnnotation.value?.createdAt || (updatedAnnotation as any).createdAt;\n return aCreated === uCreated;\n });\n if (index !== -1) {\n annotations[index] = updatedAnnotation;\n await storage.set('annotations', annotations);\n console.log('[synthesis] Annotation updated:', updatedAnnotation);\n \n // Update the annotation object in memory so next click shows updated note\n Object.assign(annotation, updatedAnnotation);\n }\n },\n // On delete\n async () => {\n const stored = await storage.get('annotations');\n const annotations = stored.annotations || stored || []; // Handle both {annotations: [...]} and [...]\n const filtered = annotations.filter((a: Annotation) => {\n const aCreated = a.value?.createdAt || (a as any).createdAt;\n const tCreated = annotation.value?.createdAt || (annotation as any).createdAt;\n return aCreated !== tCreated;\n });\n await storage.set('annotations', filtered);\n console.log('[synthesis] Annotation deleted');\n \n // Remove highlight\n highlight.remove();\n }\n );\n });\n \n // Get whole text nodes (splits at boundaries)\n try {\n const textNodes = wholeTextNodesInRange(range);\n console.log('[synthesis] Found', textNodes.length, 'text nodes to highlight');\n \n if (textNodes.length === 0) {\n console.warn('[synthesis] No text nodes found in range');\n return;\n }\n \n // Wrap each text node in a highlight span\n textNodes.forEach((textNode) => {\n const uri = annotation.uri;\n const createdAt = annotation.value?.createdAt || (annotation as any).createdAt;\n const annotationId = uri || createdAt;\n\n const span = document.createElement('span');\n span.className = 'synthesis-highlight';\n span.dataset.annotationId = annotationId;\n span.style.cssText = highlight.style.cssText;\n \n // Copy event listeners\n span.addEventListener('mouseenter', () => {\n const allSpans = document.querySelectorAll(\n `.synthesis-highlight[data-annotation-id=\"${annotationId}\"]`\n );\n allSpans.forEach(s => {\n (s as HTMLElement).style.cssText = `\n background-color: rgba(255, 235, 59, 0.8) !important;\n cursor: pointer !important;\n transition: background-color 0.2s !important;\n `;\n });\n });\n \n span.addEventListener('mouseleave', () => {\n const allSpans = document.querySelectorAll(\n `.synthesis-highlight[data-annotation-id=\"${annotationId}\"]`\n );\n allSpans.forEach(s => {\n (s as HTMLElement).style.cssText = `\n background-color: rgba(255, 235, 59, 0.6) !important;\n cursor: pointer !important;\n transition: background-color 0.2s !important;\n `;\n });\n });\n \n span.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n console.log('[synthesis] Clicked annotation:', annotation);\n \n showAnnotationPopover(\n annotation,\n span,\n async (updatedAnnotation) => {\n const stored = await storage.get('annotations');\n const annotations = stored.annotations || stored || []; // Handle both {annotations: [...]} and [...]\n const idx = annotations.findIndex((a: Annotation) => {\n const aCreated = a.value?.createdAt || (a as any).createdAt;\n const uCreated = updatedAnnotation.value?.createdAt || (updatedAnnotation as any).createdAt;\n return aCreated === uCreated;\n });\n if (idx !== -1) {\n annotations[idx] = updatedAnnotation;\n await storage.set('annotations', annotations);\n console.log('[synthesis] Annotation updated:', updatedAnnotation);\n Object.assign(annotation, updatedAnnotation);\n }\n },\n async () => {\n const stored = await storage.get('annotations');\n const annotations = stored.annotations || stored || []; // Handle both {annotations: [...]} and [...]\n const filtered = annotations.filter((a: Annotation) => {\n const aCreated = a.value?.createdAt || (a as any).createdAt;\n const tCreated = annotation.value?.createdAt || (annotation as any).createdAt;\n return aCreated !== tCreated;\n });\n await storage.set('annotations', filtered);\n console.log('[synthesis] Annotation deleted');\n \n // Remove all highlight spans for this annotation\n const allSpans = document.querySelectorAll(\n `.synthesis-highlight[data-annotation-id=\"${annotationId}\"]`\n );\n allSpans.forEach(s => s.remove());\n }\n );\n });\n \n // Wrap the entire text node\n const parent = textNode.parentNode;\n if (parent) {\n parent.replaceChild(span, textNode);\n span.appendChild(textNode);\n }\n });\n \n console.log('[synthesis] Successfully applied highlight across', textNodes.length, 'text nodes');\n } catch (error) {\n console.error('[synthesis] Failed to apply highlight:', error);\n }\n}\n\nexport function clearHighlights(container: HTMLElement = document.body) {\n const highlights = container.querySelectorAll('.synthesis-highlight');\n console.log(`[synthesis] Clearing ${highlights.length} highlights`);\n \n highlights.forEach(highlight => {\n const parent = highlight.parentNode;\n if (parent) {\n while (highlight.firstChild) {\n parent.insertBefore(highlight.firstChild, highlight);\n }\n parent.removeChild(highlight);\n parent.normalize();\n }\n });\n}\n","// Base content script logic shared between extension and proxy\nimport type { StorageAdapter } from '../storage/adapter';\nimport type { Annotation } from '../types';\nimport { normalizeUrl } from '../utils';\n\nexport interface ContentScriptAdapter {\n\tstorage: StorageAdapter;\n\tgetCurrentUrl: () => string;\n\tapplyHighlights: (annotations: Annotation[], storage: StorageAdapter) => void;\n\tclearHighlights: () => void;\n\tgenerateSelectors: (selection: Selection, root: Element) => any[];\n\tnotifySelectionChange: (selection: { text: string; selectors: any[] } | null) => void;\n}\n\nexport abstract class BaseContentScript {\n\tprotected adapter: ContentScriptAdapter;\n\tprotected currentUrl: string;\n\tprotected currentSelection: { text: string; selectors: any[] } | null = null;\n\tprivate renderTimeout: any;\n\n\tconstructor(adapter: ContentScriptAdapter) {\n\t\tthis.adapter = adapter;\n\t\tthis.currentUrl = normalizeUrl(adapter.getCurrentUrl());\n\t}\n\n\tasync start(): Promise<void> {\n\t\tconsole.log('[content] BaseContentScript starting...');\n\n\t\t// Initial render\n\t\tawait this.loadAndRenderHighlights();\n\n\t\t// Listen for storage changes\n\t\tthis.adapter.storage.onChange(({ key }) => {\n\t\t\tif (key === 'annotations') {\n\t\t\t\tconsole.log('[content] Annotations cache updated, re-rendering');\n\t\t\t\tthis.loadAndRenderHighlights();\n\t\t\t}\n\t\t});\n\n\t\t// Track text selection\n\t\tthis.setupSelectionTracking();\n\n\t\t// Watch for DOM changes (SPAs/lazy loading)\n\t\tthis.setupDomObserver();\n\t}\n\n\tprotected async loadAndRenderHighlights(): Promise<void> {\n\t\tthis.adapter.clearHighlights();\n\n\t\tconst url = normalizeUrl(this.adapter.getCurrentUrl());\n\t\tconst allAnnotations = await this.adapter.storage.get('annotations') || [];\n\n\t\tconst pageAnnotations = allAnnotations.filter(\n\t\t\t(ann: Annotation) => {\n if (!ann || !ann.value || !ann.value.target) {\n return false;\n }\n return normalizeUrl(ann.value.target.url) === url;\n }\n\t\t);\n\n\t\tconsole.log(`[content] Found ${pageAnnotations.length} annotations in cache for ${url}`);\n\n\t\tif (pageAnnotations.length > 0) {\n\t\t\tthis.adapter.applyHighlights(pageAnnotations, this.adapter.storage);\n\t\t}\n\t}\n\n\tprotected handleUrlChange() {\n\t\tconst newUrl = normalizeUrl(this.adapter.getCurrentUrl());\n\t\tif (newUrl !== this.currentUrl) {\n\t\t\tconsole.log('[content] URL changed:', this.currentUrl, '→', newUrl);\n\t\t\tthis.currentUrl = newUrl;\n\t\t\tthis.currentSelection = null;\n\t\t\tthis.loadAndRenderHighlights();\n\t\t}\n\t}\n\n\tprivate setupSelectionTracking() {\n\t\tdocument.addEventListener('mouseup', (e) => {\n\t\t\t// AMPDO: The below comment is nonesense, we need to sort it out\n\n\t\t\t// Don't handle if clicking inside mobile UI elements (handled by subclass or UI script)\n\t\t\t// But we can't easily know that here without tighter coupling.\n\t\t\t// For now, we assume the adapter or subclass handles UI specific checks if needed,\n\t\t\t// or we just let the selection logic run and it notifies the adapter.\n\n\t\t\t// Actually, the Proxy client has specific logic to ignore clicks in its own UI.\n\t\t\t// We might want to allow the subclass to override or intercept this.\n\t\t\t// But standard selection API usually works fine.\n\n\t\t\tconst selection = window.getSelection();\n\t\t\tif (selection && selection.toString().trim().length > 0) {\n\t\t\t\tconst text = selection.toString().trim();\n\t\t\t\t// Heuristic for root element - could be configurable\n\t\t\t\tconst root = document.querySelector('main') || document.querySelector('article') || document.body;\n\n\t\t\t\ttry {\n\t\t\t\t\tconst selectors = this.adapter.generateSelectors(selection, root);\n\t\t\t\t\tthis.currentSelection = { text, selectors };\n\t\t\t\t\tconsole.log('[content] Text selected:', text);\n\t\t\t\t\tthis.adapter.notifySelectionChange(this.currentSelection);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error('[content] Failed to generate selectors:', err);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.currentSelection) {\n\t\t\t\t\tthis.currentSelection = null;\n\t\t\t\t\tthis.adapter.notifySelectionChange(null);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setupDomObserver() {\n\t\tconst observer = new MutationObserver((mutations) => {\n\t\t\tlet shouldRender = false;\n\t\t\tfor (const mutation of mutations) {\n\t\t\t\tif (mutation.addedNodes.length > 0 || mutation.type === 'characterData') {\n\t\t\t\t\tshouldRender = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (shouldRender) {\n\t\t\t\tif (this.renderTimeout) clearTimeout(this.renderTimeout);\n\t\t\t\tthis.renderTimeout = setTimeout(() => {\n\t\t\t\t\tconsole.log('[content] DOM changed, re-rendering highlights');\n\t\t\t\t\tthis.loadAndRenderHighlights();\n\t\t\t\t}, 500);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(document.body, {\n\t\t\tchildList: true,\n\t\t\tsubtree: true,\n\t\t\tcharacterData: true\n\t\t});\n\t}\n}\n","// Proxy content script\nimport type { StorageAdapter } from '../storage/adapter';\nimport type { Annotation } from '../types';\nimport { normalizeUrl } from '../utils';\nimport { BaseContentScript, type ContentScriptAdapter } from './base';\n\nexport interface ContentScriptOptions {\n\tstorage: StorageAdapter;\n\tgetCurrentUrl: () => string;\n\tapplyHighlights: (annotations: Annotation[], storage: StorageAdapter) => void;\n\tclearHighlights: () => void;\n\tgenerateSelectors: (selection: Selection, root: Element) => any[];\n onSelectionChange?: (selection: { text: string; selectors: any[] } | null) => void;\n}\n\n// AMPDO: Call this `ProxyContentScript`\nexport class ContentScript extends BaseContentScript {\n\tconstructor(options: ContentScriptOptions) {\n\t\tconst adapter: ContentScriptAdapter = {\n\t\t\tstorage: options.storage,\n\t\t\tgetCurrentUrl: options.getCurrentUrl,\n\t\t\tapplyHighlights: options.applyHighlights,\n\t\t\tclearHighlights: options.clearHighlights,\n\t\t\tgenerateSelectors: options.generateSelectors || ((_s, _r) => []),\n\t\t\tnotifySelectionChange: (selection) => {\n if (options.onSelectionChange) {\n options.onSelectionChange(selection);\n }\n\t\t\t}\n\t\t};\n\t\tsuper(adapter);\n\t}\n}\n","export function createMobileAnnotateButton(x: number, y: number, onClick: () => void): HTMLElement {\n const btn = document.createElement('button');\n btn.textContent = 'Annotate';\n btn.className = 'seams-mobile-annotate-btn';\n Object.assign(btn.style, {\n position: 'fixed',\n top: `${y + 20}px`,\n left: `${x}px`,\n transform: 'translateX(-50%)',\n zIndex: '2147483647',\n padding: '8px 16px',\n background: '#2d5016', // Forest green\n color: 'white',\n border: 'none',\n borderRadius: '20px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n fontSize: '14px',\n fontWeight: '600',\n cursor: 'pointer',\n });\n \n // Use mousedown to prevent the document mouseup handler from removing the button\n // before the click event fires\n btn.addEventListener('mousedown', (e) => {\n e.stopPropagation();\n });\n\n btn.addEventListener('mouseup', (e) => {\n e.stopPropagation();\n });\n\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick();\n });\n \n document.body.appendChild(btn);\n return btn;\n}\n\nexport function createMobileSidebarToggle(onClick: () => void): HTMLElement {\n const btn = document.createElement('button');\n btn.className = 'seams-mobile-toggle-btn';\n btn.textContent = '<<'; // Default state (closed -> open)\n Object.assign(btn.style, {\n position: 'fixed',\n top: '10px',\n right: '10px',\n zIndex: '2147483647',\n width: '40px',\n height: '40px',\n background: 'white',\n color: '#2d5016', // Forest green text\n border: '1px solid #ddd',\n borderRadius: '50%',\n boxShadow: '0 2px 8px rgba(0,0,0,0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '14px',\n fontWeight: 'bold',\n cursor: 'pointer',\n });\n\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n onClick();\n });\n\n document.body.appendChild(btn);\n return btn;\n}\n\nexport function createMobileAnnotationModal(\n text: string, \n onSave: (body: string) => void, \n onCancel: () => void\n): HTMLElement {\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n background: 'rgba(0,0,0,0.5)',\n zIndex: '2147483647',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '20px',\n boxSizing: 'border-box',\n });\n\n const modal = document.createElement('div');\n Object.assign(modal.style, {\n background: 'white',\n borderRadius: '12px',\n width: '100%',\n maxWidth: '400px',\n padding: '20px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n });\n\n const quote = document.createElement('blockquote');\n quote.textContent = text;\n Object.assign(quote.style, {\n borderLeft: '3px solid #2d5016', // Forest green\n margin: '0',\n paddingLeft: '10px',\n color: '#666',\n fontSize: '14px',\n maxHeight: '100px',\n overflowY: 'auto',\n });\n\n const textarea = document.createElement('textarea');\n textarea.placeholder = 'Add your note...';\n Object.assign(textarea.style, {\n width: '100%',\n height: '100px',\n padding: '10px',\n border: '1px solid #ddd',\n borderRadius: '8px',\n resize: 'none',\n fontFamily: 'inherit',\n boxSizing: 'border-box',\n });\n\n const buttons = document.createElement('div');\n Object.assign(buttons.style, {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n });\n\n const cancelBtn = document.createElement('button');\n cancelBtn.textContent = 'Cancel';\n Object.assign(cancelBtn.style, {\n padding: '8px 16px',\n background: 'transparent',\n border: '1px solid #ddd',\n borderRadius: '6px',\n cursor: 'pointer',\n color: '#666',\n });\n cancelBtn.onclick = () => {\n document.body.removeChild(overlay);\n onCancel();\n };\n\n const saveBtn = document.createElement('button');\n saveBtn.textContent = 'Save';\n Object.assign(saveBtn.style, {\n padding: '8px 16px',\n background: '#2d5016', // Forest green\n color: 'white',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n });\n saveBtn.onclick = () => {\n const body = textarea.value.trim();\n if (body) {\n onSave(body);\n document.body.removeChild(overlay);\n }\n };\n\n buttons.appendChild(cancelBtn);\n buttons.appendChild(saveBtn);\n\n modal.appendChild(quote);\n modal.appendChild(textarea);\n modal.appendChild(buttons);\n overlay.appendChild(modal);\n\n document.body.appendChild(overlay);\n \n // Focus textarea\n setTimeout(() => textarea.focus(), 50);\n\n return overlay;\n}\n","import { createMobileAnnotateButton, createMobileAnnotationModal } from './mobile';\n\nexport interface AnnotationUIOptions {\n onAnnotate: (data: { text: string; selectors: any[]; body?: string }) => void;\n isMobile: boolean;\n}\n\nexport class AnnotationUIManager {\n private activeBtn: HTMLElement | null = null;\n\n constructor(private options: AnnotationUIOptions) {}\n\n showButton(rect: DOMRect, text: string, selectors: any[]) {\n this.removeButton();\n\n // Use a timeout to ensure UI settles and to decouple from the event loop slightly\n setTimeout(() => {\n this.activeBtn = createMobileAnnotateButton(\n rect.left + rect.width / 2,\n rect.top,\n () => {\n if (this.options.isMobile) {\n createMobileAnnotationModal(\n text,\n (body) => {\n this.options.onAnnotate({ text, selectors, body });\n },\n () => {\n // Cancelled\n }\n );\n } else {\n // Desktop - trigger annotate (opens sidebar or focuses it)\n this.options.onAnnotate({ text, selectors });\n }\n this.removeButton();\n }\n );\n }, 0);\n }\n\n removeButton() {\n if (this.activeBtn) {\n this.activeBtn.remove();\n this.activeBtn = null;\n }\n }\n}\n","// Via proxy client - injects sidebar iframe and handles page interaction\nimport { WebStorageAdapter, BackgroundWorker, ContentScript, applyHighlights, clearHighlights, generateSelectors, createMobileAnnotateButton, createMobileSidebarToggle, createMobileAnnotationModal, AnnotationUIManager } from '@seams/core';\nimport type { Annotation } from '@seams/core';\n\nconsole.log('🔬 Seams via client loaded!');\n\n// Initialize web storage adapter\nconst storage = new WebStorageAdapter();\n\nconst SIDEBAR_ID = 'seams-sidebar-iframe';\nconst SIDEBAR_WIDTH = 400;\nconst IS_MOBILE = window.innerWidth <= 768;\n\n// Initialize UI Manager\nconst uiManager = new AnnotationUIManager({\n isMobile: IS_MOBILE,\n onAnnotate: (data) => {\n const iframe = document.getElementById(SIDEBAR_ID) as HTMLIFrameElement;\n \n if (IS_MOBILE) {\n // Mobile: Show Modal (already handled by UIManager internally calls this callback with body)\n if (data.body && iframe && iframe.contentWindow) {\n iframe.contentWindow.postMessage({\n type: 'SEAMS_CREATE_ANNOTATION',\n payload: {\n text: data.text,\n selectors: data.selectors,\n body: data.body\n }\n }, '*');\n }\n } else {\n // Desktop: Send to sidebar\n if (iframe && iframe.contentWindow) {\n iframe.contentWindow.postMessage({\n type: 'SEAMS_TEXT_SELECTED',\n payload: {\n text: data.text,\n selectors: data.selectors\n }\n }, '*');\n }\n }\n }\n});\n\n// Initialize content script only (sidebar handles fetching via BackgroundWorker)\nconst contentScript = new ContentScript({\n\tstorage,\n\tgetCurrentUrl: getActualUrl,\n\tapplyHighlights,\n\tclearHighlights,\n\tgenerateSelectors,\n onSelectionChange: (selection) => {\n const iframe = document.getElementById(SIDEBAR_ID) as HTMLIFrameElement;\n \n if (selection && selection.text) {\n // Calculate selection rect\n const domSelection = window.getSelection();\n if (domSelection && domSelection.rangeCount > 0) {\n const range = domSelection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n \n uiManager.showButton(rect, selection.text, selection.selectors);\n }\n } else {\n uiManager.removeButton();\n // Clear sidebar selection\n if (iframe && iframe.contentWindow) {\n iframe.contentWindow.postMessage({\n type: 'SEAMS_TEXT_SELECTED',\n payload: null\n }, '*');\n }\n }\n }\n});\n\nfunction injectSidebar() {\n\t// Don't inject if already present\n\tif (document.getElementById(SIDEBAR_ID)) {\n\t\tconsole.log('[seams-via] Sidebar already injected');\n\t\treturn;\n\t}\n\n\t// Create iframe for sidebar\n\tconst iframe = document.createElement('iframe');\n\tiframe.id = SIDEBAR_ID;\n\t// Use relative URL to load through Caddy proxy (same origin for CSP)\n\tiframe.src = '/static/seams-sidebar.html';\n\tiframe.style.cssText = `\n position: fixed;\n top: 0;\n right: 0;\n width: ${SIDEBAR_WIDTH}px;\n height: 100vh;\n border: none;\n border-left: 1px solid #ccc;\n z-index: 2147483647;\n background: white;\n box-shadow: -2px 0 8px rgba(0,0,0,0.1);\n `;\n\n\tdocument.body.appendChild(iframe);\n\tconsole.log('[seams-via] Sidebar injected');\n\n\t// Adjust page content to avoid overlap (only on desktop)\n\tif (!IS_MOBILE) {\n\t\tdocument.body.style.marginRight = `${SIDEBAR_WIDTH}px`;\n\t} else {\n\t\tiframe.style.width = '100%';\n\t\tiframe.style.display = 'none'; // Hidden by default on mobile\n\t}\n\n\t// When iframe loads, send the URL\n\tiframe.onload = () => {\n\t\tconsole.log('[seams-via] Sidebar iframe loaded, sending URL');\n\t\tiframe.contentWindow?.postMessage({\n\t\t\ttype: 'SEAMS_PAGE_URL',\n\t\t\turl: getActualUrl(),\n\t\t}, '*');\n\t};\n\n\t// Add toggle button for mobile\n\tif (IS_MOBILE) {\n\t\tconst toggleBtn = createMobileSidebarToggle(() => {\n\t\t\tconst isHidden = iframe.style.display === 'none';\n\t\t\tiframe.style.display = isHidden ? 'block' : 'none';\n\t\t\ttoggleBtn.textContent = isHidden ? '>>' : '<<';\n\t\t});\n\t}\n}\n\nfunction normalizeUrl(url: string): string {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\t// Remove fragment\n\t\tparsed.hash = '';\n\t\t// Remove trailing slash\n\t\tlet path = parsed.pathname;\n\t\tif (path.endsWith('/') && path !== '/') {\n\t\t\tpath = path.slice(0, -1);\n\t\t}\n\t\tparsed.pathname = path;\n\t\treturn parsed.toString();\n\t} catch {\n\t\treturn url;\n\t}\n}\n\nfunction getActualUrl(): string {\n\t// Extract actual URL from pywb proxy URL\n\t// URL format: http://localhost:8081/proxy/https://example.com\n\tconst proxyUrl = window.location.href;\n\n\t// Try to get from wbinfo (pywb metadata)\n\tconst wbinfo = (window as any).wbinfo;\n\tif (wbinfo && wbinfo.url) {\n\t\tconst rawUrl = wbinfo.url;\n\t\tconst normalized = normalizeUrl(rawUrl);\n\t\tconsole.log('[seams-via] Got URL from wbinfo:', rawUrl);\n\t\tconsole.log('[seams-via] Normalized URL:', normalized);\n\t\treturn normalized;\n\t}\n\n\t// Fallback: parse from proxy URL\n\tconst match = proxyUrl.match(/\\/proxy\\/(https?:\\/\\/.+)/);\n\tif (match) {\n\t\tconst rawUrl = match[1];\n\t\tconst normalized = normalizeUrl(rawUrl);\n\t\tconsole.log('[seams-via] Extracted URL from proxy path:', rawUrl);\n\t\tconsole.log('[seams-via] Normalized URL:', normalized);\n\t\treturn normalized;\n\t}\n\n\tconsole.warn('[seams-via] Could not extract actual URL, using:', proxyUrl);\n\treturn proxyUrl;\n}\n\n// Initialize\nfunction init() {\n\tif (document.body) {\n\t\tinjectSidebar();\n\t} else {\n\t\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\t\tinjectSidebar();\n\t\t});\n\t}\n\n\t// Start content script (loads and renders annotations from localStorage)\n\tcontentScript.start();\n}\n\ninit();\n\n// Listen for messages from sidebar\n// window.addEventListener('message', (event) => { ... });\n"],"names":["normalizeUrl","url","parsed","path","domAnchorTextQuote","require$$0","domAnchorTextPosition","generateSelectors","selection","root","range","container","selectors","textQuoteSelector","generateTextQuoteSelector","textPositionSelector","generateTextPositionSelector","selector","textQuote.fromRange","error","textPosition.fromRange","findAnnotationRange","annotation","_b","_a","_c","quoteSelector","s","positionSelector","selectorsToTry","matchTextPositionSelector","matchTextQuoteSelector","textPosition.toRange","textQuote.toRange","currentPopover","showAnnotationPopover","targetElement","onSave","onDelete","hidePopover","popover","rect","quote","quotedText","handleClickOutside","e","nodeTextLength","node","previousSiblingsTextLength","sibling","length","TextPosition","element","offset","textOffset","i","parent","el","result","resolveOffsets","offsets","nextOffset","nodeIter","results","currentNode","textNode","TextRange","start","end","resolved","isNodeInRange","wholeTextNodesInRange","textNodes","text","applyHighlights","annotations","storage","clearHighlights","textRangesWithAnnotations","index","textRange","highlightRange","uri","createdAt","annotationId","highlight","span","updatedAnnotation","stored","idx","a","aCreated","uCreated","filtered","tCreated","highlights","BaseContentScript","adapter","key","pageAnnotations","ann","newUrl","err","mutations","shouldRender","mutation","ContentScript","options","_s","_r","createMobileAnnotateButton","x","y","onClick","btn","createMobileSidebarToggle","createMobileAnnotationModal","onCancel","overlay","modal","textarea","buttons","cancelBtn","saveBtn","body","AnnotationUIManager","WebStorageAdapter","SIDEBAR_ID","SIDEBAR_WIDTH","IS_MOBILE","uiManager","data","iframe","contentScript","getActualUrl","domSelection","injectSidebar","toggleBtn","isHidden","proxyUrl","wbinfo","rawUrl","normalized","match","init"],"mappings":"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","x_google_ignoreList":[1,2]}
-2
proxy/static/static/seams-index.js
··· 1 - import"./assets/modulepreload-polyfill-B5Qt9EMX.js";import{r as h}from"./assets/index-kV7Brn54.js";h();const m="http://localhost:8080";let l=!1;const i=new Map,a=document.getElementById("annotations-feed"),u=document.getElementById("load-more");document.getElementById("load-more-btn");async function p(t){if(i.has(t))return i.get(t);try{const n=await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${t}`);if(!n.ok)throw new Error("Profile fetch failed");const e=(await n.json()).avatar||null;return i.set(t,e),e}catch(n){return console.error("Failed to fetch profile for",t,n),i.set(t,null),null}}async function y(t=20){if(!l){l=!0;try{const n=await fetch(`${m}/api/annotations?limit=${t}`);if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return(await n.json()).annotations||[]}catch(n){throw console.error("Failed to fetch annotations:",n),n}finally{l=!1}}}async function g(t,n=!1){var e,f;if(!a)return;if(n||(a.innerHTML=""),t.length===0&&!n){a.innerHTML='<div class="empty">No annotations yet. Install the browser extension to start annotating!</div>';return}const r=document.createDocumentFragment();for(const o of t){const s=(e=o.author)==null?void 0:e.did;if(s&&!((f=o.author)!=null&&f.avatar)){const d=await p(s);d&&(o.author||(o.author={did:s}),o.author.avatar=d)}const c=document.createElement("seams-annotation-card");c.annotation=o,c.comments=[],r.appendChild(c)}a.appendChild(r)}async function w(){if(a)try{a.innerHTML='<div class="loading">Tending the garden...</div>';const t=await y(20);await g(t),u&&(u.style.display="none")}catch(t){a.innerHTML='<div class="error">Failed to load annotations. Please try again later.</div>',console.error("Error loading annotations:",t)}}w(); 2 - //# sourceMappingURL=seams-index.js.map
-1
proxy/static/static/seams-index.js.map
··· 1 - {"version":3,"file":"seams-index.js","sources":["../../landing/landing.ts"],"sourcesContent":["import { registerComponents } from '../packages/core/src/components';\nimport type { SeamsAnnotationCard } from '../packages/core/src/components/annotation-card';\n\nregisterComponents();\n\nconst BACKEND_URL = import.meta.env.BACKEND_URL || (window as any).BACKEND_URL || '';\n\nlet isLoading = false;\nconst avatarCache = new Map<string, string | null>();\n\nconst feedContainer = document.getElementById('annotations-feed');\nconst loadMoreContainer = document.getElementById('load-more');\nconst loadMoreBtn = document.getElementById('load-more-btn');\n\n// Fetch actor profile (avatar) from Bluesky\nasync function fetchActorProfile(did: string) {\n if (avatarCache.has(did)) {\n return avatarCache.get(did);\n }\n\n try {\n const response = await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${did}`);\n if (!response.ok) {\n throw new Error('Profile fetch failed');\n }\n const profile = await response.json();\n const avatarUrl = profile.avatar || null;\n avatarCache.set(did, avatarUrl);\n return avatarUrl;\n } catch (error) {\n console.error('Failed to fetch profile for', did, error);\n avatarCache.set(did, null);\n return null;\n }\n}\n\n// Fetch annotations from backend\nasync function fetchAnnotations(limit = 20) {\n if (isLoading) return;\n isLoading = true;\n\n try {\n const response = await fetch(`${BACKEND_URL}/api/annotations?limit=${limit}`);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n return data.annotations || [];\n } catch (error) {\n console.error('Failed to fetch annotations:', error);\n throw error;\n } finally {\n isLoading = false;\n }\n}\n\n// Render annotations to the feed\nasync function renderAnnotations(annotations: any[], append = false) {\n if (!feedContainer) return;\n\n if (!append) {\n feedContainer.innerHTML = '';\n }\n\n if (annotations.length === 0 && !append) {\n feedContainer.innerHTML = '<div class=\"empty\">No annotations yet. Install the browser extension to start annotating!</div>';\n return;\n }\n\n const fragment = document.createDocumentFragment();\n for (const annotation of annotations) {\n // Fetch avatar if needed\n const did = annotation.author?.did;\n if (did && !annotation.author?.avatar) {\n const avatar = await fetchActorProfile(did);\n if (avatar) {\n if (!annotation.author) annotation.author = { did };\n annotation.author.avatar = avatar;\n }\n }\n\n const card = document.createElement('seams-annotation-card') as SeamsAnnotationCard;\n card.annotation = annotation;\n card.comments = []; // No comments on landing for now\n \n fragment.appendChild(card);\n }\n\n feedContainer.appendChild(fragment);\n}\n\n// Load initial annotations\nasync function loadInitialAnnotations() {\n if (!feedContainer) return;\n try {\n feedContainer.innerHTML = '<div class=\"loading\">Tending the garden...</div>';\n \n const annotations = await fetchAnnotations(20);\n \n await renderAnnotations(annotations);\n\n // Hide load more button for now (could implement pagination later)\n if (loadMoreContainer) loadMoreContainer.style.display = 'none';\n } catch (error) {\n feedContainer.innerHTML = `<div class=\"error\">Failed to load annotations. Please try again later.</div>`;\n console.error('Error loading annotations:', error);\n }\n}\n\n// Initialize\nloadInitialAnnotations();\n"],"names":["registerComponents","BACKEND_URL","isLoading","avatarCache","feedContainer","loadMoreContainer","fetchActorProfile","did","response","avatarUrl","error","fetchAnnotations","limit","renderAnnotations","annotations","append","fragment","annotation","_a","_b","avatar","card","loadInitialAnnotations"],"mappings":"mGAGAA,EAAA,EAEA,MAAMC,EAAc,wBAEpB,IAAIC,EAAY,GAChB,MAAMC,MAAkB,IAElBC,EAAgB,SAAS,eAAe,kBAAkB,EAC1DC,EAAoB,SAAS,eAAe,WAAW,EACzC,SAAS,eAAe,eAAe,EAG3D,eAAeC,EAAkBC,EAAa,CAC5C,GAAIJ,EAAY,IAAII,CAAG,EACrB,OAAOJ,EAAY,IAAII,CAAG,EAG5B,GAAI,CACF,MAAMC,EAAW,MAAM,MAAM,oEAAoED,CAAG,EAAE,EACtG,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MAAM,sBAAsB,EAGxC,MAAMC,GADU,MAAMD,EAAS,KAAA,GACL,QAAU,KACpC,OAAAL,EAAY,IAAII,EAAKE,CAAS,EACvBA,CACT,OAASC,EAAO,CACd,eAAQ,MAAM,8BAA+BH,EAAKG,CAAK,EACvDP,EAAY,IAAII,EAAK,IAAI,EAClB,IACT,CACF,CAGA,eAAeI,EAAiBC,EAAQ,GAAI,CAC1C,GAAI,CAAAV,EACJ,CAAAA,EAAY,GAEZ,GAAI,CACF,MAAMM,EAAW,MAAM,MAAM,GAAGP,CAAW,0BAA0BW,CAAK,EAAE,EAE5E,GAAI,CAACJ,EAAS,GACZ,MAAM,IAAI,MAAM,uBAAuBA,EAAS,MAAM,EAAE,EAI1D,OADa,MAAMA,EAAS,KAAA,GAChB,aAAe,CAAA,CAC7B,OAASE,EAAO,CACd,cAAQ,MAAM,+BAAgCA,CAAK,EAC7CA,CACR,QAAA,CACER,EAAY,EACd,EACF,CAGA,eAAeW,EAAkBC,EAAoBC,EAAS,GAAO,SACnE,GAAI,CAACX,EAAe,OAMpB,GAJKW,IACHX,EAAc,UAAY,IAGxBU,EAAY,SAAW,GAAK,CAACC,EAAQ,CACvCX,EAAc,UAAY,kGAC1B,MACF,CAEA,MAAMY,EAAW,SAAS,uBAAA,EAC1B,UAAWC,KAAcH,EAAa,CAEpC,MAAMP,GAAMW,EAAAD,EAAW,SAAX,YAAAC,EAAmB,IAC/B,GAAIX,GAAO,GAACY,EAAAF,EAAW,SAAX,MAAAE,EAAmB,QAAQ,CAClC,MAAMC,EAAS,MAAMd,EAAkBC,CAAG,EACtCa,IACKH,EAAW,SAAQA,EAAW,OAAS,CAAE,IAAAV,CAAA,GAC9CU,EAAW,OAAO,OAASG,EAEpC,CAEA,MAAMC,EAAO,SAAS,cAAc,uBAAuB,EAC3DA,EAAK,WAAaJ,EAClBI,EAAK,SAAW,CAAA,EAEhBL,EAAS,YAAYK,CAAI,CAC3B,CAEAjB,EAAc,YAAYY,CAAQ,CACpC,CAGA,eAAeM,GAAyB,CACtC,GAAKlB,EACL,GAAI,CACFA,EAAc,UAAY,mDAE1B,MAAMU,EAAc,MAAMH,EAAiB,EAAE,EAE7C,MAAME,EAAkBC,CAAW,EAG/BT,IAAmBA,EAAkB,MAAM,QAAU,OAC3D,OAASK,EAAO,CACdN,EAAc,UAAY,+EAC1B,QAAQ,MAAM,6BAA8BM,CAAK,CACnD,CACF,CAGAY,EAAA"}
-2
proxy/static/static/seams-landing.js
··· 1 - import"./assets/modulepreload-polyfill-B5Qt9EMX.js";import{r as h}from"./assets/index-kV7Brn54.js";h();const m="http://localhost:8080";let l=!1;const i=new Map,a=document.getElementById("annotations-feed"),u=document.getElementById("load-more");document.getElementById("load-more-btn");async function p(t){if(i.has(t))return i.get(t);try{const n=await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${t}`);if(!n.ok)throw new Error("Profile fetch failed");const e=(await n.json()).avatar||null;return i.set(t,e),e}catch(n){return console.error("Failed to fetch profile for",t,n),i.set(t,null),null}}async function y(t=20){if(!l){l=!0;try{const n=await fetch(`${m}/api/annotations?limit=${t}`);if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return(await n.json()).annotations||[]}catch(n){throw console.error("Failed to fetch annotations:",n),n}finally{l=!1}}}async function g(t,n=!1){var e,f;if(!a)return;if(n||(a.innerHTML=""),t.length===0&&!n){a.innerHTML='<div class="empty">No annotations yet. Install the browser extension to start annotating!</div>';return}const r=document.createDocumentFragment();for(const o of t){const s=(e=o.author)==null?void 0:e.did;if(s&&!((f=o.author)!=null&&f.avatar)){const d=await p(s);d&&(o.author||(o.author={did:s}),o.author.avatar=d)}const c=document.createElement("seams-annotation-card");c.annotation=o,c.comments=[],r.appendChild(c)}a.appendChild(r)}async function w(){if(a)try{a.innerHTML='<div class="loading">Tending the garden...</div>';const t=await y(20);await g(t),u&&(u.style.display="none")}catch(t){a.innerHTML='<div class="error">Failed to load annotations. Please try again later.</div>',console.error("Error loading annotations:",t)}}w(); 2 - //# sourceMappingURL=seams-landing.js.map
-1
proxy/static/static/seams-landing.js.map
··· 1 - {"version":3,"file":"seams-landing.js","sources":["../../landing/landing.ts"],"sourcesContent":["import { registerComponents } from '../packages/core/src/components';\nimport type { SeamsAnnotationCard } from '../packages/core/src/components/annotation-card';\n\nregisterComponents();\n\nconst BACKEND_URL = import.meta.env.BACKEND_URL || (window as any).BACKEND_URL || '';\n\nlet isLoading = false;\nconst avatarCache = new Map<string, string | null>();\n\nconst feedContainer = document.getElementById('annotations-feed');\nconst loadMoreContainer = document.getElementById('load-more');\nconst loadMoreBtn = document.getElementById('load-more-btn');\n\n// Fetch actor profile (avatar) from Bluesky\nasync function fetchActorProfile(did: string) {\n if (avatarCache.has(did)) {\n return avatarCache.get(did);\n }\n\n try {\n const response = await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${did}`);\n if (!response.ok) {\n throw new Error('Profile fetch failed');\n }\n const profile = await response.json();\n const avatarUrl = profile.avatar || null;\n avatarCache.set(did, avatarUrl);\n return avatarUrl;\n } catch (error) {\n console.error('Failed to fetch profile for', did, error);\n avatarCache.set(did, null);\n return null;\n }\n}\n\n// Fetch annotations from backend\nasync function fetchAnnotations(limit = 20) {\n if (isLoading) return;\n isLoading = true;\n\n try {\n const response = await fetch(`${BACKEND_URL}/api/annotations?limit=${limit}`);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n return data.annotations || [];\n } catch (error) {\n console.error('Failed to fetch annotations:', error);\n throw error;\n } finally {\n isLoading = false;\n }\n}\n\n// Render annotations to the feed\nasync function renderAnnotations(annotations: any[], append = false) {\n if (!feedContainer) return;\n\n if (!append) {\n feedContainer.innerHTML = '';\n }\n\n if (annotations.length === 0 && !append) {\n feedContainer.innerHTML = '<div class=\"empty\">No annotations yet. Install the browser extension to start annotating!</div>';\n return;\n }\n\n const fragment = document.createDocumentFragment();\n for (const annotation of annotations) {\n // Fetch avatar if needed\n const did = annotation.author?.did;\n if (did && !annotation.author?.avatar) {\n const avatar = await fetchActorProfile(did);\n if (avatar) {\n if (!annotation.author) annotation.author = { did };\n annotation.author.avatar = avatar;\n }\n }\n\n const card = document.createElement('seams-annotation-card') as SeamsAnnotationCard;\n card.annotation = annotation;\n card.comments = []; // No comments on landing for now\n \n fragment.appendChild(card);\n }\n\n feedContainer.appendChild(fragment);\n}\n\n// Load initial annotations\nasync function loadInitialAnnotations() {\n if (!feedContainer) return;\n try {\n feedContainer.innerHTML = '<div class=\"loading\">Tending the garden...</div>';\n \n const annotations = await fetchAnnotations(20);\n \n await renderAnnotations(annotations);\n\n // Hide load more button for now (could implement pagination later)\n if (loadMoreContainer) loadMoreContainer.style.display = 'none';\n } catch (error) {\n feedContainer.innerHTML = `<div class=\"error\">Failed to load annotations. Please try again later.</div>`;\n console.error('Error loading annotations:', error);\n }\n}\n\n// Initialize\nloadInitialAnnotations();\n"],"names":["registerComponents","BACKEND_URL","isLoading","avatarCache","feedContainer","loadMoreContainer","fetchActorProfile","did","response","avatarUrl","error","fetchAnnotations","limit","renderAnnotations","annotations","append","fragment","annotation","_a","_b","avatar","card","loadInitialAnnotations"],"mappings":"mGAGAA,EAAA,EAEA,MAAMC,EAAc,wBAEpB,IAAIC,EAAY,GAChB,MAAMC,MAAkB,IAElBC,EAAgB,SAAS,eAAe,kBAAkB,EAC1DC,EAAoB,SAAS,eAAe,WAAW,EACzC,SAAS,eAAe,eAAe,EAG3D,eAAeC,EAAkBC,EAAa,CAC5C,GAAIJ,EAAY,IAAII,CAAG,EACrB,OAAOJ,EAAY,IAAII,CAAG,EAG5B,GAAI,CACF,MAAMC,EAAW,MAAM,MAAM,oEAAoED,CAAG,EAAE,EACtG,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MAAM,sBAAsB,EAGxC,MAAMC,GADU,MAAMD,EAAS,KAAA,GACL,QAAU,KACpC,OAAAL,EAAY,IAAII,EAAKE,CAAS,EACvBA,CACT,OAASC,EAAO,CACd,eAAQ,MAAM,8BAA+BH,EAAKG,CAAK,EACvDP,EAAY,IAAII,EAAK,IAAI,EAClB,IACT,CACF,CAGA,eAAeI,EAAiBC,EAAQ,GAAI,CAC1C,GAAI,CAAAV,EACJ,CAAAA,EAAY,GAEZ,GAAI,CACF,MAAMM,EAAW,MAAM,MAAM,GAAGP,CAAW,0BAA0BW,CAAK,EAAE,EAE5E,GAAI,CAACJ,EAAS,GACZ,MAAM,IAAI,MAAM,uBAAuBA,EAAS,MAAM,EAAE,EAI1D,OADa,MAAMA,EAAS,KAAA,GAChB,aAAe,CAAA,CAC7B,OAASE,EAAO,CACd,cAAQ,MAAM,+BAAgCA,CAAK,EAC7CA,CACR,QAAA,CACER,EAAY,EACd,EACF,CAGA,eAAeW,EAAkBC,EAAoBC,EAAS,GAAO,SACnE,GAAI,CAACX,EAAe,OAMpB,GAJKW,IACHX,EAAc,UAAY,IAGxBU,EAAY,SAAW,GAAK,CAACC,EAAQ,CACvCX,EAAc,UAAY,kGAC1B,MACF,CAEA,MAAMY,EAAW,SAAS,uBAAA,EAC1B,UAAWC,KAAcH,EAAa,CAEpC,MAAMP,GAAMW,EAAAD,EAAW,SAAX,YAAAC,EAAmB,IAC/B,GAAIX,GAAO,GAACY,EAAAF,EAAW,SAAX,MAAAE,EAAmB,QAAQ,CAClC,MAAMC,EAAS,MAAMd,EAAkBC,CAAG,EACtCa,IACKH,EAAW,SAAQA,EAAW,OAAS,CAAE,IAAAV,CAAA,GAC9CU,EAAW,OAAO,OAASG,EAEpC,CAEA,MAAMC,EAAO,SAAS,cAAc,uBAAuB,EAC3DA,EAAK,WAAaJ,EAClBI,EAAK,SAAW,CAAA,EAEhBL,EAAS,YAAYK,CAAI,CAC3B,CAEAjB,EAAc,YAAYY,CAAQ,CACpC,CAGA,eAAeM,GAAyB,CACtC,GAAKlB,EACL,GAAI,CACFA,EAAc,UAAY,mDAE1B,MAAMU,EAAc,MAAMH,EAAiB,EAAE,EAE7C,MAAME,EAAkBC,CAAW,EAG/BT,IAAmBA,EAAkB,MAAM,QAAU,OAC3D,OAASK,EAAO,CACdN,EAAc,UAAY,+EAC1B,QAAQ,MAAM,6BAA8BM,CAAK,CACnD,CACF,CAGAY,EAAA"}
-2
proxy/static/static/seams-oauth-callback.js
··· 1 - import"./assets/modulepreload-polyfill-B5Qt9EMX.js";import{W as n}from"./assets/index-BKdQD0EM.js";import{h as c}from"./assets/index-BNF_FRu3.js";console.log("[oauth-callback] Processing OAuth callback");const o=document.getElementById("status");async function a(){try{const e=new n,t={clientId:"https://seams.so/oauth/client-metadata.json",redirectUri:"https://sure.seams.so/oauth-callback.html",scope:"atproto transition:generic"};if(console.log("[oauth-callback] Config:",t),await c(e,t))if(o&&(o.textContent="Login successful! Redirecting..."),console.log("[oauth-callback] Login successful"),window.opener)console.log("[oauth-callback] Sending message to opener"),window.opener.postMessage({type:"SEAMS_OAUTH_CALLBACK",url:window.location.href},"*"),setTimeout(()=>{window.close()},500);else{o&&(o.textContent="Login successful! You can close this window.");const s=sessionStorage.getItem("seams_login_redirect")||"/";setTimeout(()=>{window.location.href=s},1e3)}else o&&(o.textContent="No OAuth response found"),console.log("[oauth-callback] No OAuth response")}catch(e){console.error("[oauth-callback] Error processing callback:",e),o&&(o.textContent="Login failed: "+e.message,o.style.color="#e74c3c")}}a(); 2 - //# sourceMappingURL=seams-oauth-callback.js.map
-1
proxy/static/static/seams-oauth-callback.js.map
··· 1 - {"version":3,"file":"seams-oauth-callback.js","sources":["../../entrypoints/via-client/oauth-callback.ts"],"sourcesContent":["// OAuth callback handler for via-client\nimport { handleOAuthCallback, WebStorageAdapter } from '@seams/core';\n\nconsole.log('[oauth-callback] Processing OAuth callback');\n\nconst statusEl = document.getElementById('status');\n\nasync function processCallback() {\n\ttry {\n\t\tconst storage = new WebStorageAdapter();\n\t\tconst config = {\n\t\t\tclientId: import.meta.env.VITE_OAUTH_CLIENT_ID || 'https://seams.so/oauth/client-metadata.json',\n\t\t\tredirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'https://sure.seams.so/oauth-callback.html',\n\t\t\tscope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic',\n\t\t};\n\t\tconsole.log('[oauth-callback] Config:', config);\n\t\tconst session = await handleOAuthCallback(storage, config);\n\n\t\tif (session) {\n\t\t\tif (statusEl) statusEl.textContent = 'Login successful! Redirecting...';\n\t\t\tconsole.log('[oauth-callback] Login successful');\n\n\t\t\t// Check if we are in a popup\n\t\t\tif (window.opener) {\n\t\t\t\tconsole.log('[oauth-callback] Sending message to opener');\n\t\t\t\twindow.opener.postMessage({\n\t\t\t\t\ttype: 'SEAMS_OAUTH_CALLBACK',\n\t\t\t\t\turl: window.location.href\n\t\t\t\t}, '*');\n\n\t\t\t\t// AMPDO: This needs to change since we are no longer calling a popup.\n\t\t\t\t// Close popup after a delay\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\twindow.close();\n\t\t\t\t}, 500);\n\t\t\t} else {\n\t\t\t\t// Not a popup (mobile or full page redirect)\n\t\t\t\t// Redirect back to the page the user was on\n\t\t\t\t// We can't easily know the \"previous\" page in a full redirect unless we stored it in sessionStorage BEFORE leaving.\n\t\t\t\t// But the sidebar iframe is where the login started. If we navigated the whole iframe, we lost state.\n\t\t\t\t// If we navigated the TOP window, we lost state too unless we stored it.\n\n\t\t\t\t// The sidebar puts `seams_login_redirect` in sessionStorage before starting?\n\t\t\t\t// Wait, `startLoginProcess` is called in Sidebar.\n\n\t\t\t\t// If we are here, we successfully logged in.\n\t\t\t\tif (statusEl) statusEl.textContent = 'Login successful! You can close this window.';\n\n\t\t\t\t// For now, redirect to the proxy home or stored redirect\n\t\t\t\tconst previousUrl = sessionStorage.getItem('seams_login_redirect') || '/';\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\twindow.location.href = previousUrl;\n\t\t\t\t}, 1000);\n\t\t\t}\n\t\t} else {\n\t\t\tif (statusEl) statusEl.textContent = 'No OAuth response found';\n\t\t\tconsole.log('[oauth-callback] No OAuth response');\n\t\t}\n\t} catch (error) {\n\t\tconsole.error('[oauth-callback] Error processing callback:', error);\n\t\tif (statusEl) {\n\t\t\tstatusEl.textContent = 'Login failed: ' + (error as Error).message;\n\t\t\tstatusEl.style.color = '#e74c3c';\n\t\t}\n\t}\n}\n\nprocessCallback();\n"],"names":["statusEl","processCallback","storage","WebStorageAdapter","config","handleOAuthCallback","previousUrl","error"],"mappings":"kJAGA,QAAQ,IAAI,4CAA4C,EAExD,MAAMA,EAAW,SAAS,eAAe,QAAQ,EAEjD,eAAeC,GAAkB,CAChC,GAAI,CACH,MAAMC,EAAU,IAAIC,EACdC,EAAS,CACd,SAAU,8CACV,YAAa,4CACb,MAAO,4BAAA,EAKR,GAHA,QAAQ,IAAI,2BAA4BA,CAAM,EAC9B,MAAMC,EAAoBH,EAASE,CAAM,EAOxD,GAJIJ,MAAmB,YAAc,oCACrC,QAAQ,IAAI,mCAAmC,EAG3C,OAAO,OACV,QAAQ,IAAI,4CAA4C,EACxD,OAAO,OAAO,YAAY,CACzB,KAAM,uBACN,IAAK,OAAO,SAAS,IAAA,EACnB,GAAG,EAIN,WAAW,IAAM,CAChB,OAAO,MAAA,CACR,EAAG,GAAG,MACA,CAWFA,MAAmB,YAAc,gDAGrC,MAAMM,EAAc,eAAe,QAAQ,sBAAsB,GAAK,IACtE,WAAW,IAAM,CAChB,OAAO,SAAS,KAAOA,CACxB,EAAG,GAAI,CACR,MAEIN,MAAmB,YAAc,2BACrC,QAAQ,IAAI,oCAAoC,CAElD,OAASO,EAAO,CACf,QAAQ,MAAM,8CAA+CA,CAAK,EAC9DP,IACHA,EAAS,YAAc,iBAAoBO,EAAgB,QAC3DP,EAAS,MAAM,MAAQ,UAEzB,CACD,CAEAC,EAAA"}
-2
proxy/static/static/seams-seams-landing.js
··· 1 - import{r as h}from"./assets/index-kV7Brn54.js";h();const m="http://localhost:8080";let l=!1;const i=new Map,a=document.getElementById("annotations-feed"),u=document.getElementById("load-more");document.getElementById("load-more-btn");async function p(t){if(i.has(t))return i.get(t);try{const n=await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${t}`);if(!n.ok)throw new Error("Profile fetch failed");const e=(await n.json()).avatar||null;return i.set(t,e),e}catch(n){return console.error("Failed to fetch profile for",t,n),i.set(t,null),null}}async function y(t=20){if(!l){l=!0;try{const n=await fetch(`${m}/api/annotations?limit=${t}`);if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return(await n.json()).annotations||[]}catch(n){throw console.error("Failed to fetch annotations:",n),n}finally{l=!1}}}async function g(t,n=!1){var e,f;if(!a)return;if(n||(a.innerHTML=""),t.length===0&&!n){a.innerHTML='<div class="empty">No annotations yet. Install the browser extension to start annotating!</div>';return}const r=document.createDocumentFragment();for(const o of t){const s=(e=o.author)==null?void 0:e.did;if(s&&!((f=o.author)!=null&&f.avatar)){const d=await p(s);d&&(o.author||(o.author={did:s}),o.author.avatar=d)}const c=document.createElement("seams-annotation-card");c.annotation=o,c.comments=[],r.appendChild(c)}a.appendChild(r)}async function w(){if(a)try{a.innerHTML='<div class="loading">Tending the garden...</div>';const t=await y(20);await g(t),u&&(u.style.display="none")}catch(t){a.innerHTML='<div class="error">Failed to load annotations. Please try again later.</div>',console.error("Error loading annotations:",t)}}w(); 2 - //# sourceMappingURL=seams-seams-landing.js.map
-1
proxy/static/static/seams-seams-landing.js.map
··· 1 - {"version":3,"file":"seams-seams-landing.js","sources":["../../landing/landing.ts"],"sourcesContent":["import { registerComponents } from '../packages/core/src/components';\nimport type { SeamsAnnotationCard } from '../packages/core/src/components/annotation-card';\n\nregisterComponents();\n\nconst BACKEND_URL = import.meta.env.BACKEND_URL || (window as any).BACKEND_URL || '';\n\nlet isLoading = false;\nconst avatarCache = new Map<string, string | null>();\n\nconst feedContainer = document.getElementById('annotations-feed');\nconst loadMoreContainer = document.getElementById('load-more');\nconst loadMoreBtn = document.getElementById('load-more-btn');\n\n// Fetch actor profile (avatar) from Bluesky\nasync function fetchActorProfile(did: string) {\n if (avatarCache.has(did)) {\n return avatarCache.get(did);\n }\n\n try {\n const response = await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${did}`);\n if (!response.ok) {\n throw new Error('Profile fetch failed');\n }\n const profile = await response.json();\n const avatarUrl = profile.avatar || null;\n avatarCache.set(did, avatarUrl);\n return avatarUrl;\n } catch (error) {\n console.error('Failed to fetch profile for', did, error);\n avatarCache.set(did, null);\n return null;\n }\n}\n\n// Fetch annotations from backend\nasync function fetchAnnotations(limit = 20) {\n if (isLoading) return;\n isLoading = true;\n\n try {\n const response = await fetch(`${BACKEND_URL}/api/annotations?limit=${limit}`);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n return data.annotations || [];\n } catch (error) {\n console.error('Failed to fetch annotations:', error);\n throw error;\n } finally {\n isLoading = false;\n }\n}\n\n// Render annotations to the feed\nasync function renderAnnotations(annotations: any[], append = false) {\n if (!feedContainer) return;\n\n if (!append) {\n feedContainer.innerHTML = '';\n }\n\n if (annotations.length === 0 && !append) {\n feedContainer.innerHTML = '<div class=\"empty\">No annotations yet. Install the browser extension to start annotating!</div>';\n return;\n }\n\n const fragment = document.createDocumentFragment();\n for (const annotation of annotations) {\n // Fetch avatar if needed\n const did = annotation.author?.did;\n if (did && !annotation.author?.avatar) {\n const avatar = await fetchActorProfile(did);\n if (avatar) {\n if (!annotation.author) annotation.author = { did };\n annotation.author.avatar = avatar;\n }\n }\n\n const card = document.createElement('seams-annotation-card') as SeamsAnnotationCard;\n card.annotation = annotation;\n card.comments = []; // No comments on landing for now\n \n fragment.appendChild(card);\n }\n\n feedContainer.appendChild(fragment);\n}\n\n// Load initial annotations\nasync function loadInitialAnnotations() {\n if (!feedContainer) return;\n try {\n feedContainer.innerHTML = '<div class=\"loading\">Tending the garden...</div>';\n \n const annotations = await fetchAnnotations(20);\n \n await renderAnnotations(annotations);\n\n // Hide load more button for now (could implement pagination later)\n if (loadMoreContainer) loadMoreContainer.style.display = 'none';\n } catch (error) {\n feedContainer.innerHTML = `<div class=\"error\">Failed to load annotations. Please try again later.</div>`;\n console.error('Error loading annotations:', error);\n }\n}\n\n// Initialize\nloadInitialAnnotations();\n"],"names":["registerComponents","BACKEND_URL","isLoading","avatarCache","feedContainer","loadMoreContainer","fetchActorProfile","did","response","avatarUrl","error","fetchAnnotations","limit","renderAnnotations","annotations","append","fragment","annotation","_a","_b","avatar","card","loadInitialAnnotations"],"mappings":"+CAGAA,EAAA,EAEA,MAAMC,EAAc,wBAEpB,IAAIC,EAAY,GAChB,MAAMC,MAAkB,IAElBC,EAAgB,SAAS,eAAe,kBAAkB,EAC1DC,EAAoB,SAAS,eAAe,WAAW,EACzC,SAAS,eAAe,eAAe,EAG3D,eAAeC,EAAkBC,EAAa,CAC5C,GAAIJ,EAAY,IAAII,CAAG,EACrB,OAAOJ,EAAY,IAAII,CAAG,EAG5B,GAAI,CACF,MAAMC,EAAW,MAAM,MAAM,oEAAoED,CAAG,EAAE,EACtG,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MAAM,sBAAsB,EAGxC,MAAMC,GADU,MAAMD,EAAS,KAAA,GACL,QAAU,KACpC,OAAAL,EAAY,IAAII,EAAKE,CAAS,EACvBA,CACT,OAASC,EAAO,CACd,eAAQ,MAAM,8BAA+BH,EAAKG,CAAK,EACvDP,EAAY,IAAII,EAAK,IAAI,EAClB,IACT,CACF,CAGA,eAAeI,EAAiBC,EAAQ,GAAI,CAC1C,GAAI,CAAAV,EACJ,CAAAA,EAAY,GAEZ,GAAI,CACF,MAAMM,EAAW,MAAM,MAAM,GAAGP,CAAW,0BAA0BW,CAAK,EAAE,EAE5E,GAAI,CAACJ,EAAS,GACZ,MAAM,IAAI,MAAM,uBAAuBA,EAAS,MAAM,EAAE,EAI1D,OADa,MAAMA,EAAS,KAAA,GAChB,aAAe,CAAA,CAC7B,OAASE,EAAO,CACd,cAAQ,MAAM,+BAAgCA,CAAK,EAC7CA,CACR,QAAA,CACER,EAAY,EACd,EACF,CAGA,eAAeW,EAAkBC,EAAoBC,EAAS,GAAO,SACnE,GAAI,CAACX,EAAe,OAMpB,GAJKW,IACHX,EAAc,UAAY,IAGxBU,EAAY,SAAW,GAAK,CAACC,EAAQ,CACvCX,EAAc,UAAY,kGAC1B,MACF,CAEA,MAAMY,EAAW,SAAS,uBAAA,EAC1B,UAAWC,KAAcH,EAAa,CAEpC,MAAMP,GAAMW,EAAAD,EAAW,SAAX,YAAAC,EAAmB,IAC/B,GAAIX,GAAO,GAACY,EAAAF,EAAW,SAAX,MAAAE,EAAmB,QAAQ,CAClC,MAAMC,EAAS,MAAMd,EAAkBC,CAAG,EACtCa,IACKH,EAAW,SAAQA,EAAW,OAAS,CAAE,IAAAV,CAAA,GAC9CU,EAAW,OAAO,OAASG,EAEpC,CAEA,MAAMC,EAAO,SAAS,cAAc,uBAAuB,EAC3DA,EAAK,WAAaJ,EAClBI,EAAK,SAAW,CAAA,EAEhBL,EAAS,YAAYK,CAAI,CAC3B,CAEAjB,EAAc,YAAYY,CAAQ,CACpC,CAGA,eAAeM,GAAyB,CACtC,GAAKlB,EACL,GAAI,CACFA,EAAc,UAAY,mDAE1B,MAAMU,EAAc,MAAMH,EAAiB,EAAE,EAE7C,MAAME,EAAkBC,CAAW,EAG/BT,IAAmBA,EAAkB,MAAM,QAAU,OAC3D,OAASK,EAAO,CACdN,EAAc,UAAY,+EAC1B,QAAQ,MAAM,6BAA8BM,CAAK,CACnD,CACF,CAGAY,EAAA"}
-51
proxy/static/static/seams-seams-sidebar.js
··· 1 - import"./assets/modulepreload-polyfill-B5Qt9EMX.js";import{W as b}from"./assets/index-BKdQD0EM.js";import{O as g,a as v}from"./assets/index-BNF_FRu3.js";import{r as L}from"./assets/index-kV7Brn54.js";class U{constructor(t){this.currentUrl=null,this.storage=t.storage,this.fetchAnnotations=t.fetchAnnotations}async syncAnnotationsForUrl(t){console.log("[BackgroundWorker] Syncing annotations for:",t);try{const e=await this.fetchAnnotations(t);console.log("[BackgroundWorker] Fetched",e.length,"annotations");const n=await this.storage.get("annotations")||[],s=new Set(n.map(i=>i.uri)),o=[...n];for(const i of e){const l=o.findIndex(h=>h.uri===i.uri);l>=0?o[l]=i:o.push(i)}const a=o.slice(-500);await this.storage.set("annotations",a),console.log("[BackgroundWorker] Stored",a.length,"annotations (global)")}catch(e){throw console.error("[BackgroundWorker] Failed to sync annotations:",e),e}}setCurrentUrl(t){this.currentUrl!==t&&(this.currentUrl=t,this.syncAnnotationsForUrl(t))}getCurrentUrl(){return this.currentUrl}}async function f(c,t){console.log(`[api] Fetching annotations for ${t} from ${c}`);try{const e=await fetch(`${c}/api/annotations?url=${encodeURIComponent(t)}&limit=100`);if(!e.ok)throw new Error(`Backend error: ${e.status}`);return(await e.json()).annotations||[]}catch(e){throw console.error("[api] Failed to fetch annotations:",e),e}}class k{async launch(t){return new Promise((e,n)=>{const r=window.screenX+(window.outerWidth-600)/2,a=window.screenY+(window.outerHeight-700)/2,i=window.open(t.toString(),"oauth-popup",`width=600,height=700,left=${r},top=${a},popup=yes`);if(!i){n(new Error("Failed to open OAuth popup"));return}const l=p=>{p.data.type==="SEAMS_OAUTH_CALLBACK"&&(window.removeEventListener("message",l),i.close(),e(p.data.url))};window.addEventListener("message",l);const h=setInterval(()=>{i.closed&&(clearInterval(h),window.removeEventListener("message",l),n(new Error("OAuth popup closed by user")))},500)})}}const u="community.lexicon.annotation.annotation",y="pub.leaflet.comment";class E{constructor(t,e){this.oauth=t,this.config=e}async authenticatedAgent(){const t=await this.oauth.loadSession();if(!t)throw new Error("Not authenticated");return{agent:new g(t),session:t}}async indexInBackend(t,e){try{await fetch(`${this.config.backendUrl}/api/annotations/index`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uri:t,cid:e})}),console.log("[pds] Annotation indexed in backend")}catch(n){console.error("[pds] Failed to index annotation in backend:",n)}}async request(t,e,n,s=0){const o=await t.handle(e,n);if(o.status===401&&s<3)try{const r=await o.clone().json();if(r.error==="use_dpop_nonce")return console.log(`[pds] DPoP nonce mismatch (retry ${s+1}), retrying...`),this.request(t,e,n,s+1);if(r.error==="invalid_token"&&s<3){console.log(`[pds] Invalid token (retry ${s+1}), refreshing...`);try{const a=await t.getSession({noCache:!0});await this.oauth.saveSession(a);const i=new g(a);return this.request(i,e,n,s+1)}catch(a){return console.error("[pds] Token refresh failed:",a),o}}}catch{}return o}async createAnnotation(t){var a;const{agent:e,session:n}=await this.authenticatedAgent(),s={$type:u,target:[{source:t.value.target.url,selector:(a=t.value.target.selector)==null?void 0:a.map(i=>({$type:i.$type,exact:i.exact,prefix:i.prefix,suffix:i.suffix,start:i.start,end:i.end}))}],body:t.value.body,createdAt:t.value.createdAt},o=await this.request(e,"/xrpc/com.atproto.repo.createRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:n.info.sub,collection:u,record:s})});if(!o.ok){const i=await o.json();throw console.error("[pds] Create error:",i),new Error(`Failed to create annotation: ${o.status} - ${JSON.stringify(i)}`)}const r=await o.json();return this.indexInBackend(r.uri,r.cid).catch(i=>{console.warn("[pds] Background indexing failed (non-fatal):",i)}),{...t,uri:r.uri,cid:r.cid}}async deleteAnnotation(t){const{agent:e,session:n}=await this.authenticatedAgent(),s=t.split("/").pop();if(!s)throw new Error("Invalid URI");const o=await this.request(e,"/xrpc/com.atproto.repo.deleteRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:n.info.sub,collection:u,rkey:s})});if(!o.ok){const r=await o.json();throw console.error("[pds] Delete error:",r),new Error(`Failed to delete annotation: ${o.status} - ${JSON.stringify(r)}`)}}async createComment(t){const{agent:e,session:n}=await this.authenticatedAgent(),s={$type:"pub.leaflet.comment",subject:t.subject,plaintext:t.plaintext,createdAt:t.createdAt,reply:t.reply,facets:t.facets,onPage:t.onPage},o=await this.request(e,"/xrpc/com.atproto.repo.createRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:n.info.sub,collection:y,record:s})});if(!o.ok){const a=await o.json();throw console.error("[pds] Create comment error:",a),new Error(`Failed to create comment: ${o.status} - ${JSON.stringify(a)}`)}const r=await o.json();return{...t,uri:r.uri,cid:r.cid}}async deleteComment(t){const{agent:e,session:n}=await this.authenticatedAgent(),s=t.split("/").pop();if(!s)throw new Error("Invalid URI");const o=await this.request(e,"/xrpc/com.atproto.repo.deleteRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:n.info.sub,collection:y,rkey:s})});if(!o.ok){const r=await o.json();throw console.error("[pds] Delete comment error:",r),new Error(`Failed to delete comment: ${o.status} - ${JSON.stringify(r)}`)}}async listAnnotationsForPage(t){try{return await f(this.config.backendUrl,t)}catch(e){return console.error("[pds] Failed to fetch from backend:",e),[]}}}class x{constructor(){this.collapsedThreads=new Set,this.activeReplyForms=new Set}isThreadCollapsed(t){return this.collapsedThreads.has(t)}toggleThreadCollapsed(t){this.collapsedThreads.has(t)?this.collapsedThreads.delete(t):this.collapsedThreads.add(t)}isReplyFormActive(t){return this.activeReplyForms.has(t)}showReplyForm(t){this.activeReplyForms.add(t)}hideReplyForm(t){this.activeReplyForms.delete(t)}clearAllReplyForms(){this.activeReplyForms.clear()}}function m(c){try{const t=new URL(c);t.hash="";let e=t.pathname;return e.endsWith("/")&&e!=="/"&&(e=e.slice(0,-1)),t.pathname=e,t.toString()}catch{return c}}class C{constructor(t,e,n,s,o){this.currentUrl="",this.currentSelection=null,this.pageAnnotations=[],this.allComments=[],this.session=null,this.container=t,this.storage=e,this.oauth=new v(e,n,s.oauth),this.pds=new E(this.oauth,s.pds),this.onSyncNeeded=o,this.uiState=new x,L(),this.oauth.initialize(),this.initialize()}async initialize(){await this.render(),this.setupStorageListener()}setupStorageListener(){this.storage.onChange(t=>{(t.key==="annotations"||t.key==="comments")&&this.loadAnnotationsForCurrentUrl()})}async setCurrentUrl(t){this.currentUrl=t,await this.loadAnnotationsForCurrentUrl()}getCurrentUrl(){return this.currentUrl}setSelection(t){this.currentSelection=t,this.updateSelectionUI()}async render(){this.session=await this.oauth.loadSession(),await this.renderInterface()}renderLoginForm(){this.container.innerHTML=` 2 - <div class="sidebar"> 3 - <div class="auth-section" id="auth-section"> 4 - <div class="login-container"> 5 - <h2>Login to Seams</h2> 6 - <div class="input-wrapper"> 7 - <span class="at-symbol">@</span> 8 - <input type="text" id="handle-input" class="handle-input" placeholder="you.bsky.social" /> 9 - </div> 10 - <button id="login-btn">Login with ATProto</button> 11 - <div id="auth-status"></div> 12 - </div> 13 - </div> 14 - </div> 15 - `;const t=this.container.querySelector("#handle-input"),e=this.container.querySelector("#login-btn"),n=this.container.querySelector("#auth-status"),s=async()=>{var r;let o=t==null?void 0:t.value.trim();if(!o){alert("Please enter your handle");return}o.startsWith("@")&&(o=o.slice(1));try{n&&(n.textContent="Logging in..."),await this.oauth.startLoginProcess(o),this.session=await this.oauth.loadSession(),this.session&&(await this.renderInterface(),(r=this.onSyncNeeded)==null||r.call(this))}catch(a){n&&(n.textContent="Login failed"),console.error("[sidebar] Login error:",a)}};e==null||e.addEventListener("click",s),t==null||t.addEventListener("keydown",o=>{o.key==="Enter"&&(o.preventDefault(),s())})}async renderInterface(){let t=null;if(this.session)try{t=await this.oauth.getProfile(this.session)}catch(e){console.error("[sidebar] Failed to fetch profile:",e)}this.container.innerHTML=` 16 - <div class="sidebar"> 17 - <div class="content-section" id="content-section"> 18 - <div class="annotation-form" id="annotation-form" style="display: none;"> 19 - <div class="form-header"> 20 - <h2>Create Annotation</h2> 21 - <button id="clear-selection-btn" class="clear-btn">×</button> 22 - </div> 23 - <div id="selected-text" class="selected-text"></div> 24 - <textarea id="annotation-text" placeholder="Add your note..."></textarea> 25 - <button id="save-btn">Save Annotation</button> 26 - </div> 27 - 28 - ${this.session?"":` 29 - <div style="padding: 12px 0; text-align: center; color: #666; font-size: 13px;"> 30 - Log in to create annotations 31 - </div> 32 - `} 33 - 34 - <div class="annotations-list"> 35 - <h2>Annotations on this page</h2> 36 - <div id="annotations"></div> 37 - </div> 38 - </div> 39 - <div class="profile-menu"> 40 - ${this.session?` 41 - <img id="profile-avatar" style="display: ${t!=null&&t.avatar?"block":"none"}; width: 40px; height: 40px; border-radius: 50%; cursor: pointer;" ${t!=null&&t.avatar?`src="${t.avatar}"`:""} /> 42 - <div id="profile-dropdown" class="profile-dropdown" style="display: none;"> 43 - <button id="logout-btn">Logout</button> 44 - </div> 45 - `:` 46 - <button id="login-trigger-btn" style="border-radius: 20px;">Login</button> 47 - `} 48 - </div> 49 - </div> 50 - `,this.attachEventListeners(),await this.loadAnnotationsForCurrentUrl()}attachEventListeners(){const t=this.container.querySelector("#clear-selection-btn"),e=this.container.querySelector("#save-btn"),n=this.container.querySelector("#logout-btn"),s=this.container.querySelector("#login-trigger-btn"),o=this.container.querySelector("#profile-avatar"),r=this.container.querySelector("#profile-dropdown");t==null||t.addEventListener("click",()=>{this.currentSelection=null,this.updateSelectionUI()}),e==null||e.addEventListener("click",async()=>{await this.handleSaveAnnotation()}),n==null||n.addEventListener("click",async()=>{await this.oauth.clearSession(),await this.storage.set("annotations",null),await this.storage.set("comments",null),await this.storage.set("lastSync",null),await this.storage.set("syncError",null),await this.storage.set("lastSyncAttempt",null),this.session=null,await this.render()}),s==null||s.addEventListener("click",()=>{this.renderLoginForm()}),o==null||o.addEventListener("click",()=>{var a;r&&r.setAttribute("style",(a=r.getAttribute("style"))!=null&&a.includes("none")?"display: block;":"display: none;")}),document.addEventListener("click",a=>{r&&o&&!o.contains(a.target)&&!r.contains(a.target)&&r.setAttribute("style","display: none;")})}updateSelectionUI(){const t=this.container.querySelector("#annotation-form"),e=this.container.querySelector("#selected-text"),n=this.container.querySelector("#annotation-text");this.currentSelection&&this.currentSelection.text&&e?(e.innerHTML=`<blockquote>${this.currentSelection.text}</blockquote>`,t&&t.setAttribute("style","display: block;")):(e&&(e.innerHTML=""),n&&(n.value=""),t&&t.setAttribute("style","display: none;"))}async createAnnotation(t,e){var n;try{await this.pds.createAnnotation({uri:"",cid:"",value:{target:{url:t.source,selector:t.selectors},body:e,createdAt:new Date().toISOString()}}),this.currentSelection=null,this.updateSelectionUI(),(n=this.onSyncNeeded)==null||n.call(this)}catch(s){throw console.error("[sidebar] Failed to create annotation:",s),s}}async handleSaveAnnotation(){var r;if(!this.session){this.renderLoginForm();return}if(!this.currentSelection)return;const t=this.container.querySelector("#annotation-text"),e=(t==null?void 0:t.value.trim())||"",n=`temp:${Date.now()}`,s={uri:n,cid:"pending",value:{target:{url:this.currentUrl,selector:this.currentSelection.selectors},body:e,createdAt:new Date().toISOString()},author:{did:"you",handle:"you"}};this.pageAnnotations.unshift(s),this.renderAnnotations();const o=this.currentSelection;this.currentSelection=null,this.updateSelectionUI();try{const a=await this.pds.createAnnotation({uri:"",cid:"",value:{target:{url:this.currentUrl,selector:o.selectors},body:e,createdAt:new Date().toISOString()}}),i=this.pageAnnotations.findIndex(l=>l.uri===n);i!==-1&&(this.pageAnnotations[i]=a),this.renderAnnotations(),(r=this.onSyncNeeded)==null||r.call(this)}catch(a){console.error("[sidebar] Failed to create annotation:",a),alert("Failed to save annotation"),this.pageAnnotations=this.pageAnnotations.filter(i=>i.uri!==n),this.renderAnnotations(),this.currentSelection=o,this.updateSelectionUI(),t&&(t.value=e)}}async loadAnnotationsForCurrentUrl(){var n;const t=await this.storage.get(["annotations","comments"]);if(t.annotations&&t.annotations.length>0){const s=t.annotations[0];if(!s.value||Array.isArray(s.target)){console.warn("[sidebar] Detected legacy/invalid cache schema. Clearing storage."),await this.storage.set("annotations",[]),this.pageAnnotations=[],this.renderAnnotations();return}}const e=m(this.currentUrl);console.log("[sidebar] Current URL normalized:",e),console.log("[sidebar] Total annotations in storage:",((n=t.annotations)==null?void 0:n.length)||0),this.pageAnnotations=(t.annotations||[]).filter(s=>!s||!s.value||!s.value.target?(console.warn("[sidebar] Malformed annotation found:",s),!1):m(s.value.target.url)===e),console.log("[sidebar] Filtered to",this.pageAnnotations.length,"annotations for this page"),this.allComments=t.comments||[],this.renderAnnotations()}renderAnnotations(){const t=this.container.querySelector("#annotations");if(t){if(this.pageAnnotations.length===0){t.innerHTML='<p class="empty">No annotations yet. Select text to create one.</p>';return}t.innerHTML="",this.pageAnnotations.forEach(e=>{const n=document.createElement("seams-annotation-card");n.annotation=e,n.comments=this.allComments,t.appendChild(n)}),t.hasAttribute("data-listening")||(t.setAttribute("data-listening","true"),t.addEventListener("comment-submit",async e=>{const n=e.detail;await this.handleCommentSubmit(n.subjectUri,n.text)}),t.addEventListener("reply-submit",async e=>{const n=e.detail;await this.handleReplySubmit(n.parentUri,n.text)}))}}async handleCommentSubmit(t,e){var n;if(!this.session){this.renderLoginForm();return}try{await this.pds.createComment({$type:"pub.leaflet.comment",subject:t,plaintext:e,createdAt:new Date().toISOString()}),(n=this.onSyncNeeded)==null||n.call(this)}catch(s){console.error("[sidebar] Failed to create comment:",s),alert("Failed to post comment")}}async handleReplySubmit(t,e){var s;if(!this.session){this.renderLoginForm();return}const n=this.allComments.find(o=>o.uri===t);if(n)try{await this.pds.createComment({$type:"pub.leaflet.comment",subject:n.subject,plaintext:e,createdAt:new Date().toISOString(),reply:{parent:t}}),(s=this.onSyncNeeded)==null||s.call(this)}catch(o){console.error("[sidebar] Failed to create reply:",o),alert("Failed to post reply")}}}console.log("[seams-sidebar] Loading sidebar (v2.1)...");const w=document.getElementById("app");if(!w)throw new Error("App element not found");const S=new b,F=new k,A=new U({storage:S,fetchAnnotations:async c=>f("http://localhost:8080",c)}),d=new C(w,S,F,{oauth:{clientId:"https://seams.so/oauth/client-metadata.json",redirectUri:"https://sure.seams.so/oauth-callback.html",scope:"atproto transition:generic"},pds:{backendUrl:"http://localhost:8080"}},c=>{c&&A.setCurrentUrl(c)});window.addEventListener("message",c=>{if(c.data.type==="SEAMS_PAGE_URL"){const t=c.data.url;console.log("[seams-sidebar] Received page URL:",t),d.setCurrentUrl(t),A.setCurrentUrl(t)}else if(c.data.type==="SEAMS_TEXT_SELECTED")console.log("[seams-sidebar] Received selection update"),d.setSelection(c.data.payload);else if(c.data.type==="SEAMS_CREATE_ANNOTATION"){console.log("[seams-sidebar] Received create annotation request");const{text:t,selectors:e,body:n}=c.data.payload;d.createAnnotation({source:d.getCurrentUrl(),selectors:e},n).then(()=>{console.log("[seams-sidebar] Annotation created from mobile request")}).catch(s=>{console.error("[seams-sidebar] Failed to create annotation from mobile request:",s)})}});window.parent.postMessage({type:"SEAMS_SIDEBAR_READY"},"*");console.log("[seams-sidebar] Ready"); 51 - //# sourceMappingURL=seams-seams-sidebar.js.map
-1
proxy/static/static/seams-seams-sidebar.js.map
··· 1 - {"version":3,"file":"seams-seams-sidebar.js","sources":["../../packages/core/src/background/worker.ts","../../packages/core/src/api.ts","../../packages/core/src/oauth/launchers.ts","../../packages/core/src/pds/index.ts","../../packages/core/src/sidebar/ui-state.ts","../../packages/core/src/sidebar/utils.ts","../../packages/core/src/sidebar/index.ts","../../entrypoints/via-client/sidebar.ts"],"sourcesContent":["// Background worker - fetches annotations and writes to storage\nimport type { StorageAdapter } from '../storage/adapter';\nimport type { Annotation } from '../types';\n\nexport interface BackgroundWorkerOptions {\n\tstorage: StorageAdapter;\n\tfetchAnnotations: (url: string) => Promise<Annotation[]>;\n}\n\nexport class BackgroundWorker {\n\tprivate storage: StorageAdapter;\n\tprivate fetchAnnotations: (url: string) => Promise<Annotation[]>;\n\tprivate currentUrl: string | null = null;\n\n\tconstructor(options: BackgroundWorkerOptions) {\n\t\tthis.storage = options.storage;\n\t\tthis.fetchAnnotations = options.fetchAnnotations;\n\t}\n\n\tasync syncAnnotationsForUrl(url: string): Promise<void> {\n\t\tconsole.log('[BackgroundWorker] Syncing annotations for:', url);\n\n\t\ttry {\n\t\t\tconst newAnnotations = await this.fetchAnnotations(url);\n\t\t\tconsole.log('[BackgroundWorker] Fetched', newAnnotations.length, 'annotations');\n\n\t\t\t// Get existing annotations from global storage\n\t\t\tconst existingAnnotations = await this.storage.get('annotations') || [];\n\n\t\t\t// Create a Set of existing URIs for fast lookup\n\t\t\tconst existingUris = new Set(existingAnnotations.map((a: any) => a.uri));\n\t\t\tconst merged = [...existingAnnotations];\n\n\t\t\tfor (const newAnn of newAnnotations) {\n\t\t\t\t// AMPDO: replace this with a check against the set\n\t\t\t\tconst index = merged.findIndex((a: any) => a.uri === newAnn.uri);\n\t\t\t\tif (index >= 0) {\n\t\t\t\t\tmerged[index] = newAnn;\n\t\t\t\t} else {\n\t\t\t\t\tmerged.push(newAnn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Limit total annotations to prevent unbounded memory growth (same as extension)\n\t\t\tconst MAX_ANNOTATIONS = 500;\n\t\t\tconst updated = merged.slice(-MAX_ANNOTATIONS);\n\n\t\t\tawait this.storage.set('annotations', updated);\n\t\t\tconsole.log('[BackgroundWorker] Stored', updated.length, 'annotations (global)');\n\t\t} catch (error) {\n\t\t\tconsole.error('[BackgroundWorker] Failed to sync annotations:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tsetCurrentUrl(url: string): void {\n\t\tif (this.currentUrl !== url) {\n\t\t\tthis.currentUrl = url;\n\t\t\tthis.syncAnnotationsForUrl(url);\n\t\t}\n\t}\n\n\tgetCurrentUrl(): string | null {\n\t\treturn this.currentUrl;\n\t}\n}\n","import type { Annotation } from './types';\n\nexport async function fetchAnnotations(backendUrl: string, url: string): Promise<Annotation[]> {\n\tconsole.log(`[api] Fetching annotations for ${url} from ${backendUrl}`);\n\n\ttry {\n\t\tconst response = await fetch(\n\t\t\t`${backendUrl}/api/annotations?url=${encodeURIComponent(url)}&limit=100`\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Backend error: ${response.status}`);\n\t\t}\n\n\t\tconst data = await response.json();\n\t\t// The backend returns { annotations: [...], count: ... }\n\t\treturn data.annotations || [];\n\t} catch (error) {\n\t\tconsole.error('[api] Failed to fetch annotations:', error);\n\t\tthrow error;\n\t}\n}\n","import type { OAuthLauncher } from \"./index\";\n\n/**\n * Extension OAuth launcher using browser.identity.launchWebAuthFlow\n */\nexport class ExtensionOAuthLauncher implements OAuthLauncher {\n\tasync launch(authUrl: URL): Promise<string> {\n\t\tif (typeof browser === \"undefined\" || !browser.identity) {\n\t\t\tthrow new Error('browser.identity not available');\n\t\t}\n\n\t\tconsole.log('[oauth-launcher] Launching web auth flow...');\n\t\tconst capturedUrl = await browser.identity.launchWebAuthFlow({\n\t\t\turl: authUrl.toString(),\n\t\t\tinteractive: true,\n\t\t});\n\n\t\tif (!capturedUrl) {\n\t\t\tthrow new Error('OAuth flow cancelled or failed');\n\t\t}\n\n\t\treturn capturedUrl;\n\t}\n}\n\n/**\n * Web OAuth launcher using popup window with postMessage callback\n */\nexport class WebOAuthLauncher implements OAuthLauncher {\n\tasync launch(authUrl: URL): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst width = 600;\n\t\t\tconst height = 700;\n\t\t\tconst left = window.screenX + (window.outerWidth - width) / 2;\n\t\t\tconst top = window.screenY + (window.outerHeight - height) / 2;\n\n\t\t\t// AMPDO: Switch this to in using the same tab\n\t\t\tconst popup = window.open(\n\t\t\t\tauthUrl.toString(),\n\t\t\t\t'oauth-popup',\n\t\t\t\t`width=${width},height=${height},left=${left},top=${top},popup=yes`\n\t\t\t);\n\n\t\t\tif (!popup) {\n\t\t\t\treject(new Error('Failed to open OAuth popup'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Listen for message from callback page\n\t\t\tconst messageHandler = (event: MessageEvent) => {\n\t\t\t\tif (event.data.type === 'SEAMS_OAUTH_CALLBACK') {\n\t\t\t\t\twindow.removeEventListener('message', messageHandler);\n\t\t\t\t\tpopup.close();\n\t\t\t\t\tresolve(event.data.url);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\twindow.addEventListener('message', messageHandler);\n\n\t\t\t// Poll for popup close\n\t\t\tconst pollTimer = setInterval(() => {\n\t\t\t\tif (popup.closed) {\n\t\t\t\t\tclearInterval(pollTimer);\n\t\t\t\t\twindow.removeEventListener('message', messageHandler);\n\t\t\t\t\treject(new Error('OAuth popup closed by user'));\n\t\t\t\t}\n\t\t\t}, 500);\n\t\t});\n\t}\n}\n","import { OAuthUserAgent } from \"@atcute/oauth-browser-client\";\nimport type { OAuthManager } from \"../oauth\";\nimport type { Annotation } from \"../types\";\nimport { fetchAnnotations } from \"../api\";\n\nconst ANNOTATION_COLLECTION = \"community.lexicon.annotation.annotation\";\nconst COMMENT_COLLECTION = \"pub.leaflet.comment\";\n\nexport interface Comment {\n $type: string;\n uri?: string;\n cid?: string;\n subject: string;\n plaintext: string;\n createdAt: string;\n reply?: {\n parent: string;\n };\n facets?: any[];\n onPage?: string;\n author?: {\n did: string;\n handle: string;\n };\n}\n\nexport interface PDSConfig {\n backendUrl: string;\n}\n\nexport class PDSClient {\n private oauth: OAuthManager;\n private config: PDSConfig;\n\n constructor(oauth: OAuthManager, config: PDSConfig) {\n this.oauth = oauth;\n this.config = config;\n }\n\n private async authenticatedAgent() {\n const session = await this.oauth.loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n return { agent: new OAuthUserAgent(session), session };\n }\n\n private async indexInBackend(uri: string, cid: string) {\n try {\n await fetch(`${this.config.backendUrl}/api/annotations/index`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ uri, cid }),\n });\n console.log('[pds] Annotation indexed in backend');\n } catch (err) {\n console.error('[pds] Failed to index annotation in backend:', err);\n }\n }\n\n private async request(agent: OAuthUserAgent, path: string, options: any, retryCount = 0): Promise<Response> {\n const response = await agent.handle(path, options);\n\n if (response.status === 401 && retryCount < 3) {\n try {\n const data = await response.clone().json();\n if (data.error === 'use_dpop_nonce') {\n console.log(`[pds] DPoP nonce mismatch (retry ${retryCount + 1}), retrying...`);\n // The OAuthUserAgent should automatically update its nonce from the response headers\n return this.request(agent, path, options, retryCount + 1);\n } else if (data.error === 'invalid_token' && retryCount < 3) {\n console.log(`[pds] Invalid token (retry ${retryCount + 1}), refreshing...`);\n try {\n // Force token refresh\n const newSession = await agent.getSession({ noCache: true });\n // Update persistence\n await this.oauth.saveSession(newSession);\n \n // Create new agent with fresh credentials to ensure the new token is used\n const newAgent = new OAuthUserAgent(newSession);\n \n // Retry with the new agent\n return this.request(newAgent, path, options, retryCount + 1);\n } catch (refreshErr) {\n console.error('[pds] Token refresh failed:', refreshErr);\n // If refresh fails, we can't recover, so return original 401\n return response;\n }\n }\n } catch (e) {\n // Ignore JSON parse errors on 401\n }\n }\n\n return response;\n }\n\n async createAnnotation(annotation: Annotation): Promise<Annotation> {\n const { agent, session } = await this.authenticatedAgent();\n \n const record = {\n $type: ANNOTATION_COLLECTION,\n target: [{\n source: annotation.value.target.url,\n selector: annotation.value.target.selector?.map((s: any) => ({\n $type: s.$type,\n exact: s.exact,\n prefix: s.prefix,\n suffix: s.suffix,\n start: s.start,\n end: s.end\n }))\n }],\n body: annotation.value.body,\n createdAt: annotation.value.createdAt,\n };\n\n const response = await this.request(agent, '/xrpc/com.atproto.repo.createRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: ANNOTATION_COLLECTION,\n record,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Create error:', error);\n throw new Error(`Failed to create annotation: ${response.status} - ${JSON.stringify(error)}`);\n }\n\n const result = await response.json();\n\n // Index in backend\n // We do this optimistically/independently, but failure shouldn't block the return of the annotation\n this.indexInBackend(result.uri, result.cid).catch(err => {\n console.warn('[pds] Background indexing failed (non-fatal):', err);\n });\n\n return {\n ...annotation,\n uri: result.uri,\n cid: result.cid,\n };\n }\n\n async deleteAnnotation(uri: string): Promise<void> {\n const { agent, session } = await this.authenticatedAgent();\n\n const rkey = uri.split(\"/\").pop();\n if (!rkey) {\n throw new Error(\"Invalid URI\");\n }\n\n const response = await this.request(agent, '/xrpc/com.atproto.repo.deleteRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: ANNOTATION_COLLECTION,\n rkey,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Delete error:', error);\n throw new Error(`Failed to delete annotation: ${response.status} - ${JSON.stringify(error)}`);\n }\n }\n\n async createComment(comment: Omit<Comment, 'uri' | 'cid' | 'author'>): Promise<Comment> {\n const { agent, session } = await this.authenticatedAgent();\n \n const record = {\n $type: 'pub.leaflet.comment',\n subject: comment.subject,\n plaintext: comment.plaintext,\n createdAt: comment.createdAt,\n reply: comment.reply,\n facets: comment.facets,\n onPage: comment.onPage,\n };\n\n const response = await this.request(agent, '/xrpc/com.atproto.repo.createRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: COMMENT_COLLECTION,\n record,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Create comment error:', error);\n throw new Error(`Failed to create comment: ${response.status} - ${JSON.stringify(error)}`);\n }\n\n const result = await response.json();\n\n return {\n ...comment,\n uri: result.uri,\n cid: result.cid,\n };\n }\n\n async deleteComment(uri: string): Promise<void> {\n const { agent, session } = await this.authenticatedAgent();\n\n const rkey = uri.split(\"/\").pop();\n if (!rkey) {\n throw new Error(\"Invalid URI\");\n }\n\n const response = await this.request(agent, '/xrpc/com.atproto.repo.deleteRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: COMMENT_COLLECTION,\n rkey,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Delete comment error:', error);\n throw new Error(`Failed to delete comment: ${response.status} - ${JSON.stringify(error)}`);\n }\n }\n\n async listAnnotationsForPage(url: string): Promise<Annotation[]> {\n try {\n return await fetchAnnotations(this.config.backendUrl, url);\n } catch (error) {\n console.error('[pds] Failed to fetch from backend:', error);\n return [];\n }\n }\n}\n","export class UIState {\n private collapsedThreads = new Set<string>();\n private activeReplyForms = new Set<string>();\n\n isThreadCollapsed(uri: string): boolean {\n return this.collapsedThreads.has(uri);\n }\n\n toggleThreadCollapsed(uri: string): void {\n if (this.collapsedThreads.has(uri)) {\n this.collapsedThreads.delete(uri);\n } else {\n this.collapsedThreads.add(uri);\n }\n }\n\n isReplyFormActive(uri: string): boolean {\n return this.activeReplyForms.has(uri);\n }\n\n showReplyForm(uri: string): void {\n this.activeReplyForms.add(uri);\n }\n\n hideReplyForm(uri: string): void {\n this.activeReplyForms.delete(uri);\n }\n\n clearAllReplyForms(): void {\n this.activeReplyForms.clear();\n }\n}\n","export function normalizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.hash = '';\n let path = parsed.pathname;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n parsed.pathname = path;\n return parsed.toString();\n } catch {\n return url;\n }\n}\n","import type { StorageAdapter } from '../storage';\nimport type { OAuthLauncher, OAuthConfig, OAuthManager } from '../oauth';\nimport { OAuthManager as OAuthManagerImpl } from '../oauth';\nimport type { PDSClient, Comment } from '../pds';\nimport { PDSClient as PDSClientImpl } from '../pds';\nimport type { Annotation } from '../types';\nimport { UIState } from './ui-state';\nimport { renderAnnotationCard } from './rendering';\nimport { normalizeUrl } from './utils';\n\nimport { registerComponents } from '../components';\nimport type { SeamsAnnotationCard } from '../components';\n\nexport interface SidebarConfig {\n oauth: OAuthConfig;\n pds: {\n backendUrl: string;\n };\n}\n\nexport type SyncCallback = () => void;\n\nexport class Sidebar {\n private container: HTMLElement;\n private storage: StorageAdapter;\n private oauth: OAuthManager;\n private pds: PDSClient;\n private onSyncNeeded?: SyncCallback;\n private uiState: UIState;\n\n private currentUrl = '';\n private currentSelection: { text: string; selectors: any[] } | null = null;\n private pageAnnotations: Annotation[] = [];\n private allComments: Comment[] = [];\n private session: any = null;\n\n constructor(\n container: HTMLElement,\n storage: StorageAdapter,\n launcher: OAuthLauncher,\n config: SidebarConfig,\n onSyncNeeded?: SyncCallback\n ) {\n this.container = container;\n this.storage = storage;\n this.oauth = new OAuthManagerImpl(storage, launcher, config.oauth);\n this.pds = new PDSClientImpl(this.oauth, config.pds);\n this.onSyncNeeded = onSyncNeeded;\n this.uiState = new UIState();\n\n registerComponents();\n this.oauth.initialize();\n this.initialize();\n }\n\n private async initialize() {\n await this.render();\n this.setupStorageListener();\n }\n\n private setupStorageListener() {\n this.storage.onChange((change) => {\n if (change.key === 'annotations' || change.key === 'comments') {\n this.loadAnnotationsForCurrentUrl();\n }\n });\n }\n\n async setCurrentUrl(url: string) {\n this.currentUrl = url;\n await this.loadAnnotationsForCurrentUrl();\n }\n\n getCurrentUrl() {\n return this.currentUrl;\n }\n\n setSelection(selection: { text: string; selectors: any[] } | null) {\n this.currentSelection = selection;\n this.updateSelectionUI();\n }\n\n private async render() {\n this.session = await this.oauth.loadSession();\n await this.renderInterface();\n }\n\n private renderLoginForm() {\n this.container.innerHTML = `\n <div class=\"sidebar\">\n <div class=\"auth-section\" id=\"auth-section\">\n <div class=\"login-container\">\n <h2>Login to Seams</h2>\n <div class=\"input-wrapper\">\n <span class=\"at-symbol\">@</span>\n <input type=\"text\" id=\"handle-input\" class=\"handle-input\" placeholder=\"you.bsky.social\" />\n </div>\n <button id=\"login-btn\">Login with ATProto</button>\n <div id=\"auth-status\"></div>\n </div>\n </div>\n </div>\n `;\n\n const handleInput = this.container.querySelector('#handle-input') as HTMLInputElement;\n const loginBtn = this.container.querySelector('#login-btn');\n const authStatus = this.container.querySelector('#auth-status');\n\n const handleLogin = async () => {\n let handle = handleInput?.value.trim();\n if (!handle) {\n alert('Please enter your handle');\n return;\n }\n\n if (handle.startsWith('@')) {\n handle = handle.slice(1);\n }\n\n try {\n if (authStatus) authStatus.textContent = 'Logging in...';\n \n await this.oauth.startLoginProcess(handle);\n \n this.session = await this.oauth.loadSession();\n if (this.session) {\n await this.renderInterface();\n this.onSyncNeeded?.();\n }\n } catch (error) {\n if (authStatus) authStatus.textContent = 'Login failed';\n console.error('[sidebar] Login error:', error);\n }\n };\n\n loginBtn?.addEventListener('click', handleLogin);\n handleInput?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleLogin();\n }\n });\n }\n\n private async renderInterface() {\n let profile: any = null;\n if (this.session) {\n try {\n profile = await this.oauth.getProfile(this.session);\n } catch (error) {\n console.error('[sidebar] Failed to fetch profile:', error);\n }\n }\n\n this.container.innerHTML = `\n <div class=\"sidebar\">\n <div class=\"content-section\" id=\"content-section\">\n <div class=\"annotation-form\" id=\"annotation-form\" style=\"display: none;\">\n <div class=\"form-header\">\n <h2>Create Annotation</h2>\n <button id=\"clear-selection-btn\" class=\"clear-btn\">×</button>\n </div>\n <div id=\"selected-text\" class=\"selected-text\"></div>\n <textarea id=\"annotation-text\" placeholder=\"Add your note...\"></textarea>\n <button id=\"save-btn\">Save Annotation</button>\n </div>\n \n ${!this.session ? `\n <div style=\"padding: 12px 0; text-align: center; color: #666; font-size: 13px;\">\n Log in to create annotations\n </div>\n ` : ''}\n\n <div class=\"annotations-list\">\n <h2>Annotations on this page</h2>\n <div id=\"annotations\"></div>\n </div>\n </div>\n <div class=\"profile-menu\">\n ${this.session ? `\n <img id=\"profile-avatar\" style=\"display: ${profile?.avatar ? 'block' : 'none'}; width: 40px; height: 40px; border-radius: 50%; cursor: pointer;\" ${profile?.avatar ? `src=\"${profile.avatar}\"` : ''} />\n <div id=\"profile-dropdown\" class=\"profile-dropdown\" style=\"display: none;\">\n <button id=\"logout-btn\">Logout</button>\n </div>\n ` : `\n <button id=\"login-trigger-btn\" style=\"border-radius: 20px;\">Login</button>\n `}\n </div>\n </div>\n `;\n\n this.attachEventListeners();\n await this.loadAnnotationsForCurrentUrl();\n }\n\n private attachEventListeners() {\n const clearSelectionBtn = this.container.querySelector('#clear-selection-btn');\n const saveBtn = this.container.querySelector('#save-btn');\n const logoutBtn = this.container.querySelector('#logout-btn');\n const loginTriggerBtn = this.container.querySelector('#login-trigger-btn');\n const profileAvatar = this.container.querySelector('#profile-avatar');\n const profileDropdown = this.container.querySelector('#profile-dropdown');\n\n clearSelectionBtn?.addEventListener('click', () => {\n this.currentSelection = null;\n this.updateSelectionUI();\n });\n\n saveBtn?.addEventListener('click', async () => {\n await this.handleSaveAnnotation();\n });\n\n logoutBtn?.addEventListener('click', async () => {\n await this.oauth.clearSession();\n await this.storage.set('annotations', null);\n await this.storage.set('comments', null);\n await this.storage.set('lastSync', null);\n await this.storage.set('syncError', null);\n await this.storage.set('lastSyncAttempt', null);\n this.session = null;\n await this.render();\n });\n\n loginTriggerBtn?.addEventListener('click', () => {\n this.renderLoginForm();\n });\n\n profileAvatar?.addEventListener('click', () => {\n if (profileDropdown) {\n profileDropdown.setAttribute('style', \n profileDropdown.getAttribute('style')?.includes('none') ? 'display: block;' : 'display: none;'\n );\n }\n });\n\n document.addEventListener('click', (e) => {\n if (profileDropdown && profileAvatar &&\n !profileAvatar.contains(e.target as Node) &&\n !profileDropdown.contains(e.target as Node)) {\n profileDropdown.setAttribute('style', 'display: none;');\n }\n });\n }\n\n private updateSelectionUI() {\n const annotationForm = this.container.querySelector('#annotation-form');\n const selectedTextEl = this.container.querySelector('#selected-text');\n const annotationTextarea = this.container.querySelector('#annotation-text') as HTMLTextAreaElement;\n\n if (this.currentSelection && this.currentSelection.text && selectedTextEl) {\n selectedTextEl.innerHTML = `<blockquote>${this.currentSelection.text}</blockquote>`;\n if (annotationForm) annotationForm.setAttribute('style', 'display: block;');\n } else {\n if (selectedTextEl) selectedTextEl.innerHTML = '';\n if (annotationTextarea) annotationTextarea.value = '';\n if (annotationForm) annotationForm.setAttribute('style', 'display: none;');\n }\n }\n\n async createAnnotation(target: { source: string, selectors: any[] }, body: string) {\n try {\n await this.pds.createAnnotation({\n uri: '', // Will be populated by PDS\n cid: '',\n value: {\n target: {\n url: target.source,\n selector: target.selectors,\n },\n body,\n createdAt: new Date().toISOString(),\n },\n } as Annotation);\n\n this.currentSelection = null;\n this.updateSelectionUI();\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create annotation:', error);\n throw error; // Re-throw to handle in caller if needed\n }\n }\n\n private async handleSaveAnnotation() {\n if (!this.session) {\n this.renderLoginForm();\n return;\n }\n\n if (!this.currentSelection) return;\n\n const annotationTextarea = this.container.querySelector('#annotation-text') as HTMLTextAreaElement;\n const body = annotationTextarea?.value.trim() || '';\n\n // Optimistic UI update\n const tempUri = `temp:${Date.now()}`;\n const tempAnnotation: Annotation = {\n uri: tempUri,\n cid: 'pending',\n value: {\n target: {\n url: this.currentUrl,\n selector: this.currentSelection.selectors,\n },\n body,\n createdAt: new Date().toISOString(),\n },\n author: {\n did: 'you', // We might want to get the actual DID from session if available\n handle: 'you',\n }\n };\n\n // Add to local list immediately\n this.pageAnnotations.unshift(tempAnnotation);\n this.renderAnnotations();\n \n // Clear form immediately\n const originalSelection = this.currentSelection;\n this.currentSelection = null;\n this.updateSelectionUI();\n\n try {\n const created = await this.pds.createAnnotation({\n uri: '', // Placeholder\n cid: '',\n value: {\n target: {\n url: this.currentUrl,\n selector: originalSelection.selectors,\n },\n body,\n createdAt: new Date().toISOString(),\n },\n } as Annotation);\n\n // Replace temp annotation with real one\n const index = this.pageAnnotations.findIndex(a => a.uri === tempUri);\n if (index !== -1) {\n this.pageAnnotations[index] = created;\n }\n this.renderAnnotations();\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create annotation:', error);\n alert('Failed to save annotation');\n // Remove temp annotation on failure\n this.pageAnnotations = this.pageAnnotations.filter(a => a.uri !== tempUri);\n this.renderAnnotations();\n // Restore selection?\n this.currentSelection = originalSelection;\n this.updateSelectionUI();\n if (annotationTextarea) annotationTextarea.value = body;\n }\n }\n\n private async loadAnnotationsForCurrentUrl() {\n const result = await this.storage.get(['annotations', 'comments']);\n\n // Validate cache schema\n if (result.annotations && result.annotations.length > 0) {\n const first = result.annotations[0];\n // Check for flat schema (missing value wrapper) or old schema\n if (!first.value || Array.isArray(first.target)) {\n console.warn('[sidebar] Detected legacy/invalid cache schema. Clearing storage.');\n await this.storage.set('annotations', []);\n this.pageAnnotations = [];\n this.renderAnnotations();\n return;\n }\n }\n\n const norm = normalizeUrl(this.currentUrl);\n console.log('[sidebar] Current URL normalized:', norm);\n console.log('[sidebar] Total annotations in storage:', result.annotations?.length || 0);\n \n this.pageAnnotations = (result.annotations || []).filter(\n (ann: Annotation) => {\n if (!ann || !ann.value || !ann.value.target) {\n console.warn('[sidebar] Malformed annotation found:', ann);\n return false;\n }\n const annUrl = normalizeUrl(ann.value.target.url);\n const matches = annUrl === norm;\n if (!matches) {\n // console.log('[sidebar] Filtered out:', annUrl, '!==', norm);\n }\n return matches;\n }\n );\n console.log('[sidebar] Filtered to', this.pageAnnotations.length, 'annotations for this page');\n this.allComments = result.comments || [];\n\n this.renderAnnotations();\n }\n\n private renderAnnotations() {\n const annotationsContainer = this.container.querySelector('#annotations');\n if (!annotationsContainer) return;\n\n if (this.pageAnnotations.length === 0) {\n annotationsContainer.innerHTML = '<p class=\"empty\">No annotations yet. Select text to create one.</p>';\n return;\n }\n\n annotationsContainer.innerHTML = '';\n \n this.pageAnnotations.forEach(ann => {\n const card = document.createElement('seams-annotation-card') as SeamsAnnotationCard;\n card.annotation = ann;\n card.comments = this.allComments;\n annotationsContainer.appendChild(card);\n });\n\n // Event delegation for custom events from web components\n if (!annotationsContainer.hasAttribute('data-listening')) {\n annotationsContainer.setAttribute('data-listening', 'true');\n \n annotationsContainer.addEventListener('comment-submit', (async (e: Event) => {\n const detail = (e as CustomEvent).detail;\n await this.handleCommentSubmit(detail.subjectUri, detail.text);\n }) as EventListener);\n\n annotationsContainer.addEventListener('reply-submit', (async (e: Event) => {\n const detail = (e as CustomEvent).detail;\n await this.handleReplySubmit(detail.parentUri, detail.text);\n }) as EventListener);\n }\n }\n\n private async handleCommentSubmit(subject: string, plaintext: string) {\n if (!this.session) {\n this.renderLoginForm();\n return;\n }\n\n try {\n await this.pds.createComment({\n $type: 'pub.leaflet.comment',\n subject,\n plaintext,\n createdAt: new Date().toISOString(),\n });\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create comment:', error);\n alert('Failed to post comment');\n }\n }\n\n private async handleReplySubmit(parent: string, plaintext: string) {\n if (!this.session) {\n this.renderLoginForm();\n return;\n }\n\n const parentComment = this.allComments.find(c => c.uri === parent);\n if (!parentComment) return;\n\n try {\n await this.pds.createComment({\n $type: 'pub.leaflet.comment',\n subject: parentComment.subject,\n plaintext,\n createdAt: new Date().toISOString(),\n reply: { parent },\n });\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create reply:', error);\n alert('Failed to post reply');\n }\n }\n}\n\nexport { UIState } from './ui-state';\nexport { renderAnnotationCard, buildCommentThread } from './rendering';\nexport { normalizeUrl } from './utils';\n","import '../sidepanel/style.css';\nimport { WebStorageAdapter, WebOAuthLauncher, Sidebar, BackgroundWorker, fetchAnnotations } from '@seams/core';\n\nconsole.log('[seams-sidebar] Loading sidebar (v2.1)...');\n\nconst app = document.getElementById('app');\nif (!app) {\n throw new Error('App element not found');\n}\n\nconst storage = new WebStorageAdapter();\nconst launcher = new WebOAuthLauncher();\n\nconst backgroundWorker = new BackgroundWorker({\n storage,\n fetchAnnotations: async (url: string) => {\n const backendUrl = import.meta.env.VITE_BACKEND_URL || import.meta.env.BACKEND_URL || 'https://seams.so';\n return fetchAnnotations(backendUrl, url);\n },\n});\n\nconst sidebar = new Sidebar(\n app,\n storage,\n launcher,\n {\n oauth: {\n clientId: import.meta.env.VITE_OAUTH_CLIENT_ID || 'http://localhost:8081/static/client-metadata.json',\n redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'http://localhost:8081/static/oauth-callback.html',\n scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic',\n },\n pds: {\n backendUrl: import.meta.env.VITE_BACKEND_URL || import.meta.env.BACKEND_URL || 'https://seams.so',\n },\n },\n (url?: string) => {\n if (url) {\n backgroundWorker.setCurrentUrl(url);\n }\n }\n);\n\n// Listen for messages from parent (page URL)\nwindow.addEventListener('message', (event) => {\n if (event.data.type === 'SEAMS_PAGE_URL') {\n const url = event.data.url;\n console.log('[seams-sidebar] Received page URL:', url);\n sidebar.setCurrentUrl(url);\n backgroundWorker.setCurrentUrl(url);\n } else if (event.data.type === 'SEAMS_TEXT_SELECTED') {\n console.log('[seams-sidebar] Received selection update');\n sidebar.setSelection(event.data.payload);\n } else if (event.data.type === 'SEAMS_CREATE_ANNOTATION') {\n console.log('[seams-sidebar] Received create annotation request');\n const { text, selectors, body } = event.data.payload;\n // Use the current URL of the sidebar (which should match the page)\n // But we can also use the source URL from the payload if we sent it, \n // currently sidebar uses its own this.currentUrl\n \n // We need to make sure sidebar has the correct URL set\n // The sidebar tracks currentUrl via SEAMS_PAGE_URL messages\n \n sidebar.createAnnotation({\n source: sidebar.getCurrentUrl(), // Assuming public getter or we can just rely on internal state\n selectors\n }, body).then(() => {\n console.log('[seams-sidebar] Annotation created from mobile request');\n }).catch(err => {\n console.error('[seams-sidebar] Failed to create annotation from mobile request:', err);\n });\n }\n});\n\n// Notify parent window that sidebar is ready\nwindow.parent.postMessage({ type: 'SEAMS_SIDEBAR_READY' }, '*');\nconsole.log('[seams-sidebar] Ready');\n"],"names":["BackgroundWorker","options","url","newAnnotations","existingAnnotations","existingUris","a","merged","newAnn","index","updated","error","fetchAnnotations","backendUrl","response","WebOAuthLauncher","authUrl","resolve","reject","left","top","popup","messageHandler","event","pollTimer","ANNOTATION_COLLECTION","COMMENT_COLLECTION","PDSClient","oauth","config","session","OAuthUserAgent","uri","cid","err","agent","path","retryCount","data","newSession","newAgent","refreshErr","annotation","record","_a","s","result","rkey","comment","UIState","normalizeUrl","parsed","Sidebar","container","storage","launcher","onSyncNeeded","OAuthManagerImpl","PDSClientImpl","registerComponents","change","selection","handleInput","loginBtn","authStatus","handleLogin","handle","e","profile","clearSelectionBtn","saveBtn","logoutBtn","loginTriggerBtn","profileAvatar","profileDropdown","annotationForm","selectedTextEl","annotationTextarea","target","body","tempUri","tempAnnotation","originalSelection","created","first","norm","ann","annotationsContainer","card","detail","subject","plaintext","parent","parentComment","c","app","WebStorageAdapter","backgroundWorker","sidebar","text","selectors"],"mappings":"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"}
-121
proxy/static/static/seams-sidebar.js
··· 1 - var T=Object.defineProperty;var S=r=>{throw TypeError(r)};var N=(r,t,e)=>t in r?T(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var A=(r,t,e)=>N(r,typeof t!="symbol"?t+"":t,e),$=(r,t,e)=>t.has(r)||S("Cannot "+e);var u=(r,t,e)=>($(r,t,"read from private field"),e?e.call(r):t.get(r)),w=(r,t,e)=>t.has(r)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,e),m=(r,t,e,o)=>($(r,t,"write to private field"),o?o.call(r,e):t.set(r,e),e);import{W as P}from"./assets/web-Ts7v-0PE.js";import{c as j,g as k,O as I,d as q,a as D,r as W,b as z,f as H}from"./assets/exchange-CZnIlTgn.js";class _{constructor(t){this.currentUrl=null,this.storage=t.storage,this.fetchAnnotations=t.fetchAnnotations}async syncAnnotationsForUrl(t){console.log("[BackgroundWorker] Syncing annotations for:",t);try{const e=await this.fetchAnnotations(t);console.log("[BackgroundWorker] Fetched",e.length,"annotations");const o=`annotations:${t}`;await this.storage.set(o,e),console.log("[BackgroundWorker] Stored",e.length,"annotations")}catch(e){throw console.error("[BackgroundWorker] Failed to sync annotations:",e),e}}setCurrentUrl(t){this.currentUrl!==t&&(this.currentUrl=t,this.syncAnnotationsForUrl(t))}getCurrentUrl(){return this.currentUrl}}var p,h;class y{constructor(t){A(this,"session");w(this,p);w(this,h);this.session=t,m(this,p,j(t.dpopKey,!1))}get sub(){return this.session.info.sub}getSession(t){const e=k(this.session.info.sub,t);return e.then(o=>{this.session=o}).finally(()=>{m(this,h,void 0)}),m(this,h,e)}async signOut(){const t=this.session.info.sub;try{const{dpopKey:e,info:o,token:s}=await k(t,{allowStale:!0});await new I(o.server,e).revoke(s.refresh??s.access)}finally{q(t)}}async handle(t,e){await u(this,h);const o=new Headers(e==null?void 0:e.headers);let s=this.session,n=new URL(t,s.info.aud);o.set("authorization",`${s.token.type} ${s.token.access}`);let a=await u(this,p).call(this,n,{...e,headers:o});if(!M(a))return a;try{u(this,h)?s=await u(this,h):s=await this.getSession()}catch{return a}return(e==null?void 0:e.body)instanceof ReadableStream?a:(n=new URL(t,s.info.aud),o.set("authorization",`${s.token.type} ${s.token.access}`),await u(this,p).call(this,n,{...e,headers:o}))}}p=new WeakMap,h=new WeakMap;const M=r=>{if(r.status!==401)return!1;const t=r.headers.get("www-authenticate");return t!=null&&(t.startsWith("Bearer ")||t.startsWith("DPoP "))&&t.includes('error="invalid_token"')},f="synthesis-oauth:session";let L=!1;class J{constructor(t,e,o){this.storage=t,this.launcher=e,this.config=o}initialize(){typeof window<"u"&&!L&&(D({metadata:{client_id:this.config.clientId,redirect_uri:this.config.redirectUri}}),L=!0)}async startLoginProcess(t){console.log("[oauth] Starting login process for handle:",t),this.initialize(),console.log("[oauth] Resolving identity...");const{metadata:e}=await W(t);console.log("[oauth] PDS metadata:",e),console.log("[oauth] Creating authorization URL...");const o=await z({metadata:e,scope:this.config.scope});console.log("[oauth] Auth URL:",o.toString()),console.log("[oauth] Launching auth flow...");const s=await this.launcher.launch(o);if(!s)throw new Error("OAuth flow cancelled or failed");console.log("[oauth] Captured redirect URL:",s);const n=new URL(s),a=n.search||n.hash.slice(1),i=new URLSearchParams(a);if(console.log("[oauth] OAuth params:",Object.fromEntries(i)),i.has("error")){const d=i.get("error"),c=i.get("error_description");throw console.error("[oauth] OAuth error:",d,c),new Error(`OAuth error: ${d} - ${c}`)}console.log("[oauth] Finalizing authorization...");const l=await H(i);console.log("[oauth] Authorization complete, session:",l),await this.saveSession(l),console.log("[oauth] Session saved successfully")}async saveSession(t){await this.storage.set(f,t)}async loadSession(){return await this.storage.get(f)}async clearSession(){await this.storage.set(f,null)}async getProfile(t){return await(await new y(t).handle("/xrpc/app.bsky.actor.getProfile?actor="+t.info.sub)).json()}}class B{async launch(t){return new Promise((e,o)=>{const a=window.screenX+(window.outerWidth-600)/2,i=window.screenY+(window.outerHeight-700)/2,l=window.open(t.toString(),"oauth-popup",`width=600,height=700,left=${a},top=${i},popup=yes`);if(!l){o(new Error("Failed to open OAuth popup"));return}const d=g=>{g.data.type==="SEAMS_OAUTH_CALLBACK"&&(window.removeEventListener("message",d),l.close(),e(g.data.url))};window.addEventListener("message",d);const c=setInterval(()=>{l.closed&&(clearInterval(c),window.removeEventListener("message",d),o(new Error("OAuth popup closed by user")))},500)})}}const b="community.lexicon.annotation.annotation",E="pub.leaflet.comment";class K{constructor(t,e){this.oauth=t,this.config=e}async createAnnotation(t){const e=await this.oauth.loadSession();if(!e)throw new Error("Not authenticated");const o=new y(e),s={$type:t.$type,target:t.target,body:t.body,tags:t.tags,document:t.document,createdAt:t.createdAt},n=await o.handle("/xrpc/com.atproto.repo.createRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:e.info.sub,collection:b,record:s})});if(!n.ok){const i=await n.json();throw console.error("[pds] Create error:",i),new Error(`Failed to create annotation: ${n.status} - ${JSON.stringify(i)}`)}const a=await n.json();try{await fetch(`${this.config.backendUrl}/api/annotations/index`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uri:a.uri,cid:a.cid})}),console.log("[pds] Annotation indexed in backend")}catch(i){console.error("[pds] Failed to index annotation in backend:",i)}return{...t,uri:a.uri,cid:a.cid}}async deleteAnnotation(t){const e=await this.oauth.loadSession();if(!e)throw new Error("Not authenticated");const o=new y(e),s=t.split("/").pop();if(!s)throw new Error("Invalid URI");const n=await o.handle("/xrpc/com.atproto.repo.deleteRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:e.info.sub,collection:b,rkey:s})});if(!n.ok){const a=await n.json();throw console.error("[pds] Delete error:",a),new Error(`Failed to delete annotation: ${n.status} - ${JSON.stringify(a)}`)}}async createComment(t){const e=await this.oauth.loadSession();if(!e)throw new Error("Not authenticated");const o=new y(e),s={$type:"pub.leaflet.comment",subject:t.subject,plaintext:t.plaintext,createdAt:t.createdAt,reply:t.reply,facets:t.facets,onPage:t.onPage},n=await o.handle("/xrpc/com.atproto.repo.createRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:e.info.sub,collection:E,record:s})});if(!n.ok){const i=await n.json();throw console.error("[pds] Create comment error:",i),new Error(`Failed to create comment: ${n.status} - ${JSON.stringify(i)}`)}const a=await n.json();return{...t,uri:a.uri,cid:a.cid}}async deleteComment(t){const e=await this.oauth.loadSession();if(!e)throw new Error("Not authenticated");const o=new y(e),s=t.split("/").pop();if(!s)throw new Error("Invalid URI");const n=await o.handle("/xrpc/com.atproto.repo.deleteRecord",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo:e.info.sub,collection:E,rkey:s})});if(!n.ok){const a=await n.json();throw console.error("[pds] Delete comment error:",a),new Error(`Failed to delete comment: ${n.status} - ${JSON.stringify(a)}`)}}async listAnnotationsForPage(t){try{const e=await fetch(`${this.config.backendUrl}/api/annotations?url=${encodeURIComponent(t)}&limit=100`);if(!e.ok)throw new Error(`Backend error: ${e.status}`);return((await e.json()).annotations||[]).map(n=>{const a=JSON.parse(n.selectors||"[]");return{$type:b,uri:n.uri,cid:n.cid,target:[{source:n.targetUrl,selector:a}],body:n.body||"",createdAt:n.createdAt,author:n.authorHandle?{did:n.authorDid,handle:n.authorHandle}:void 0}})}catch(e){return console.error("[pds] Failed to fetch from backend:",e),[]}}}class Y{constructor(){this.collapsedThreads=new Set,this.activeReplyForms=new Set}isThreadCollapsed(t){return this.collapsedThreads.has(t)}toggleThreadCollapsed(t){this.collapsedThreads.has(t)?this.collapsedThreads.delete(t):this.collapsedThreads.add(t)}isReplyFormActive(t){return this.activeReplyForms.has(t)}showReplyForm(t){this.activeReplyForms.add(t)}hideReplyForm(t){this.activeReplyForms.delete(t)}clearAllReplyForms(){this.activeReplyForms.clear()}}function U(r,t,e,o=!1){const s=t.filter(a=>{var i;return((i=a.reply)==null?void 0:i.parent)===r});if(s.length===0)return"";const n=e.isThreadCollapsed(r);return` 2 - <div class="comment-thread ${o?"nested":""}"> 3 - <button class="thread-toggle-btn" data-uri="${r}"> 4 - ${n?"▸":"▾"} ${s.length} ${s.length===1?"reply":"replies"} 5 - </button> 6 - ${n?"":` 7 - <div class="thread-children ${s.length===1?"single-child":""}"> 8 - ${s.map(a=>{const i=t.some(d=>{var c;return((c=d.reply)==null?void 0:c.parent)===a.uri}),l=e.isReplyFormActive(a.uri);return` 9 - <div class="comment" data-uri="${a.uri}"> 10 - <div class="comment-content"> 11 - <div class="comment-text">${a.plaintext}</div> 12 - <div class="comment-meta"> 13 - <small>${new Date(a.createdAt).toLocaleString()}</small> 14 - <button class="reply-btn" data-uri="${a.uri}">Reply</button> 15 - </div> 16 - </div> 17 - ${l?` 18 - <div class="reply-form" data-parent="${a.uri}"> 19 - <textarea class="reply-input" placeholder="Write a reply..."></textarea> 20 - <div class="reply-actions"> 21 - <button class="save-reply-btn">Post</button> 22 - <button class="cancel-reply-btn">Cancel</button> 23 - </div> 24 - </div> 25 - `:""} 26 - ${i?U(a.uri,t,e,!0):""} 27 - </div> 28 - `}).join("")} 29 - </div> 30 - `} 31 - </div> 32 - `}function G(r,t,e){var l,d;const o=(d=(l=r.target[0])==null?void 0:l.selector)==null?void 0:d.find(c=>c.$type==="community.lexicon.annotation.annotation#textQuoteSelector"),s=(o==null?void 0:o.exact)||"",n=t.filter(c=>c.subject===r.uri&&!c.reply),a=e.isThreadCollapsed(r.uri),i=e.isReplyFormActive(r.uri);return` 33 - <div class="annotation-card" data-uri="${r.uri}"> 34 - ${s?`<blockquote>${s}</blockquote>`:""} 35 - ${r.body?`<p>${r.body}</p>`:""} 36 - <div class="annotation-meta"> 37 - <small>${new Date(r.createdAt).toLocaleString()}</small> 38 - </div> 39 - <div class="comments-section"> 40 - <div class="comments-header"> 41 - <button class="toggle-comments-btn" data-uri="${r.uri}"> 42 - ${a?"▸":"▾"} ${n.length} comment${n.length!==1?"s":""} 43 - </button> 44 - <button class="add-comment-btn" data-uri="${r.uri}">Add comment</button> 45 - </div> 46 - ${a?"":` 47 - <div class="comments-list"> 48 - ${i?` 49 - <div class="comment-form" data-subject="${r.uri}"> 50 - <textarea class="comment-input" placeholder="Write a comment..."></textarea> 51 - <div class="comment-actions"> 52 - <button class="save-comment-btn">Post</button> 53 - <button class="cancel-comment-btn">Cancel</button> 54 - </div> 55 - </div> 56 - `:""} 57 - ${n.map(c=>{const g=t.some(O=>{var v;return((v=O.reply)==null?void 0:v.parent)===c.uri});return` 58 - <div class="comment" data-uri="${c.uri}"> 59 - <div class="comment-content"> 60 - <div class="comment-text">${c.plaintext}</div> 61 - <div class="comment-meta"> 62 - <small>${new Date(c.createdAt).toLocaleString()}</small> 63 - <button class="reply-btn" data-uri="${c.uri}">Reply</button> 64 - </div> 65 - </div> 66 - ${e.isReplyFormActive(c.uri)?` 67 - <div class="reply-form" data-parent="${c.uri}"> 68 - <textarea class="reply-input" placeholder="Write a reply..."></textarea> 69 - <div class="reply-actions"> 70 - <button class="save-reply-btn">Post</button> 71 - <button class="cancel-reply-btn">Cancel</button> 72 - </div> 73 - </div> 74 - `:""} 75 - ${g?U(c.uri,t,e,!0):""} 76 - </div> 77 - `}).join("")} 78 - </div> 79 - `} 80 - </div> 81 - </div> 82 - `}function C(r){try{const t=new URL(r);t.hash="";let e=t.pathname;return e.endsWith("/")&&e!=="/"&&(e=e.slice(0,-1)),t.pathname=e,t.toString()}catch{return r}}class Q{constructor(t,e,o,s,n){this.currentUrl="",this.currentSelection=null,this.pageAnnotations=[],this.allComments=[],this.container=t,this.storage=e,this.oauth=new J(e,o,s.oauth),this.pds=new K(this.oauth,s.pds),this.onSyncNeeded=n,this.uiState=new Y,this.oauth.initialize(),this.initialize()}async initialize(){await this.render(),this.setupStorageListener()}setupStorageListener(){this.storage.onChange(t=>{(t.key==="annotations"||t.key==="comments")&&this.loadAnnotationsForCurrentUrl()})}async setCurrentUrl(t){this.currentUrl=t,await this.loadAnnotationsForCurrentUrl()}setSelection(t){this.currentSelection=t,this.updateSelectionUI()}async render(){const t=await this.oauth.loadSession();t?await this.renderLoggedIn(t):this.renderLoginForm()}renderLoginForm(){this.container.innerHTML=` 83 - <div class="sidebar"> 84 - <div class="auth-section" id="auth-section"> 85 - <div class="login-container"> 86 - <h2>Login to Seams</h2> 87 - <div class="input-wrapper"> 88 - <span class="at-symbol">@</span> 89 - <input type="text" id="handle-input" class="handle-input" placeholder="you.bsky.social" /> 90 - </div> 91 - <button id="login-btn">Login with ATProto</button> 92 - <div id="auth-status"></div> 93 - </div> 94 - </div> 95 - </div> 96 - `;const t=this.container.querySelector("#handle-input"),e=this.container.querySelector("#login-btn"),o=this.container.querySelector("#auth-status"),s=async()=>{var a;let n=t==null?void 0:t.value.trim();if(!n){alert("Please enter your handle");return}n.startsWith("@")&&(n=n.slice(1));try{o&&(o.textContent="Logging in..."),await this.oauth.startLoginProcess(n);const i=await this.oauth.loadSession();i&&(await this.renderLoggedIn(i),(a=this.onSyncNeeded)==null||a.call(this))}catch(i){o&&(o.textContent="Login failed"),console.error("[sidebar] Login error:",i)}};e==null||e.addEventListener("click",s),t==null||t.addEventListener("keydown",n=>{n.key==="Enter"&&(n.preventDefault(),s())})}async renderLoggedIn(t){let e=null;try{e=await this.oauth.getProfile(t)}catch(o){console.error("[sidebar] Failed to fetch profile:",o)}this.container.innerHTML=` 97 - <div class="sidebar"> 98 - <div class="content-section" id="content-section"> 99 - <div class="annotation-form" id="annotation-form" style="display: none;"> 100 - <div class="form-header"> 101 - <h2>Create Annotation</h2> 102 - <button id="clear-selection-btn" class="clear-btn">×</button> 103 - </div> 104 - <div id="selected-text" class="selected-text"></div> 105 - <textarea id="annotation-text" placeholder="Add your note..."></textarea> 106 - <button id="save-btn">Save Annotation</button> 107 - </div> 108 - <div class="annotations-list"> 109 - <h2>Annotations on this page</h2> 110 - <div id="annotations"></div> 111 - </div> 112 - </div> 113 - <div class="profile-menu"> 114 - <img id="profile-avatar" style="display: ${e!=null&&e.avatar?"block":"none"}; width: 40px; height: 40px; border-radius: 50%; cursor: pointer;" ${e!=null&&e.avatar?`src="${e.avatar}"`:""} /> 115 - <div id="profile-dropdown" class="profile-dropdown" style="display: none;"> 116 - <button id="logout-btn">Logout</button> 117 - </div> 118 - </div> 119 - </div> 120 - `,this.attachEventListeners(),await this.loadAnnotationsForCurrentUrl()}attachEventListeners(){const t=this.container.querySelector("#clear-selection-btn"),e=this.container.querySelector("#save-btn"),o=this.container.querySelector("#logout-btn"),s=this.container.querySelector("#profile-avatar"),n=this.container.querySelector("#profile-dropdown");t==null||t.addEventListener("click",()=>{this.currentSelection=null,this.updateSelectionUI()}),e==null||e.addEventListener("click",async()=>{await this.handleSaveAnnotation()}),o==null||o.addEventListener("click",async()=>{await this.oauth.clearSession(),await this.storage.set("annotations",null),await this.storage.set("comments",null),await this.storage.set("lastSync",null),await this.storage.set("syncError",null),await this.storage.set("lastSyncAttempt",null),await this.render()}),s==null||s.addEventListener("click",()=>{var a;n&&n.setAttribute("style",(a=n.getAttribute("style"))!=null&&a.includes("none")?"display: block;":"display: none;")}),document.addEventListener("click",a=>{n&&s&&!s.contains(a.target)&&!n.contains(a.target)&&n.setAttribute("style","display: none;")})}updateSelectionUI(){const t=this.container.querySelector("#annotation-form"),e=this.container.querySelector("#selected-text"),o=this.container.querySelector("#annotation-text");this.currentSelection&&this.currentSelection.text&&e?(e.innerHTML=`<blockquote>${this.currentSelection.text}</blockquote>`,t&&t.setAttribute("style","display: block;")):(e&&(e.innerHTML=""),o&&(o.value=""),t&&t.setAttribute("style","display: none;"))}async handleSaveAnnotation(){var o;if(!this.currentSelection)return;const t=this.container.querySelector("#annotation-text"),e=(t==null?void 0:t.value.trim())||"";try{await this.pds.createAnnotation({$type:"community.lexicon.annotation.annotation",target:[{source:this.currentUrl,selector:this.currentSelection.selectors}],body:e,createdAt:new Date().toISOString()}),this.currentSelection=null,this.updateSelectionUI(),(o=this.onSyncNeeded)==null||o.call(this)}catch(s){console.error("[sidebar] Failed to create annotation:",s),alert("Failed to save annotation")}}async loadAnnotationsForCurrentUrl(){const t=await this.storage.get(["annotations","comments"]),e=C(this.currentUrl);this.pageAnnotations=(t.annotations||[]).filter(o=>{var s;return C((s=o.target[0])==null?void 0:s.source)===e}),this.allComments=t.comments||[],this.renderAnnotations()}renderAnnotations(){const t=this.container.querySelector("#annotations");if(t){if(this.pageAnnotations.length===0){t.innerHTML='<p class="empty">No annotations yet. Select text to create one.</p>';return}t.innerHTML=this.pageAnnotations.map(e=>G(e,this.allComments,this.uiState)).join(""),this.attachCommentEventListeners()}}attachCommentEventListeners(){this.container.querySelectorAll(".toggle-comments-btn").forEach(t=>{t.addEventListener("click",e=>{const o=e.target.dataset.uri;this.uiState.toggleThreadCollapsed(o),this.renderAnnotations()})}),this.container.querySelectorAll(".add-comment-btn").forEach(t=>{t.addEventListener("click",e=>{const o=e.target.dataset.uri;this.uiState.showReplyForm(o),this.renderAnnotations()})}),this.container.querySelectorAll(".reply-btn").forEach(t=>{t.addEventListener("click",e=>{const o=e.target.dataset.uri;this.uiState.showReplyForm(o),this.renderAnnotations()})}),this.container.querySelectorAll(".cancel-comment-btn, .cancel-reply-btn").forEach(t=>{t.addEventListener("click",e=>{const o=e.target.closest(".comment-form, .reply-form"),s=o.getAttribute("data-subject")||o.getAttribute("data-parent");this.uiState.hideReplyForm(s),this.renderAnnotations()})}),this.container.querySelectorAll(".save-comment-btn").forEach(t=>{t.addEventListener("click",async e=>{var i;const o=e.target.closest(".comment-form"),s=o.querySelector(".comment-input"),n=o.getAttribute("data-subject"),a=s.value.trim();if(a)try{await this.pds.createComment({$type:"pub.leaflet.comment",subject:n,plaintext:a,createdAt:new Date().toISOString()}),this.uiState.hideReplyForm(n),(i=this.onSyncNeeded)==null||i.call(this)}catch(l){console.error("[sidebar] Failed to create comment:",l),alert("Failed to post comment")}})}),this.container.querySelectorAll(".save-reply-btn").forEach(t=>{t.addEventListener("click",async e=>{var l;const o=e.target.closest(".reply-form"),s=o.querySelector(".reply-input"),n=o.getAttribute("data-parent"),a=s.value.trim();if(!a)return;const i=this.allComments.find(d=>d.uri===n);if(i)try{await this.pds.createComment({$type:"pub.leaflet.comment",subject:i.subject,plaintext:a,createdAt:new Date().toISOString(),reply:{parent:n}}),this.uiState.hideReplyForm(n),(l=this.onSyncNeeded)==null||l.call(this)}catch(d){console.error("[sidebar] Failed to create reply:",d),alert("Failed to post reply")}})}),this.container.querySelectorAll(".thread-toggle-btn").forEach(t=>{t.addEventListener("click",e=>{const o=e.target.dataset.uri;this.uiState.toggleThreadCollapsed(o),this.renderAnnotations()})})}}console.log("[seams-sidebar] Loading sidebar...");const x=document.getElementById("app");if(!x)throw new Error("App element not found");const F=new P,X=new B,R=new _({storage:F,fetchAnnotations:async r=>{const e=await fetch(`https://seams.so/api/annotations?url=${encodeURIComponent(r)}&limit=100`);if(!e.ok)throw new Error(`Backend error: ${e.status}`);return((await e.json()).annotations||[]).map(s=>{const n=JSON.parse(s.selectors||"[]");return{$type:"community.lexicon.annotation.annotation",uri:s.uri,cid:s.cid,target:[{source:s.targetUrl,selector:n}],body:s.body||"",createdAt:s.createdAt,author:s.authorHandle?{did:s.authorDid,handle:s.authorHandle}:void 0}})}}),V=new Q(x,F,X,{oauth:{clientId:"http://localhost:8081/static/client-metadata.json",redirectUri:"http://localhost:8081/static/oauth-callback.html",scope:"atproto transition:generic"},pds:{backendUrl:"https://seams.so"}},r=>{r&&R.setCurrentUrl(r)});window.addEventListener("message",r=>{if(r.data.type==="SEAMS_PAGE_URL"){const t=r.data.url;console.log("[seams-sidebar] Received page URL:",t),V.setCurrentUrl(t),R.setCurrentUrl(t)}});window.parent.postMessage({type:"SEAMS_SIDEBAR_READY"},"*");console.log("[seams-sidebar] Ready"); 121 - //# sourceMappingURL=seams-sidebar.js.map
-1
proxy/static/static/seams-sidebar.js.map
··· 1 - {"version":3,"file":"seams-sidebar.js","sources":["../../packages/core/src/background/worker.ts","../../node_modules/.pnpm/@atcute+oauth-browser-client@1.0.27/node_modules/@atcute/oauth-browser-client/dist/agents/user-agent.js","../../packages/core/src/oauth/index.ts","../../packages/core/src/oauth/launchers.ts","../../packages/core/src/pds/index.ts","../../packages/core/src/sidebar/ui-state.ts","../../packages/core/src/sidebar/rendering.ts","../../packages/core/src/sidebar/utils.ts","../../packages/core/src/sidebar/index.ts","../../entrypoints/via-client/sidebar.ts"],"sourcesContent":["// Background worker - fetches annotations and writes to storage\nimport type { StorageAdapter } from '../storage/adapter';\nimport type { Annotation } from '../types';\n\nexport interface BackgroundWorkerOptions {\n storage: StorageAdapter;\n fetchAnnotations: (url: string) => Promise<Annotation[]>;\n}\n\nexport class BackgroundWorker {\n private storage: StorageAdapter;\n private fetchAnnotations: (url: string) => Promise<Annotation[]>;\n private currentUrl: string | null = null;\n\n constructor(options: BackgroundWorkerOptions) {\n this.storage = options.storage;\n this.fetchAnnotations = options.fetchAnnotations;\n }\n\n async syncAnnotationsForUrl(url: string): Promise<void> {\n console.log('[BackgroundWorker] Syncing annotations for:', url);\n \n try {\n const annotations = await this.fetchAnnotations(url);\n console.log('[BackgroundWorker] Fetched', annotations.length, 'annotations');\n \n const key = `annotations:${url}`;\n await this.storage.set(key, annotations);\n console.log('[BackgroundWorker] Stored', annotations.length, 'annotations');\n } catch (error) {\n console.error('[BackgroundWorker] Failed to sync annotations:', error);\n throw error;\n }\n }\n\n setCurrentUrl(url: string): void {\n if (this.currentUrl !== url) {\n this.currentUrl = url;\n this.syncAnnotationsForUrl(url);\n }\n }\n\n getCurrentUrl(): string | null {\n return this.currentUrl;\n }\n}\n","import { createDPoPFetch } from '../dpop.js';\nimport { OAuthServerAgent } from './server-agent.js';\nimport { deleteStoredSession, getSession } from './sessions.js';\nexport class OAuthUserAgent {\n session;\n #fetch;\n #getSessionPromise;\n constructor(session) {\n this.session = session;\n this.#fetch = createDPoPFetch(session.dpopKey, false);\n }\n get sub() {\n return this.session.info.sub;\n }\n getSession(options) {\n const promise = getSession(this.session.info.sub, options);\n promise\n .then((session) => {\n this.session = session;\n })\n .finally(() => {\n this.#getSessionPromise = undefined;\n });\n return (this.#getSessionPromise = promise);\n }\n async signOut() {\n const sub = this.session.info.sub;\n try {\n const { dpopKey, info, token } = await getSession(sub, { allowStale: true });\n const server = new OAuthServerAgent(info.server, dpopKey);\n await server.revoke(token.refresh ?? token.access);\n }\n finally {\n deleteStoredSession(sub);\n }\n }\n async handle(pathname, init) {\n await this.#getSessionPromise;\n const headers = new Headers(init?.headers);\n let session = this.session;\n let url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n let response = await this.#fetch(url, { ...init, headers });\n if (!isInvalidTokenResponse(response)) {\n return response;\n }\n try {\n if (this.#getSessionPromise) {\n session = await this.#getSessionPromise;\n }\n else {\n session = await this.getSession();\n }\n }\n catch {\n return response;\n }\n // Stream already consumed, can't retry.\n if (init?.body instanceof ReadableStream) {\n return response;\n }\n url = new URL(pathname, session.info.aud);\n headers.set('authorization', `${session.token.type} ${session.token.access}`);\n return await this.#fetch(url, { ...init, headers });\n }\n}\nconst isInvalidTokenResponse = (response) => {\n if (response.status !== 401) {\n return false;\n }\n const auth = response.headers.get('www-authenticate');\n return (auth != null &&\n (auth.startsWith('Bearer ') || auth.startsWith('DPoP ')) &&\n auth.includes('error=\"invalid_token\"'));\n};\n//# sourceMappingURL=user-agent.js.map","import {\n configureOAuth,\n createAuthorizationUrl,\n finalizeAuthorization,\n resolveFromIdentity,\n OAuthUserAgent,\n type OAuthSession,\n} from \"@atcute/oauth-browser-client\";\nimport type { StorageAdapter } from \"../storage\";\n\nconst OAUTH_SESSION_KEY = \"synthesis-oauth:session\";\n\nexport interface OAuthLauncher {\n launch(authUrl: URL): Promise<string>;\n}\n\nexport interface OAuthConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nlet isOAuthInitialized = false;\n\nexport class OAuthManager {\n private storage: StorageAdapter;\n private launcher: OAuthLauncher;\n private config: OAuthConfig;\n\n constructor(storage: StorageAdapter, launcher: OAuthLauncher, config: OAuthConfig) {\n this.storage = storage;\n this.launcher = launcher;\n this.config = config;\n }\n\n initialize() {\n if (typeof window !== \"undefined\" && !isOAuthInitialized) {\n configureOAuth({\n metadata: {\n client_id: this.config.clientId,\n redirect_uri: this.config.redirectUri,\n },\n });\n isOAuthInitialized = true;\n }\n }\n\n async startLoginProcess(handle: string): Promise<void> {\n console.log('[oauth] Starting login process for handle:', handle);\n this.initialize();\n \n console.log('[oauth] Resolving identity...');\n const { metadata } = await resolveFromIdentity(handle);\n console.log('[oauth] PDS metadata:', metadata);\n \n console.log('[oauth] Creating authorization URL...');\n const authUrl = await createAuthorizationUrl({\n metadata: metadata,\n scope: this.config.scope,\n });\n console.log('[oauth] Auth URL:', authUrl.toString());\n\n console.log('[oauth] Launching auth flow...');\n const capturedUrl = await this.launcher.launch(authUrl);\n \n if (!capturedUrl) {\n throw new Error('OAuth flow cancelled or failed');\n }\n\n console.log('[oauth] Captured redirect URL:', capturedUrl);\n\n // Parse OAuth response from redirect URL (params can be in search or hash)\n const url = new URL(capturedUrl);\n const paramString = url.search || url.hash.slice(1);\n const params = new URLSearchParams(paramString);\n \n console.log('[oauth] OAuth params:', Object.fromEntries(params));\n\n if (params.has('error')) {\n const error = params.get('error');\n const errorDesc = params.get('error_description');\n console.error('[oauth] OAuth error:', error, errorDesc);\n throw new Error(`OAuth error: ${error} - ${errorDesc}`);\n }\n\n // Finalize authorization with the params\n console.log('[oauth] Finalizing authorization...');\n const session = await finalizeAuthorization(params);\n console.log('[oauth] Authorization complete, session:', session);\n\n // Store session\n await this.saveSession(session);\n console.log('[oauth] Session saved successfully');\n }\n\n async saveSession(session: OAuthSession): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, session);\n }\n\n async loadSession(): Promise<OAuthSession | null> {\n return await this.storage.get(OAUTH_SESSION_KEY);\n }\n\n async clearSession(): Promise<void> {\n await this.storage.set(OAUTH_SESSION_KEY, null);\n }\n\n async getProfile(session: OAuthSession): Promise<any> {\n const agent = new OAuthUserAgent(session);\n const response = await agent.handle('/xrpc/app.bsky.actor.getProfile?actor=' + session.info.sub);\n return await response.json();\n }\n}\n","import type { OAuthLauncher } from \"./index\";\n\n/**\n * Extension OAuth launcher using browser.identity.launchWebAuthFlow\n */\nexport class ExtensionOAuthLauncher implements OAuthLauncher {\n async launch(authUrl: URL): Promise<string> {\n if (typeof browser === \"undefined\" || !browser.identity) {\n throw new Error('browser.identity not available');\n }\n\n console.log('[oauth-launcher] Launching web auth flow...');\n const capturedUrl = await browser.identity.launchWebAuthFlow({\n url: authUrl.toString(),\n interactive: true,\n });\n\n if (!capturedUrl) {\n throw new Error('OAuth flow cancelled or failed');\n }\n\n return capturedUrl;\n }\n}\n\n/**\n * Web OAuth launcher using popup window with postMessage callback\n */\nexport class WebOAuthLauncher implements OAuthLauncher {\n async launch(authUrl: URL): Promise<string> {\n return new Promise((resolve, reject) => {\n const width = 600;\n const height = 700;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const popup = window.open(\n authUrl.toString(),\n 'oauth-popup',\n `width=${width},height=${height},left=${left},top=${top},popup=yes`\n );\n\n if (!popup) {\n reject(new Error('Failed to open OAuth popup'));\n return;\n }\n\n // Listen for message from callback page\n const messageHandler = (event: MessageEvent) => {\n if (event.data.type === 'SEAMS_OAUTH_CALLBACK') {\n window.removeEventListener('message', messageHandler);\n popup.close();\n resolve(event.data.url);\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n // Poll for popup close\n const pollTimer = setInterval(() => {\n if (popup.closed) {\n clearInterval(pollTimer);\n window.removeEventListener('message', messageHandler);\n reject(new Error('OAuth popup closed by user'));\n }\n }, 500);\n });\n }\n}\n","import { OAuthUserAgent } from \"@atcute/oauth-browser-client\";\nimport type { OAuthManager } from \"../oauth\";\nimport type { Annotation } from \"../types\";\n\nconst ANNOTATION_COLLECTION = \"community.lexicon.annotation.annotation\";\nconst COMMENT_COLLECTION = \"pub.leaflet.comment\";\n\nexport interface Comment {\n $type: string;\n uri?: string;\n cid?: string;\n subject: string;\n plaintext: string;\n createdAt: string;\n reply?: {\n parent: string;\n };\n facets?: any[];\n onPage?: string;\n author?: {\n did: string;\n handle: string;\n };\n}\n\nexport interface PDSConfig {\n backendUrl: string;\n}\n\nexport class PDSClient {\n private oauth: OAuthManager;\n private config: PDSConfig;\n\n constructor(oauth: OAuthManager, config: PDSConfig) {\n this.oauth = oauth;\n this.config = config;\n }\n\n async createAnnotation(annotation: Annotation): Promise<Annotation> {\n const session = await this.oauth.loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n \n const record = {\n $type: annotation.$type,\n target: annotation.target,\n body: annotation.body,\n tags: annotation.tags,\n document: annotation.document,\n createdAt: annotation.createdAt,\n };\n\n const response = await agent.handle('/xrpc/com.atproto.repo.createRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: ANNOTATION_COLLECTION,\n record,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Create error:', error);\n throw new Error(`Failed to create annotation: ${response.status} - ${JSON.stringify(error)}`);\n }\n\n const result = await response.json();\n\n // Index in backend\n try {\n await fetch(`${this.config.backendUrl}/api/annotations/index`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n uri: result.uri,\n cid: result.cid,\n }),\n });\n console.log('[pds] Annotation indexed in backend');\n } catch (err) {\n console.error('[pds] Failed to index annotation in backend:', err);\n }\n\n return {\n ...annotation,\n uri: result.uri,\n cid: result.cid,\n };\n }\n\n async deleteAnnotation(uri: string): Promise<void> {\n const session = await this.oauth.loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n\n const rkey = uri.split(\"/\").pop();\n if (!rkey) {\n throw new Error(\"Invalid URI\");\n }\n\n const response = await agent.handle('/xrpc/com.atproto.repo.deleteRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: ANNOTATION_COLLECTION,\n rkey,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Delete error:', error);\n throw new Error(`Failed to delete annotation: ${response.status} - ${JSON.stringify(error)}`);\n }\n }\n\n async createComment(comment: Omit<Comment, 'uri' | 'cid' | 'author'>): Promise<Comment> {\n const session = await this.oauth.loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n \n const record = {\n $type: 'pub.leaflet.comment',\n subject: comment.subject,\n plaintext: comment.plaintext,\n createdAt: comment.createdAt,\n reply: comment.reply,\n facets: comment.facets,\n onPage: comment.onPage,\n };\n\n const response = await agent.handle('/xrpc/com.atproto.repo.createRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: COMMENT_COLLECTION,\n record,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Create comment error:', error);\n throw new Error(`Failed to create comment: ${response.status} - ${JSON.stringify(error)}`);\n }\n\n const result = await response.json();\n\n return {\n ...comment,\n uri: result.uri,\n cid: result.cid,\n };\n }\n\n async deleteComment(uri: string): Promise<void> {\n const session = await this.oauth.loadSession();\n if (!session) {\n throw new Error(\"Not authenticated\");\n }\n\n const agent = new OAuthUserAgent(session);\n\n const rkey = uri.split(\"/\").pop();\n if (!rkey) {\n throw new Error(\"Invalid URI\");\n }\n\n const response = await agent.handle('/xrpc/com.atproto.repo.deleteRecord', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo: session.info.sub,\n collection: COMMENT_COLLECTION,\n rkey,\n }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n console.error('[pds] Delete comment error:', error);\n throw new Error(`Failed to delete comment: ${response.status} - ${JSON.stringify(error)}`);\n }\n }\n\n async listAnnotationsForPage(url: string): Promise<Annotation[]> {\n try {\n const response = await fetch(\n `${this.config.backendUrl}/api/annotations?url=${encodeURIComponent(url)}&limit=100`\n );\n \n if (!response.ok) {\n throw new Error(`Backend error: ${response.status}`);\n }\n \n const data = await response.json();\n const annotations = data.annotations || [];\n \n return annotations.map((ann: any) => {\n const selectors = JSON.parse(ann.selectors || '[]');\n return {\n $type: ANNOTATION_COLLECTION,\n uri: ann.uri,\n cid: ann.cid,\n target: [{\n source: ann.targetUrl,\n selector: selectors,\n }],\n body: ann.body || '',\n createdAt: ann.createdAt,\n author: ann.authorHandle ? {\n did: ann.authorDid,\n handle: ann.authorHandle,\n } : undefined,\n };\n });\n } catch (error) {\n console.error('[pds] Failed to fetch from backend:', error);\n return [];\n }\n }\n}\n","export class UIState {\n private collapsedThreads = new Set<string>();\n private activeReplyForms = new Set<string>();\n\n isThreadCollapsed(uri: string): boolean {\n return this.collapsedThreads.has(uri);\n }\n\n toggleThreadCollapsed(uri: string): void {\n if (this.collapsedThreads.has(uri)) {\n this.collapsedThreads.delete(uri);\n } else {\n this.collapsedThreads.add(uri);\n }\n }\n\n isReplyFormActive(uri: string): boolean {\n return this.activeReplyForms.has(uri);\n }\n\n showReplyForm(uri: string): void {\n this.activeReplyForms.add(uri);\n }\n\n hideReplyForm(uri: string): void {\n this.activeReplyForms.delete(uri);\n }\n\n clearAllReplyForms(): void {\n this.activeReplyForms.clear();\n }\n}\n","import type { Annotation } from '../types';\nimport type { Comment } from '../pds';\nimport type { UIState } from './ui-state';\n\nexport function buildCommentThread(\n parentUri: string,\n allComments: Comment[],\n uiState: UIState,\n isNested: boolean = false\n): string {\n const replies = allComments.filter(c => c.reply?.parent === parentUri);\n if (replies.length === 0) return '';\n\n const isCollapsed = uiState.isThreadCollapsed(parentUri);\n\n return `\n <div class=\"comment-thread ${isNested ? 'nested' : ''}\">\n <button class=\"thread-toggle-btn\" data-uri=\"${parentUri}\">\n ${isCollapsed ? '▸' : '▾'} ${replies.length} ${replies.length === 1 ? 'reply' : 'replies'}\n </button>\n ${!isCollapsed ? `\n <div class=\"thread-children ${replies.length === 1 ? 'single-child' : ''}\">\n ${replies.map(comment => {\n const hasReplies = allComments.some(c => c.reply?.parent === comment.uri);\n const isReplyFormActive = uiState.isReplyFormActive(comment.uri!);\n \n return `\n <div class=\"comment\" data-uri=\"${comment.uri}\">\n <div class=\"comment-content\">\n <div class=\"comment-text\">${comment.plaintext}</div>\n <div class=\"comment-meta\">\n <small>${new Date(comment.createdAt).toLocaleString()}</small>\n <button class=\"reply-btn\" data-uri=\"${comment.uri}\">Reply</button>\n </div>\n </div>\n ${isReplyFormActive ? `\n <div class=\"reply-form\" data-parent=\"${comment.uri}\">\n <textarea class=\"reply-input\" placeholder=\"Write a reply...\"></textarea>\n <div class=\"reply-actions\">\n <button class=\"save-reply-btn\">Post</button>\n <button class=\"cancel-reply-btn\">Cancel</button>\n </div>\n </div>\n ` : ''}\n ${hasReplies ? buildCommentThread(comment.uri!, allComments, uiState, true) : ''}\n </div>\n `;\n }).join('')}\n </div>\n ` : ''}\n </div>\n `;\n}\n\nexport function renderAnnotationCard(\n ann: Annotation,\n allComments: Comment[],\n uiState: UIState\n): string {\n const quote = ann.target[0]?.selector?.find((s: any) => s.$type === 'community.lexicon.annotation.annotation#textQuoteSelector');\n const text = quote?.exact || '';\n const comments = allComments.filter(c => c.subject === ann.uri && !c.reply);\n const isCommentsCollapsed = uiState.isThreadCollapsed(ann.uri!);\n const isCommentFormActive = uiState.isReplyFormActive(ann.uri!);\n\n return `\n <div class=\"annotation-card\" data-uri=\"${ann.uri}\">\n ${text ? `<blockquote>${text}</blockquote>` : ''}\n ${ann.body ? `<p>${ann.body}</p>` : ''}\n <div class=\"annotation-meta\">\n <small>${new Date(ann.createdAt).toLocaleString()}</small>\n </div>\n <div class=\"comments-section\">\n <div class=\"comments-header\">\n <button class=\"toggle-comments-btn\" data-uri=\"${ann.uri}\">\n ${isCommentsCollapsed ? '▸' : '▾'} ${comments.length} comment${comments.length !== 1 ? 's' : ''}\n </button>\n <button class=\"add-comment-btn\" data-uri=\"${ann.uri}\">Add comment</button>\n </div>\n ${!isCommentsCollapsed ? `\n <div class=\"comments-list\">\n ${isCommentFormActive ? `\n <div class=\"comment-form\" data-subject=\"${ann.uri}\">\n <textarea class=\"comment-input\" placeholder=\"Write a comment...\"></textarea>\n <div class=\"comment-actions\">\n <button class=\"save-comment-btn\">Post</button>\n <button class=\"cancel-comment-btn\">Cancel</button>\n </div>\n </div>\n ` : ''}\n ${comments.map(comment => {\n const hasReplies = allComments.some(c => c.reply?.parent === comment.uri);\n \n return `\n <div class=\"comment\" data-uri=\"${comment.uri}\">\n <div class=\"comment-content\">\n <div class=\"comment-text\">${comment.plaintext}</div>\n <div class=\"comment-meta\">\n <small>${new Date(comment.createdAt).toLocaleString()}</small>\n <button class=\"reply-btn\" data-uri=\"${comment.uri}\">Reply</button>\n </div>\n </div>\n ${uiState.isReplyFormActive(comment.uri!) ? `\n <div class=\"reply-form\" data-parent=\"${comment.uri}\">\n <textarea class=\"reply-input\" placeholder=\"Write a reply...\"></textarea>\n <div class=\"reply-actions\">\n <button class=\"save-reply-btn\">Post</button>\n <button class=\"cancel-reply-btn\">Cancel</button>\n </div>\n </div>\n ` : ''}\n ${hasReplies ? buildCommentThread(comment.uri!, allComments, uiState, true) : ''}\n </div>\n `;}).join('')}\n </div>\n ` : ''}\n </div>\n </div>\n `;\n}\n","export function normalizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.hash = '';\n let path = parsed.pathname;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n parsed.pathname = path;\n return parsed.toString();\n } catch {\n return url;\n }\n}\n","import type { StorageAdapter } from '../storage';\nimport type { OAuthLauncher, OAuthConfig, OAuthManager } from '../oauth';\nimport { OAuthManager as OAuthManagerImpl } from '../oauth';\nimport type { PDSClient, Comment } from '../pds';\nimport { PDSClient as PDSClientImpl } from '../pds';\nimport type { Annotation } from '../types';\nimport { UIState } from './ui-state';\nimport { renderAnnotationCard } from './rendering';\nimport { normalizeUrl } from './utils';\n\nexport interface SidebarConfig {\n oauth: OAuthConfig;\n pds: {\n backendUrl: string;\n };\n}\n\nexport type SyncCallback = () => void;\n\nexport class Sidebar {\n private container: HTMLElement;\n private storage: StorageAdapter;\n private oauth: OAuthManager;\n private pds: PDSClient;\n private onSyncNeeded?: SyncCallback;\n private uiState: UIState;\n\n private currentUrl = '';\n private currentSelection: { text: string; selectors: any[] } | null = null;\n private pageAnnotations: Annotation[] = [];\n private allComments: Comment[] = [];\n\n constructor(\n container: HTMLElement,\n storage: StorageAdapter,\n launcher: OAuthLauncher,\n config: SidebarConfig,\n onSyncNeeded?: SyncCallback\n ) {\n this.container = container;\n this.storage = storage;\n this.oauth = new OAuthManagerImpl(storage, launcher, config.oauth);\n this.pds = new PDSClientImpl(this.oauth, config.pds);\n this.onSyncNeeded = onSyncNeeded;\n this.uiState = new UIState();\n\n this.oauth.initialize();\n this.initialize();\n }\n\n private async initialize() {\n await this.render();\n this.setupStorageListener();\n }\n\n private setupStorageListener() {\n this.storage.onChange((change) => {\n if (change.key === 'annotations' || change.key === 'comments') {\n this.loadAnnotationsForCurrentUrl();\n }\n });\n }\n\n async setCurrentUrl(url: string) {\n this.currentUrl = url;\n await this.loadAnnotationsForCurrentUrl();\n }\n\n setSelection(selection: { text: string; selectors: any[] } | null) {\n this.currentSelection = selection;\n this.updateSelectionUI();\n }\n\n private async render() {\n const session = await this.oauth.loadSession();\n\n if (session) {\n await this.renderLoggedIn(session);\n } else {\n this.renderLoginForm();\n }\n }\n\n private renderLoginForm() {\n this.container.innerHTML = `\n <div class=\"sidebar\">\n <div class=\"auth-section\" id=\"auth-section\">\n <div class=\"login-container\">\n <h2>Login to Seams</h2>\n <div class=\"input-wrapper\">\n <span class=\"at-symbol\">@</span>\n <input type=\"text\" id=\"handle-input\" class=\"handle-input\" placeholder=\"you.bsky.social\" />\n </div>\n <button id=\"login-btn\">Login with ATProto</button>\n <div id=\"auth-status\"></div>\n </div>\n </div>\n </div>\n `;\n\n const handleInput = this.container.querySelector('#handle-input') as HTMLInputElement;\n const loginBtn = this.container.querySelector('#login-btn');\n const authStatus = this.container.querySelector('#auth-status');\n\n const handleLogin = async () => {\n let handle = handleInput?.value.trim();\n if (!handle) {\n alert('Please enter your handle');\n return;\n }\n\n if (handle.startsWith('@')) {\n handle = handle.slice(1);\n }\n\n try {\n if (authStatus) authStatus.textContent = 'Logging in...';\n await this.oauth.startLoginProcess(handle);\n \n const session = await this.oauth.loadSession();\n if (session) {\n await this.renderLoggedIn(session);\n this.onSyncNeeded?.();\n }\n } catch (error) {\n if (authStatus) authStatus.textContent = 'Login failed';\n console.error('[sidebar] Login error:', error);\n }\n };\n\n loginBtn?.addEventListener('click', handleLogin);\n handleInput?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleLogin();\n }\n });\n }\n\n private async renderLoggedIn(session: any) {\n let profile: any = null;\n try {\n profile = await this.oauth.getProfile(session);\n } catch (error) {\n console.error('[sidebar] Failed to fetch profile:', error);\n }\n\n this.container.innerHTML = `\n <div class=\"sidebar\">\n <div class=\"content-section\" id=\"content-section\">\n <div class=\"annotation-form\" id=\"annotation-form\" style=\"display: none;\">\n <div class=\"form-header\">\n <h2>Create Annotation</h2>\n <button id=\"clear-selection-btn\" class=\"clear-btn\">×</button>\n </div>\n <div id=\"selected-text\" class=\"selected-text\"></div>\n <textarea id=\"annotation-text\" placeholder=\"Add your note...\"></textarea>\n <button id=\"save-btn\">Save Annotation</button>\n </div>\n <div class=\"annotations-list\">\n <h2>Annotations on this page</h2>\n <div id=\"annotations\"></div>\n </div>\n </div>\n <div class=\"profile-menu\">\n <img id=\"profile-avatar\" style=\"display: ${profile?.avatar ? 'block' : 'none'}; width: 40px; height: 40px; border-radius: 50%; cursor: pointer;\" ${profile?.avatar ? `src=\"${profile.avatar}\"` : ''} />\n <div id=\"profile-dropdown\" class=\"profile-dropdown\" style=\"display: none;\">\n <button id=\"logout-btn\">Logout</button>\n </div>\n </div>\n </div>\n `;\n\n this.attachEventListeners();\n await this.loadAnnotationsForCurrentUrl();\n }\n\n private attachEventListeners() {\n const clearSelectionBtn = this.container.querySelector('#clear-selection-btn');\n const saveBtn = this.container.querySelector('#save-btn');\n const logoutBtn = this.container.querySelector('#logout-btn');\n const profileAvatar = this.container.querySelector('#profile-avatar');\n const profileDropdown = this.container.querySelector('#profile-dropdown');\n\n clearSelectionBtn?.addEventListener('click', () => {\n this.currentSelection = null;\n this.updateSelectionUI();\n });\n\n saveBtn?.addEventListener('click', async () => {\n await this.handleSaveAnnotation();\n });\n\n logoutBtn?.addEventListener('click', async () => {\n await this.oauth.clearSession();\n await this.storage.set('annotations', null);\n await this.storage.set('comments', null);\n await this.storage.set('lastSync', null);\n await this.storage.set('syncError', null);\n await this.storage.set('lastSyncAttempt', null);\n await this.render();\n });\n\n profileAvatar?.addEventListener('click', () => {\n if (profileDropdown) {\n profileDropdown.setAttribute('style', \n profileDropdown.getAttribute('style')?.includes('none') ? 'display: block;' : 'display: none;'\n );\n }\n });\n\n document.addEventListener('click', (e) => {\n if (profileDropdown && profileAvatar &&\n !profileAvatar.contains(e.target as Node) &&\n !profileDropdown.contains(e.target as Node)) {\n profileDropdown.setAttribute('style', 'display: none;');\n }\n });\n }\n\n private updateSelectionUI() {\n const annotationForm = this.container.querySelector('#annotation-form');\n const selectedTextEl = this.container.querySelector('#selected-text');\n const annotationTextarea = this.container.querySelector('#annotation-text') as HTMLTextAreaElement;\n\n if (this.currentSelection && this.currentSelection.text && selectedTextEl) {\n selectedTextEl.innerHTML = `<blockquote>${this.currentSelection.text}</blockquote>`;\n if (annotationForm) annotationForm.setAttribute('style', 'display: block;');\n } else {\n if (selectedTextEl) selectedTextEl.innerHTML = '';\n if (annotationTextarea) annotationTextarea.value = '';\n if (annotationForm) annotationForm.setAttribute('style', 'display: none;');\n }\n }\n\n private async handleSaveAnnotation() {\n if (!this.currentSelection) return;\n\n const annotationTextarea = this.container.querySelector('#annotation-text') as HTMLTextAreaElement;\n const body = annotationTextarea?.value.trim() || '';\n\n try {\n await this.pds.createAnnotation({\n $type: 'community.lexicon.annotation.annotation',\n target: [{\n source: this.currentUrl,\n selector: this.currentSelection.selectors,\n }],\n body,\n createdAt: new Date().toISOString(),\n });\n\n this.currentSelection = null;\n this.updateSelectionUI();\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create annotation:', error);\n alert('Failed to save annotation');\n }\n }\n\n private async loadAnnotationsForCurrentUrl() {\n const result = await this.storage.get(['annotations', 'comments']);\n\n const norm = normalizeUrl(this.currentUrl);\n this.pageAnnotations = (result.annotations || []).filter(\n (ann: Annotation) => normalizeUrl(ann.target[0]?.source) === norm\n );\n this.allComments = result.comments || [];\n\n this.renderAnnotations();\n }\n\n private renderAnnotations() {\n const annotationsContainer = this.container.querySelector('#annotations');\n if (!annotationsContainer) return;\n\n if (this.pageAnnotations.length === 0) {\n annotationsContainer.innerHTML = '<p class=\"empty\">No annotations yet. Select text to create one.</p>';\n return;\n }\n\n annotationsContainer.innerHTML = this.pageAnnotations\n .map(ann => renderAnnotationCard(ann, this.allComments, this.uiState))\n .join('');\n\n this.attachCommentEventListeners();\n }\n\n private attachCommentEventListeners() {\n this.container.querySelectorAll('.toggle-comments-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.target as HTMLElement).dataset.uri!;\n this.uiState.toggleThreadCollapsed(uri);\n this.renderAnnotations();\n });\n });\n\n this.container.querySelectorAll('.add-comment-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.target as HTMLElement).dataset.uri!;\n this.uiState.showReplyForm(uri);\n this.renderAnnotations();\n });\n });\n\n this.container.querySelectorAll('.reply-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.target as HTMLElement).dataset.uri!;\n this.uiState.showReplyForm(uri);\n this.renderAnnotations();\n });\n });\n\n this.container.querySelectorAll('.cancel-comment-btn, .cancel-reply-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const form = (e.target as HTMLElement).closest('.comment-form, .reply-form')!;\n const uri = form.getAttribute('data-subject') || form.getAttribute('data-parent')!;\n this.uiState.hideReplyForm(uri);\n this.renderAnnotations();\n });\n });\n\n this.container.querySelectorAll('.save-comment-btn').forEach(btn => {\n btn.addEventListener('click', async (e) => {\n const form = (e.target as HTMLElement).closest('.comment-form')!;\n const textarea = form.querySelector('.comment-input') as HTMLTextAreaElement;\n const subject = form.getAttribute('data-subject')!;\n const plaintext = textarea.value.trim();\n\n if (!plaintext) return;\n\n try {\n await this.pds.createComment({\n $type: 'pub.leaflet.comment',\n subject,\n plaintext,\n createdAt: new Date().toISOString(),\n });\n this.uiState.hideReplyForm(subject);\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create comment:', error);\n alert('Failed to post comment');\n }\n });\n });\n\n this.container.querySelectorAll('.save-reply-btn').forEach(btn => {\n btn.addEventListener('click', async (e) => {\n const form = (e.target as HTMLElement).closest('.reply-form')!;\n const textarea = form.querySelector('.reply-input') as HTMLTextAreaElement;\n const parent = form.getAttribute('data-parent')!;\n const plaintext = textarea.value.trim();\n\n if (!plaintext) return;\n\n const parentComment = this.allComments.find(c => c.uri === parent);\n if (!parentComment) return;\n\n try {\n await this.pds.createComment({\n $type: 'pub.leaflet.comment',\n subject: parentComment.subject,\n plaintext,\n createdAt: new Date().toISOString(),\n reply: { parent },\n });\n this.uiState.hideReplyForm(parent);\n this.onSyncNeeded?.();\n } catch (error) {\n console.error('[sidebar] Failed to create reply:', error);\n alert('Failed to post reply');\n }\n });\n });\n\n this.container.querySelectorAll('.thread-toggle-btn').forEach(btn => {\n btn.addEventListener('click', (e) => {\n const uri = (e.target as HTMLElement).dataset.uri!;\n this.uiState.toggleThreadCollapsed(uri);\n this.renderAnnotations();\n });\n });\n }\n}\n\nexport { UIState } from './ui-state';\nexport { renderAnnotationCard, buildCommentThread } from './rendering';\nexport { normalizeUrl } from './utils';\n","import '../sidepanel/style.css';\nimport { WebStorageAdapter, WebOAuthLauncher, Sidebar, BackgroundWorker } from '@seams/core';\n\nconsole.log('[seams-sidebar] Loading sidebar...');\n\nconst app = document.getElementById('app');\nif (!app) {\n throw new Error('App element not found');\n}\n\nconst storage = new WebStorageAdapter();\nconst launcher = new WebOAuthLauncher();\n\nconst backgroundWorker = new BackgroundWorker({\n storage,\n fetchAnnotations: async (url: string) => {\n const backendUrl = import.meta.env.VITE_BACKEND_URL || import.meta.env.BACKEND_URL || 'https://seams.so';\n const response = await fetch(`${backendUrl}/api/annotations?url=${encodeURIComponent(url)}&limit=100`);\n if (!response.ok) throw new Error(`Backend error: ${response.status}`);\n const data = await response.json();\n \n return (data.annotations || []).map((ann: any) => {\n const selectors = JSON.parse(ann.selectors || '[]');\n return {\n $type: 'community.lexicon.annotation.annotation',\n uri: ann.uri,\n cid: ann.cid,\n target: [{\n source: ann.targetUrl,\n selector: selectors,\n }],\n body: ann.body || '',\n createdAt: ann.createdAt,\n author: ann.authorHandle ? {\n did: ann.authorDid,\n handle: ann.authorHandle,\n } : undefined,\n };\n });\n },\n});\n\nconst sidebar = new Sidebar(\n app,\n storage,\n launcher,\n {\n oauth: {\n clientId: import.meta.env.VITE_OAUTH_CLIENT_ID || 'http://localhost:8081/static/client-metadata.json',\n redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI || 'http://localhost:8081/static/oauth-callback.html',\n scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic',\n },\n pds: {\n backendUrl: import.meta.env.VITE_BACKEND_URL || import.meta.env.BACKEND_URL || 'https://seams.so',\n },\n },\n (url?: string) => {\n if (url) {\n backgroundWorker.setCurrentUrl(url);\n }\n }\n);\n\n// Listen for messages from parent (page URL)\nwindow.addEventListener('message', (event) => {\n if (event.data.type === 'SEAMS_PAGE_URL') {\n const url = event.data.url;\n console.log('[seams-sidebar] Received page URL:', url);\n sidebar.setCurrentUrl(url);\n backgroundWorker.setCurrentUrl(url);\n }\n});\n\n// Notify parent window that sidebar is ready\nwindow.parent.postMessage({ type: 'SEAMS_SIDEBAR_READY' }, '*');\nconsole.log('[seams-sidebar] Ready');\n"],"names":["BackgroundWorker","options","url","annotations","key","error","OAuthUserAgent","session","__publicField","__privateAdd","_fetch","_getSessionPromise","__privateSet","createDPoPFetch","promise","getSession","sub","dpopKey","info","token","OAuthServerAgent","deleteStoredSession","pathname","init","__privateGet","headers","response","isInvalidTokenResponse","auth","OAUTH_SESSION_KEY","isOAuthInitialized","OAuthManager","storage","launcher","config","configureOAuth","handle","metadata","resolveFromIdentity","authUrl","createAuthorizationUrl","capturedUrl","paramString","params","errorDesc","finalizeAuthorization","WebOAuthLauncher","resolve","reject","left","top","popup","messageHandler","event","pollTimer","ANNOTATION_COLLECTION","COMMENT_COLLECTION","PDSClient","oauth","annotation","agent","record","result","err","uri","rkey","comment","ann","selectors","UIState","buildCommentThread","parentUri","allComments","uiState","isNested","replies","_a","c","isCollapsed","hasReplies","isReplyFormActive","renderAnnotationCard","quote","_b","s","text","comments","isCommentsCollapsed","isCommentFormActive","normalizeUrl","parsed","path","Sidebar","container","onSyncNeeded","OAuthManagerImpl","PDSClientImpl","change","selection","handleInput","loginBtn","authStatus","handleLogin","e","profile","clearSelectionBtn","saveBtn","logoutBtn","profileAvatar","profileDropdown","annotationForm","selectedTextEl","annotationTextarea","body","norm","annotationsContainer","btn","form","textarea","subject","plaintext","parent","parentComment","app","WebStorageAdapter","backgroundWorker","sidebar"],"mappings":"2nBASO,MAAMA,CAAiB,CAK5B,YAAYC,EAAkC,CAF9C,KAAQ,WAA4B,KAGlC,KAAK,QAAUA,EAAQ,QACvB,KAAK,iBAAmBA,EAAQ,gBAClC,CAEA,MAAM,sBAAsBC,EAA4B,CACtD,QAAQ,IAAI,8CAA+CA,CAAG,EAE9D,GAAI,CACF,MAAMC,EAAc,MAAM,KAAK,iBAAiBD,CAAG,EACnD,QAAQ,IAAI,6BAA8BC,EAAY,OAAQ,aAAa,EAE3E,MAAMC,EAAM,eAAeF,CAAG,GAC9B,MAAM,KAAK,QAAQ,IAAIE,EAAKD,CAAW,EACvC,QAAQ,IAAI,4BAA6BA,EAAY,OAAQ,aAAa,CAC5E,OAASE,EAAO,CACd,cAAQ,MAAM,iDAAkDA,CAAK,EAC/DA,CACR,CACF,CAEA,cAAcH,EAAmB,CAC3B,KAAK,aAAeA,IACtB,KAAK,WAAaA,EAClB,KAAK,sBAAsBA,CAAG,EAElC,CAEA,eAA+B,CAC7B,OAAO,KAAK,UACd,CACF,SC1CO,MAAMI,CAAe,CAIxB,YAAYC,EAAS,CAHrBC,EAAA,gBACAC,EAAA,KAAAC,GACAD,EAAA,KAAAE,GAEI,KAAK,QAAUJ,EACfK,EAAA,KAAKF,EAASG,EAAgBN,EAAQ,QAAS,EAAK,EACxD,CACA,IAAI,KAAM,CACN,OAAO,KAAK,QAAQ,KAAK,GAC7B,CACA,WAAWN,EAAS,CAChB,MAAMa,EAAUC,EAAW,KAAK,QAAQ,KAAK,IAAKd,CAAO,EACzD,OAAAa,EACK,KAAMP,GAAY,CACnB,KAAK,QAAUA,CACnB,CAAC,EACI,QAAQ,IAAM,CACfK,EAAA,KAAKD,EAAqB,OAC9B,CAAC,EACOC,EAAA,KAAKD,EAAqBG,EACtC,CACA,MAAM,SAAU,CACZ,MAAME,EAAM,KAAK,QAAQ,KAAK,IAC9B,GAAI,CACA,KAAM,CAAE,QAAAC,EAAS,KAAAC,EAAM,MAAAC,CAAK,EAAK,MAAMJ,EAAWC,EAAK,CAAE,WAAY,GAAM,EAE3E,MADe,IAAII,EAAiBF,EAAK,OAAQD,CAAO,EAC3C,OAAOE,EAAM,SAAWA,EAAM,MAAM,CACrD,QACR,CACYE,EAAoBL,CAAG,CAC3B,CACJ,CACA,MAAM,OAAOM,EAAUC,EAAM,CACzB,MAAMC,EAAA,KAAKb,GACX,MAAMc,EAAU,IAAI,QAAQF,GAAA,YAAAA,EAAM,OAAO,EACzC,IAAIhB,EAAU,KAAK,QACfL,EAAM,IAAI,IAAIoB,EAAUf,EAAQ,KAAK,GAAG,EAC5CkB,EAAQ,IAAI,gBAAiB,GAAGlB,EAAQ,MAAM,IAAI,IAAIA,EAAQ,MAAM,MAAM,EAAE,EAC5E,IAAImB,EAAW,MAAMF,EAAA,KAAKd,GAAL,UAAYR,EAAK,CAAE,GAAGqB,EAAM,QAAAE,IACjD,GAAI,CAACE,EAAuBD,CAAQ,EAChC,OAAOA,EAEX,GAAI,CACIF,EAAA,KAAKb,GACLJ,EAAU,MAAMiB,EAAA,KAAKb,GAGrBJ,EAAU,MAAM,KAAK,WAAU,CAEvC,MACM,CACF,OAAOmB,CACX,CAEA,OAAIH,GAAA,YAAAA,EAAM,gBAAgB,eACfG,GAEXxB,EAAM,IAAI,IAAIoB,EAAUf,EAAQ,KAAK,GAAG,EACxCkB,EAAQ,IAAI,gBAAiB,GAAGlB,EAAQ,MAAM,IAAI,IAAIA,EAAQ,MAAM,MAAM,EAAE,EACrE,MAAMiB,EAAA,KAAKd,GAAL,UAAYR,EAAK,CAAE,GAAGqB,EAAM,QAAAE,IAC7C,CACJ,CA5DIf,EAAA,YACAC,EAAA,YA4DJ,MAAMgB,EAA0BD,GAAa,CACzC,GAAIA,EAAS,SAAW,IACpB,MAAO,GAEX,MAAME,EAAOF,EAAS,QAAQ,IAAI,kBAAkB,EACpD,OAAQE,GAAQ,OACXA,EAAK,WAAW,SAAS,GAAKA,EAAK,WAAW,OAAO,IACtDA,EAAK,SAAS,uBAAuB,CAC7C,EChEMC,EAAoB,0BAY1B,IAAIC,EAAqB,GAElB,MAAMC,CAAa,CAKxB,YAAYC,EAAyBC,EAAyBC,EAAqB,CACjF,KAAK,QAAUF,EACf,KAAK,SAAWC,EAChB,KAAK,OAASC,CAChB,CAEA,YAAa,CACP,OAAO,OAAW,KAAe,CAACJ,IACpCK,EAAe,CACb,SAAU,CACR,UAAW,KAAK,OAAO,SACvB,aAAc,KAAK,OAAO,WAAA,CAC5B,CACD,EACDL,EAAqB,GAEzB,CAEA,MAAM,kBAAkBM,EAA+B,CACrD,QAAQ,IAAI,6CAA8CA,CAAM,EAChE,KAAK,WAAA,EAEL,QAAQ,IAAI,+BAA+B,EAC3C,KAAM,CAAE,SAAAC,CAAA,EAAa,MAAMC,EAAoBF,CAAM,EACrD,QAAQ,IAAI,wBAAyBC,CAAQ,EAE7C,QAAQ,IAAI,uCAAuC,EACnD,MAAME,EAAU,MAAMC,EAAuB,CAC3C,SAAAH,EACA,MAAO,KAAK,OAAO,KAAA,CACpB,EACD,QAAQ,IAAI,oBAAqBE,EAAQ,SAAA,CAAU,EAEnD,QAAQ,IAAI,gCAAgC,EAC5C,MAAME,EAAc,MAAM,KAAK,SAAS,OAAOF,CAAO,EAEtD,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,gCAAgC,EAGlD,QAAQ,IAAI,iCAAkCA,CAAW,EAGzD,MAAMvC,EAAM,IAAI,IAAIuC,CAAW,EACzBC,EAAcxC,EAAI,QAAUA,EAAI,KAAK,MAAM,CAAC,EAC5CyC,EAAS,IAAI,gBAAgBD,CAAW,EAI9C,GAFA,QAAQ,IAAI,wBAAyB,OAAO,YAAYC,CAAM,CAAC,EAE3DA,EAAO,IAAI,OAAO,EAAG,CACvB,MAAMtC,EAAQsC,EAAO,IAAI,OAAO,EAC1BC,EAAYD,EAAO,IAAI,mBAAmB,EAChD,cAAQ,MAAM,uBAAwBtC,EAAOuC,CAAS,EAChD,IAAI,MAAM,gBAAgBvC,CAAK,MAAMuC,CAAS,EAAE,CACxD,CAGA,QAAQ,IAAI,qCAAqC,EACjD,MAAMrC,EAAU,MAAMsC,EAAsBF,CAAM,EAClD,QAAQ,IAAI,2CAA4CpC,CAAO,EAG/D,MAAM,KAAK,YAAYA,CAAO,EAC9B,QAAQ,IAAI,oCAAoC,CAClD,CAEA,MAAM,YAAYA,EAAsC,CACtD,MAAM,KAAK,QAAQ,IAAIsB,EAAmBtB,CAAO,CACnD,CAEA,MAAM,aAA4C,CAChD,OAAO,MAAM,KAAK,QAAQ,IAAIsB,CAAiB,CACjD,CAEA,MAAM,cAA8B,CAClC,MAAM,KAAK,QAAQ,IAAIA,EAAmB,IAAI,CAChD,CAEA,MAAM,WAAWtB,EAAqC,CAGpD,OAAO,MADU,MADH,IAAID,EAAeC,CAAO,EACX,OAAO,yCAA2CA,EAAQ,KAAK,GAAG,GACzE,KAAA,CACxB,CACF,CCpFO,MAAMuC,CAA0C,CACrD,MAAM,OAAOP,EAA+B,CAC1C,OAAO,IAAI,QAAQ,CAACQ,EAASC,IAAW,CAGtC,MAAMC,EAAO,OAAO,SAAW,OAAO,WAAa,KAAS,EACtDC,EAAM,OAAO,SAAW,OAAO,YAAc,KAAU,EAEvDC,EAAQ,OAAO,KACnBZ,EAAQ,SAAA,EACR,cACA,6BAAwCU,CAAI,QAAQC,CAAG,YAAA,EAGzD,GAAI,CAACC,EAAO,CACVH,EAAO,IAAI,MAAM,4BAA4B,CAAC,EAC9C,MACF,CAGA,MAAMI,EAAkBC,GAAwB,CAC1CA,EAAM,KAAK,OAAS,yBACtB,OAAO,oBAAoB,UAAWD,CAAc,EACpDD,EAAM,MAAA,EACNJ,EAAQM,EAAM,KAAK,GAAG,EAE1B,EAEA,OAAO,iBAAiB,UAAWD,CAAc,EAGjD,MAAME,EAAY,YAAY,IAAM,CAC9BH,EAAM,SACR,cAAcG,CAAS,EACvB,OAAO,oBAAoB,UAAWF,CAAc,EACpDJ,EAAO,IAAI,MAAM,4BAA4B,CAAC,EAElD,EAAG,GAAG,CACR,CAAC,CACH,CACF,CChEA,MAAMO,EAAwB,0CACxBC,EAAqB,sBAwBpB,MAAMC,CAAU,CAIrB,YAAYC,EAAqBxB,EAAmB,CAClD,KAAK,MAAQwB,EACb,KAAK,OAASxB,CAChB,CAEA,MAAM,iBAAiByB,EAA6C,CAClE,MAAMpD,EAAU,MAAM,KAAK,MAAM,YAAA,EACjC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,mBAAmB,EAGrC,MAAMqD,EAAQ,IAAItD,EAAeC,CAAO,EAElCsD,EAAS,CACb,MAAOF,EAAW,MAClB,OAAQA,EAAW,OACnB,KAAMA,EAAW,KACjB,KAAMA,EAAW,KACjB,SAAUA,EAAW,SACrB,UAAWA,EAAW,SAAA,EAGlBjC,EAAW,MAAMkC,EAAM,OAAO,sCAAuC,CACzE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,KAAMrD,EAAQ,KAAK,IACnB,WAAYgD,EACZ,OAAAM,CAAA,CACD,CAAA,CACF,EAED,GAAI,CAACnC,EAAS,GAAI,CAChB,MAAMrB,EAAQ,MAAMqB,EAAS,KAAA,EAC7B,cAAQ,MAAM,sBAAuBrB,CAAK,EACpC,IAAI,MAAM,gCAAgCqB,EAAS,MAAM,MAAM,KAAK,UAAUrB,CAAK,CAAC,EAAE,CAC9F,CAEA,MAAMyD,EAAS,MAAMpC,EAAS,KAAA,EAG9B,GAAI,CACF,MAAM,MAAM,GAAG,KAAK,OAAO,UAAU,yBAA0B,CAC7D,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAA,EAC3B,KAAM,KAAK,UAAU,CACnB,IAAKoC,EAAO,IACZ,IAAKA,EAAO,GAAA,CACb,CAAA,CACF,EACD,QAAQ,IAAI,qCAAqC,CACnD,OAASC,EAAK,CACZ,QAAQ,MAAM,+CAAgDA,CAAG,CACnE,CAEA,MAAO,CACL,GAAGJ,EACH,IAAKG,EAAO,IACZ,IAAKA,EAAO,GAAA,CAEhB,CAEA,MAAM,iBAAiBE,EAA4B,CACjD,MAAMzD,EAAU,MAAM,KAAK,MAAM,YAAA,EACjC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,mBAAmB,EAGrC,MAAMqD,EAAQ,IAAItD,EAAeC,CAAO,EAElC0D,EAAOD,EAAI,MAAM,GAAG,EAAE,IAAA,EAC5B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,aAAa,EAG/B,MAAMvC,EAAW,MAAMkC,EAAM,OAAO,sCAAuC,CACzE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,KAAMrD,EAAQ,KAAK,IACnB,WAAYgD,EACZ,KAAAU,CAAA,CACD,CAAA,CACF,EAED,GAAI,CAACvC,EAAS,GAAI,CAChB,MAAMrB,EAAQ,MAAMqB,EAAS,KAAA,EAC7B,cAAQ,MAAM,sBAAuBrB,CAAK,EACpC,IAAI,MAAM,gCAAgCqB,EAAS,MAAM,MAAM,KAAK,UAAUrB,CAAK,CAAC,EAAE,CAC9F,CACF,CAEA,MAAM,cAAc6D,EAAoE,CACtF,MAAM3D,EAAU,MAAM,KAAK,MAAM,YAAA,EACjC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,mBAAmB,EAGrC,MAAMqD,EAAQ,IAAItD,EAAeC,CAAO,EAElCsD,EAAS,CACb,MAAO,sBACP,QAASK,EAAQ,QACjB,UAAWA,EAAQ,UACnB,UAAWA,EAAQ,UACnB,MAAOA,EAAQ,MACf,OAAQA,EAAQ,OAChB,OAAQA,EAAQ,MAAA,EAGZxC,EAAW,MAAMkC,EAAM,OAAO,sCAAuC,CACzE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,KAAMrD,EAAQ,KAAK,IACnB,WAAYiD,EACZ,OAAAK,CAAA,CACD,CAAA,CACF,EAED,GAAI,CAACnC,EAAS,GAAI,CAChB,MAAMrB,EAAQ,MAAMqB,EAAS,KAAA,EAC7B,cAAQ,MAAM,8BAA+BrB,CAAK,EAC5C,IAAI,MAAM,6BAA6BqB,EAAS,MAAM,MAAM,KAAK,UAAUrB,CAAK,CAAC,EAAE,CAC3F,CAEA,MAAMyD,EAAS,MAAMpC,EAAS,KAAA,EAE9B,MAAO,CACL,GAAGwC,EACH,IAAKJ,EAAO,IACZ,IAAKA,EAAO,GAAA,CAEhB,CAEA,MAAM,cAAcE,EAA4B,CAC9C,MAAMzD,EAAU,MAAM,KAAK,MAAM,YAAA,EACjC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,mBAAmB,EAGrC,MAAMqD,EAAQ,IAAItD,EAAeC,CAAO,EAElC0D,EAAOD,EAAI,MAAM,GAAG,EAAE,IAAA,EAC5B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,aAAa,EAG/B,MAAMvC,EAAW,MAAMkC,EAAM,OAAO,sCAAuC,CACzE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,KAAMrD,EAAQ,KAAK,IACnB,WAAYiD,EACZ,KAAAS,CAAA,CACD,CAAA,CACF,EAED,GAAI,CAACvC,EAAS,GAAI,CAChB,MAAMrB,EAAQ,MAAMqB,EAAS,KAAA,EAC7B,cAAQ,MAAM,8BAA+BrB,CAAK,EAC5C,IAAI,MAAM,6BAA6BqB,EAAS,MAAM,MAAM,KAAK,UAAUrB,CAAK,CAAC,EAAE,CAC3F,CACF,CAEA,MAAM,uBAAuBH,EAAoC,CAC/D,GAAI,CACF,MAAMwB,EAAW,MAAM,MACrB,GAAG,KAAK,OAAO,UAAU,wBAAwB,mBAAmBxB,CAAG,CAAC,YAAA,EAG1E,GAAI,CAACwB,EAAS,GACZ,MAAM,IAAI,MAAM,kBAAkBA,EAAS,MAAM,EAAE,EAMrD,QAHa,MAAMA,EAAS,KAAA,GACH,aAAe,CAAA,GAErB,IAAKyC,GAAa,CACnC,MAAMC,EAAY,KAAK,MAAMD,EAAI,WAAa,IAAI,EAClD,MAAO,CACL,MAAOZ,EACP,IAAKY,EAAI,IACT,IAAKA,EAAI,IACT,OAAQ,CAAC,CACP,OAAQA,EAAI,UACZ,SAAUC,CAAA,CACX,EACD,KAAMD,EAAI,MAAQ,GAClB,UAAWA,EAAI,UACf,OAAQA,EAAI,aAAe,CACzB,IAAKA,EAAI,UACT,OAAQA,EAAI,YAAA,EACV,MAAA,CAER,CAAC,CACH,OAAS9D,EAAO,CACd,eAAQ,MAAM,sCAAuCA,CAAK,EACnD,CAAA,CACT,CACF,CACF,CClPO,MAAMgE,CAAQ,CAAd,aAAA,CACL,KAAQ,qBAAuB,IAC/B,KAAQ,qBAAuB,GAAY,CAE3C,kBAAkBL,EAAsB,CACtC,OAAO,KAAK,iBAAiB,IAAIA,CAAG,CACtC,CAEA,sBAAsBA,EAAmB,CACnC,KAAK,iBAAiB,IAAIA,CAAG,EAC/B,KAAK,iBAAiB,OAAOA,CAAG,EAEhC,KAAK,iBAAiB,IAAIA,CAAG,CAEjC,CAEA,kBAAkBA,EAAsB,CACtC,OAAO,KAAK,iBAAiB,IAAIA,CAAG,CACtC,CAEA,cAAcA,EAAmB,CAC/B,KAAK,iBAAiB,IAAIA,CAAG,CAC/B,CAEA,cAAcA,EAAmB,CAC/B,KAAK,iBAAiB,OAAOA,CAAG,CAClC,CAEA,oBAA2B,CACzB,KAAK,iBAAiB,MAAA,CACxB,CACF,CC3BO,SAASM,EACdC,EACAC,EACAC,EACAC,EAAoB,GACZ,CACR,MAAMC,EAAUH,EAAY,iBAAY,QAAAI,EAAAC,EAAE,QAAF,YAAAD,EAAS,UAAWL,EAAS,EACrE,GAAII,EAAQ,SAAW,EAAG,MAAO,GAEjC,MAAMG,EAAcL,EAAQ,kBAAkBF,CAAS,EAEvD,MAAO;AAAA,iCACwBG,EAAW,SAAW,EAAE;AAAA,oDACLH,CAAS;AAAA,UACnDO,EAAc,IAAM,GAAG,IAAIH,EAAQ,MAAM,IAAIA,EAAQ,SAAW,EAAI,QAAU,SAAS;AAAA;AAAA,QAExFG,EA6BC,GA7Ba;AAAA,sCACeH,EAAQ,SAAW,EAAI,eAAiB,EAAE;AAAA,YACpEA,EAAQ,IAAIT,GAAW,CACvB,MAAMa,EAAaP,EAAY,KAAKK,UAAK,QAAAD,EAAAC,EAAE,QAAF,YAAAD,EAAS,UAAWV,EAAQ,IAAG,EAClEc,EAAoBP,EAAQ,kBAAkBP,EAAQ,GAAI,EAEhE,MAAO;AAAA,+CAC4BA,EAAQ,GAAG;AAAA;AAAA,8CAEZA,EAAQ,SAAS;AAAA;AAAA,6BAElC,IAAI,KAAKA,EAAQ,SAAS,EAAE,gBAAgB;AAAA,0DACfA,EAAQ,GAAG;AAAA;AAAA;AAAA,kBAGnDc,EAAoB;AAAA,yDACmBd,EAAQ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOhD,EAAE;AAAA,kBACJa,EAAaT,EAAmBJ,EAAQ,IAAMM,EAAaC,EAAS,EAAI,EAAI,EAAE;AAAA;AAAA,aAGtF,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,OAET;AAAA;AAAA,GAGZ,CAEO,SAASQ,EACdd,EACAK,EACAC,EACQ,SACR,MAAMS,GAAQC,GAAAP,EAAAT,EAAI,OAAO,CAAC,IAAZ,YAAAS,EAAe,WAAf,YAAAO,EAAyB,KAAMC,GAAWA,EAAE,QAAU,6DAC9DC,GAAOH,GAAA,YAAAA,EAAO,QAAS,GACvBI,EAAWd,EAAY,OAAO,GAAK,EAAE,UAAYL,EAAI,KAAO,CAAC,EAAE,KAAK,EACpEoB,EAAsBd,EAAQ,kBAAkBN,EAAI,GAAI,EACxDqB,EAAsBf,EAAQ,kBAAkBN,EAAI,GAAI,EAE9D,MAAO;AAAA,6CACoCA,EAAI,GAAG;AAAA,QAC5CkB,EAAO,eAAeA,CAAI,gBAAkB,EAAE;AAAA,QAC9ClB,EAAI,KAAO,MAAMA,EAAI,IAAI,OAAS,EAAE;AAAA;AAAA,iBAE3B,IAAI,KAAKA,EAAI,SAAS,EAAE,gBAAgB;AAAA;AAAA;AAAA;AAAA,0DAICA,EAAI,GAAG;AAAA,cACnDoB,EAAsB,IAAM,GAAG,IAAID,EAAS,MAAM,WAAWA,EAAS,SAAW,EAAI,IAAM,EAAE;AAAA;AAAA,sDAErDnB,EAAI,GAAG;AAAA;AAAA,UAElDoB,EAoCC,GApCqB;AAAA;AAAA,cAEnBC,EAAsB;AAAA,wDACoBrB,EAAI,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAO/C,EAAE;AAAA,cACJmB,EAAS,IAAIpB,GAAW,CACxB,MAAMa,EAAaP,EAAY,KAAKK,UAAK,QAAAD,EAAAC,EAAE,QAAF,YAAAD,EAAS,UAAWV,EAAQ,IAAG,EAExE,MAAO;AAAA,+CAC0BA,EAAQ,GAAG;AAAA;AAAA,8CAEZA,EAAQ,SAAS;AAAA;AAAA,6BAElC,IAAI,KAAKA,EAAQ,SAAS,EAAE,gBAAgB;AAAA,0DACfA,EAAQ,GAAG;AAAA;AAAA;AAAA,kBAGnDO,EAAQ,kBAAkBP,EAAQ,GAAI,EAAI;AAAA,yDACHA,EAAQ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOhD,EAAE;AAAA,kBACJa,EAAaT,EAAmBJ,EAAQ,IAAMM,EAAaC,EAAS,EAAI,EAAI,EAAE;AAAA;AAAA,aAElF,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,SAEX;AAAA;AAAA;AAAA,GAId,CCvHO,SAASgB,EAAavF,EAAqB,CAChD,GAAI,CACF,MAAMwF,EAAS,IAAI,IAAIxF,CAAG,EAC1BwF,EAAO,KAAO,GACd,IAAIC,EAAOD,EAAO,SAClB,OAAIC,EAAK,SAAS,GAAG,GAAKA,IAAS,MACjCA,EAAOA,EAAK,MAAM,EAAG,EAAE,GAEzBD,EAAO,SAAWC,EACXD,EAAO,SAAA,CAChB,MAAQ,CACN,OAAOxF,CACT,CACF,CCMO,MAAM0F,CAAQ,CAanB,YACEC,EACA7D,EACAC,EACAC,EACA4D,EACA,CAXF,KAAQ,WAAa,GACrB,KAAQ,iBAA8D,KACtE,KAAQ,gBAAgC,CAAA,EACxC,KAAQ,YAAyB,CAAA,EAS/B,KAAK,UAAYD,EACjB,KAAK,QAAU7D,EACf,KAAK,MAAQ,IAAI+D,EAAiB/D,EAASC,EAAUC,EAAO,KAAK,EACjE,KAAK,IAAM,IAAI8D,EAAc,KAAK,MAAO9D,EAAO,GAAG,EACnD,KAAK,aAAe4D,EACpB,KAAK,QAAU,IAAIzB,EAEnB,KAAK,MAAM,WAAA,EACX,KAAK,WAAA,CACP,CAEA,MAAc,YAAa,CACzB,MAAM,KAAK,OAAA,EACX,KAAK,qBAAA,CACP,CAEQ,sBAAuB,CAC7B,KAAK,QAAQ,SAAU4B,GAAW,EAC5BA,EAAO,MAAQ,eAAiBA,EAAO,MAAQ,aACjD,KAAK,6BAAA,CAET,CAAC,CACH,CAEA,MAAM,cAAc/F,EAAa,CAC/B,KAAK,WAAaA,EAClB,MAAM,KAAK,6BAAA,CACb,CAEA,aAAagG,EAAsD,CACjE,KAAK,iBAAmBA,EACxB,KAAK,kBAAA,CACP,CAEA,MAAc,QAAS,CACrB,MAAM3F,EAAU,MAAM,KAAK,MAAM,YAAA,EAE7BA,EACF,MAAM,KAAK,eAAeA,CAAO,EAEjC,KAAK,gBAAA,CAET,CAEQ,iBAAkB,CACxB,KAAK,UAAU,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgB3B,MAAM4F,EAAc,KAAK,UAAU,cAAc,eAAe,EAC1DC,EAAW,KAAK,UAAU,cAAc,YAAY,EACpDC,EAAa,KAAK,UAAU,cAAc,cAAc,EAExDC,EAAc,SAAY,OAC9B,IAAIlE,EAAS+D,GAAA,YAAAA,EAAa,MAAM,OAChC,GAAI,CAAC/D,EAAQ,CACX,MAAM,0BAA0B,EAChC,MACF,CAEIA,EAAO,WAAW,GAAG,IACvBA,EAASA,EAAO,MAAM,CAAC,GAGzB,GAAI,CACEiE,MAAuB,YAAc,iBACzC,MAAM,KAAK,MAAM,kBAAkBjE,CAAM,EAEzC,MAAM7B,EAAU,MAAM,KAAK,MAAM,YAAA,EAC7BA,IACF,MAAM,KAAK,eAAeA,CAAO,GACjCqE,EAAA,KAAK,eAAL,MAAAA,EAAA,WAEJ,OAASvE,EAAO,CACVgG,MAAuB,YAAc,gBACzC,QAAQ,MAAM,yBAA0BhG,CAAK,CAC/C,CACF,EAEA+F,GAAA,MAAAA,EAAU,iBAAiB,QAASE,GACpCH,GAAA,MAAAA,EAAa,iBAAiB,UAAYI,GAAM,CAC1CA,EAAE,MAAQ,UACZA,EAAE,eAAA,EACFD,EAAA,EAEJ,EACF,CAEA,MAAc,eAAe/F,EAAc,CACzC,IAAIiG,EAAe,KACnB,GAAI,CACFA,EAAU,MAAM,KAAK,MAAM,WAAWjG,CAAO,CAC/C,OAASF,EAAO,CACd,QAAQ,MAAM,qCAAsCA,CAAK,CAC3D,CAEA,KAAK,UAAU,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAkBsBmG,GAAA,MAAAA,EAAS,OAAS,QAAU,MAAM,sEAAsEA,GAAA,MAAAA,EAAS,OAAS,QAAQA,EAAQ,MAAM,IAAM,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQzM,KAAK,qBAAA,EACL,MAAM,KAAK,6BAAA,CACb,CAEQ,sBAAuB,CAC7B,MAAMC,EAAoB,KAAK,UAAU,cAAc,sBAAsB,EACvEC,EAAU,KAAK,UAAU,cAAc,WAAW,EAClDC,EAAY,KAAK,UAAU,cAAc,aAAa,EACtDC,EAAgB,KAAK,UAAU,cAAc,iBAAiB,EAC9DC,EAAkB,KAAK,UAAU,cAAc,mBAAmB,EAExEJ,GAAA,MAAAA,EAAmB,iBAAiB,QAAS,IAAM,CACjD,KAAK,iBAAmB,KACxB,KAAK,kBAAA,CACP,GAEAC,GAAA,MAAAA,EAAS,iBAAiB,QAAS,SAAY,CAC7C,MAAM,KAAK,qBAAA,CACb,GAEAC,GAAA,MAAAA,EAAW,iBAAiB,QAAS,SAAY,CAC/C,MAAM,KAAK,MAAM,aAAA,EACjB,MAAM,KAAK,QAAQ,IAAI,cAAe,IAAI,EAC1C,MAAM,KAAK,QAAQ,IAAI,WAAY,IAAI,EACvC,MAAM,KAAK,QAAQ,IAAI,WAAY,IAAI,EACvC,MAAM,KAAK,QAAQ,IAAI,YAAa,IAAI,EACxC,MAAM,KAAK,QAAQ,IAAI,kBAAmB,IAAI,EAC9C,MAAM,KAAK,OAAA,CACb,GAEAC,GAAA,MAAAA,EAAe,iBAAiB,QAAS,IAAM,OACzCC,GACFA,EAAgB,aAAa,SAC3BjC,EAAAiC,EAAgB,aAAa,OAAO,IAApC,MAAAjC,EAAuC,SAAS,QAAU,kBAAoB,gBAAA,CAGpF,GAEA,SAAS,iBAAiB,QAAU2B,GAAM,CACpCM,GAAmBD,GACrB,CAACA,EAAc,SAASL,EAAE,MAAc,GACxC,CAACM,EAAgB,SAASN,EAAE,MAAc,GAC1CM,EAAgB,aAAa,QAAS,gBAAgB,CAE1D,CAAC,CACH,CAEQ,mBAAoB,CAC1B,MAAMC,EAAiB,KAAK,UAAU,cAAc,kBAAkB,EAChEC,EAAiB,KAAK,UAAU,cAAc,gBAAgB,EAC9DC,EAAqB,KAAK,UAAU,cAAc,kBAAkB,EAEtE,KAAK,kBAAoB,KAAK,iBAAiB,MAAQD,GACzDA,EAAe,UAAY,eAAe,KAAK,iBAAiB,IAAI,gBAChED,GAAgBA,EAAe,aAAa,QAAS,iBAAiB,IAEtEC,MAA+B,UAAY,IAC3CC,MAAuC,MAAQ,IAC/CF,GAAgBA,EAAe,aAAa,QAAS,gBAAgB,EAE7E,CAEA,MAAc,sBAAuB,OACnC,GAAI,CAAC,KAAK,iBAAkB,OAE5B,MAAME,EAAqB,KAAK,UAAU,cAAc,kBAAkB,EACpEC,GAAOD,GAAA,YAAAA,EAAoB,MAAM,SAAU,GAEjD,GAAI,CACF,MAAM,KAAK,IAAI,iBAAiB,CAC9B,MAAO,0CACP,OAAQ,CAAC,CACP,OAAQ,KAAK,WACb,SAAU,KAAK,iBAAiB,SAAA,CACjC,EACD,KAAAC,EACA,UAAW,IAAI,KAAA,EAAO,YAAA,CAAY,CACnC,EAED,KAAK,iBAAmB,KACxB,KAAK,kBAAA,GACLrC,EAAA,KAAK,eAAL,MAAAA,EAAA,UACF,OAASvE,EAAO,CACd,QAAQ,MAAM,yCAA0CA,CAAK,EAC7D,MAAM,2BAA2B,CACnC,CACF,CAEA,MAAc,8BAA+B,CAC3C,MAAMyD,EAAS,MAAM,KAAK,QAAQ,IAAI,CAAC,cAAe,UAAU,CAAC,EAE3DoD,EAAOzB,EAAa,KAAK,UAAU,EACzC,KAAK,iBAAmB3B,EAAO,aAAe,CAAA,GAAI,OAC/CK,UAAoB,OAAAsB,GAAab,EAAAT,EAAI,OAAO,CAAC,IAAZ,YAAAS,EAAe,MAAM,IAAMsC,EAAA,EAE/D,KAAK,YAAcpD,EAAO,UAAY,CAAA,EAEtC,KAAK,kBAAA,CACP,CAEQ,mBAAoB,CAC1B,MAAMqD,EAAuB,KAAK,UAAU,cAAc,cAAc,EACxE,GAAKA,EAEL,IAAI,KAAK,gBAAgB,SAAW,EAAG,CACrCA,EAAqB,UAAY,sEACjC,MACF,CAEAA,EAAqB,UAAY,KAAK,gBACnC,OAAWlC,EAAqBd,EAAK,KAAK,YAAa,KAAK,OAAO,CAAC,EACpE,KAAK,EAAE,EAEV,KAAK,4BAAA,EACP,CAEQ,6BAA8B,CACpC,KAAK,UAAU,iBAAiB,sBAAsB,EAAE,QAAQiD,GAAO,CACrEA,EAAI,iBAAiB,QAAU,GAAM,CACnC,MAAMpD,EAAO,EAAE,OAAuB,QAAQ,IAC9C,KAAK,QAAQ,sBAAsBA,CAAG,EACtC,KAAK,kBAAA,CACP,CAAC,CACH,CAAC,EAED,KAAK,UAAU,iBAAiB,kBAAkB,EAAE,QAAQoD,GAAO,CACjEA,EAAI,iBAAiB,QAAU,GAAM,CACnC,MAAMpD,EAAO,EAAE,OAAuB,QAAQ,IAC9C,KAAK,QAAQ,cAAcA,CAAG,EAC9B,KAAK,kBAAA,CACP,CAAC,CACH,CAAC,EAED,KAAK,UAAU,iBAAiB,YAAY,EAAE,QAAQoD,GAAO,CAC3DA,EAAI,iBAAiB,QAAU,GAAM,CACnC,MAAMpD,EAAO,EAAE,OAAuB,QAAQ,IAC9C,KAAK,QAAQ,cAAcA,CAAG,EAC9B,KAAK,kBAAA,CACP,CAAC,CACH,CAAC,EAED,KAAK,UAAU,iBAAiB,wCAAwC,EAAE,QAAQoD,GAAO,CACvFA,EAAI,iBAAiB,QAAU,GAAM,CACnC,MAAMC,EAAQ,EAAE,OAAuB,QAAQ,4BAA4B,EACrErD,EAAMqD,EAAK,aAAa,cAAc,GAAKA,EAAK,aAAa,aAAa,EAChF,KAAK,QAAQ,cAAcrD,CAAG,EAC9B,KAAK,kBAAA,CACP,CAAC,CACH,CAAC,EAED,KAAK,UAAU,iBAAiB,mBAAmB,EAAE,QAAQoD,GAAO,CAClEA,EAAI,iBAAiB,QAAS,MAAO,GAAM,OACzC,MAAMC,EAAQ,EAAE,OAAuB,QAAQ,eAAe,EACxDC,EAAWD,EAAK,cAAc,gBAAgB,EAC9CE,EAAUF,EAAK,aAAa,cAAc,EAC1CG,EAAYF,EAAS,MAAM,KAAA,EAEjC,GAAKE,EAEL,GAAI,CACF,MAAM,KAAK,IAAI,cAAc,CAC3B,MAAO,sBACP,QAAAD,EACA,UAAAC,EACA,UAAW,IAAI,KAAA,EAAO,YAAA,CAAY,CACnC,EACD,KAAK,QAAQ,cAAcD,CAAO,GAClC3C,EAAA,KAAK,eAAL,MAAAA,EAAA,UACF,OAASvE,EAAO,CACd,QAAQ,MAAM,sCAAuCA,CAAK,EAC1D,MAAM,wBAAwB,CAChC,CACF,CAAC,CACH,CAAC,EAED,KAAK,UAAU,iBAAiB,iBAAiB,EAAE,QAAQ+G,GAAO,CAChEA,EAAI,iBAAiB,QAAS,MAAO,GAAM,OACzC,MAAMC,EAAQ,EAAE,OAAuB,QAAQ,aAAa,EACtDC,EAAWD,EAAK,cAAc,cAAc,EAC5CI,EAASJ,EAAK,aAAa,aAAa,EACxCG,EAAYF,EAAS,MAAM,KAAA,EAEjC,GAAI,CAACE,EAAW,OAEhB,MAAME,EAAgB,KAAK,YAAY,KAAK7C,GAAKA,EAAE,MAAQ4C,CAAM,EACjE,GAAKC,EAEL,GAAI,CACF,MAAM,KAAK,IAAI,cAAc,CAC3B,MAAO,sBACP,QAASA,EAAc,QACvB,UAAAF,EACA,UAAW,IAAI,KAAA,EAAO,YAAA,EACtB,MAAO,CAAE,OAAAC,CAAA,CAAO,CACjB,EACD,KAAK,QAAQ,cAAcA,CAAM,GACjC7C,EAAA,KAAK,eAAL,MAAAA,EAAA,UACF,OAASvE,EAAO,CACd,QAAQ,MAAM,oCAAqCA,CAAK,EACxD,MAAM,sBAAsB,CAC9B,CACF,CAAC,CACH,CAAC,EAED,KAAK,UAAU,iBAAiB,oBAAoB,EAAE,QAAQ+G,GAAO,CACnEA,EAAI,iBAAiB,QAAU,GAAM,CACnC,MAAMpD,EAAO,EAAE,OAAuB,QAAQ,IAC9C,KAAK,QAAQ,sBAAsBA,CAAG,EACtC,KAAK,kBAAA,CACP,CAAC,CACH,CAAC,CACH,CACF,CC9XA,QAAQ,IAAI,oCAAoC,EAEhD,MAAM2D,EAAM,SAAS,eAAe,KAAK,EACzC,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,uBAAuB,EAGzC,MAAM3F,EAAU,IAAI4F,EACd3F,EAAW,IAAIa,EAEf+E,EAAmB,IAAI7H,EAAiB,CAC5C,QAAAgC,EACA,iBAAkB,MAAO9B,GAAgB,CAEvC,MAAMwB,EAAW,MAAM,MAAM,wCAAqC,mBAAmBxB,CAAG,CAAC,YAAY,EACrG,GAAI,CAACwB,EAAS,GAAI,MAAM,IAAI,MAAM,kBAAkBA,EAAS,MAAM,EAAE,EAGrE,QAFa,MAAMA,EAAS,KAAA,GAEf,aAAe,CAAA,GAAI,IAAKyC,GAAa,CAChD,MAAMC,EAAY,KAAK,MAAMD,EAAI,WAAa,IAAI,EAClD,MAAO,CACL,MAAO,0CACP,IAAKA,EAAI,IACT,IAAKA,EAAI,IACT,OAAQ,CAAC,CACP,OAAQA,EAAI,UACZ,SAAUC,CAAA,CACX,EACD,KAAMD,EAAI,MAAQ,GAClB,UAAWA,EAAI,UACf,OAAQA,EAAI,aAAe,CACzB,IAAKA,EAAI,UACT,OAAQA,EAAI,YAAA,EACV,MAAA,CAER,CAAC,CACH,CACF,CAAC,EAEK2D,EAAU,IAAIlC,EAClB+B,EACA3F,EACAC,EACA,CACE,MAAO,CACL,SAAU,oDACV,YAAa,mDACb,MAAO,4BAAA,EAET,IAAK,CACH,WAAgD,kBAAA,CAClD,EAED/B,GAAiB,CACZA,GACF2H,EAAiB,cAAc3H,CAAG,CAEtC,CACF,EAGA,OAAO,iBAAiB,UAAYmD,GAAU,CAC5C,GAAIA,EAAM,KAAK,OAAS,iBAAkB,CACxC,MAAMnD,EAAMmD,EAAM,KAAK,IACvB,QAAQ,IAAI,qCAAsCnD,CAAG,EACrD4H,EAAQ,cAAc5H,CAAG,EACzB2H,EAAiB,cAAc3H,CAAG,CACpC,CACF,CAAC,EAGD,OAAO,OAAO,YAAY,CAAE,KAAM,qBAAA,EAAyB,GAAG,EAC9D,QAAQ,IAAI,uBAAuB","x_google_ignoreList":[1]}
-28
proxy/static/static/test-client.js
··· 1 - // Minimal test client - just injects a visible banner 2 - (function() { 3 - console.log('🔬 Seams test client loaded!'); 4 - 5 - function injectBanner() { 6 - const banner = document.createElement('div'); 7 - banner.style.cssText = ` 8 - position: fixed; 9 - top: 0; 10 - left: 0; 11 - right: 0; 12 - background: #ff6b6b; 13 - color: white; 14 - padding: 10px; 15 - text-align: center; 16 - z-index: 999999; 17 - font-family: monospace; 18 - `; 19 - banner.textContent = '🔬 Seams via proxy - Client Injected!'; 20 - document.body.appendChild(banner); 21 - } 22 - 23 - if (document.body) { 24 - injectBanner(); 25 - } else { 26 - document.addEventListener('DOMContentLoaded', injectBanner); 27 - } 28 - })();
-49
proxy/static/via-html/oauth-callback.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams OAuth Callback</title> 7 - <style> 8 - body { 9 - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 10 - display: flex; 11 - align-items: center; 12 - justify-content: center; 13 - height: 100vh; 14 - margin: 0; 15 - background: #f5f5f5; 16 - } 17 - .message { 18 - text-align: center; 19 - padding: 32px; 20 - background: white; 21 - border-radius: 8px; 22 - box-shadow: 0 2px 8px rgba(0,0,0,0.1); 23 - } 24 - .spinner { 25 - border: 3px solid #f3f3f3; 26 - border-top: 3px solid #0085ff; 27 - border-radius: 50%; 28 - width: 40px; 29 - height: 40px; 30 - animation: spin 1s linear infinite; 31 - margin: 0 auto 16px; 32 - } 33 - @keyframes spin { 34 - 0% { transform: rotate(0deg); } 35 - 100% { transform: rotate(360deg); } 36 - } 37 - </style> 38 - <script type="module" crossorigin src="/seams-oauth-callback.js"></script> 39 - <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-CyEOUuNr.js"> 40 - <link rel="modulepreload" crossorigin href="/assets/index-BKdQD0EM.js"> 41 - </head> 42 - <body> 43 - <div class="message"> 44 - <div class="spinner"></div> 45 - <h2>Completing login...</h2> 46 - <p id="status">Processing OAuth response</p> 47 - </div> 48 - </body> 49 - </html>
-15
proxy/static/via-html/seams-sidebar.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams Sidebar</title> 7 - <script type="module" crossorigin src="/seams-seams-sidebar.js"></script> 8 - <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-CyEOUuNr.js"> 9 - <link rel="modulepreload" crossorigin href="/assets/index-BKdQD0EM.js"> 10 - <link rel="stylesheet" crossorigin href="/assets/seams-sidebar-gO3IQ7ah.css"> 11 - </head> 12 - <body> 13 - <div id="app"></div> 14 - </body> 15 - </html>
-70
proxy/via-html/oauth-callback.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams OAuth Callback</title> 7 - <link rel="stylesheet" href="/landing.css"> 8 - <style> 9 - body { 10 - display: flex; 11 - align-items: center; 12 - justify-content: center; 13 - height: 100vh; 14 - margin: 0; 15 - overflow: hidden; 16 - } 17 - .callback-container { 18 - background: white; 19 - padding: 48px; 20 - border: 2px dashed #d0d0d0; 21 - border-radius: 2px; 22 - text-align: center; 23 - max-width: 400px; 24 - width: 90%; 25 - box-shadow: 0 4px 12px rgba(45, 80, 22, 0.05); 26 - } 27 - .logo { 28 - font-family: 'Spectral', serif; 29 - font-size: 16px; 30 - font-weight: 700; 31 - letter-spacing: 0.1em; 32 - text-transform: uppercase; 33 - color: #666; 34 - margin-bottom: 16px; 35 - } 36 - h2 { 37 - font-family: 'Fraunces', serif; 38 - font-size: 24px; 39 - color: #1a1a1a; 40 - margin-bottom: 16px; 41 - } 42 - .spinner { 43 - border: 3px solid #f3f3f3; 44 - border-top: 3px solid var(--forest-green); 45 - border-radius: 50%; 46 - width: 32px; 47 - height: 32px; 48 - animation: spin 1s linear infinite; 49 - margin: 0 auto 24px; 50 - } 51 - @keyframes spin { 52 - 0% { transform: rotate(0deg); } 53 - 100% { transform: rotate(360deg); } 54 - } 55 - #status { 56 - color: #666; 57 - font-size: 14px; 58 - } 59 - </style> 60 - </head> 61 - <body> 62 - <div class="callback-container"> 63 - <div class="logo">Seams</div> 64 - <div class="spinner"></div> 65 - <h2>Connecting...</h2> 66 - <p id="status">Completing authentication</p> 67 - </div> 68 - <script type="module" src="../../entrypoints/via-client/oauth-callback.ts"></script> 69 - </body> 70 - </html>
-12
proxy/via-html/seams-sidebar.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - <title>Seams Sidebar</title> 7 - </head> 8 - <body> 9 - <div id="app"></div> 10 - <script type="module" src="../../entrypoints/via-client/sidebar.ts"></script> 11 - </body> 12 - </html>
-31
scripts/postbuild-via.sh
··· 1 - #!/usr/bin/env bash 2 - # Post-build script for via proxy - fixes HTML paths and copies to correct location 3 - 4 - set -e 5 - 6 - echo "📝 Post-processing via build..." 7 - 8 - # Copy BUILT HTML files from the nested output directory to static root 9 - # Vite outputs to proxy/static/proxy/via-html/ because of input structure 10 - cp proxy/static/proxy/via-html/*.html proxy/static/ 11 - 12 - # Clean up the nested directory structure created by Vite 13 - rm -rf proxy/static/proxy 14 - 15 - # Copy CSS and font files from landing to static root 16 - echo "🎨 Copying shared assets from landing..." 17 - cp landing/landing.css proxy/static/ 18 - cp landing/fonts.css proxy/static/ 19 - cp landing/favicon.ico proxy/static/ 20 - # cp landing/landing.js proxy/static/ 21 - mkdir -p proxy/static/fonts 22 - cp landing/fonts/* proxy/static/fonts/ 23 - 24 - # Copy client-metadata.json from landing to static root (proxy shares the same client ID) 25 - cp landing/oauth/client-metadata.json proxy/static/ 26 - 27 - # Fix asset paths in HTML files (add /static prefix) 28 - # sed -i 's|src="/seams-|src="/static/seams-|g' proxy/static/*.html 29 - # sed -i 's|href="/assets/|href="/static/assets/|g' proxy/static/*.html 30 - 31 - echo "✅ Via build post-processing complete"
-60
scripts/start-via.sh
··· 1 - #!/usr/bin/env bash 2 - # Start via proxy development servers 3 - 4 - set -e 5 - 6 - echo "🔨 Building via client scripts (watch mode)..." 7 - 8 - # Export development OAuth configuration for localhost 9 - # Note: Use 127.0.0.1 for redirect_uri as required by RFC 8252 10 - # The redirect_uri in the client_id must match the actual redirect_uri used. 11 - export VITE_OAUTH_CLIENT_ID="http://localhost?redirect_uri=http%3A%2F%2F127.0.0.1%3A8082%2Foauth%2Fcallback&scope=atproto%20transition%3Ageneric" 12 - export VITE_OAUTH_REDIRECT_URI="http://127.0.0.1:8082/oauth/callback" 13 - export VITE_OAUTH_SCOPE="atproto transition:generic" 14 - export BACKEND_URL="http://localhost:8080" 15 - 16 - pnpm dev:via & 17 - BUILD_PID=$! 18 - 19 - # Wait for initial build 20 - sleep 2 21 - 22 - echo "" 23 - echo "🚀 Starting via proxy servers..." 24 - echo "" 25 - 26 - # Kill any existing processes on these ports 27 - lsof -ti:8081 | xargs kill -9 2>/dev/null || true 28 - lsof -ti:8082 | xargs kill -9 2>/dev/null || true 29 - 30 - # Ensure LD_LIBRARY_PATH is set for pywb (needed for gevent/greenlet) 31 - # This should already be set by the nix shell, but we make sure here 32 - if [ -z "$LD_LIBRARY_PATH" ]; then 33 - echo "⚠️ LD_LIBRARY_PATH not set. Run this from nix shell!" 34 - exit 1 35 - fi 36 - 37 - # Start pywb in background (must run from proxy directory) 38 - echo "📦 Starting pywb on port 8081..." 39 - (cd proxy && LD_LIBRARY_PATH="$LD_LIBRARY_PATH" wayback -p 8081) & 40 - PYWB_PID=$! 41 - 42 - # Wait for pywb to start 43 - sleep 2 44 - 45 - # Start Caddy in foreground 46 - echo "🌐 Starting Caddy on port 8082..." 47 - echo "" 48 - echo "✅ Via proxy ready at http://localhost:8082" 49 - echo "" 50 - echo "Press Ctrl+C to stop all services" 51 - echo "" 52 - 53 - # Trap to kill background processes on exit 54 - trap "kill $BUILD_PID $PYWB_PID 2>/dev/null || true" EXIT 55 - 56 - # Run Caddy (blocks) 57 - caddy run 58 - 59 - # Cleanup 60 - kill $BUILD_PID $PYWB_PID 2>/dev/null || true
-33
vite.via.config.ts
··· 1 - import { defineConfig } from 'vite'; 2 - import path from 'path'; 3 - 4 - export default defineConfig({ 5 - base: '/static/', 6 - build: { 7 - outDir: 'proxy/static', 8 - emptyOutDir: false, 9 - sourcemap: true, 10 - rollupOptions: { 11 - input: { 12 - client: path.resolve(__dirname, 'entrypoints/via-client/main.ts'), 13 - 'seams-sidebar': path.resolve(__dirname, 'proxy/via-html/seams-sidebar.html'), 14 - 'oauth-callback': path.resolve(__dirname, 'proxy/via-html/oauth-callback.html'), 15 - }, 16 - output: { 17 - entryFileNames: 'seams-[name].js', 18 - format: 'es', 19 - }, 20 - }, 21 - }, 22 - resolve: { 23 - alias: { 24 - '@': path.resolve(__dirname, './'), 25 - }, 26 - }, 27 - define: { 28 - 'import.meta.env.VITE_OAUTH_CLIENT_ID': JSON.stringify(process.env.VITE_OAUTH_CLIENT_ID || 'https://seams.so/oauth/client-metadata.json'), 29 - 'import.meta.env.VITE_OAUTH_REDIRECT_URI': JSON.stringify(process.env.VITE_OAUTH_REDIRECT_URI || 'https://sure.seams.so/oauth-callback.html'), 30 - 'import.meta.env.VITE_OAUTH_SCOPE': JSON.stringify(process.env.VITE_OAUTH_SCOPE || 'atproto transition:generic'), 31 - 'import.meta.env.BACKEND_URL': JSON.stringify(process.env.BACKEND_URL || 'http://localhost:8080'), 32 - }, 33 - });