Social Annotations in the Atmosphere
15
fork

Configure Feed

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

idk a bunch of stuff

+1184 -1558
+4
.gitignore
··· 53 53 54 54 # Android TWA build 55 55 Seams - Google Play package(2)/ 56 + .env.secrets 57 + 58 + # Test environment secrets 59 + tests/.env.test
+22 -5
Dockerfile.sure-client
··· 15 15 COPY entrypoints/via-client/ ./entrypoints/via-client/ 16 16 COPY entrypoints/sidepanel/ ./entrypoints/sidepanel/ 17 17 COPY sure-client-proxy/ ./sure-client-proxy/ 18 - COPY vite.sure-client.config.ts vite.sure-client-inject.config.ts tsconfig.json ./ 18 + COPY vite.sure-client.config.ts vite.sure-client-inject.config.ts vite.sure-client.shared.ts tsconfig.json ./ 19 19 COPY scripts/postbuild-sure-client.sh ./scripts/ 20 20 21 21 # Install dependencies ··· 25 25 WORKDIR /build/sure-client-proxy 26 26 RUN npm install 27 27 28 - # Build sure-client 28 + # Build sure-client with HMAC secret from build-time secret 29 + # The secret is mounted at /run/secrets/CORS_PROXY_HMAC_SECRET during build 29 30 WORKDIR /build 30 - RUN pnpm build:sure-client 31 + RUN --mount=type=secret,id=CORS_PROXY_HMAC_SECRET \ 32 + VITE_CORS_PROXY_HMAC_SECRET=$(cat /run/secrets/CORS_PROXY_HMAC_SECRET 2>/dev/null || echo "") \ 33 + pnpm build:sure-client 31 34 32 35 # Runtime stage - Node.js + Caddy 33 36 FROM node:22-alpine ··· 65 68 CORS_PROXY_PORT=8083 npx tsx index.ts & 66 69 CORS_PID=$! 67 70 68 - # Wait for CORS proxy to start 69 - sleep 2 71 + # Wait for CORS proxy to be healthy (up to 30 seconds) 72 + echo "Waiting for CORS proxy to be ready..." 73 + MAX_ATTEMPTS=30 74 + ATTEMPT=0 75 + while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do 76 + if curl -s -o /dev/null -w "%{http_code}" http://localhost:8083/ 2>/dev/null | grep -q "200"; then 77 + echo "CORS proxy is ready" 78 + break 79 + fi 80 + ATTEMPT=$((ATTEMPT + 1)) 81 + if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then 82 + echo "ERROR: CORS proxy failed to start within ${MAX_ATTEMPTS} seconds" 83 + exit 1 84 + fi 85 + sleep 1 86 + done 70 87 71 88 # Start Caddy (static files on 8081, cors proxy on 8082) 72 89 cd /app
+47 -6
deploy-sure-client.sh
··· 1 1 #!/bin/bash 2 2 # Deploy Sure Client Proxy to Fly.io 3 3 # Usage: ./deploy-sure-client.sh 4 + # 5 + # HMAC Authentication Setup: 6 + # 1. Create .env.secrets file (gitignored) with: CORS_PROXY_HMAC_SECRET=<your-secret> 7 + # 2. Or set environment variable: export CORS_PROXY_HMAC_SECRET=<your-secret> 8 + # 3. The script will set the Fly secret and use it for build 9 + # 10 + # Generate a secret with: openssl rand -base64 32 4 11 5 12 set -e 6 13 14 + APP_NAME="sure-seams-so" 15 + 7 16 echo "Deploying Sure Client Proxy to Fly.io..." 8 17 9 - # Build locally first to verify everything works 10 - echo "Building sure-client locally..." 11 - pnpm build:sure-client 18 + # Load secrets from .env.secrets if it exists 19 + if [ -f .env.secrets ]; then 20 + echo "Loading secrets from .env.secrets..." 21 + set -a 22 + source .env.secrets 23 + set +a 24 + fi 12 25 13 - # Deploy to Fly.io 14 - fly deploy --config fly.sure-client.toml 26 + # Check if HMAC secret is available 27 + if [ -n "$CORS_PROXY_HMAC_SECRET" ]; then 28 + echo "HMAC secret found, enabling authentication..." 29 + 30 + # Ensure the Fly.io app has the runtime secret 31 + echo "Setting runtime secret on Fly.io..." 32 + fly secrets set CORS_PROXY_HMAC_SECRET="$CORS_PROXY_HMAC_SECRET" --app "$APP_NAME" --stage 33 + 34 + # Deploy with build-time secret 35 + echo "Deploying with HMAC authentication..." 36 + fly deploy --config fly.sure-client.toml \ 37 + --build-secret "CORS_PROXY_HMAC_SECRET=$CORS_PROXY_HMAC_SECRET" 38 + else 39 + echo "WARNING: CORS_PROXY_HMAC_SECRET not set" 40 + echo "HMAC authentication will be DISABLED" 41 + echo "" 42 + echo "To enable HMAC auth:" 43 + echo " 1. Generate secret: openssl rand -base64 32" 44 + echo " 2. Create .env.secrets with: CORS_PROXY_HMAC_SECRET=<secret>" 45 + echo " 3. Re-run this script" 46 + echo "" 47 + read -p "Continue without HMAC? (y/N) " -n 1 -r 48 + echo 49 + if [[ ! $REPLY =~ ^[Yy]$ ]]; then 50 + exit 1 51 + fi 52 + 53 + fly deploy --config fly.sure-client.toml 54 + fi 15 55 56 + echo "" 16 57 echo "Deployment complete!" 17 - echo "Visit: https://sure-client-seams-so.fly.dev" 58 + echo "Visit: https://sure.seams.so"
+3 -4
entrypoints/via-client/main.ts
··· 1 1 // Via proxy client - handles page interaction and communicates with parent frame (shell) 2 2 // This runs inside the wabac.js proxied iframe which cannot access localStorage 3 3 // Uses PostMessageStorageAdapter to request data from shell 4 - import { PostMessageStorageAdapter, ProxyContentScript, applyHighlights, clearHighlights, generateSelectors } from '@seams/core'; 4 + import { PostMessageStorageAdapter, ProxyContentScript, applyHighlights, clearHighlights, generateSelectors, isAllowedOrigin } from '@seams/core'; 5 5 6 6 console.log('[seams-client] Seams via client loaded!'); 7 7 ··· 16 16 // but we can use document.referrer as a hint 17 17 if (document.referrer) { 18 18 const referrerOrigin = new URL(document.referrer).origin; 19 - // Validate it's an allowed origin 20 - if (referrerOrigin === 'https://sure.seams.so' || 21 - referrerOrigin === 'http://127.0.0.1:8081') { 19 + // Validate it's an allowed origin using shared constants 20 + if (isAllowedOrigin(referrerOrigin)) { 22 21 return referrerOrigin; 23 22 } 24 23 }
+39 -13
entrypoints/via-client/oauth-callback.ts
··· 1 1 // OAuth callback handler for via-client 2 - import { handleOAuthCallback, WebStorageAdapter } from '@seams/core'; 2 + import { handleOAuthCallback, WebStorageAdapter, isAllowedOrigin, DEFAULT_OAUTH_SCOPE } from '@seams/core'; 3 3 4 4 console.log('[oauth-callback] Processing OAuth callback'); 5 5 ··· 11 11 const config = { 12 12 clientId: import.meta.env.VITE_OAUTH_CLIENT_ID || 'https://seams.so/oauth/client-metadata.json', 13 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', 14 + scope: import.meta.env.VITE_OAUTH_SCOPE || DEFAULT_OAUTH_SCOPE, 15 15 }; 16 - console.log('[oauth-callback] Config:', config); 16 + console.log('[oauth-callback] Config:', { clientId: config.clientId, redirectUri: config.redirectUri, scope: config.scope }); 17 17 const session = await handleOAuthCallback(storage, config); 18 18 19 19 if (session) { ··· 22 22 23 23 // Check if we are in a popup 24 24 if (window.opener) { 25 - console.log('[oauth-callback] Sending message to opener'); 25 + // Determine the correct target origin for the opener 26 + let targetOrigin = 'https://sure.seams.so'; // Default to production 27 + try { 28 + if (document.referrer) { 29 + const referrerOrigin = new URL(document.referrer).origin; 30 + if (isAllowedOrigin(referrerOrigin)) { 31 + targetOrigin = referrerOrigin; 32 + } 33 + } 34 + } catch (e) { 35 + console.warn('[oauth-callback] Failed to parse referrer, using default origin:', e); 36 + } 37 + 38 + console.log('[oauth-callback] Sending message to opener with origin:', targetOrigin); 26 39 window.opener.postMessage({ 27 40 type: 'SEAMS_OAUTH_CALLBACK', 28 41 url: window.location.href 29 - }, '*'); 42 + }, targetOrigin); 30 43 31 44 setTimeout(() => { 32 45 window.close(); 33 46 }, 500); 34 47 } else { 35 - // Not a popup (mobile or full page redirect) 36 - if (statusEl) statusEl.textContent = 'Login successful! Redirecting...'; 48 + // Not a popup (mobile or full page redirect) 49 + if (statusEl) statusEl.textContent = 'Login successful! Redirecting...'; 37 50 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); 51 + // Redirect back to the page the user was on 52 + // SECURITY: Validate redirect URL to prevent open redirect attacks 53 + const previousUrl = sessionStorage.getItem('seams_login_redirect') || '/'; 54 + let safeRedirect = '/'; 55 + try { 56 + const redirect = new URL(previousUrl, window.location.origin); 57 + // Only allow same-origin redirects 58 + if (redirect.origin === window.location.origin) { 59 + safeRedirect = redirect.pathname + redirect.search + redirect.hash; 60 + } else { 61 + console.warn('[oauth-callback] Blocked cross-origin redirect attempt:', previousUrl); 62 + } 63 + } catch { 64 + console.warn('[oauth-callback] Invalid redirect URL, using default:', previousUrl); 65 + } 66 + console.log('[oauth-callback] Redirecting to:', safeRedirect); 67 + setTimeout(() => { 68 + window.location.href = safeRedirect; 69 + }, 1000); 44 70 } 45 71 } else { 46 72 if (statusEl) statusEl.textContent = 'No OAuth response found';
+7 -3
entrypoints/via-client/shell.ts
··· 6 6 fetchAnnotations, 7 7 Sidebar, 8 8 PopupOAuthLauncher, 9 + DEFAULT_OAUTH_SCOPE, 9 10 } from '@seams/core'; 10 11 11 12 // Import sidebar CSS - will be scoped to .sidebar-container ··· 70 71 } 71 72 72 73 // Push current annotations to content iframe 73 - async function pushAnnotationsToContent(): Promise<void> { 74 + // Returns true if push succeeded, false otherwise 75 + async function pushAnnotationsToContent(): Promise<boolean> { 74 76 try { 75 77 const annotations = await storage.get('annotations') || []; 76 78 console.log('[shell] Pushing', annotations.length, 'annotations to content iframe'); 77 - postToContent({ 79 + const success = postToContent({ 78 80 type: 'ANNOTATIONS_UPDATED', 79 81 annotations 80 82 }); 83 + return success; 81 84 } catch (error) { 82 85 console.error('[shell] Failed to push annotations to content:', error); 86 + return false; 83 87 } 84 88 } 85 89 ··· 201 205 // For development, VITE_OAUTH_CLIENT_ID uses the loopback format: http://localhost?redirect_uri=...&scope=... 202 206 clientId: import.meta.env.VITE_OAUTH_CLIENT_ID, 203 207 redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI, 204 - scope: import.meta.env.VITE_OAUTH_SCOPE || 'atproto transition:generic', 208 + scope: import.meta.env.VITE_OAUTH_SCOPE || DEFAULT_OAUTH_SCOPE, 205 209 }, 206 210 pds: { 207 211 backendUrl: BACKEND_URL,
+4 -4
fly.sure-client.toml
··· 1 1 # fly.sure-client.toml app configuration for Sure Client Proxy (wabac.js-based) 2 - # Deploy with: fly deploy --config fly.sure-client.toml 3 - app = 'sure-client-seams-so' 2 + # Deploy with: ./deploy-sure-client.sh 3 + app = 'sure-seams-so' 4 4 primary_region = 'sjc' 5 5 6 6 [build] ··· 29 29 cpus = 1 30 30 31 31 [env] 32 - # Override with production domain 33 - CORS_ALLOWED_ORIGINS = "https://sure-client-seams-so.fly.dev" 32 + # Production domains - include both the fly.dev domain and custom domain 33 + CORS_ALLOWED_ORIGINS = "https://sure.seams.so,https://sure-client-seams-so.fly.dev"
+1 -1
landing/oauth/client-metadata.json
··· 16 16 "response_types": [ 17 17 "code" 18 18 ], 19 - "scope": "atproto transition:generic", 19 + "scope": "atproto", 20 20 "token_endpoint_auth_method": "none" 21 21 }
+1 -1
package.json
··· 20 20 "test:server": "cd server && go test -v ./...", 21 21 "test:server:coverage": "cd server && go test -coverprofile=coverage.out ./... && go tool cover -html=coverage.out -o coverage.html", 22 22 "test:e2e": "playwright test", 23 - "test:e2e:extension": "RUN_EXTENSION_TESTS=1 playwright test --project=chrome-extension", 23 + "test:e2e:extension": "node --env-file=tests/.env.test ./node_modules/@playwright/test/cli.js test --config=tests/playwright.config.ts --project=chrome-extension", 24 24 "test:e2e:proxy": "RUN_PROXY_TESTS=1 playwright test --project=chrome-proxy", 25 25 "test:all": "pnpm test && pnpm test:server" 26 26 },
+24
packages/core/src/constants.ts
··· 1 + // Shared constants for seams.so 2 + // Centralized origin validation to prevent drift between files 3 + 4 + /** 5 + * Allowed origins for cross-origin communication 6 + * Note: Use 127.0.0.1 for local dev (RFC 8252 requires loopback IP for OAuth) 7 + */ 8 + export const ALLOWED_ORIGINS = [ 9 + 'http://127.0.0.1:8081', 10 + 'https://sure.seams.so', 11 + ] as const; 12 + 13 + /** 14 + * Check if an origin is in the allowed list 15 + */ 16 + export function isAllowedOrigin(origin: string): boolean { 17 + return ALLOWED_ORIGINS.includes(origin as typeof ALLOWED_ORIGINS[number]); 18 + } 19 + 20 + /** 21 + * Default OAuth scope - minimal permissions for annotation functionality 22 + * Per AGENTS.md: only request 'atproto' scope, not 'transition:generic' 23 + */ 24 + export const DEFAULT_OAUTH_SCOPE = 'atproto';
+1
packages/core/src/index.ts
··· 1 1 // Core package exports 2 2 export * from './types'; 3 + export * from './constants'; 3 4 export * from './storage'; 4 5 export * from './background'; 5 6 export * from './content';
+8 -4
packages/core/src/oauth/index.ts
··· 101 101 const paramString = url.search || url.hash.slice(1); 102 102 const params = new URLSearchParams(paramString); 103 103 104 - console.log('[oauth] OAuth params:', Object.fromEntries(params)); 104 + // Log param keys only, not values (to avoid logging sensitive auth codes) 105 + console.log('[oauth] OAuth params received:', Array.from(params.keys()).join(', ')); 105 106 106 107 if (params.has('error')) { 107 108 const error = params.get('error'); ··· 113 114 // Finalize authorization with the params 114 115 console.log('[oauth] Finalizing authorization...'); 115 116 const session = await finalizeAuthorization(params); 116 - console.log('[oauth] Authorization complete, session:', session); 117 + // Log session info without sensitive tokens 118 + console.log('[oauth] Authorization complete for:', session.info?.sub || 'unknown user'); 117 119 118 120 // Store session 119 121 await this.saveSession(session); ··· 161 163 const paramString = url.search || url.hash.slice(1); 162 164 const params = new URLSearchParams(paramString); 163 165 164 - console.log('[oauth] OAuth params:', Object.fromEntries(params)); 166 + // Log param keys only, not values (to avoid logging sensitive auth codes) 167 + console.log('[oauth] OAuth params received:', Array.from(params.keys()).join(', ')); 165 168 166 169 if (!params.has('code') && !params.has('error')) { 167 170 console.log('[oauth] No OAuth params found'); ··· 178 181 // Finalize authorization with the params 179 182 console.log('[oauth] Finalizing authorization...'); 180 183 const session = await finalizeAuthorization(params); 181 - console.log('[oauth] Authorization complete, session:', session); 184 + // Log session info without sensitive tokens 185 + console.log('[oauth] Authorization complete for:', session.info?.sub || 'unknown user'); 182 186 183 187 // Store session 184 188 await storage.set(OAUTH_SESSION_KEY, session);
+7
packages/core/src/oauth/launchers.ts
··· 1 1 import type { OAuthLauncher } from "./index"; 2 + import { isAllowedOrigin } from "../constants"; 2 3 3 4 /** 4 5 * Extension OAuth launcher using browser.identity.launchWebAuthFlow ··· 64 65 65 66 // Listen for message from callback page 66 67 const messageHandler = (event: MessageEvent) => { 68 + // Validate origin - only accept messages from allowed origins 69 + if (!isAllowedOrigin(event.origin)) { 70 + console.warn('[oauth-launcher] Rejected message from unauthorized origin:', event.origin); 71 + return; 72 + } 73 + 67 74 if (event.data.type === 'SEAMS_OAUTH_CALLBACK') { 68 75 window.removeEventListener('message', messageHandler); 69 76 popup.close();
+3 -9
packages/core/src/storage/postmessage.ts
··· 3 3 // Communicates with shell (parent window) which has localStorage access 4 4 5 5 import type { StorageAdapter, StorageChange } from './adapter'; 6 - 7 - // Allowed origins for postMessage communication 8 - // Note: Use 127.0.0.1 for local dev (RFC 8252 requires loopback IP for OAuth) 9 - const ALLOWED_ORIGINS = [ 10 - 'http://127.0.0.1:8081', 11 - 'https://sure.seams.so', 12 - ]; 6 + import { ALLOWED_ORIGINS, isAllowedOrigin } from '../constants'; 13 7 14 8 interface PendingRequest { 15 9 resolve: (value: any) => void; ··· 36 30 37 31 private handleMessage(event: MessageEvent): void { 38 32 // Validate origin - only accept messages from allowed origins 39 - if (!ALLOWED_ORIGINS.includes(event.origin)) { 33 + if (!isAllowedOrigin(event.origin)) { 40 34 return; 41 35 } 42 36 ··· 96 90 97 91 private requestAnnotations(): Promise<any> { 98 92 return new Promise((resolve, reject) => { 99 - const requestId = `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; 93 + const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`; 100 94 101 95 // Set up timeout 102 96 const timeout = setTimeout(() => {
+17 -2
packages/core/src/storage/web.ts
··· 16 16 async get(keys: string | string[]): Promise<any> { 17 17 if (typeof keys === 'string') { 18 18 const value = localStorage.getItem(keys); 19 - return value ? JSON.parse(value) : null; 19 + if (!value) return null; 20 + try { 21 + return JSON.parse(value); 22 + } catch (e) { 23 + console.error('[WebStorageAdapter] Failed to parse stored value for key:', keys, e); 24 + return null; 25 + } 20 26 } 21 27 22 28 const result: Record<string, any> = {}; 23 29 keys.forEach(key => { 24 30 const value = localStorage.getItem(key); 25 - result[key] = value ? JSON.parse(value) : null; 31 + if (!value) { 32 + result[key] = null; 33 + } else { 34 + try { 35 + result[key] = JSON.parse(value); 36 + } catch (e) { 37 + console.error('[WebStorageAdapter] Failed to parse stored value for key:', key, e); 38 + result[key] = null; 39 + } 40 + } 26 41 }); 27 42 return result; 28 43 }
+1
packages/core/src/utils/index.ts
··· 3 3 export * from './selectors/match'; 4 4 export * from './highlights/apply'; 5 5 export * from './date'; 6 + export * from './proxy-auth'; 6 7
+76
packages/core/src/utils/proxy-auth.ts
··· 1 + /** 2 + * HMAC-based authentication for CORS proxy requests 3 + * 4 + * When CORS_PROXY_HMAC_SECRET is configured on the server, clients must 5 + * sign requests with matching credentials to prevent unauthorized proxy usage. 6 + * 7 + * Usage: 8 + * const signer = new ProxyRequestSigner(secret); 9 + * const headers = await signer.signRequest(targetUrl); 10 + * fetch(proxyUrl + targetUrl, { headers }); 11 + */ 12 + 13 + /** 14 + * Sign proxy requests with HMAC-SHA256 15 + * Compatible with server-side verification in cors-proxy/index.ts 16 + */ 17 + export class ProxyRequestSigner { 18 + private secret: string; 19 + private encoder: TextEncoder; 20 + 21 + constructor(secret: string) { 22 + this.secret = secret; 23 + this.encoder = new TextEncoder(); 24 + } 25 + 26 + /** 27 + * Generate signed headers for a proxy request 28 + * @param targetUrl The URL being proxied (not the proxy URL itself) 29 + * @returns Headers object with X-Seams-Timestamp and X-Seams-Signature 30 + */ 31 + async signRequest(targetUrl: string): Promise<Headers> { 32 + const timestamp = Date.now().toString(); 33 + const message = `${timestamp}:${targetUrl}`; 34 + 35 + // Use Web Crypto API for browser compatibility 36 + const key = await crypto.subtle.importKey( 37 + 'raw', 38 + this.encoder.encode(this.secret), 39 + { name: 'HMAC', hash: 'SHA-256' }, 40 + false, 41 + ['sign'] 42 + ); 43 + 44 + const signature = await crypto.subtle.sign( 45 + 'HMAC', 46 + key, 47 + this.encoder.encode(message) 48 + ); 49 + 50 + // Convert to base64 (compatible with older ES targets) 51 + const signatureArray = new Uint8Array(signature); 52 + let binaryString = ''; 53 + for (let i = 0; i < signatureArray.length; i++) { 54 + binaryString += String.fromCharCode(signatureArray[i]); 55 + } 56 + const signatureBase64 = btoa(binaryString); 57 + 58 + const headers = new Headers(); 59 + headers.set('X-Seams-Timestamp', timestamp); 60 + headers.set('X-Seams-Signature', signatureBase64); 61 + 62 + return headers; 63 + } 64 + 65 + /** 66 + * Convenience method to add signature to existing headers 67 + */ 68 + async addSignatureToHeaders(targetUrl: string, existingHeaders: Headers): Promise<Headers> { 69 + const signedHeaders = await this.signRequest(targetUrl); 70 + 71 + existingHeaders.set('X-Seams-Timestamp', signedHeaders.get('X-Seams-Timestamp')!); 72 + existingHeaders.set('X-Seams-Signature', signedHeaders.get('X-Seams-Signature')!); 73 + 74 + return existingHeaders; 75 + } 76 + }
playwright-report/data/7a33d5db6370b6de345e990751aa1f1da65ad675.png

This is a binary file and will not be displayed.

playwright-report/data/96c01f1f74a1bd5eed488783522af11cd6fb0da3.png

This is a binary file and will not be displayed.

playwright-report/data/97169b3a19656c1a2a19bde981d74804eb77f605.png

This is a binary file and will not be displayed.

+1 -1
playwright-report/index.html
··· 82 82 <div id='root'></div> 83 83 </body> 84 84 </html> 85 - <script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script> 85 + <script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script>
+1 -1
proxy/static/client-metadata.json
··· 16 16 "response_types": [ 17 17 "code" 18 18 ], 19 - "scope": "atproto transition:generic", 19 + "scope": "atproto", 20 20 "token_endpoint_auth_method": "none" 21 21 }
+1 -1
proxy/static/oauth-callback.html
··· 58 58 } 59 59 </style> 60 60 <script type="module" crossorigin src="/static/seams-oauth-callback.js"></script> 61 - <link rel="modulepreload" crossorigin href="/static/assets/index-DkUoX9_k.js"> 61 + <link rel="modulepreload" crossorigin href="/static/assets/index-BDoddM_k.js"> 62 62 </head> 63 63 <body> 64 64 <div class="callback-container">
+1 -1
proxy/static/oauth/client-metadata.json
··· 19 19 "response_types": [ 20 20 "code" 21 21 ], 22 - "scope": "atproto transition:generic", 22 + "scope": "atproto", 23 23 "token_endpoint_auth_method": "none" 24 24 }
-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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJmcm9tUmFuZ2UiLCJmcm9tVGV4dFBvc2l0aW9uIiwidG9SYW5nZSIsInRvVGV4dFBvc2l0aW9uIiwidGV4dFBvc2l0aW9uIiwiU0xJQ0VfTEVOR1RIIiwiU0xJQ0VfUkUiLCJSZWdFeHAiLCJTdHJpbmciLCJDT05URVhUX0xFTkdUSCIsInJvb3QiLCJyYW5nZSIsInVuZGVmaW5lZCIsIkVycm9yIiwicG9zaXRpb24iLCJzZWxlY3RvciIsInN0YXJ0IiwiZW5kIiwiZXhhY3QiLCJ0ZXh0Q29udGVudCIsInN1YnN0ciIsInByZWZpeFN0YXJ0IiwiTWF0aCIsIm1heCIsInByZWZpeCIsInN1ZmZpeEVuZCIsIm1pbiIsImxlbmd0aCIsInN1ZmZpeCIsIm9wdGlvbnMiLCJoaW50IiwiZG1wIiwiTWF0Y2hfRGlzdGFuY2UiLCJzbGljZXMiLCJtYXRjaCIsImxvYyIsIk51bWJlciIsIlBPU0lUSVZFX0lORklOSVRZIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJyZXN1bHQiLCJoYXZlUHJlZml4IiwiaGF2ZVN1ZmZpeCIsImZvdW5kUHJlZml4IiwibWF0Y2hfbWFpbiIsImZpcnN0U2xpY2UiLCJzaGlmdCIsImZvbGRTbGljZXMiLCJhY2MiLCJzbGljZSIsInJlZHVjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUFTZ0JBLFMsR0FBQUEsUztRQWFBQyxnQixHQUFBQSxnQjtRQW9DQUMsTyxHQUFBQSxPO1FBVUFDLGMsR0FBQUEsYzs7QUFwRWhCOzs7O0FBQ0E7O0lBQVlDLFk7Ozs7OztBQUVaO0FBQ0EsSUFBTUMsZUFBZSxFQUFyQjtBQUNBLElBQU1DLFdBQVcsSUFBSUMsTUFBSixDQUFXLGtCQUFrQkMsT0FBT0gsWUFBUCxDQUFsQixHQUF5QyxHQUFwRCxFQUF5RCxHQUF6RCxDQUFqQjtBQUNBLElBQU1JLGlCQUFpQkosWUFBdkI7O0FBR08sU0FBU0wsU0FBVCxDQUFtQlUsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDO0FBQ3JDLE1BQUlELFNBQVNFLFNBQWIsRUFBd0I7QUFDdEIsVUFBTSxJQUFJQyxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEO0FBQ0QsTUFBSUYsVUFBVUMsU0FBZCxFQUF5QjtBQUN2QixVQUFNLElBQUlDLEtBQUosQ0FBVSxvQ0FBVixDQUFOO0FBQ0Q7O0FBRUQsTUFBSUMsV0FBV1YsYUFBYUosU0FBYixDQUF1QlUsSUFBdkIsRUFBNkJDLEtBQTdCLENBQWY7QUFDQSxTQUFPVixpQkFBaUJTLElBQWpCLEVBQXVCSSxRQUF2QixDQUFQO0FBQ0Q7O0FBR00sU0FBU2IsZ0JBQVQsQ0FBMEJTLElBQTFCLEVBQWdDSyxRQUFoQyxFQUEwQztBQUMvQyxNQUFJTCxTQUFTRSxTQUFiLEVBQXdCO0FBQ3RCLFVBQU0sSUFBSUMsS0FBSixDQUFVLG1DQUFWLENBQU47QUFDRDtBQUNELE1BQUlFLGFBQWFILFNBQWpCLEVBQTRCO0FBQzFCLFVBQU0sSUFBSUMsS0FBSixDQUFVLHVDQUFWLENBQU47QUFDRDs7QUFOOEMsTUFRMUNHLEtBUjBDLEdBUWpDRCxRQVJpQyxDQVExQ0MsS0FSMEM7O0FBUy9DLE1BQUlBLFVBQVVKLFNBQWQsRUFBeUI7QUFDdkIsVUFBTSxJQUFJQyxLQUFKLENBQVUsNENBQVYsQ0FBTjtBQUNEO0FBQ0QsTUFBSUcsUUFBUSxDQUFaLEVBQWU7QUFDYixVQUFNLElBQUlILEtBQUosQ0FBVSxpREFBVixDQUFOO0FBQ0Q7O0FBZDhDLE1BZ0IxQ0ksR0FoQjBDLEdBZ0JuQ0YsUUFoQm1DLENBZ0IxQ0UsR0FoQjBDOztBQWlCL0MsTUFBSUEsUUFBUUwsU0FBWixFQUF1QjtBQUNyQixVQUFNLElBQUlDLEtBQUosQ0FBVSwwQ0FBVixDQUFOO0FBQ0Q7QUFDRCxNQUFJSSxNQUFNLENBQVYsRUFBYTtBQUNYLFVBQU0sSUFBSUosS0FBSixDQUFVLCtDQUFWLENBQU47QUFDRDs7QUFFRCxNQUFJSyxRQUFRUixLQUFLUyxXQUFMLENBQWlCQyxNQUFqQixDQUF3QkosS0FBeEIsRUFBK0JDLE1BQU1ELEtBQXJDLENBQVo7O0FBRUEsTUFBSUssY0FBY0MsS0FBS0MsR0FBTCxDQUFTLENBQVQsRUFBWVAsUUFBUVAsY0FBcEIsQ0FBbEI7QUFDQSxNQUFJZSxTQUFTZCxLQUFLUyxXQUFMLENBQWlCQyxNQUFqQixDQUF3QkMsV0FBeEIsRUFBcUNMLFFBQVFLLFdBQTdDLENBQWI7O0FBRUEsTUFBSUksWUFBWUgsS0FBS0ksR0FBTCxDQUFTaEIsS0FBS1MsV0FBTCxDQUFpQlEsTUFBMUIsRUFBa0NWLE1BQU1SLGNBQXhDLENBQWhCO0FBQ0EsTUFBSW1CLFNBQVNsQixLQUFLUyxXQUFMLENBQWlCQyxNQUFqQixDQUF3QkgsR0FBeEIsRUFBNkJRLFlBQVlSLEdBQXpDLENBQWI7O0FBRUEsU0FBTyxFQUFDQyxZQUFELEVBQVFNLGNBQVIsRUFBZ0JJLGNBQWhCLEVBQVA7QUFDRDs7QUFHTSxTQUFTMUIsT0FBVCxDQUFpQlEsSUFBakIsRUFBdUJLLFFBQXZCLEVBQStDO0FBQUEsTUFBZGMsT0FBYyx1RUFBSixFQUFJOztBQUNwRCxNQUFJZixXQUFXWCxlQUFlTyxJQUFmLEVBQXFCSyxRQUFyQixFQUErQmMsT0FBL0IsQ0FBZjtBQUNBLE1BQUlmLGFBQWEsSUFBakIsRUFBdUI7QUFDckIsV0FBTyxJQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBT1YsYUFBYUYsT0FBYixDQUFxQlEsSUFBckIsRUFBMkJJLFFBQTNCLENBQVA7QUFDRDtBQUNGOztBQUdNLFNBQVNYLGNBQVQsQ0FBd0JPLElBQXhCLEVBQThCSyxRQUE5QixFQUFzRDtBQUFBLE1BQWRjLE9BQWMsdUVBQUosRUFBSTs7QUFDM0QsTUFBSW5CLFNBQVNFLFNBQWIsRUFBd0I7QUFDdEIsVUFBTSxJQUFJQyxLQUFKLENBQVUsbUNBQVYsQ0FBTjtBQUNEO0FBQ0QsTUFBSUUsYUFBYUgsU0FBakIsRUFBNEI7QUFDMUIsVUFBTSxJQUFJQyxLQUFKLENBQVUsdUNBQVYsQ0FBTjtBQUNEOztBQU4wRCxNQVF0REssS0FSc0QsR0FRN0NILFFBUjZDLENBUXRERyxLQVJzRDs7QUFTM0QsTUFBSUEsVUFBVU4sU0FBZCxFQUF5QjtBQUN2QixVQUFNLElBQUlDLEtBQUosQ0FBVSw0Q0FBVixDQUFOO0FBQ0Q7O0FBWDBELE1BYXREVyxNQWJzRCxHQWFwQ1QsUUFib0MsQ0FhdERTLE1BYnNEO0FBQUEsTUFhOUNJLE1BYjhDLEdBYXBDYixRQWJvQyxDQWE5Q2EsTUFiOEM7QUFBQSxNQWN0REUsSUFkc0QsR0FjOUNELE9BZDhDLENBY3REQyxJQWRzRDs7QUFlM0QsTUFBSUMsTUFBTSw4QkFBVjs7QUFFQUEsTUFBSUMsY0FBSixHQUFxQnRCLEtBQUtTLFdBQUwsQ0FBaUJRLE1BQWpCLEdBQTBCLENBQS9DOztBQUVBO0FBQ0E7QUFDQSxNQUFJTSxTQUFTZixNQUFNZ0IsS0FBTixDQUFZNUIsUUFBWixDQUFiO0FBQ0EsTUFBSTZCLE1BQU9MLFNBQVNsQixTQUFWLEdBQXlCRixLQUFLUyxXQUFMLENBQWlCUSxNQUFqQixHQUEwQixDQUEzQixHQUFnQyxDQUF4RCxHQUE2REcsSUFBdkU7QUFDQSxNQUFJZCxRQUFRb0IsT0FBT0MsaUJBQW5CO0FBQ0EsTUFBSXBCLE1BQU1tQixPQUFPRSxpQkFBakI7QUFDQSxNQUFJQyxTQUFTLENBQUMsQ0FBZDtBQUNBLE1BQUlDLGFBQWFoQixXQUFXWixTQUE1QjtBQUNBLE1BQUk2QixhQUFhYixXQUFXaEIsU0FBNUI7QUFDQSxNQUFJOEIsY0FBYyxLQUFsQjs7QUFFQTtBQUNBLE1BQUlGLFVBQUosRUFBZ0I7QUFDZEQsYUFBU1IsSUFBSVksVUFBSixDQUFlakMsS0FBS1MsV0FBcEIsRUFBaUNLLE1BQWpDLEVBQXlDVyxHQUF6QyxDQUFUO0FBQ0EsUUFBSUksU0FBUyxDQUFDLENBQWQsRUFBaUI7QUFDZkosWUFBTUksU0FBU2YsT0FBT0csTUFBdEI7QUFDQWUsb0JBQWMsSUFBZDtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxNQUFJRCxjQUFjLENBQUNDLFdBQW5CLEVBQWdDO0FBQzlCSCxhQUFTUixJQUFJWSxVQUFKLENBQWVqQyxLQUFLUyxXQUFwQixFQUFpQ1MsTUFBakMsRUFBeUNPLE1BQU1qQixNQUFNUyxNQUFyRCxDQUFUO0FBQ0EsUUFBSVksU0FBUyxDQUFDLENBQWQsRUFBaUI7QUFDZkosWUFBTUksU0FBU3JCLE1BQU1TLE1BQXJCO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLE1BQUlpQixhQUFhWCxPQUFPWSxLQUFQLEVBQWpCO0FBQ0FOLFdBQVNSLElBQUlZLFVBQUosQ0FBZWpDLEtBQUtTLFdBQXBCLEVBQWlDeUIsVUFBakMsRUFBNkNULEdBQTdDLENBQVQ7QUFDQSxNQUFJSSxTQUFTLENBQUMsQ0FBZCxFQUFpQjtBQUNmdkIsWUFBUXVCLE1BQVI7QUFDQUosVUFBTWxCLE1BQU1ELFFBQVE0QixXQUFXakIsTUFBL0I7QUFDRCxHQUhELE1BR087QUFDTCxXQUFPLElBQVA7QUFDRDs7QUFFRDtBQUNBLE1BQUltQixhQUFhLFNBQWJBLFVBQWEsQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLEVBQWdCO0FBQy9CLFFBQUksQ0FBQ0QsR0FBTCxFQUFVO0FBQ1I7QUFDQSxhQUFPLElBQVA7QUFDRDs7QUFFRCxRQUFJUixTQUFTUixJQUFJWSxVQUFKLENBQWVqQyxLQUFLUyxXQUFwQixFQUFpQzZCLEtBQWpDLEVBQXdDRCxJQUFJWixHQUE1QyxDQUFiO0FBQ0EsUUFBSUksV0FBVyxDQUFDLENBQWhCLEVBQW1CO0FBQ2pCLGFBQU8sSUFBUDtBQUNEOztBQUVEO0FBQ0FRLFFBQUlaLEdBQUosR0FBVUksU0FBU1MsTUFBTXJCLE1BQXpCOztBQUVBO0FBQ0FvQixRQUFJL0IsS0FBSixHQUFZTSxLQUFLSSxHQUFMLENBQVNxQixJQUFJL0IsS0FBYixFQUFvQnVCLE1BQXBCLENBQVo7QUFDQVEsUUFBSTlCLEdBQUosR0FBVUssS0FBS0MsR0FBTCxDQUFTd0IsSUFBSTlCLEdBQWIsRUFBa0JzQixTQUFTUyxNQUFNckIsTUFBakMsQ0FBVjs7QUFFQSxXQUFPb0IsR0FBUDtBQUNELEdBbkJEOztBQXFCQTtBQUNBO0FBQ0E7QUFDQWhCLE1BQUlDLGNBQUosR0FBcUIsRUFBckI7QUFDQSxNQUFNZSxNQUFNZCxPQUFPZ0IsTUFBUCxDQUFjSCxVQUFkLEVBQTBCLEVBQUM5QixZQUFELEVBQVFDLFFBQVIsRUFBYWtCLFFBQWIsRUFBMUIsQ0FBWjtBQUNBLE1BQUksQ0FBQ1ksR0FBTCxFQUFVO0FBQ1IsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBTyxFQUFDL0IsT0FBTytCLElBQUkvQixLQUFaLEVBQW1CQyxLQUFLOEIsSUFBSTlCLEdBQTVCLEVBQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmTWF0Y2hQYXRjaCBmcm9tICdkaWZmLW1hdGNoLXBhdGNoJ1xuaW1wb3J0ICogYXMgdGV4dFBvc2l0aW9uIGZyb20gJ2RvbS1hbmNob3ItdGV4dC1wb3NpdGlvbidcblxuLy8gVGhlIERpZmZNYXRjaFBhdGNoIGJpdGFwIGhhcyBhIGhhcmQgMzItY2hhcmFjdGVyIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LlxuY29uc3QgU0xJQ0VfTEVOR1RIID0gMzJcbmNvbnN0IFNMSUNFX1JFID0gbmV3IFJlZ0V4cCgnKC58W1xcclxcbl0pezEsJyArIFN0cmluZyhTTElDRV9MRU5HVEgpICsgJ30nLCAnZycpXG5jb25zdCBDT05URVhUX0xFTkdUSCA9IFNMSUNFX0xFTkdUSFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUmFuZ2Uocm9vdCwgcmFuZ2UpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInJhbmdlXCInKVxuICB9XG5cbiAgbGV0IHBvc2l0aW9uID0gdGV4dFBvc2l0aW9uLmZyb21SYW5nZShyb290LCByYW5nZSlcbiAgcmV0dXJuIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgcG9zaXRpb24pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0UG9zaXRpb24ocm9vdCwgc2VsZWN0b3IpIHtcbiAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJyb290XCInKVxuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBcInNlbGVjdG9yXCInKVxuICB9XG5cbiAgbGV0IHtzdGFydH0gPSBzZWxlY3RvclxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0b3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0YXJ0XCInKVxuICB9XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwic3RhcnRcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICB9XG5cbiAgbGV0IHtlbmR9ID0gc2VsZWN0b3JcbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWxlY3RvciBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiZW5kXCInKVxuICB9XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wZXJ0eSBcImVuZFwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cblxuICBsZXQgZXhhY3QgPSByb290LnRleHRDb250ZW50LnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpXG5cbiAgbGV0IHByZWZpeFN0YXJ0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBDT05URVhUX0xFTkdUSClcbiAgbGV0IHByZWZpeCA9IHJvb3QudGV4dENvbnRlbnQuc3Vic3RyKHByZWZpeFN0YXJ0LCBzdGFydCAtIHByZWZpeFN0YXJ0KVxuXG4gIGxldCBzdWZmaXhFbmQgPSBNYXRoLm1pbihyb290LnRleHRDb250ZW50Lmxlbmd0aCwgZW5kICsgQ09OVEVYVF9MRU5HVEgpXG4gIGxldCBzdWZmaXggPSByb290LnRleHRDb250ZW50LnN1YnN0cihlbmQsIHN1ZmZpeEVuZCAtIGVuZClcblxuICByZXR1cm4ge2V4YWN0LCBwcmVmaXgsIHN1ZmZpeH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdG9SYW5nZShyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBwb3NpdGlvbiA9IHRvVGV4dFBvc2l0aW9uKHJvb3QsIHNlbGVjdG9yLCBvcHRpb25zKVxuICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9IGVsc2Uge1xuICAgIHJldHVybiB0ZXh0UG9zaXRpb24udG9SYW5nZShyb290LCBwb3NpdGlvbilcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1RleHRQb3NpdGlvbihyb290LCBzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChyb290ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIFwicm9vdFwiJylcbiAgfVxuICBpZiAoc2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgXCJzZWxlY3RvclwiJylcbiAgfVxuXG4gIGxldCB7ZXhhY3R9ID0gc2VsZWN0b3JcbiAgaWYgKGV4YWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlbGVjdG9yIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJleGFjdFwiJylcbiAgfVxuXG4gIGxldCB7cHJlZml4LCBzdWZmaXh9ID0gc2VsZWN0b3JcbiAgbGV0IHtoaW50fSA9IG9wdGlvbnNcbiAgbGV0IGRtcCA9IG5ldyBEaWZmTWF0Y2hQYXRjaCgpXG5cbiAgZG1wLk1hdGNoX0Rpc3RhbmNlID0gcm9vdC50ZXh0Q29udGVudC5sZW5ndGggKiAyXG5cbiAgLy8gV29yayBhcm91bmQgYSBoYXJkIGxpbWl0IG9mIHRoZSBEaWZmTWF0Y2hQYXRjaCBiaXRhcCBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlIHNlYXJjaCBwYXR0ZXJuIG11c3QgYmUgbm8gbW9yZSB0aGFuIFNMSUNFX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICBsZXQgc2xpY2VzID0gZXhhY3QubWF0Y2goU0xJQ0VfUkUpXG4gIGxldCBsb2MgPSAoaGludCA9PT0gdW5kZWZpbmVkKSA/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-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":"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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]}
-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":"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,GAAoB,mEAUbF,GAA8BL,GAAoBO,GAAmB,EAAG,EAAK,EAC7ED,GAA4Bb,GAAoBc,GAAmB,EAAG,EAAK,ECXlFC,GAAqB,eAAgB,WAU9BH,GAAiBG,GAA6CC,GAAxBC,GACtCJ,EAAeE,GAA2CG,GAAtBC,GCVpCC,EAAQ,OAAO,UAAc,IAAc,UAAU,MAAQ,OAC7DC,GAAiB,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,GAAeI,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,EACJ,MAAMC,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,WAA2B,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,GAAY,CAAE,KAAM,QAAS,WAAY,OAAO,EACzCC,GAAiB,SAAY,CACtC,MAAMC,EAAO,MAAM,OAAO,OAAO,YAAYF,GAAW,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,GAAW,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,GAAeyH,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,GAAmBC,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,EAAa,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,IAAsBmI,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,ErBtFO,IAAA5C,EAAA6C,EsBGA,MAAMC,EAAe,CAIxB,YAAYF,EAAS,CAHrBpJ,EAAA,gBACA8G,EAAA,KAAAN,GACAM,EAAA,KAAAuC,GAEI,KAAK,QAAUD,EACfrC,EAAA,KAAKP,EAAS5B,GAAgBwE,EAAQ,QAAS,EAAK,EACxD,CACA,IAAI,KAAM,CACN,OAAO,KAAK,QAAQ,KAAK,GAC7B,CACA,WAAWtJ,EAAS,CAChB,MAAMqI,EAAUZ,EAAW,KAAK,QAAQ,KAAK,IAAKzH,CAAO,EACzD,OAAAqI,EACK,KAAMiB,GAAY,CACnB,KAAK,QAAUA,CACnB,CAAC,EACI,QAAQ,IAAM,CACfrC,EAAA,KAAKsC,EAAqB,OAC9B,CAAC,EACOtC,EAAA,KAAKsC,EAAqBlB,EACtC,CACA,MAAM,SAAU,CACZ,MAAM/H,EAAM,KAAK,QAAQ,KAAK,IAC9B,GAAI,CACA,KAAM,CAAE,QAAA2D,EAAS,KAAAuE,EAAM,MAAA9I,CAAK,EAAK,MAAM+H,EAAWnH,EAAK,CAAE,WAAY,GAAM,EAE3E,MADe,IAAIyG,EAAiByB,EAAK,OAAQvE,CAAO,EAC3C,OAAOvE,EAAM,SAAWA,EAAM,MAAM,CACrD,QACR,CACY6I,GAAoBjI,CAAG,CAC3B,CACJ,CACA,MAAM,OAAOiF,EAAUJ,EAAM,CACzB,MAAMgC,EAAA,KAAKoC,GACX,MAAMjH,EAAU,IAAI,QAAQ6C,GAAA,YAAAA,EAAM,OAAO,EACzC,IAAImE,EAAU,KAAK,QACf5H,EAAM,IAAI,IAAI6D,EAAU+D,EAAQ,KAAK,GAAG,EAC5ChH,EAAQ,IAAI,gBAAiB,GAAGgH,EAAQ,MAAM,IAAI,IAAIA,EAAQ,MAAM,MAAM,EAAE,EAC5E,IAAI7I,EAAW,MAAM0G,EAAA,KAAKT,GAAL,UAAYhF,EAAK,CAAE,GAAGyD,EAAM,QAAA7C,IACjD,GAAI,CAACmH,GAAuBhJ,CAAQ,EAChC,OAAOA,EAEX,GAAI,CACI0G,EAAA,KAAKoC,GACLD,EAAU,MAAMnC,EAAA,KAAKoC,GAGrBD,EAAU,MAAM,KAAK,WAAU,CAEvC,MACM,CACF,OAAO7I,CACX,CAEA,OAAI0E,GAAA,YAAAA,EAAM,gBAAgB,eACf1E,GAEXiB,EAAM,IAAI,IAAI6D,EAAU+D,EAAQ,KAAK,GAAG,EACxChH,EAAQ,IAAI,gBAAiB,GAAGgH,EAAQ,MAAM,IAAI,IAAIA,EAAQ,MAAM,MAAM,EAAE,EACrE,MAAMnC,EAAA,KAAKT,GAAL,UAAYhF,EAAK,CAAE,GAAGyD,EAAM,QAAA7C,IAC7C,CACJ,CA5DIoE,EAAA,YACA6C,EAAA,YA4DJ,MAAME,GAA0BhJ,GAAa,CACzC,GAAIA,EAAS,SAAW,IACpB,MAAO,GAEX,MAAMiJ,EAAOjJ,EAAS,QAAQ,IAAI,kBAAkB,EACpD,OAAQiJ,GAAQ,OACXA,EAAK,WAAW,SAAS,GAAKA,EAAK,WAAW,OAAO,IACtDA,EAAK,SAAS,uBAAuB,CAC7C,EChEMC,EAAoB,0BAY1B,IAAIC,EAAqB,GAElB,MAAMC,EAAa,CAKxB,YAAYC,EAAyBC,EAAyBC,EAAqB,CACjF,KAAK,QAAUF,EACf,KAAK,SAAWC,EAChB,KAAK,OAASC,CAChB,CAEA,YAAa,CACP,OAAO,OAAW,KAAe,CAACJ,IACpC7J,GAAe,CACb,SAAU,CACR,UAAW,KAAK,OAAO,SACvB,aAAc,KAAK,OAAO,WAAA,CAC5B,CACD,EACD6J,EAAqB,GAEzB,CAEA,MAAM,kBAAkBjH,EAA+B,CACrD,QAAQ,IAAI,6CAA8CA,CAAM,EAChE,KAAK,WAAA,EAEL,QAAQ,IAAI,+BAA+B,EAC3C,KAAM,CAAE,SAAAO,CAAA,EAAa,MAAME,GAAoBT,CAAM,EACrD,QAAQ,IAAI,wBAAyBO,CAAQ,EAE7C,QAAQ,IAAI,uCAAuC,EACnD,MAAMiG,EAAU,MAAMN,GAAuB,CAC3C,SAAA3F,EACA,MAAO,KAAK,OAAO,KAAA,CACpB,EACD,QAAQ,IAAI,oBAAqBiG,EAAQ,SAAA,CAAU,EAEnD,QAAQ,IAAI,gCAAgC,EAC5C,MAAMc,EAAc,MAAM,KAAK,SAAS,OAAOd,CAAO,EAEtD,GAAI,CAACc,EACH,MAAM,IAAI,MAAM,gCAAgC,EAGlD,QAAQ,IAAI,iCAAkCA,CAAW,EAGzD,MAAMvI,EAAM,IAAI,IAAIuI,CAAW,EACzBC,EAAcxI,EAAI,QAAUA,EAAI,KAAK,MAAM,CAAC,EAC5CwH,EAAS,IAAI,gBAAgBgB,CAAW,EAI9C,GAFA,QAAQ,IAAI,wBAAyB,OAAO,YAAYhB,CAAM,CAAC,EAE3DA,EAAO,IAAI,OAAO,EAAG,CACvB,MAAMrI,EAAQqI,EAAO,IAAI,OAAO,EAC1BiB,EAAYjB,EAAO,IAAI,mBAAmB,EAChD,cAAQ,MAAM,uBAAwBrI,EAAOsJ,CAAS,EAChD,IAAI,MAAM,gBAAgBtJ,CAAK,MAAMsJ,CAAS,EAAE,CACxD,CAGA,QAAQ,IAAI,qCAAqC,EACjD,MAAMb,EAAU,MAAMF,GAAsBF,CAAM,EAClD,QAAQ,IAAI,2CAA4CI,CAAO,EAG/D,MAAM,KAAK,YAAYA,CAAO,EAC9B,QAAQ,IAAI,oCAAoC,CAClD,CAEA,MAAM,YAAYA,EAAsC,CACtD,MAAM,KAAK,QAAQ,IAAIK,EAAmBL,CAAO,CACnD,CAEA,MAAM,aAA4C,CAChD,OAAO,MAAM,KAAK,QAAQ,IAAIK,CAAiB,CACjD,CAEA,MAAM,cAA8B,CAClC,MAAM,KAAK,QAAQ,IAAIA,EAAmB,IAAI,CAChD,CAEA,MAAM,WAAWL,EAAqC,CAGpD,OAAO,MADU,MADH,IAAIE,GAAeF,CAAO,EACX,OAAO,yCAA2CA,EAAQ,KAAK,GAAG,GACzE,KAAA,CACxB,CACF,CAMA,eAAsBc,GAAoBN,EAAyBE,EAAoD,CACrH,QAAQ,IAAI,iCAAiC,EAEzCA,IACF,QAAQ,IAAI,yCAA0CA,CAAM,EAC5DjK,GAAe,CACb,SAAU,CACR,UAAWiK,EAAO,SAClB,aAAcA,EAAO,WAAA,CACvB,CACD,GAIH,MAAMtI,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAClCwI,EAAcxI,EAAI,QAAUA,EAAI,KAAK,MAAM,CAAC,EAC5CwH,EAAS,IAAI,gBAAgBgB,CAAW,EAI9C,GAFA,QAAQ,IAAI,wBAAyB,OAAO,YAAYhB,CAAM,CAAC,EAE3D,CAACA,EAAO,IAAI,MAAM,GAAK,CAACA,EAAO,IAAI,OAAO,EAC5C,eAAQ,IAAI,+BAA+B,EACpC,KAGT,GAAIA,EAAO,IAAI,OAAO,EAAG,CACvB,MAAMrI,EAAQqI,EAAO,IAAI,OAAO,EAC1BiB,EAAYjB,EAAO,IAAI,mBAAmB,EAChD,cAAQ,MAAM,uBAAwBrI,EAAOsJ,CAAS,EAChD,IAAI,MAAM,gBAAgBtJ,CAAK,MAAMsJ,CAAS,EAAE,CACxD,CAGA,QAAQ,IAAI,qCAAqC,EACjD,MAAMb,EAAU,MAAMF,GAAsBF,CAAM,EAClD,eAAQ,IAAI,2CAA4CI,CAAO,EAG/D,MAAMQ,EAAQ,IAAIH,EAAmBL,CAAO,EAC5C,QAAQ,IAAI,oCAAoC,EAEzCA,CACT","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":"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,GAAoB,mEAUbF,GAA8BL,GAAoBO,GAAmB,EAAG,EAAK,EAC7ED,GAA4Bb,GAAoBc,GAAmB,EAAG,EAAK,ECXlFC,GAAqB,eAAgB,WAU9BH,GAAiBG,GAA6CC,GAAxBC,GACtCJ,EAAeE,GAA2CG,GAAtBC,GCVpCC,EAAQ,OAAO,UAAc,IAAc,UAAU,MAAQ,OAC7DC,GAAiB,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,GAAeI,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,EACJ,MAAMC,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,WAA2B,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,GAAY,CAAE,KAAM,QAAS,WAAY,OAAO,EACzCC,GAAiB,SAAY,CACtC,MAAMC,EAAO,MAAM,OAAO,OAAO,YAAYF,GAAW,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,GAAW,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,GAAeyH,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,GAAmBC,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,EAAa,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,IAAsBmI,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,ErBtFO,IAAA5C,EAAA6C,EsBGA,MAAMC,EAAe,CAIxB,YAAYF,EAAS,CAHrBpJ,EAAA,gBACA8G,EAAA,KAAAN,GACAM,EAAA,KAAAuC,GAEI,KAAK,QAAUD,EACfrC,EAAA,KAAKP,EAAS5B,GAAgBwE,EAAQ,QAAS,EAAK,EACxD,CACA,IAAI,KAAM,CACN,OAAO,KAAK,QAAQ,KAAK,GAC7B,CACA,WAAWtJ,EAAS,CAChB,MAAMqI,EAAUZ,EAAW,KAAK,QAAQ,KAAK,IAAKzH,CAAO,EACzD,OAAAqI,EACK,KAAMiB,GAAY,CACnB,KAAK,QAAUA,CACnB,CAAC,EACI,QAAQ,IAAM,CACfrC,EAAA,KAAKsC,EAAqB,OAC9B,CAAC,EACOtC,EAAA,KAAKsC,EAAqBlB,EACtC,CACA,MAAM,SAAU,CACZ,MAAM/H,EAAM,KAAK,QAAQ,KAAK,IAC9B,GAAI,CACA,KAAM,CAAE,QAAA2D,EAAS,KAAAuE,EAAM,MAAA9I,CAAK,EAAK,MAAM+H,EAAWnH,EAAK,CAAE,WAAY,GAAM,EAE3E,MADe,IAAIyG,EAAiByB,EAAK,OAAQvE,CAAO,EAC3C,OAAOvE,EAAM,SAAWA,EAAM,MAAM,CACrD,QACR,CACY6I,GAAoBjI,CAAG,CAC3B,CACJ,CACA,MAAM,OAAOiF,EAAUJ,EAAM,CACzB,MAAMgC,EAAA,KAAKoC,GACX,MAAMjH,EAAU,IAAI,QAAQ6C,GAAA,YAAAA,EAAM,OAAO,EACzC,IAAImE,EAAU,KAAK,QACf5H,EAAM,IAAI,IAAI6D,EAAU+D,EAAQ,KAAK,GAAG,EAC5ChH,EAAQ,IAAI,gBAAiB,GAAGgH,EAAQ,MAAM,IAAI,IAAIA,EAAQ,MAAM,MAAM,EAAE,EAC5E,IAAI7I,EAAW,MAAM0G,EAAA,KAAKT,GAAL,UAAYhF,EAAK,CAAE,GAAGyD,EAAM,QAAA7C,IACjD,GAAI,CAACmH,GAAuBhJ,CAAQ,EAChC,OAAOA,EAEX,GAAI,CACI0G,EAAA,KAAKoC,GACLD,EAAU,MAAMnC,EAAA,KAAKoC,GAGrBD,EAAU,MAAM,KAAK,WAAU,CAEvC,MACM,CACF,OAAO7I,CACX,CAEA,OAAI0E,GAAA,YAAAA,EAAM,gBAAgB,eACf1E,GAEXiB,EAAM,IAAI,IAAI6D,EAAU+D,EAAQ,KAAK,GAAG,EACxChH,EAAQ,IAAI,gBAAiB,GAAGgH,EAAQ,MAAM,IAAI,IAAIA,EAAQ,MAAM,MAAM,EAAE,EACrE,MAAMnC,EAAA,KAAKT,GAAL,UAAYhF,EAAK,CAAE,GAAGyD,EAAM,QAAA7C,IAC7C,CACJ,CA5DIoE,EAAA,YACA6C,EAAA,YA4DJ,MAAME,GAA0BhJ,GAAa,CACzC,GAAIA,EAAS,SAAW,IACpB,MAAO,GAEX,MAAMiJ,EAAOjJ,EAAS,QAAQ,IAAI,kBAAkB,EACpD,OAAQiJ,GAAQ,OACXA,EAAK,WAAW,SAAS,GAAKA,EAAK,WAAW,OAAO,IACtDA,EAAK,SAAS,uBAAuB,CAC7C,EChEMC,EAAoB,0BAY1B,IAAIC,EAAqB,GAElB,MAAMC,EAAa,CAKxB,YAAYC,EAAyBC,EAAyBC,EAAqB,CACjF,KAAK,QAAUF,EACf,KAAK,SAAWC,EAChB,KAAK,OAASC,CAChB,CAEA,YAAa,CACP,OAAO,OAAW,KAAe,CAACJ,IACpC7J,GAAe,CACb,SAAU,CACR,UAAW,KAAK,OAAO,SACvB,aAAc,KAAK,OAAO,WAAA,CAC5B,CACD,EACD6J,EAAqB,GAEzB,CAEA,MAAM,kBAAkBjH,EAA+B,CACrD,QAAQ,IAAI,6CAA8CA,CAAM,EAChE,KAAK,WAAA,EAEL,QAAQ,IAAI,+BAA+B,EAC3C,KAAM,CAAE,SAAAO,CAAA,EAAa,MAAME,GAAoBT,CAAM,EACrD,QAAQ,IAAI,wBAAyBO,CAAQ,EAE7C,QAAQ,IAAI,uCAAuC,EACnD,MAAMiG,EAAU,MAAMN,GAAuB,CAC3C,SAAA3F,EACA,MAAO,KAAK,OAAO,KAAA,CACpB,EACD,QAAQ,IAAI,oBAAqBiG,EAAQ,SAAA,CAAU,EAEnD,QAAQ,IAAI,gCAAgC,EAC5C,MAAMc,EAAc,MAAM,KAAK,SAAS,OAAOd,CAAO,EAEtD,GAAI,CAACc,EACH,MAAM,IAAI,MAAM,gCAAgC,EAGlD,QAAQ,IAAI,iCAAkCA,CAAW,EAGzD,MAAMvI,EAAM,IAAI,IAAIuI,CAAW,EACzBC,EAAcxI,EAAI,QAAUA,EAAI,KAAK,MAAM,CAAC,EAC5CwH,EAAS,IAAI,gBAAgBgB,CAAW,EAI9C,GAFA,QAAQ,IAAI,wBAAyB,OAAO,YAAYhB,CAAM,CAAC,EAE3DA,EAAO,IAAI,OAAO,EAAG,CACvB,MAAMrI,EAAQqI,EAAO,IAAI,OAAO,EAC1BiB,EAAYjB,EAAO,IAAI,mBAAmB,EAChD,cAAQ,MAAM,uBAAwBrI,EAAOsJ,CAAS,EAChD,IAAI,MAAM,gBAAgBtJ,CAAK,MAAMsJ,CAAS,EAAE,CACxD,CAGA,QAAQ,IAAI,qCAAqC,EACjD,MAAMb,EAAU,MAAMF,GAAsBF,CAAM,EAClD,QAAQ,IAAI,2CAA4CI,CAAO,EAG/D,MAAM,KAAK,YAAYA,CAAO,EAC9B,QAAQ,IAAI,oCAAoC,CAClD,CAEA,MAAM,YAAYA,EAAsC,CACtD,MAAM,KAAK,QAAQ,IAAIK,EAAmBL,CAAO,CACnD,CAEA,MAAM,aAA4C,CAChD,OAAO,MAAM,KAAK,QAAQ,IAAIK,CAAiB,CACjD,CAEA,MAAM,cAA8B,CAClC,MAAM,KAAK,QAAQ,IAAIA,EAAmB,IAAI,CAChD,CAEA,MAAM,WAAWL,EAAqC,CAGpD,OAAO,MADU,MADH,IAAIE,GAAeF,CAAO,EACX,OAAO,yCAA2CA,EAAQ,KAAK,GAAG,GACzE,KAAA,CACxB,CACF,CAMA,eAAsBc,GAAoBN,EAAuD,CAC/F,QAAQ,IAAI,iCAAiC,EAG7C,MAAMpI,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAClCwI,EAAcxI,EAAI,QAAUA,EAAI,KAAK,MAAM,CAAC,EAC5CwH,EAAS,IAAI,gBAAgBgB,CAAW,EAI9C,GAFA,QAAQ,IAAI,wBAAyB,OAAO,YAAYhB,CAAM,CAAC,EAE3D,CAACA,EAAO,IAAI,MAAM,GAAK,CAACA,EAAO,IAAI,OAAO,EAC5C,eAAQ,IAAI,+BAA+B,EACpC,KAGT,GAAIA,EAAO,IAAI,OAAO,EAAG,CACvB,MAAMrI,EAAQqI,EAAO,IAAI,OAAO,EAC1BiB,EAAYjB,EAAO,IAAI,mBAAmB,EAChD,cAAQ,MAAM,uBAAwBrI,EAAOsJ,CAAS,EAChD,IAAI,MAAM,gBAAgBtJ,CAAK,MAAMsJ,CAAS,EAAE,CACxD,CAGA,QAAQ,IAAI,qCAAqC,EACjD,MAAMb,EAAU,MAAMF,GAAsBF,CAAM,EAClD,eAAQ,IAAI,2CAA4CI,CAAO,EAG/D,MAAMQ,EAAQ,IAAIH,EAAmBL,CAAO,EAC5C,QAAQ,IAAI,oCAAoC,EAEzCA,CACT","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":"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","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 - })();
+2 -2
scripts/inject-oauth-plugin.ts
··· 18 18 // We use the extension-callback.html on the server (port 8080) for extension development 19 19 // Must use 127.0.0.1 instead of localhost for the redirect URI 20 20 const devRedirectUri = "http://127.0.0.1:8080/extension-callback.html"; 21 - const devClientId = `http://localhost?redirect_uri=${encodeURIComponent("http://127.0.0.1:8080/extension-callback.html")}&scope=${encodeURIComponent("atproto transition:generic")}`; 21 + const devClientId = `http://localhost?redirect_uri=${encodeURIComponent("http://127.0.0.1:8080/extension-callback.html")}&scope=${encodeURIComponent("atproto")}`; 22 22 23 23 return { 24 24 define: { 25 25 "import.meta.env.VITE_OAUTH_CLIENT_ID": JSON.stringify(devClientId), 26 26 "import.meta.env.VITE_OAUTH_REDIRECT_URI": JSON.stringify(devRedirectUri), 27 - "import.meta.env.VITE_OAUTH_SCOPE": JSON.stringify("atproto transition:generic"), 27 + "import.meta.env.VITE_OAUTH_SCOPE": JSON.stringify("atproto"), 28 28 } 29 29 }; 30 30 }
+72
scripts/postbuild-sure-client.js
··· 1 + #!/usr/bin/env node 2 + /** 3 + * Post-build script for sure-client-proxy 4 + * Cross-platform alternative to postbuild-sure-client.sh 5 + * 1. Flattens nested HTML output from vite 6 + * 2. Copies source files (index.html, loadwabac.js, client-metadata.json) 7 + */ 8 + 9 + const fs = require('fs'); 10 + const path = require('path'); 11 + 12 + const OUT_DIR = 'sure-client-proxy/dist'; 13 + const SRC_DIR = 'sure-client-proxy/src'; 14 + const NESTED_DIR = path.join(OUT_DIR, 'sure-client-proxy/html'); 15 + 16 + function copyFile(src, dest) { 17 + fs.copyFileSync(src, dest); 18 + console.log(`Copied: ${src} -> ${dest}`); 19 + } 20 + 21 + function main() { 22 + // Verify output directory exists 23 + if (!fs.existsSync(OUT_DIR)) { 24 + console.error(`ERROR: Output directory ${OUT_DIR} does not exist`); 25 + process.exit(1); 26 + } 27 + 28 + // Move HTML files from nested vite output to root 29 + if (fs.existsSync(NESTED_DIR)) { 30 + const htmlFiles = fs.readdirSync(NESTED_DIR).filter(f => f.endsWith('.html')); 31 + for (const file of htmlFiles) { 32 + fs.renameSync(path.join(NESTED_DIR, file), path.join(OUT_DIR, file)); 33 + } 34 + // Remove empty nested directories 35 + fs.rmSync(path.join(OUT_DIR, 'sure-client-proxy'), { recursive: true }); 36 + console.log('Flattened HTML files'); 37 + } 38 + 39 + // Copy source files 40 + const sourceFiles = ['index.html', 'loadwabac.js', 'client-metadata.json']; 41 + for (const file of sourceFiles) { 42 + const srcPath = path.join(SRC_DIR, file); 43 + if (!fs.existsSync(srcPath)) { 44 + console.error(`ERROR: Required source file ${srcPath} not found`); 45 + process.exit(1); 46 + } 47 + copyFile(srcPath, path.join(OUT_DIR, file)); 48 + } 49 + 50 + // Copy wabac.js service worker 51 + const wabacSW = 'sure-client-proxy/node_modules/@webrecorder/wabac/dist/sw.js'; 52 + if (fs.existsSync(wabacSW)) { 53 + copyFile(wabacSW, path.join(OUT_DIR, 'sw.js')); 54 + console.log('Copied wabac.js service worker'); 55 + } else { 56 + console.error(`ERROR: wabac.js sw.js not found at ${wabacSW}`); 57 + console.error("Run 'cd sure-client-proxy && npm install' to install dependencies"); 58 + process.exit(1); 59 + } 60 + 61 + console.log(''); 62 + console.log(`Build complete. Files in ${OUT_DIR}/:`); 63 + const files = fs.readdirSync(OUT_DIR).filter(f => 64 + f.endsWith('.html') || f.endsWith('.js') || f.endsWith('.json') 65 + ); 66 + for (const file of files) { 67 + const stats = fs.statSync(path.join(OUT_DIR, file)); 68 + console.log(` ${file} (${stats.size} bytes)`); 69 + } 70 + } 71 + 72 + main();
+24 -7
scripts/postbuild-sure-client.sh
··· 3 3 # 1. Flattens nested HTML output from vite 4 4 # 2. Copies source files (index.html, loadwabac.js, client-metadata.json) 5 5 6 + set -e # Exit on any error 7 + 6 8 OUT_DIR="sure-client-proxy/dist" 7 9 SRC_DIR="sure-client-proxy/src" 8 10 NESTED_DIR="$OUT_DIR/sure-client-proxy/html" 11 + 12 + # Verify output directory exists 13 + if [ ! -d "$OUT_DIR" ]; then 14 + echo "ERROR: Output directory $OUT_DIR does not exist" 15 + exit 1 16 + fi 9 17 10 18 # Move HTML files from nested vite output to root 11 19 if [ -d "$NESTED_DIR" ]; then 12 - mv "$NESTED_DIR"/*.html "$OUT_DIR/" 20 + mv "$NESTED_DIR"/*.html "$OUT_DIR/" || { echo "ERROR: Failed to move HTML files"; exit 1; } 13 21 rm -rf "$OUT_DIR/sure-client-proxy" 14 22 echo "Flattened HTML files" 15 23 fi 16 24 17 - # Copy source files 18 - cp "$SRC_DIR/index.html" "$OUT_DIR/" 19 - cp "$SRC_DIR/loadwabac.js" "$OUT_DIR/" 20 - cp "$SRC_DIR/client-metadata.json" "$OUT_DIR/" 25 + # Verify source files exist before copying 26 + for file in index.html loadwabac.js client-metadata.json; do 27 + if [ ! -f "$SRC_DIR/$file" ]; then 28 + echo "ERROR: Required source file $SRC_DIR/$file not found" 29 + exit 1 30 + fi 31 + done 32 + 33 + # Copy source files with error checking 34 + cp "$SRC_DIR/index.html" "$OUT_DIR/" || { echo "ERROR: Failed to copy index.html"; exit 1; } 35 + cp "$SRC_DIR/loadwabac.js" "$OUT_DIR/" || { echo "ERROR: Failed to copy loadwabac.js"; exit 1; } 36 + cp "$SRC_DIR/client-metadata.json" "$OUT_DIR/" || { echo "ERROR: Failed to copy client-metadata.json"; exit 1; } 21 37 echo "Copied source files from $SRC_DIR" 22 38 23 39 # Copy wabac.js service worker 24 40 WABAC_SW="sure-client-proxy/node_modules/@webrecorder/wabac/dist/sw.js" 25 41 if [ -f "$WABAC_SW" ]; then 26 - cp "$WABAC_SW" "$OUT_DIR/" 42 + cp "$WABAC_SW" "$OUT_DIR/" || { echo "ERROR: Failed to copy wabac.js service worker"; exit 1; } 27 43 echo "Copied wabac.js service worker" 28 44 else 29 - echo "WARNING: wabac.js sw.js not found at $WABAC_SW" 45 + echo "ERROR: wabac.js sw.js not found at $WABAC_SW" 30 46 echo "Run 'cd sure-client-proxy && npm install' to install dependencies" 47 + exit 1 31 48 fi 32 49 33 50 echo ""
+2 -2
scripts/start-via.sh
··· 8 8 # Export development OAuth configuration for localhost 9 9 # Note: Use 127.0.0.1 for redirect_uri as required by RFC 8252 10 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" 11 + export VITE_OAUTH_CLIENT_ID="http://localhost?redirect_uri=http%3A%2F%2F127.0.0.1%3A8082%2Foauth%2Fcallback&scope=atproto" 12 12 export VITE_OAUTH_REDIRECT_URI="http://127.0.0.1:8082/oauth/callback" 13 - export VITE_OAUTH_SCOPE="atproto transition:generic" 13 + export VITE_OAUTH_SCOPE="atproto" 14 14 export BACKEND_URL="http://localhost:8080" 15 15 16 16 pnpm dev:via &
+21 -4
sure-client-proxy/Caddyfile
··· 10 10 encode gzip 11 11 12 12 # CORS headers for service worker and client 13 + # Note: same-origin requests don't need CORS headers 14 + # Service worker operates same-origin so no CORS needed for static files 15 + # Remove wildcard CORS - only allow same-origin access 13 16 header { 14 - Access-Control-Allow-Origin * 15 - Access-Control-Allow-Methods "GET, POST, OPTIONS" 16 - Access-Control-Allow-Headers "*" 17 + # Security headers 18 + X-Content-Type-Options "nosniff" 19 + X-Frame-Options "SAMEORIGIN" 20 + Referrer-Policy "strict-origin-when-cross-origin" 17 21 } 18 22 19 23 # Cache static assets ··· 29 33 header @html Cache-Control "no-cache" 30 34 } 31 35 32 - # CORS proxy (reverse proxy to Node.js server) 36 + # CORS proxy (reverse proxy to Node.js server on port 8083) 37 + # External clients connect to :8082, Caddy forwards to Node on :8083 33 38 :8082 { 39 + # Security headers for proxy responses 40 + header { 41 + X-Content-Type-Options "nosniff" 42 + # Note: X-Frame-Options and CSP intentionally not set here 43 + # as the proxy strips these from upstream responses for iframe embedding 44 + } 45 + 46 + # Request size limit (matches Node.js MAX_BODY_SIZE) 47 + request_body { 48 + max_size 10MB 49 + } 50 + 34 51 reverse_proxy localhost:8083 35 52 }
+42 -17
sure-client-proxy/README.md
··· 1 - # Seams Client-Side Proxy POC 1 + # Seams Client-Side Proxy 2 2 3 3 A client-side web proxy using wabac.js, replacing the server-side pywb proxy. 4 4 ··· 6 6 7 7 Instead of fetching pages server-side (pywb), this approach uses: 8 8 9 - 1. **CORS Proxy** (`cors-proxy/`) - Lightweight Node.js server that adds CORS headers 9 + 1. **CORS Proxy** (`cors-proxy/`) - Node.js server that adds CORS headers with SSRF protection 10 10 2. **wabac.js Service Worker** - Intercepts requests in the browser and routes through CORS proxy 11 11 3. **Script Injection** - `seams-client.js` is injected into proxied pages 12 12 ··· 25 25 ## Development 26 26 27 27 ```bash 28 - # Start both servers (cors-proxy on 8082, static on 8081) 28 + # Start both servers (cors-proxy on 8082 via Caddy, static on 8081) 29 29 npm run dev 30 30 ``` 31 31 ··· 49 49 │ ├── package.json 50 50 │ └── tsconfig.json 51 51 52 - ├── static/ 52 + ├── src/ 53 53 │ ├── index.html # Main page with iframe 54 54 │ ├── loadwabac.js # Initialize wabac.js service worker 55 - │ ├── seams-client.js # Injected into proxied pages 56 - │ └── sw.js # wabac.js service worker (copied from npm) 55 + │ └── client-metadata.json # OAuth metadata (for production use) 56 + 57 + ├── html/ 58 + │ ├── seams-shell.html # Shell with sidebar (built by vite) 59 + │ └── oauth-callback.html # OAuth callback handler 57 60 61 + ├── Caddyfile 58 62 ├── package.json 59 63 └── README.md 60 64 ``` 61 65 62 66 ## Ports 63 67 64 - - **8081** - Static site (main page with iframe) 65 - - **8082** - CORS proxy server 68 + - **8081** - Static site (main page with iframe) via Caddy 69 + - **8082** - CORS proxy (Caddy reverse proxies to Node on 8083) 70 + - **8083** - CORS proxy Node.js server (internal) 66 71 67 - ## Testing 72 + ## Environment Variables 68 73 69 - After running `npm run dev`: 74 + The CORS proxy supports these environment variables: 70 75 71 - 1. Open http://localhost:8081/#https://example.com 72 - 2. Open browser DevTools console 73 - 3. Should see `[seams-client] Injected! URL: https://example.com` in the console 74 - 4. The example.com page should render in the iframe 76 + | Variable | Default | Description | 77 + |----------|---------|-------------| 78 + | `CORS_ALLOWED_ORIGINS` | `http://127.0.0.1:8081` | Comma-separated allowed origins | 79 + | `CORS_PROXY_PORT` | `8083` | Port for Node.js server | 80 + | `CORS_PROXY_MAX_BODY_SIZE` | `10485760` (10MB) | Max request body size | 81 + | `CORS_PROXY_TIMEOUT_MS` | `30000` | Request timeout in ms | 82 + | `CORS_PROXY_RATE_WINDOW_MS` | `60000` | Rate limit window in ms | 83 + | `CORS_PROXY_RATE_LIMIT` | `100` | Max requests per window | 84 + | `CORS_PROXY_RATE_MAX_CLIENTS` | `10000` | Max tracked clients (memory bound) | 75 85 76 86 ## CORS Proxy Details 77 87 ··· 82 92 - **Referer**: Accepts `x-proxy-referer` header 83 93 - **User-Agent**: Accepts `x-proxy-user-agent` header 84 94 95 + ### Security Features 96 + 97 + - **SSRF Protection**: Blocks private IPs, cloud metadata endpoints 98 + - **DNS Rebinding Mitigation**: Validates resolved IPs before fetch (see note below) 99 + - **Rate Limiting**: Configurable per-origin request limits with bounded memory 100 + - **Origin Validation**: Requires Origin header (no Referer fallback) 101 + - **Audit Logging**: Logs all proxy requests with request IDs 102 + 103 + ### DNS Rebinding Limitation 104 + 105 + The DNS validation provides defense-in-depth but cannot fully prevent DNS rebinding 106 + attacks due to TOCTOU (time-of-check-time-of-use) - `fetch()` does its own DNS 107 + resolution after our validation. For full protection in production, deploy behind 108 + a network-level firewall that blocks outbound connections to private IP ranges 109 + (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16). 110 + 85 111 ## Next Steps 86 112 87 - 1. Replace `seams-client.js` placeholder with build from `entrypoints/via-client/main.ts` 88 - 2. Deploy CORS proxy to Cloudflare Workers or similar edge runtime 89 - 3. Deploy static site to CDN 113 + 1. Deploy CORS proxy to Cloudflare Workers or similar edge runtime 114 + 2. Deploy static site to CDN
+420 -22
sure-client-proxy/cors-proxy/index.ts
··· 1 1 import { Hono } from 'hono'; 2 2 import { serve } from '@hono/node-server'; 3 + import dns from 'dns/promises'; 4 + import crypto from 'crypto'; 3 5 4 6 const app = new Hono(); 5 7 8 + // HMAC authentication configuration 9 + // When CORS_PROXY_HMAC_SECRET is set, requests must include valid signature 10 + const HMAC_SECRET = process.env.CORS_PROXY_HMAC_SECRET || ''; 11 + const HMAC_ENABLED = HMAC_SECRET.length > 0; 12 + const HMAC_MAX_AGE_MS = parseInt(process.env.CORS_PROXY_HMAC_MAX_AGE_MS || '60000', 10); // 1 minute default 13 + 14 + /** 15 + * Verify HMAC signature on request 16 + * Signature format: HMAC-SHA256(secret, timestamp:url) 17 + * Headers: X-Seams-Timestamp (unix ms), X-Seams-Signature (base64) 18 + */ 19 + function verifyHmacSignature(timestamp: string, url: string, signature: string): boolean { 20 + if (!HMAC_SECRET) return false; 21 + 22 + const message = `${timestamp}:${url}`; 23 + const expectedSignature = crypto 24 + .createHmac('sha256', HMAC_SECRET) 25 + .update(message) 26 + .digest('base64'); 27 + 28 + // Use timing-safe comparison to prevent timing attacks 29 + try { 30 + return crypto.timingSafeEqual( 31 + Buffer.from(signature, 'base64'), 32 + Buffer.from(expectedSignature, 'base64') 33 + ); 34 + } catch { 35 + return false; 36 + } 37 + } 38 + 6 39 // Allowed origins for CORS (configurable via environment variable) 7 40 // Note: Use 127.0.0.1 for local dev (RFC 8252 requires loopback IP for OAuth) 8 41 const CORS_ALLOWED_ORIGINS = process.env.CORS_ALLOWED_ORIGINS ··· 11 44 'http://127.0.0.1:8081', 12 45 ]; 13 46 47 + // Configurable limits via environment variables 48 + const MAX_BODY_SIZE = parseInt(process.env.CORS_PROXY_MAX_BODY_SIZE || String(10 * 1024 * 1024), 10); 49 + const REQUEST_TIMEOUT_MS = parseInt(process.env.CORS_PROXY_TIMEOUT_MS || '30000', 10); 50 + 51 + // Rate limiting configuration 52 + const RATE_LIMIT_WINDOW_MS = parseInt(process.env.CORS_PROXY_RATE_WINDOW_MS || '60000', 10); 53 + const RATE_LIMIT_MAX_REQUESTS = parseInt(process.env.CORS_PROXY_RATE_LIMIT || '100', 10); 54 + const RATE_LIMIT_MAX_CLIENTS = parseInt(process.env.CORS_PROXY_RATE_MAX_CLIENTS || '10000', 10); 55 + 56 + // Simple in-memory rate limiter with bounded size 57 + const rateLimitMap = new Map<string, { count: number; windowStart: number }>(); 58 + 59 + function isRateLimited(clientId: string): boolean { 60 + const now = Date.now(); 61 + const entry = rateLimitMap.get(clientId); 62 + 63 + if (!entry || now - entry.windowStart > RATE_LIMIT_WINDOW_MS) { 64 + // Prevent memory exhaustion: if map is full, reject new clients 65 + if (rateLimitMap.size >= RATE_LIMIT_MAX_CLIENTS && !entry) { 66 + console.warn(`[cors-proxy] Rate limit map full (${RATE_LIMIT_MAX_CLIENTS} clients), rejecting new client`); 67 + return true; 68 + } 69 + rateLimitMap.set(clientId, { count: 1, windowStart: now }); 70 + return false; 71 + } 72 + 73 + entry.count++; 74 + if (entry.count > RATE_LIMIT_MAX_REQUESTS) { 75 + return true; 76 + } 77 + 78 + return false; 79 + } 80 + 81 + // Clean up old rate limit entries periodically 82 + setInterval(() => { 83 + const now = Date.now(); 84 + for (const [key, entry] of rateLimitMap.entries()) { 85 + if (now - entry.windowStart > RATE_LIMIT_WINDOW_MS) { 86 + rateLimitMap.delete(key); 87 + } 88 + } 89 + }, RATE_LIMIT_WINDOW_MS); 90 + 91 + // Check if an IP address is private/internal 92 + function isPrivateIP(ip: string): { blocked: boolean; reason?: string } { 93 + // Handle IPv4-mapped IPv6 addresses (::ffff:x.x.x.x) 94 + const ipv4MappedMatch = ip.match(/^::ffff:(\d+)\.(\d+)\.(\d+)\.(\d+)$/i); 95 + if (ipv4MappedMatch) { 96 + const [, aStr, bStr] = ipv4MappedMatch; 97 + const a = Number(aStr); 98 + const b = Number(bStr); 99 + if (a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) || 100 + (a === 169 && b === 254) || a === 127 || a === 0) { 101 + return { blocked: true, reason: 'Private IPv4-mapped IPv6 address' }; 102 + } 103 + } 104 + 105 + // IPv6 private ranges 106 + if (ip.match(/^f[cd][0-9a-f]{2}:/i)) { 107 + return { blocked: true, reason: 'IPv6 Unique Local Address (ULA)' }; 108 + } 109 + if (ip.match(/^fe[89ab][0-9a-f]:/i)) { 110 + return { blocked: true, reason: 'IPv6 link-local address' }; 111 + } 112 + if (ip === '::1' || ip === '0:0:0:0:0:0:0:1') { 113 + return { blocked: true, reason: 'IPv6 loopback' }; 114 + } 115 + 116 + // IPv4 private ranges 117 + const ipv4Match = ip.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); 118 + if (ipv4Match) { 119 + const [, aStr, bStr] = ipv4Match; 120 + const a = Number(aStr); 121 + const b = Number(bStr); 122 + 123 + if (a === 10) { 124 + return { blocked: true, reason: 'Private IP (10.0.0.0/8)' }; 125 + } 126 + if (a === 172 && b >= 16 && b <= 31) { 127 + return { blocked: true, reason: 'Private IP (172.16.0.0/12)' }; 128 + } 129 + if (a === 192 && b === 168) { 130 + return { blocked: true, reason: 'Private IP (192.168.0.0/16)' }; 131 + } 132 + if (a === 169 && b === 254) { 133 + return { blocked: true, reason: 'Link-local IP (169.254.0.0/16)' }; 134 + } 135 + if (a === 127) { 136 + return { blocked: true, reason: 'Loopback IP (127.0.0.0/8)' }; 137 + } 138 + if (a === 0) { 139 + return { blocked: true, reason: 'Invalid IP (0.0.0.0/8)' }; 140 + } 141 + if (a === 100 && b >= 64 && b <= 127) { 142 + return { blocked: true, reason: 'Carrier-Grade NAT (100.64.0.0/10)' }; 143 + } 144 + } 145 + 146 + return { blocked: false }; 147 + } 148 + 149 + // SSRF Protection: Block private/internal IP ranges and cloud metadata endpoints 150 + function isBlockedUrl(urlString: string): { blocked: boolean; reason?: string } { 151 + try { 152 + const url = new URL(urlString); 153 + let hostname = url.hostname.toLowerCase(); 154 + 155 + // Remove brackets from IPv6 addresses for validation 156 + if (hostname.startsWith('[') && hostname.endsWith(']')) { 157 + hostname = hostname.slice(1, -1); 158 + } 159 + 160 + // Block cloud metadata endpoints by hostname 161 + const metadataHosts = [ 162 + '169.254.169.254', // AWS/GCP/Azure metadata 163 + 'metadata.google.internal', 164 + 'metadata.google', 165 + '100.100.100.200', // Alibaba Cloud metadata 166 + 'fd00:ec2::254', // AWS IPv6 metadata 167 + ]; 168 + if (metadataHosts.includes(hostname)) { 169 + return { blocked: true, reason: 'Cloud metadata endpoint blocked' }; 170 + } 171 + 172 + // Block localhost variants 173 + if (hostname === 'localhost' || 174 + hostname === '127.0.0.1' || 175 + hostname === '::1' || 176 + hostname === '0.0.0.0' || 177 + hostname.endsWith('.localhost')) { 178 + return { blocked: true, reason: 'Localhost access blocked' }; 179 + } 180 + 181 + // Check if hostname is a direct IP address 182 + const ipCheck = isPrivateIP(hostname); 183 + if (ipCheck.blocked) { 184 + return ipCheck; 185 + } 186 + 187 + // Block file:// and other dangerous protocols 188 + if (url.protocol !== 'http:' && url.protocol !== 'https:') { 189 + return { blocked: true, reason: `Protocol ${url.protocol} not allowed` }; 190 + } 191 + 192 + return { blocked: false }; 193 + } catch { 194 + return { blocked: true, reason: 'Invalid URL format' }; 195 + } 196 + } 197 + 198 + // Resolve hostname and validate resolved IPs against SSRF blocklist 199 + // NOTE: This provides defense-in-depth but cannot fully prevent DNS rebinding 200 + // attacks due to TOCTOU (time-of-check-time-of-use) - fetch() does its own DNS 201 + // resolution. For full protection, deploy behind a network-level firewall that 202 + // blocks outbound connections to private IP ranges. 203 + async function resolveAndValidate(urlString: string): Promise<{ blocked: boolean; reason?: string }> { 204 + try { 205 + const url = new URL(urlString); 206 + const hostname = url.hostname; 207 + 208 + // Skip DNS resolution for IP addresses (already validated by isBlockedUrl) 209 + if (hostname.match(/^(\d+\.){3}\d+$/) || hostname.includes(':')) { 210 + return { blocked: false }; 211 + } 212 + 213 + // Resolve the hostname to IP addresses 214 + let addresses: string[]; 215 + try { 216 + addresses = await dns.resolve4(hostname); 217 + } catch { 218 + // If IPv4 fails, try IPv6 219 + try { 220 + addresses = await dns.resolve6(hostname); 221 + } catch { 222 + // DNS resolution failed - fail closed for security 223 + return { blocked: true, reason: `DNS resolution failed for ${hostname}` }; 224 + } 225 + } 226 + 227 + // Validate ALL resolved IPs - block if ANY is private 228 + for (const ip of addresses) { 229 + const ipCheck = isPrivateIP(ip); 230 + if (ipCheck.blocked) { 231 + // Log detailed info server-side, return generic message to client 232 + console.warn(`[cors-proxy] DNS rebinding blocked: ${hostname} resolves to ${ip} (${ipCheck.reason})`); 233 + return { blocked: true, reason: 'Request blocked for security reasons' }; 234 + } 235 + 236 + // Also check cloud metadata IPs 237 + if (ip === '169.254.169.254' || ip === '100.100.100.200') { 238 + console.warn(`[cors-proxy] DNS rebinding blocked: ${hostname} resolves to cloud metadata IP ${ip}`); 239 + return { blocked: true, reason: 'Request blocked for security reasons' }; 240 + } 241 + } 242 + 243 + return { blocked: false }; 244 + } catch { 245 + return { blocked: true, reason: 'Failed to validate URL' }; 246 + } 247 + } 248 + 249 + // Validate redirect location against SSRF blocklist 250 + function validateRedirectLocation(location: string, baseUrl: string): string | null { 251 + try { 252 + // Resolve relative URLs against the base 253 + const resolved = new URL(location, baseUrl); 254 + const blockCheck = isBlockedUrl(resolved.href); 255 + if (blockCheck.blocked) { 256 + console.warn(`[cors-proxy] Blocked redirect to: ${resolved.href} - ${blockCheck.reason}`); 257 + return null; 258 + } 259 + return resolved.href; 260 + } catch { 261 + return null; 262 + } 263 + } 264 + 14 265 // Headers to skip when proxying request 15 266 const SKIP_REQUEST_HEADERS = new Set([ 16 267 'host', ··· 42 293 const headers = c.req.header('Access-Control-Request-Headers'); 43 294 44 295 if (CORS_ALLOWED_ORIGINS.length && origin && !CORS_ALLOWED_ORIGINS.includes(origin)) { 45 - return c.json({ error: 'origin not allowed' }, 403); 296 + return c.json({ error: 'Origin not allowed' }, 403); 46 297 } 47 298 48 299 if (origin && method && headers) { 49 300 return new Response(null, { 50 301 headers: { 51 - 'Access-Control-Allow-Method': method, 302 + 'Access-Control-Allow-Methods': method, 52 303 'Access-Control-Allow-Headers': headers, 53 304 'Access-Control-Allow-Origin': origin, 54 305 'Access-Control-Allow-Credentials': 'true', 306 + 'Access-Control-Max-Age': '86400', // Cache preflight for 24 hours 55 307 }, 56 308 }); 57 309 } ··· 65 317 66 318 // Main proxy handler 67 319 app.all('/proxy/*', async (c) => { 68 - // Extract the target URL from the path 320 + // Get client identifier for rate limiting (use origin or IP) 321 + const origin = c.req.header('Origin'); 322 + const clientIp = c.req.header('X-Forwarded-For')?.split(',')[0]?.trim() || 'unknown'; 323 + const clientId = origin || clientIp; 324 + 325 + // Rate limiting check 326 + if (isRateLimited(clientId)) { 327 + console.warn(`[cors-proxy] Rate limited: ${clientId}`); 328 + return c.json({ error: 'Rate limit exceeded. Try again later.' }, 429); 329 + } 330 + 331 + // CSRF Protection: Require Origin header - no Referer fallback 332 + // Referer is spoofable and provides false sense of security 333 + if (!origin) { 334 + console.warn('[cors-proxy] Blocked request without Origin header'); 335 + return c.json({ error: 'Origin header required' }, 403); 336 + } 337 + 338 + if (CORS_ALLOWED_ORIGINS.length && !CORS_ALLOWED_ORIGINS.includes(origin)) { 339 + console.warn(`[cors-proxy] Blocked request from unauthorized origin: ${origin}`); 340 + return c.json({ error: 'Origin not allowed' }, 403); 341 + } 342 + 343 + // Extract the target URL from the path (needed for HMAC verification) 69 344 let proxyUrl = c.req.path.slice('/proxy/'.length); 70 345 71 346 // Handle query string ··· 79 354 proxyUrl = 'https:' + proxyUrl; 80 355 } 81 356 82 - // Validate URL 357 + // HMAC authentication check (when enabled) 358 + if (HMAC_ENABLED) { 359 + const timestamp = c.req.header('X-Seams-Timestamp'); 360 + const signature = c.req.header('X-Seams-Signature'); 361 + 362 + if (!timestamp || !signature) { 363 + console.warn('[cors-proxy] HMAC auth failed: missing headers'); 364 + return c.json({ error: 'Authentication required' }, 401); 365 + } 366 + 367 + // Check timestamp freshness to prevent replay attacks 368 + const timestampMs = parseInt(timestamp, 10); 369 + const now = Date.now(); 370 + if (isNaN(timestampMs) || Math.abs(now - timestampMs) > HMAC_MAX_AGE_MS) { 371 + console.warn(`[cors-proxy] HMAC auth failed: timestamp expired (drift: ${now - timestampMs}ms)`); 372 + return c.json({ error: 'Request expired' }, 401); 373 + } 374 + 375 + // Verify signature 376 + if (!verifyHmacSignature(timestamp, proxyUrl, signature)) { 377 + console.warn('[cors-proxy] HMAC auth failed: invalid signature'); 378 + return c.json({ error: 'Invalid signature' }, 401); 379 + } 380 + } 381 + 382 + // Validate URL syntax 83 383 try { 84 384 new URL(proxyUrl); 85 385 } catch { 86 - return c.json({ error: 'Invalid URL' }, 400); 386 + return c.json({ error: 'Invalid URL format' }, 400); 387 + } 388 + 389 + // SSRF Protection: Block internal/private URLs (hostname check) 390 + const blockCheck = isBlockedUrl(proxyUrl); 391 + if (blockCheck.blocked) { 392 + console.warn(`[cors-proxy] SSRF blocked (hostname): ${proxyUrl} - ${blockCheck.reason}`); 393 + // Return generic error to avoid leaking internal network topology 394 + return c.json({ error: 'Request blocked' }, 403); 395 + } 396 + 397 + // SSRF Protection: Resolve DNS and validate resolved IPs (prevents DNS rebinding) 398 + const dnsCheck = await resolveAndValidate(proxyUrl); 399 + if (dnsCheck.blocked) { 400 + console.warn(`[cors-proxy] SSRF blocked (DNS): ${proxyUrl} - ${dnsCheck.reason}`); 401 + // Return generic error to avoid leaking DNS resolution details 402 + return c.json({ error: 'Request blocked' }, 403); 87 403 } 88 404 89 - console.log(`[cors-proxy] Proxying: ${proxyUrl}`); 405 + // Audit log for successful proxy request start 406 + const requestId = Math.random().toString(36).substring(2, 10); 407 + console.log(`[cors-proxy] [${requestId}] Proxying: ${proxyUrl} (origin: ${origin})`); 90 408 91 409 // Build proxy request headers 92 410 const proxyHeaders = new Headers(); ··· 136 454 proxyHeaders.set('Cookie', cookie); 137 455 } 138 456 139 - // Get request body for non-GET/HEAD requests 457 + // Get request body for non-GET/HEAD requests with size limit 140 458 const method = c.req.method; 141 - const body = (method === 'GET' || method === 'HEAD') ? null : await c.req.raw.body; 459 + let body: ReadableStream<Uint8Array> | null = null; 460 + 461 + if (method !== 'GET' && method !== 'HEAD') { 462 + const contentLength = c.req.header('Content-Length'); 463 + if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) { 464 + return c.json({ error: `Request body too large (max ${MAX_BODY_SIZE / 1024 / 1024}MB)` }, 413); 465 + } 466 + body = c.req.raw.body; 467 + } 468 + 469 + // Set up request timeout with AbortController 470 + const controller = new AbortController(); 471 + const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); 142 472 143 473 try { 144 474 // Fetch with redirect: manual to handle redirects specially ··· 147 477 headers: proxyHeaders, 148 478 body, 149 479 redirect: 'manual', 480 + signal: controller.signal, 150 481 }); 482 + 483 + // Clear timeout on successful fetch 484 + clearTimeout(timeoutId); 151 485 152 486 // Build response headers 153 487 const responseHeaders = new Headers(); ··· 183 517 184 518 const location = resp.headers.get('location'); 185 519 if (location) { 186 - responseHeaders.set('x-orig-location', location); 520 + // Validate redirect location against SSRF blocklist 521 + const validatedLocation = validateRedirectLocation(location, proxyUrl); 522 + if (validatedLocation) { 523 + responseHeaders.set('x-orig-location', validatedLocation); 524 + } else { 525 + // Don't expose blocked redirect locations 526 + responseHeaders.set('x-redirect-blocked', 'true'); 527 + } 187 528 } 188 529 189 530 // Return 200 so browser doesn't follow redirect ··· 193 534 } 194 535 195 536 // Add CORS headers 196 - const origin = c.req.header('Origin'); 197 - if (origin) { 198 - responseHeaders.set('Access-Control-Allow-Origin', origin); 199 - responseHeaders.set('Access-Control-Allow-Credentials', 'true'); 200 - responseHeaders.set('Access-Control-Expose-Headers', exposeHeaders.join(',')); 201 - } 537 + responseHeaders.set('Access-Control-Allow-Origin', origin); 538 + responseHeaders.set('Access-Control-Allow-Credentials', 'true'); 539 + responseHeaders.set('Access-Control-Expose-Headers', [...exposeHeaders, 'X-Request-Id'].join(',')); 540 + 541 + // Return request ID to client for debugging/correlation 542 + responseHeaders.set('X-Request-Id', requestId); 202 543 203 - // Handle error status codes 544 + // Handle error status codes (>= 400, excluding 404 and memento responses) 204 545 let responseBody: ReadableStream<Uint8Array> | string | null; 205 - if (status > 400 && status !== 404 && !resp.headers.get('memento-datetime')) { 546 + if (status >= 400 && status !== 404 && !resp.headers.get('memento-datetime')) { 206 547 responseBody = `Sorry, this page could not be loaded (Error Status: ${status})`; 207 548 } else { 208 549 responseBody = resp.body; 209 550 } 551 + 552 + // Audit log for completed request 553 + console.log(`[cors-proxy] [${requestId}] Completed: ${resp.status} ${resp.statusText}`); 210 554 211 555 return new Response(responseBody, { 212 556 headers: responseHeaders, ··· 214 558 statusText, 215 559 }); 216 560 } catch (error) { 217 - console.error('[cors-proxy] Fetch error:', error); 561 + clearTimeout(timeoutId); 562 + 563 + if (error instanceof Error && error.name === 'AbortError') { 564 + console.error(`[cors-proxy] [${requestId}] Timeout: ${proxyUrl}`); 565 + return c.json({ error: 'Request timed out' }, 504); 566 + } 567 + 568 + console.error(`[cors-proxy] [${requestId}] Fetch error:`, error); 218 569 return c.json({ error: 'Failed to fetch target URL' }, 502); 219 570 } 220 571 }); 221 572 222 - // Health check 573 + // Track server start time for uptime calculation 574 + const serverStartTime = Date.now(); 575 + 576 + // Health check with operational metrics 223 577 app.get('/', (c) => { 224 - return c.json({ status: 'ok', service: 'seams-cors-proxy' }); 578 + return c.json({ 579 + status: 'ok', 580 + service: 'seams-cors-proxy', 581 + uptime_seconds: Math.floor((Date.now() - serverStartTime) / 1000), 582 + rate_limit_clients: rateLimitMap.size, 583 + rate_limit_max_clients: RATE_LIMIT_MAX_CLIENTS, 584 + memory_mb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024), 585 + }); 225 586 }); 226 587 227 - const port = parseInt(process.env.CORS_PROXY_PORT || '8082', 10); 588 + // Separate liveness probe (minimal, fast) 589 + app.get('/healthz', (c) => { 590 + return c.text('ok'); 591 + }); 592 + 593 + const port = parseInt(process.env.CORS_PROXY_PORT || '8083', 10); 228 594 console.log(`[cors-proxy] Starting server on http://localhost:${port}`); 229 595 console.log(`[cors-proxy] Allowed origins: ${CORS_ALLOWED_ORIGINS.join(', ')}`); 596 + console.log(`[cors-proxy] Rate limit: ${RATE_LIMIT_MAX_REQUESTS} req/${RATE_LIMIT_WINDOW_MS / 1000}s, max ${RATE_LIMIT_MAX_CLIENTS} clients`); 597 + console.log(`[cors-proxy] Max body: ${MAX_BODY_SIZE / 1024 / 1024}MB, timeout: ${REQUEST_TIMEOUT_MS / 1000}s`); 598 + console.log(`[cors-proxy] HMAC auth: ${HMAC_ENABLED ? 'ENABLED' : 'DISABLED (set CORS_PROXY_HMAC_SECRET to enable)'}`); 599 + if (HMAC_ENABLED) { 600 + console.log(`[cors-proxy] HMAC max age: ${HMAC_MAX_AGE_MS / 1000}s`); 601 + } 230 602 231 - serve({ 603 + const server = serve({ 232 604 fetch: app.fetch, 233 605 port, 234 606 }); 607 + 608 + // Graceful shutdown handling 609 + let isShuttingDown = false; 610 + 611 + function gracefulShutdown(signal: string) { 612 + if (isShuttingDown) return; 613 + isShuttingDown = true; 614 + 615 + console.log(`[cors-proxy] Received ${signal}, shutting down gracefully...`); 616 + 617 + // Give in-flight requests time to complete 618 + const SHUTDOWN_TIMEOUT = 10000; 619 + const shutdownTimer = setTimeout(() => { 620 + console.log('[cors-proxy] Shutdown timeout, forcing exit'); 621 + process.exit(1); 622 + }, SHUTDOWN_TIMEOUT); 623 + 624 + server.close(() => { 625 + clearTimeout(shutdownTimer); 626 + console.log('[cors-proxy] Server closed, exiting'); 627 + process.exit(0); 628 + }); 629 + } 630 + 631 + process.on('SIGTERM', () => gracefulShutdown('SIGTERM')); 632 + process.on('SIGINT', () => gracefulShutdown('SIGINT'));
+6 -5
sure-client-proxy/src/client-metadata.json
··· 1 1 { 2 - "client_id": "http://127.0.0.1:8081/client-metadata.json", 3 - "client_uri": "http://127.0.0.1:8081", 2 + "$comment": "AT Protocol OAuth client metadata. In dev, loopback client ID bypasses this. In production, this file is served at /client-metadata.json", 3 + "client_id": "https://sure.seams.so/client-metadata.json", 4 + "client_uri": "https://sure.seams.so", 4 5 "redirect_uris": [ 5 - "http://127.0.0.1:8081/oauth-callback.html" 6 + "https://sure.seams.so/oauth-callback.html" 6 7 ], 7 8 "application_type": "web", 8 - "client_name": "Seams (Local Dev)", 9 + "client_name": "Seams", 9 10 "dpop_bound_access_tokens": true, 10 11 "grant_types": [ 11 12 "authorization_code", ··· 14 15 "response_types": [ 15 16 "code" 16 17 ], 17 - "scope": "atproto transition:generic", 18 + "scope": "atproto", 18 19 "token_endpoint_auth_method": "none" 19 20 }
+36 -8
sure-client-proxy/src/index.html
··· 115 115 <button onclick="loadUrl()">Go</button> 116 116 </div> 117 117 <div id="main-container"> 118 + <!-- 119 + SECURITY NOTE: allow-scripts + allow-same-origin = sandbox escape risk. 120 + Required for wabac.js service worker interception. Mitigated by serving 121 + this shell from a dedicated origin (sure.seams.so) separate from main app. 122 + --> 118 123 <iframe 119 124 id="content" 120 125 class="sidebar-open" 121 - sandbox="allow-downloads allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-presentation allow-scripts allow-same-origin allow-forms" 126 + sandbox="allow-scripts allow-same-origin allow-forms allow-popups" 122 127 ></iframe> 123 128 <!-- Sidebar container - Sidebar component rendered directly by shell.ts --> 124 129 <div id="sidebar-container" class="sidebar-container"></div> 125 130 <button id="toggle-btn" class="sidebar-open" title="Toggle sidebar">&lt;&lt;</button> 126 131 </div> 127 132 <script> 128 - // Try with official Webrecorder CORS proxy for testing 129 - // const corsProxy = 'https://wabac-cors-proxy.webrecorder.workers.dev/proxy/'; 130 - // Use our local CORS proxy (127.0.0.1 for RFC 8252 OAuth compatibility) 131 - const corsProxy = 'http://127.0.0.1:8082/proxy/'; 133 + // CORS proxy URL - configured at build time via Vite or falls back to localhost for dev 134 + // In production, this should be set to the deployed proxy URL 135 + // __CORS_PROXY_URL__ is replaced at build time by Vite define config 136 + const corsProxy = (typeof __CORS_PROXY_URL__ !== 'undefined' && __CORS_PROXY_URL__) 137 + || 'http://127.0.0.1:8082/proxy/'; 132 138 133 139 console.log('[index] Using CORS proxy:', corsProxy); 134 140 const proxy = new SeamsLiveProxy({ corsProxy }); 135 - proxy.init(); 141 + proxy.init().catch(error => { 142 + console.error('[index] Failed to initialize proxy:', error); 143 + document.body.innerHTML = ` 144 + <div style="padding: 20px; font-family: system-ui, sans-serif;"> 145 + <h2>Failed to Initialize</h2> 146 + <p>Service worker registration failed: ${error.message}</p> 147 + <p>Try refreshing the page or clearing browser cache.</p> 148 + </div> 149 + `; 150 + }); 136 151 137 152 function loadUrl() { 138 - const url = document.getElementById('urlInput').value; 153 + const url = document.getElementById('urlInput').value.trim(); 139 154 if (url) { 140 - window.location.hash = url; 155 + // Validate URL before setting hash 156 + try { 157 + const parsed = new URL(url); 158 + // Only allow http/https protocols 159 + if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { 160 + console.error('[index] Invalid URL protocol:', parsed.protocol); 161 + alert('Only http:// and https:// URLs are supported'); 162 + return; 163 + } 164 + window.location.hash = url; 165 + } catch (e) { 166 + console.error('[index] Invalid URL:', url, e); 167 + alert('Please enter a valid URL (e.g., https://example.com)'); 168 + } 141 169 } 142 170 } 143 171
+96 -64
sure-client-proxy/src/loadwabac.js
··· 1 1 /** 2 2 * SeamsLiveProxy - Client-side web proxy using wabac.js service worker 3 - * 4 3 * Based on https://github.com/webrecorder/wabac.js/blob/main/examples/live-proxy/loadwabac.js 5 4 */ 6 5 class SeamsLiveProxy { ··· 16 15 this.url = ''; 17 16 this.ts = ''; 18 17 19 - // Regex to match collection URL pattern: liveproxy/20231225mp_/https://... 20 - this.matchRx = new RegExp(`${collName}\\/([\\d]+)?\\w\\w_\\/(.*)`); 18 + // Regex to match collection URL pattern: /w/liveproxy/20231225mp_/https://... 19 + // Escape collName to prevent regex injection, anchor at start 20 + const escapedCollName = collName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); 21 + this.matchRx = new RegExp(`^.*/w/${escapedCollName}/([\\d]+)?\\w\\w_/(.*)`); 21 22 } 22 23 23 24 async init() { 24 - console.log('[loadwabac] Initializing SeamsLiveProxy'); 25 - console.log('[loadwabac] CORS proxy:', this.corsProxy); 25 + console.log('[loadwabac] Initializing proxy'); 26 26 27 27 const scope = './'; 28 - 29 - // Register service worker with script injection 30 - const swParams = new URLSearchParams({ 31 - injectScripts: this.injectScripts, 32 - }); 33 - 34 - console.log('[loadwabac] Registering service worker with params:', swParams.toString()); 28 + const swParams = new URLSearchParams({ injectScripts: this.injectScripts }); 35 29 36 - // Register the service worker 37 - await navigator.serviceWorker.register( 30 + // Register the service worker with timeout 31 + const SW_REGISTRATION_TIMEOUT = 30000; 32 + const registrationPromise = navigator.serviceWorker.register( 38 33 `./sw.js?${swParams.toString()}`, 39 34 { scope } 40 35 ); 41 - 42 - console.log('[loadwabac] Service worker registered'); 36 + 37 + const timeoutPromise = new Promise((_, reject) => { 38 + setTimeout(() => reject(new Error('Service worker registration timed out')), SW_REGISTRATION_TIMEOUT); 39 + }); 40 + 41 + try { 42 + await Promise.race([registrationPromise, timeoutPromise]); 43 + } catch (error) { 44 + console.error('[loadwabac] SW registration failed:', error); 45 + throw error; 46 + } 43 47 44 48 // Set up message listener for collAdded BEFORE sending addColl 49 + // Use a resolved flag to handle race condition where message arrives before listener 45 50 let initedResolve = null; 46 - const inited = new Promise((resolve) => (initedResolve = resolve)); 51 + let initedResolved = false; 52 + const inited = new Promise((resolve) => { 53 + initedResolve = () => { 54 + if (!initedResolved) { 55 + initedResolved = true; 56 + resolve(); 57 + } 58 + }; 59 + }); 47 60 48 - navigator.serviceWorker.addEventListener('message', (event) => { 49 - console.log('[loadwabac] Received message from SW:', event.data); 61 + // Store reference for cleanup 62 + const messageHandler = (event) => { 50 63 if (event.data.msg_type === 'collAdded') { 51 - console.log('[loadwabac] Collection added, ready for replay'); 64 + console.log('[loadwabac] Collection ready'); 52 65 initedResolve(); 53 66 } 54 - }); 67 + }; 68 + navigator.serviceWorker.addEventListener('message', messageHandler); 69 + this._messageHandler = messageHandler; 55 70 56 71 // Build base URL (without hash) 57 72 const baseUrl = new URL(window.location); 58 73 baseUrl.hash = ''; 59 74 60 - // Configure the live proxy collection - matching the reference implementation 75 + // Configure the live proxy collection 61 76 const msg = { 62 77 msg_type: 'addColl', 63 78 name: this.collName, ··· 73 88 }, 74 89 }; 75 90 76 - console.log('[loadwabac] addColl message:', msg); 77 - 78 91 // Send message to service worker controller 79 92 if (!navigator.serviceWorker.controller) { 80 - console.log('[loadwabac] No controller yet, waiting for controllerchange'); 81 93 await new Promise((resolve) => { 82 94 navigator.serviceWorker.addEventListener('controllerchange', () => { 83 - console.log('[loadwabac] Controller changed, now sending addColl message'); 84 95 navigator.serviceWorker.controller.postMessage(msg); 85 96 resolve(); 86 97 }); 87 98 }); 88 99 } else { 89 - console.log('[loadwabac] Sending addColl message to existing controller'); 90 100 navigator.serviceWorker.controller.postMessage(msg); 91 101 } 92 102 93 - // Wait for collection to be ready 94 - await inited; 95 - console.log('[loadwabac] Collection ready'); 103 + // Wait for collection to be ready with timeout 104 + const COLLECTION_TIMEOUT = 30000; // 30 seconds 105 + const collectionTimeoutPromise = new Promise((_, reject) => { 106 + setTimeout(() => reject(new Error('Collection initialization timed out')), COLLECTION_TIMEOUT); 107 + }); 108 + 109 + try { 110 + await Promise.race([inited, collectionTimeoutPromise]); 111 + } catch (error) { 112 + console.error('[loadwabac] Collection init failed:', error); 113 + navigator.serviceWorker.removeEventListener('message', this._messageHandler); 114 + throw error; 115 + } 116 + 117 + navigator.serviceWorker.removeEventListener('message', this._messageHandler); 96 118 97 119 // Set up iframe load listener 98 - window.addEventListener('load', () => { 99 - const iframe = document.querySelector('#content'); 100 - if (iframe) { 101 - iframe.addEventListener('load', () => { 102 - try { 103 - const iframeHref = iframe.contentWindow.location.href; 104 - console.log('[loadwabac] Iframe loaded:', iframeHref); 105 - this.onIframeLoad(iframeHref); 106 - } catch (e) { 107 - // Cross-origin access blocked - this means SW didn't intercept 108 - console.warn('[loadwabac] Cannot read iframe location (cross-origin) - SW may not be intercepting'); 109 - } 110 - }); 111 - } 112 - }); 120 + const iframe = document.querySelector('#content'); 121 + if (iframe) { 122 + this._iframeLoadHandler = () => { 123 + try { 124 + const iframeHref = iframe.contentWindow.location.href; 125 + this.onIframeLoad(iframeHref); 126 + } catch { 127 + console.warn('[loadwabac] Cross-origin iframe access blocked'); 128 + } 129 + }; 130 + iframe.addEventListener('load', this._iframeLoadHandler); 131 + } 113 132 114 - // Set up hash change listeners 115 - window.addEventListener('hashchange', () => { 133 + // Set up hash change listeners (store references for cleanup) 134 + this._hashChangeHandler = () => { 116 135 this.onHashChange(); 117 - }); 136 + }; 137 + window.addEventListener('hashchange', this._hashChangeHandler); 118 138 119 - // Initial load after everything is set up 120 - window.addEventListener('load', () => { 139 + // Initial load handler 140 + this._windowLoadHandler = () => { 121 141 this.onHashChange(); 122 - }); 142 + }; 143 + window.addEventListener('load', this._windowLoadHandler); 123 144 124 145 // Also trigger immediately if page is already loaded 125 146 if (document.readyState === 'complete') { 126 147 this.onHashChange(); 148 + } 149 + } 150 + 151 + // Cleanup method to remove event listeners 152 + destroy() { 153 + if (this._messageHandler) { 154 + navigator.serviceWorker.removeEventListener('message', this._messageHandler); 155 + } 156 + if (this._hashChangeHandler) { 157 + window.removeEventListener('hashchange', this._hashChangeHandler); 158 + } 159 + if (this._windowLoadHandler) { 160 + window.removeEventListener('load', this._windowLoadHandler); 161 + } 162 + const iframe = document.querySelector('#content'); 163 + if (iframe && this._iframeLoadHandler) { 164 + iframe.removeEventListener('load', this._iframeLoadHandler); 127 165 } 128 166 } 129 167 ··· 137 175 const url = m?.[2] || ''; 138 176 const ts = m?.[1] || ''; 139 177 140 - // Need a valid URL - default to example.com like reference 141 - const finalUrl = url || 'https://example.com/'; 178 + // Require a valid URL - don't load anything if empty 179 + if (!url) { 180 + return; 181 + } 182 + 183 + const finalUrl = url; 142 184 143 185 // Don't change if same URL 144 186 if (finalUrl === this.url && ts === this.ts) { 145 187 return; 146 188 } 147 189 148 - console.log(`[loadwabac] Loading URL: ${finalUrl}`); 190 + console.log(`[loadwabac] Loading: ${finalUrl}`); 149 191 150 192 // Build iframe URL: /w/liveproxy/mp_/https://example.com 151 193 const iframeUrl = ts 152 194 ? `/w/${this.collName}/${ts}mp_/${finalUrl}` 153 195 : `/w/${this.collName}/mp_/${finalUrl}`; 154 196 155 - console.log(`[loadwabac] Setting iframe src to: ${iframeUrl}`); 156 - 157 197 const iframe = document.querySelector('#content'); 158 198 if (iframe) { 159 199 iframe.src = iframeUrl; ··· 161 201 162 202 this.url = finalUrl; 163 203 this.ts = ts; 164 - 165 - // Update hash if it was empty 166 - if (!url && finalUrl) { 167 - window.location.hash = ts ? `#${ts}/${finalUrl}` : `#${finalUrl}`; 168 - } 169 204 } 170 205 171 206 onIframeLoad(iframeUrl) { 172 207 const m = iframeUrl.match(this.matchRx); 173 208 if (!m) { 174 - console.log('[loadwabac] Iframe URL does not match pattern:', iframeUrl); 175 209 return; 176 210 } 177 211 178 212 this.ts = m[1] || ''; 179 213 this.url = m[2] || ''; 180 - 181 - console.log('[loadwabac] Iframe navigated to:', this.url); 182 214 183 215 // Update hash to match iframe navigation 184 216 const newHash = this.ts ? `#${this.ts}/${this.url}` : `#${this.url}`;
-4
test-results/.last-run.json
··· 1 - { 2 - "status": "passed", 3 - "failedTests": [] 4 - }
test-results/.playwright-artifacts-1/42bd34798ad454c5903650393115c1d7.png

This is a binary file and will not be displayed.

test-results/.playwright-artifacts-1/9ff48b845a725a99b6e80a18e07b8c41.png

This is a binary file and will not be displayed.

test-results/extension-create-Extension-3d172-notation-via-text-selection-chrome-extension/test-failed-1.png

This is a binary file and will not be displayed.

test-results/extension-create-Extension-3d172-notation-via-text-selection-chrome-extension/test-failed-2.png

This is a binary file and will not be displayed.

test-results/extension-create-Extension-3d172-notation-via-text-selection-chrome-extension/test-failed-3.png

This is a binary file and will not be displayed.

+11 -7
tests/e2e/extension/create.spec.ts
··· 5 5 * 6 6 * Prerequisites: 7 7 * 1. Build the extension: pnpm build 8 - * 2. Configure test account in environment: 8 + * 2. Configure test account in tests/.env.test: 9 9 * - TEST_HANDLE: AT Protocol handle (e.g., seams-test.your-pds.com) 10 + * - TEST_PASSWORD: Password for the test account 11 + * - RUN_EXTENSION_TESTS=1 10 12 * 3. Start the backend server: pnpm dev:server 13 + * 4. Run with: pnpm test:e2e:extension 11 14 */ 12 15 13 16 import { test, expect } from '@playwright/test'; ··· 18 21 loginWithTestAccount, 19 22 } from '../../helpers/extension'; 20 23 21 - const TEST_HANDLE = process.env.TEST_HANDLE || 'seams-test.pds.seams.so'; 24 + const TEST_HANDLE = process.env.TEST_HANDLE; 25 + const TEST_PASSWORD = process.env.TEST_PASSWORD; 22 26 23 27 test.describe('Extension Create Annotation', () => { 24 28 test.skip( 25 29 !process.env.RUN_EXTENSION_TESTS, 26 - 'Set RUN_EXTENSION_TESTS=1 to run extension tests' 30 + 'Set RUN_EXTENSION_TESTS=1 in tests/.env.test' 27 31 ); 28 32 29 33 test.skip( 30 - !process.env.TEST_HANDLE, 31 - 'Set TEST_HANDLE to run annotation creation tests' 34 + !TEST_HANDLE || !TEST_PASSWORD, 35 + 'Set TEST_HANDLE and TEST_PASSWORD in tests/.env.test' 32 36 ); 33 37 34 38 test('creates annotation via text selection', async () => { ··· 43 47 const sidebarPage = await openSidePanel(context, page); 44 48 45 49 // Login with test account 46 - await loginWithTestAccount(sidebarPage, TEST_HANDLE); 50 + await loginWithTestAccount(context, sidebarPage, TEST_HANDLE); 47 51 48 52 // Select text on the page 49 53 const selectedText = await selectText(page, 'p', 0, 20); ··· 125 129 await page.goto('https://example.com/'); 126 130 127 131 const sidebarPage = await openSidePanel(context, page); 128 - await loginWithTestAccount(sidebarPage, TEST_HANDLE); 132 + await loginWithTestAccount(context, sidebarPage, TEST_HANDLE); 129 133 130 134 // Select text 131 135 await selectText(page, 'p', 0, 15);
+17 -2
tests/helpers/extension.ts
··· 5 5 import { chromium, type BrowserContext, type Page } from '@playwright/test'; 6 6 import path from 'path'; 7 7 import { copyFileSync, mkdirSync, existsSync } from 'fs'; 8 + import { handleExtensionOAuthPopup } from './oauth-automation'; 8 9 9 10 const EXTENSION_PATH = path.resolve(__dirname, '../../.output/chrome-mv3'); 10 11 const GOLDEN_DB_PATH = path.resolve(__dirname, '../fixtures/golden-db/annotations.db'); ··· 179 180 * Login to Seams with a test account 180 181 */ 181 182 export async function loginWithTestAccount( 183 + context: BrowserContext, 182 184 sidebarPage: Page, 183 185 handle: string 184 186 ): Promise<void> { 187 + const password = process.env.TEST_PASSWORD; 188 + if (!password) { 189 + throw new Error('TEST_PASSWORD not set in tests/.env.test'); 190 + } 191 + 192 + // Set up popup handler BEFORE triggering login 193 + const popupPromise = handleExtensionOAuthPopup(context, { 194 + identifier: handle, 195 + password, 196 + }); 197 + 185 198 // Click login trigger if not already showing login form 186 199 const loginTrigger = sidebarPage.locator('#login-trigger-btn'); 187 200 if (await loginTrigger.isVisible()) { ··· 195 208 // Click login button 196 209 await sidebarPage.locator('#login-btn').click(); 197 210 198 - // Wait for OAuth flow to complete (this will depend on the test account setup) 199 - // For now, we just wait for the profile avatar to appear 211 + // Wait for OAuth to complete 212 + await popupPromise; 213 + 214 + // Verify login succeeded 200 215 await sidebarPage.waitForSelector('#profile-avatar', { timeout: 30000 }); 201 216 }
+81
tests/helpers/oauth-automation.ts
··· 1 + /** 2 + * OAuth automation helpers for E2E testing 3 + * 4 + * Automates PDS login flow for extension tests. 5 + * Works with @atproto/oauth-provider authorization pages. 6 + */ 7 + 8 + import type { Page, BrowserContext } from '@playwright/test'; 9 + 10 + /** 11 + * Complete PDS OAuth login form 12 + * Handles the @atproto/oauth-provider authorization page 13 + * 14 + * Flow: 15 + * 1. Click "Sign in" button on initial PDS page 16 + * 2. Fill identifier and password 17 + * 3. Click "Authorize" button on consent screen 18 + */ 19 + export async function completePDSLogin( 20 + page: Page, 21 + credentials: { identifier: string; password: string } 22 + ): Promise<void> { 23 + // Wait for PDS authorize page to load (React app hydration) 24 + await page.waitForLoadState('networkidle'); 25 + 26 + // Step 1: Click "Sign in" button to show login form 27 + const signInBtn = page.locator('button:has-text("Sign in")').first(); 28 + await signInBtn.waitFor({ state: 'visible', timeout: 10000 }); 29 + await signInBtn.click(); 30 + 31 + // Wait for login form to appear 32 + await page.waitForLoadState('networkidle'); 33 + 34 + // Step 2: Fill in credentials 35 + // Try common selectors for identifier/handle input 36 + const identifierInput = page.locator( 37 + 'input[name="identifier"], input[name="handle"], input[type="text"], input[autocomplete="username"]' 38 + ).first(); 39 + await identifierInput.waitFor({ state: 'visible', timeout: 10000 }); 40 + await identifierInput.fill(credentials.identifier); 41 + 42 + // Fill password 43 + const passwordInput = page.locator( 44 + 'input[name="password"], input[type="password"]' 45 + ).first(); 46 + await passwordInput.waitFor({ state: 'visible', timeout: 5000 }); 47 + await passwordInput.fill(credentials.password); 48 + 49 + // Click submit/sign-in button (the form submit, not the initial sign in) 50 + const submitBtn = page.locator( 51 + 'button[type="submit"], form button:has-text("Sign in"), form button:has-text("Log in"), form button:has-text("Next"), form button:has-text("Continue")' 52 + ).first(); 53 + await submitBtn.click(); 54 + 55 + // Wait for consent/authorize screen 56 + await page.waitForLoadState('networkidle'); 57 + 58 + // Step 3: Click "Authorize" button on consent screen 59 + const authorizeBtn = page.locator( 60 + 'button:has-text("Authorize"), button:has-text("Allow"), button:has-text("Approve"), button:has-text("Accept")' 61 + ).first(); 62 + 63 + await authorizeBtn.waitFor({ state: 'visible', timeout: 10000 }); 64 + await authorizeBtn.click(); 65 + 66 + // Wait for redirect back to seams callback 67 + await page.waitForURL(/seams\.so\/oauth\/callback/, { timeout: 30000 }); 68 + } 69 + 70 + /** 71 + * Wait for OAuth popup and automate login 72 + */ 73 + export async function handleExtensionOAuthPopup( 74 + context: BrowserContext, 75 + credentials: { identifier: string; password: string } 76 + ): Promise<void> { 77 + // browser.identity.launchWebAuthFlow creates a popup 78 + const popup = await context.waitForEvent('page'); 79 + await completePDSLogin(popup, credentials); 80 + // Popup closes automatically after redirect is captured 81 + }
+25 -20
tests/playwright.config.ts
··· 79 79 ], 80 80 81 81 // Servers for integration tests 82 + // Only start proxy servers when running proxy tests 82 83 webServer: [ 83 - // Backend server (Go) 84 + // Backend server (Go) - needed for both extension and proxy tests 84 85 { 85 86 command: 'go run ./cmd/server', 86 87 cwd: SERVER_DIR, ··· 88 89 reuseExistingServer: !process.env.CI, 89 90 timeout: 30000, 90 91 }, 91 - // Proxy static server (for proxy tests) 92 - { 93 - command: 'npx serve -p 8081 dist', 94 - cwd: PROXY_DIR, 95 - url: 'http://127.0.0.1:8081', 96 - reuseExistingServer: !process.env.CI, 97 - timeout: 15000, 98 - }, 99 - // CORS proxy (for proxy tests) 100 - { 101 - command: 'npx tsx cors-proxy/index.ts', 102 - cwd: PROXY_DIR, 103 - url: 'http://127.0.0.1:8082', 104 - reuseExistingServer: !process.env.CI, 105 - timeout: 15000, 106 - env: { 107 - PORT: '8082', 108 - }, 109 - }, 92 + // Proxy static server (for proxy tests only) 93 + ...(process.env.RUN_PROXY_TESTS 94 + ? [ 95 + { 96 + command: 'npx serve -p 8081 dist', 97 + cwd: PROXY_DIR, 98 + url: 'http://127.0.0.1:8081', 99 + reuseExistingServer: !process.env.CI, 100 + timeout: 15000, 101 + }, 102 + // CORS proxy (for proxy tests) 103 + { 104 + command: 'npx tsx cors-proxy/index.ts', 105 + cwd: PROXY_DIR, 106 + url: 'http://127.0.0.1:8082', 107 + reuseExistingServer: !process.env.CI, 108 + timeout: 15000, 109 + env: { 110 + PORT: '8082', 111 + }, 112 + }, 113 + ] 114 + : []), 110 115 ], 111 116 });
+2 -35
vite.sure-client-inject.config.ts
··· 1 1 import { defineConfig } from 'vite'; 2 2 import path from 'path'; 3 - 4 - // Development server configuration (must match vite.sure-client.config.ts) 5 - const DEV_HOST = '127.0.0.1'; 6 - const DEV_PORT = 8081; 7 - 8 - // OAuth configuration 9 - const OAUTH_SCOPE = 'atproto transition:generic'; 10 - const DEV_REDIRECT_URI = `http://${DEV_HOST}:${DEV_PORT}/oauth-callback.html`; 11 - 12 - // Build the loopback client ID for development (AT Protocol OAuth spec) 13 - // Format: http://localhost?redirect_uri=<encoded_uri>&scope=<encoded_scope> 14 - // This special format tells the auth server to allow local development without fetching metadata 15 - const DEV_LOOPBACK_CLIENT_ID = 16 - `http://localhost?redirect_uri=${encodeURIComponent(DEV_REDIRECT_URI)}&scope=${encodeURIComponent(OAUTH_SCOPE)}`; 17 - 18 - // For production, use environment variables or the actual client metadata URL 19 - const isProd = process.env.NODE_ENV === 'production'; 3 + import { getEnvDefines } from './vite.sure-client.shared'; 20 4 21 5 // Vite config for the injected seams-client.js script 22 6 // Built as IIFE (self-contained, no ES module imports) for wabac.js injection ··· 45 29 '@': path.resolve(__dirname, './'), 46 30 }, 47 31 }, 48 - define: { 49 - // Use loopback client ID format for development, real URL for production 50 - 'import.meta.env.VITE_OAUTH_CLIENT_ID': JSON.stringify( 51 - process.env.VITE_OAUTH_CLIENT_ID || (isProd ? 'https://sure.seams.so/client-metadata.json' : DEV_LOOPBACK_CLIENT_ID) 52 - ), 53 - 'import.meta.env.VITE_OAUTH_REDIRECT_URI': JSON.stringify( 54 - process.env.VITE_OAUTH_REDIRECT_URI || (isProd ? 'https://sure.seams.so/oauth-callback.html' : DEV_REDIRECT_URI) 55 - ), 56 - 'import.meta.env.VITE_OAUTH_SCOPE': JSON.stringify( 57 - process.env.VITE_OAUTH_SCOPE || OAUTH_SCOPE 58 - ), 59 - 'import.meta.env.VITE_BACKEND_URL': JSON.stringify( 60 - process.env.VITE_BACKEND_URL || 'https://seams.so' 61 - ), 62 - 'import.meta.env.BACKEND_URL': JSON.stringify( 63 - process.env.BACKEND_URL || 'https://seams.so' 64 - ), 65 - }, 32 + define: getEnvDefines(), 66 33 });
+2 -37
vite.sure-client.config.ts
··· 1 1 import { defineConfig } from 'vite'; 2 2 import path from 'path'; 3 - 4 - // Development server configuration 5 - const DEV_HOST = '127.0.0.1'; 6 - const DEV_PORT = 8081; 7 - 8 - // OAuth configuration 9 - const OAUTH_SCOPE = 'atproto transition:generic'; 10 - const DEV_REDIRECT_URI = `http://${DEV_HOST}:${DEV_PORT}/oauth-callback.html`; 11 - 12 - // Build the loopback client ID for development (AT Protocol OAuth spec) 13 - // Format: http://localhost?redirect_uri=<encoded_uri>&scope=<encoded_scope> 14 - // This special format tells the auth server to allow local development without fetching metadata 15 - const DEV_LOOPBACK_CLIENT_ID = 16 - `http://localhost?redirect_uri=${encodeURIComponent(DEV_REDIRECT_URI)}&scope=${encodeURIComponent(OAUTH_SCOPE)}`; 17 - 18 - // For production, use environment variables or the actual client metadata URL 19 - const isProd = process.env.NODE_ENV === 'production'; 20 - 21 - const envDefines = { 22 - // Use loopback client ID format for development, real URL for production 23 - 'import.meta.env.VITE_OAUTH_CLIENT_ID': JSON.stringify( 24 - process.env.VITE_OAUTH_CLIENT_ID || (isProd ? 'https://sure.seams.so/client-metadata.json' : DEV_LOOPBACK_CLIENT_ID) 25 - ), 26 - 'import.meta.env.VITE_OAUTH_REDIRECT_URI': JSON.stringify( 27 - process.env.VITE_OAUTH_REDIRECT_URI || (isProd ? 'https://sure.seams.so/oauth-callback.html' : DEV_REDIRECT_URI) 28 - ), 29 - 'import.meta.env.VITE_OAUTH_SCOPE': JSON.stringify( 30 - process.env.VITE_OAUTH_SCOPE || OAUTH_SCOPE 31 - ), 32 - 'import.meta.env.VITE_BACKEND_URL': JSON.stringify( 33 - process.env.VITE_BACKEND_URL || 'https://seams.so' 34 - ), 35 - 'import.meta.env.BACKEND_URL': JSON.stringify( 36 - process.env.BACKEND_URL || 'https://seams.so' 37 - ), 38 - }; 3 + import { getEnvDefines } from './vite.sure-client.shared'; 39 4 40 5 // Vite config for sure-client-proxy 41 6 // Builds the shell (with embedded sidebar) and oauth HTML pages (ES modules) ··· 68 33 '@': path.resolve(__dirname, './'), 69 34 }, 70 35 }, 71 - define: envDefines, 36 + define: getEnvDefines(), 72 37 });
+55
vite.sure-client.shared.ts
··· 1 + // Shared configuration for sure-client vite builds 2 + // Used by both vite.sure-client.config.ts and vite.sure-client-inject.config.ts 3 + 4 + // Development server configuration 5 + export const DEV_HOST = '127.0.0.1'; 6 + export const DEV_PORT = 8081; 7 + export const DEV_PROXY_PORT = 8082; 8 + 9 + // OAuth configuration 10 + // Per AGENTS.md: only request 'atproto' scope, not 'transition:generic' 11 + // We use custom lexicons (community.lexicon.annotation.*) so we don't need Bluesky social features 12 + export const OAUTH_SCOPE = 'atproto'; 13 + export const DEV_REDIRECT_URI = `http://${DEV_HOST}:${DEV_PORT}/oauth-callback.html`; 14 + 15 + // Build the loopback client ID for development (AT Protocol OAuth spec) 16 + // Format: http://localhost?redirect_uri=<encoded_uri>&scope=<encoded_scope> 17 + // This special format tells the auth server to allow local development without fetching metadata 18 + export const DEV_LOOPBACK_CLIENT_ID = 19 + `http://localhost?redirect_uri=${encodeURIComponent(DEV_REDIRECT_URI)}&scope=${encodeURIComponent(OAUTH_SCOPE)}`; 20 + 21 + // For production, use environment variables or the actual client metadata URL 22 + export const isProd = process.env.NODE_ENV === 'production'; 23 + 24 + // CORS proxy URL configuration 25 + export const DEV_CORS_PROXY_URL = `http://${DEV_HOST}:${DEV_PROXY_PORT}/proxy/`; 26 + export const PROD_CORS_PROXY_URL = 'https://sure.seams.so/proxy/'; 27 + 28 + // Standard env defines for OAuth configuration 29 + export function getEnvDefines() { 30 + return { 31 + 'import.meta.env.VITE_OAUTH_CLIENT_ID': JSON.stringify( 32 + process.env.VITE_OAUTH_CLIENT_ID || (isProd ? 'https://sure.seams.so/client-metadata.json' : DEV_LOOPBACK_CLIENT_ID) 33 + ), 34 + 'import.meta.env.VITE_OAUTH_REDIRECT_URI': JSON.stringify( 35 + process.env.VITE_OAUTH_REDIRECT_URI || (isProd ? 'https://sure.seams.so/oauth-callback.html' : DEV_REDIRECT_URI) 36 + ), 37 + 'import.meta.env.VITE_OAUTH_SCOPE': JSON.stringify( 38 + process.env.VITE_OAUTH_SCOPE || OAUTH_SCOPE 39 + ), 40 + 'import.meta.env.VITE_BACKEND_URL': JSON.stringify( 41 + process.env.VITE_BACKEND_URL || 'https://seams.so' 42 + ), 43 + 'import.meta.env.BACKEND_URL': JSON.stringify( 44 + process.env.BACKEND_URL || 'https://seams.so' 45 + ), 46 + // CORS proxy URL for wabac.js live proxy 47 + '__CORS_PROXY_URL__': JSON.stringify( 48 + process.env.VITE_CORS_PROXY_URL || (isProd ? PROD_CORS_PROXY_URL : DEV_CORS_PROXY_URL) 49 + ), 50 + // HMAC secret for proxy authentication (optional) 51 + 'import.meta.env.VITE_CORS_PROXY_HMAC_SECRET': JSON.stringify( 52 + process.env.VITE_CORS_PROXY_HMAC_SECRET || '' 53 + ), 54 + }; 55 + }
+1 -1
vite.via.config.ts
··· 29 29 define: { 30 30 'import.meta.env.VITE_OAUTH_CLIENT_ID': JSON.stringify(process.env.VITE_OAUTH_CLIENT_ID || 'https://seams.so/oauth/client-metadata.json'), 31 31 'import.meta.env.VITE_OAUTH_REDIRECT_URI': JSON.stringify(process.env.VITE_OAUTH_REDIRECT_URI || 'https://sure.seams.so/oauth-callback.html'), 32 - 'import.meta.env.VITE_OAUTH_SCOPE': JSON.stringify(process.env.VITE_OAUTH_SCOPE || 'atproto transition:generic'), 32 + 'import.meta.env.VITE_OAUTH_SCOPE': JSON.stringify(process.env.VITE_OAUTH_SCOPE || 'atproto'), 33 33 'import.meta.env.BACKEND_URL': JSON.stringify(process.env.BACKEND_URL || 'http://localhost:8080'), 34 34 }, 35 35 });