// ==UserScript== // @name Better Perplexity // @namespace https://github.com/thenolle/userscripts // @version 1.0.3 // @description Layout, code blocks, prompts, batch runs, exports and usage tracking for Perplexity. // @author Nolly // @license PolyForm-Strict-1.0.0 // @homepageURL https://github.com/thenolle/userscripts/tree/master/better-perplexity // @supportURL https://github.com/thenolle/userscripts/issues // @updateURL https://raw.githubusercontent.com/thenolle/userscripts/dist/better-perplexity/better-perplexity.meta.js // @downloadURL https://raw.githubusercontent.com/thenolle/userscripts/dist/better-perplexity/better-perplexity.user.js // @icon https://www.google.com/s2/favicons?sz=64&domain=perplexity.ai // @match https://www.perplexity.ai/* // @match https://perplexity.ai/* // @noframes // @connect raw.githubusercontent.com // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_xmlhttpRequest // @grant unsafeWindow // ==/UserScript== (()=>{var ye={banner:"color: #c4b5fd; font-weight: bold; font-size: 13px; line-height: 1.5",success:"color: #86efac; font-weight: bold",info:"color: #93c5fd",warning:"color: #fcd34d; font-weight: bold",error:"color: #fca5a5; font-weight: bold",muted:"color: #a1a1aa"},jt=(e)=>{let t=Math.max(0,Math.floor((42-e.length)/2));return`│${" ".repeat(t)}${e}${" ".repeat(Math.max(0,42-e.length-t))}│`},ae=(e)=>{let t=`[${e}]`,n=new Set,r={banner(o){let i=jt(""),s=[`╭${"─".repeat(42)}╮`,i,jt(e.toUpperCase()),i,jt(`v${o}`),i,`╰${"─".repeat(42)}╯`];console.log(`%c${s.join(` `)}`,ye.banner)},success:(o,...i)=>console.log(`%c${t} ✔ ${o}`,ye.success,...i),info:(o,...i)=>console.info(`%c${t} ℹ ${o}`,ye.info,...i),warning:(o,...i)=>console.warn(`%c${t} ⚠ ${o}`,ye.warning,...i),error:(o,...i)=>console.error(`%c${t} ✖ ${o}`,ye.error,...i),debug:(o,...i)=>console.debug(`%c${t} · ${o}`,ye.muted,...i),errorOnce(o,i){let s=`${o}:${i instanceof Error?i.message:String(i)}`;if(n.has(s))return;n.add(s),r.error(o,i)}};return r};var gs=ae("core"),Kt=(e)=>{try{return document.evaluate(e,document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue}catch(t){return gs.errorOnce(`Invalid XPath: ${e}`,t),null}};var a=(e,t,n)=>{let r=document.createElement(e);if(t)r.className=t;if(n!==void 0)r.textContent=n;return r};var J=(e)=>{if(e instanceof Element)return e;return e instanceof Node?e.parentElement:null},tt=(e="data-us-root")=>({attribute:e,mark(t){return t.setAttribute(e,""),t},isOwn(t){let n=t instanceof Element?t:t?.parentElement;return Boolean(n?.closest(`[${e}]`))}});class zt{listeners=new Map;on(e,t){let n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),()=>n.delete(t)}emit(e,t,n){for(let r of this.listeners.get(e)??[])try{r(t)}catch(o){n?.(o)}}}class qt{teardowns=[];add(e){return this.teardowns.push(e),e}listen(e,t,n,r){return e.addEventListener(t,n,r),this.add(()=>e.removeEventListener(t,n,r))}interval(e,t){let n=window.setInterval(e,t);return this.add(()=>window.clearInterval(n))}timeout(e,t){let n=window.setTimeout(e,t);return this.add(()=>window.clearTimeout(n))}dispose(){let e=this.teardowns.reverse();this.teardowns=[];for(let t of e)try{t()}catch{continue}}}class T{context;defaultEnabled=!0;scope=new qt;active=!1;constructor(e){this.context=e}get enabled(){return this.context.storage.get(`module:${this.id}`,this.defaultEnabled)}set enabled(e){this.context.storage.set(`module:${this.id}`,e)}onEnable(){}onDisable(){}menuEntries(){return[]}commands(){return[]}toggle(){this.enabled=!this.enabled,this.context.logger.info(`${this.name} ${this.enabled?"enabled":"disabled"}.`),this.context.refreshMenu(),this.context.requestUpdate()}sync(){let e=this.enabled;if(e&&!this.active)this.active=!0,this.onEnable();else if(!e&&this.active)this.active=!1,this.scope.dispose(),this.onDisable()}}var bs=(e,{method:t="GET",headers:n,body:r,timeout:o=15000}={})=>{if(typeof GM_xmlhttpRequest!=="function")return fetch(e,{method:t,headers:n,body:r,cache:"no-store"}).then((i)=>{if(!i.ok)throw Error(`HTTP ${i.status}`);return i.text()});return new Promise((i,s)=>GM_xmlhttpRequest({method:t,url:e,timeout:o,...n?{headers:n}:{},...r!==void 0?{data:r}:{},onload:(p)=>p.status>=200&&p.status<300?i(p.responseText):s(Error(`HTTP ${p.status}`)),onerror:()=>s(Error("Network error")),ontimeout:()=>s(Error("Request timed out"))}))},nt=(e,t)=>bs(e,t===void 0?{}:{timeout:t});var ys=typeof GM_registerMenuCommand==="function"&&typeof GM_unregisterMenuCommand==="function";class Gt{ids=[];sync(e){if(!ys)return;for(let t of this.ids)GM_unregisterMenuCommand(t);this.ids=e.map(({label:t,action:n})=>GM_registerMenuCommand(t,n))}}var Wt=ae("core"),Vt=()=>{if(typeof unsafeWindow<"u"&&unsafeWindow)return unsafeWindow;return window.wrappedJSObject??null},Sr=(e,t)=>{if(!e)return null;if(typeof e.get==="function")return e.get(t);if(Array.isArray(e)){let n=e.find((r)=>Array.isArray(r)&&String(r[0]).toLowerCase()===t);return n?String(n[1]):null}if(typeof e==="object"){for(let[n,r]of Object.entries(e))if(n.toLowerCase()===t)return typeof r==="string"?r:null}return null},vs=(e,t)=>{let n=e,r=t,o=typeof n==="string"?n:n?.url??n?.href??"",i=(r?.method??(typeof n==="object"?n?.method:void 0)??"GET").toUpperCase();return{url:o,method:i,header:(s)=>Sr(r?.headers,s.toLowerCase())??Sr(typeof n==="object"?n?.headers:null,s.toLowerCase())}};class Yt{extract;listeners=new Set;installed=!1;constructor(e){this.extract=e}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}install(){if(this.installed)return;let e=Vt();if(!e||!e.fetch){Wt.warning("Page fetch is not reachable; request spying is disabled.");return}let t=e.fetch,n=(i)=>{for(let s of this.listeners)try{s(i)}catch(p){Wt.errorOnce("Fetch spy listener failed.",p)}},o=Object.assign((...i)=>{try{n(this.extract(vs(i[0],i[1])))}catch(s){Wt.errorOnce("Fetch spy failed.",s)}return t.apply(e,i)},t);e.fetch=typeof exportFunction==="function"?exportFunction(o,e):o,this.installed=!0}}var Er=({owner:e,repo:t,branch:n,slug:r})=>{let o=`https://raw.githubusercontent.com/${e}/${t}`,i=`https://github.com/${e}/${t}`;return{home:`${i}/tree/${n}/${r}`,namespace:i,issues:`${i}/issues`,releases:`${i}/releases`,sponsor:`https://github.com/sponsors/${e}`,meta:`${o}/dist/${r}/${r}.meta.js`,install:`${o}/dist/${r}/${r}.user.js`,rawFile:(s)=>`${o}/${n}/${r}/${s}`}};var rt=typeof GM_getValue==="function"&&typeof GM_setValue==="function";class kr{options;listeners=new Map;constructor(e){this.options=e}get(e,t){if(rt)return GM_getValue(this.gmKey(e),t);try{let n=localStorage.getItem(this.localKey(e));return n===null?t:JSON.parse(n)}catch{return t}}set(e,t){if(rt)GM_setValue(this.gmKey(e),t);else try{localStorage.setItem(this.localKey(e),JSON.stringify(t))}catch{return}for(let n of this.listeners.get(e)??[])n(t)}remove(e){if(rt&&typeof GM_deleteValue==="function")GM_deleteValue(this.gmKey(e));else if(!rt)localStorage.removeItem(this.localKey(e))}subscribe(e,t){let n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),()=>n.delete(t)}bucket(e,t){return{get:()=>this.get(e,t),set:(n)=>this.set(e,n),update:(n)=>this.set(e,n(this.get(e,t))),reset:()=>this.set(e,t),subscribe:(n)=>this.subscribe(e,n)}}gmKey(e){return`${this.options.gmPrefix??""}${e}`}localKey(e){return`${this.options.namespace}:${e}`}}var ot=(e)=>new kr(e);var xs={childList:!0,subtree:!0},ws=(e)=>e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");class Jt{options;logger;storage;events=new zt;features=[];menu=new Gt;ui;observer=new MutationObserver((e)=>this.handleMutations(e));scheduled=!1;initialized=!1;timer=null;href="";constructor(e){this.options=e;this.logger=ae(e.name),this.storage=ot({namespace:e.id,...e.storage}),this.ui=e.ui??tt()}requestUpdate=()=>{if(this.scheduled||!this.initialized)return;this.scheduled=!0,requestAnimationFrame(()=>{this.scheduled=!1,this.update()})};openSettings=()=>this.options.openSettings?.(this);refreshMenu=()=>this.menu.sync(this.collectMenuEntries());getFeatures=()=>this.features;getCommands=()=>this.features.flatMap((e)=>{let t=e.name,n={id:`${e.id}:toggle`,group:t,title:`${e.enabled?"Disable":"Enable"} ${e.name}`,run:()=>e.toggle()};if(!e.enabled)return[n];let r=e.menuEntries().map((i)=>({id:`${e.id}:${i.id??ws(i.label)}`,group:t,title:i.label,run:i.action})),o=e.commands().map((i)=>({...i,id:`${e.id}:${i.id}`,group:t}));return[n,...r,...o]});runCommand=(e)=>{let t=this.getCommands().find((n)=>n.id===e);if(!t)return!1;return t.run(),!0};register(e){return this.features.push(e(this)),this}start(){if(this.options.clearConsole)console.clear();if(!document.body){this.logger.warning("Document body not available. Waiting for DOM..."),document.addEventListener("DOMContentLoaded",()=>this.start(),{once:!0});return}this.logger.banner(this.options.version),this.logger.info("Starting userscript..."),this.observer.observe(document.body,this.options.observe??xs),window.addEventListener("popstate",this.requestUpdate),window.setInterval(this.requestUpdate,this.options.safetyInterval??2000),this.initialize()}collectMenuEntries(){return this.features.flatMap((e)=>[{label:`${e.enabled?"Disable":"Enable"} ${e.name}`,action:()=>e.toggle()},...e.menuEntries()])}isReady(){return(this.options.isReady??(()=>Boolean(document.body)))()}initialize(){if(this.initialized||this.timer!==null||!this.isReady())return;this.logger.info("Interface detected. Waiting for UI stabilization..."),this.timer=window.setTimeout(()=>{if(this.timer=null,this.initialized||!this.isReady())return;this.initialized=!0,this.href=location.href,this.update(),this.refreshMenu(),this.logger.success("Initialized successfully.");for(let e of this.features)this.logger.info(`${e.name}: ${e.enabled?"enabled":"disabled"}`);this.events.emit("ready",void 0,(e)=>this.logger.errorOnce("ready listener failed.",e))},this.options.initializationDelay??500)}update(){if(location.href!==this.href)this.href=location.href,this.events.emit("navigate",this.href,(e)=>this.logger.errorOnce("navigate listener failed.",e));for(let e of this.features)try{e.sync(),e.run()}catch(t){this.logger.errorOnce(`${e.name} failed.`,t)}}handleMutations(e){if(e.every(({target:t})=>this.ui.isOwn(t)))return;if(this.initialized)this.requestUpdate();else this.initialize()}}var M=(e,t)=>{let n=document.getElementById(e),r=n??a("style");if(r.id=e,r.textContent=t,!n)document.head.appendChild(r)};var Tr=()=>new DOMException("Aborted","AbortError"),it=(e)=>e instanceof DOMException&&e.name==="AbortError",ee=(e,t)=>new Promise((n,r)=>{if(t?.aborted){r(Tr());return}let o=()=>{window.clearTimeout(i),r(Tr())},i=window.setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})}),le=async(e,{timeout:t=1e4,interval:n=100,signal:r}={})=>{let o=Date.now()+t;for(;;){let i=e();if(i)return i;if(Date.now()>=o)return null;await ee(n,r)}};var U={initializationDelay:500,safetyInterval:2000,usage:{refreshInterval:60000,focusInterval:15000,focusSpan:600000,pollTick:5000,visibleStaleAfter:1e4,refreshDelays:[1000,3000,8000,20000,45000],sendUpdateDelays:[0,250,1000,3000],tickInterval:1000,retryCooldown:15000}},Cr={childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:["class","aria-label","aria-expanded","aria-selected","aria-hidden","data-state","hidden"]};var y=(e,{primary:t=!1,onClick:n}={})=>{let r=a("button",t?"bp-button bp-button-primary":"bp-button",e);if(r.type="button",n)r.addEventListener("click",n);return r},D=({label:e,hint:t,checked:n,onChange:r})=>{let o=a("label","bp-switch"),i=a("span","bp-switch-text");if(i.appendChild(a("span",void 0,e)),t)i.appendChild(a("span","bp-data-label",t));let s=a("input");return s.type="checkbox",s.checked=n,s.addEventListener("change",()=>r(s.checked)),o.append(i,s,a("span","bp-switch-track")),{wrapper:o,input:s}},ve=(e,t)=>{let n=a("section","bp-section"),r=a("h3","bp-section-heading");if(r.appendChild(a("span",void 0,e)),t!==void 0)r.appendChild(a("span",void 0,t));return n.appendChild(r),n},De=(e,t,n="")=>{let r=a("div","bp-data-row");return r.append(a("span","bp-data-label",e),a("span",`bp-data-value ${n}`.trim(),t)),r},pe=({label:e,hint:t,value:n,min:r,max:o,step:i=1,onChange:s})=>{let p=a("label","bp-field"),l=a("span","bp-switch-text");if(l.appendChild(a("span",void 0,e)),t)l.appendChild(a("span","bp-data-label",t));let d=a("input","bp-input");if(d.type="number",d.value=String(n),d.step=String(i),r!==void 0)d.min=String(r);if(o!==void 0)d.max=String(o);return d.addEventListener("change",()=>{let c=Number(d.value);if(!Number.isFinite(c))return;let u=Math.min(o??1/0,Math.max(r??-1/0,c));d.value=String(u),s(u)}),p.append(l,d),{wrapper:p,input:d}},oe=(e,t,n,r)=>{let o=a("label","bp-field");o.appendChild(a("span",void 0,e));let i=a("select","bp-input");for(let s of t){let p=a("option",void 0,s.label);p.value=s.value,i.appendChild(p)}return i.value=n,i.addEventListener("change",()=>r(i.value)),o.appendChild(i),o},te=(e,t,n)=>{let r=a("textarea","bp-input");return r.placeholder=e,r.value=t,r.rows=3,r.addEventListener("input",()=>n(r.value)),r};var Be=tt("data-bp-root"),{attribute:Ec,mark:S,isOwn:O}=Be;var Lr=` .bp-button { display: inline-flex; align-items: center; justify-content: center; min-height: 32px; padding: 0 12px; border: 1px solid var(--bp-border); border-radius: 8px; background: transparent; color: var(--bp-fg); font: inherit; font-size: 12px; font-weight: 500; cursor: pointer; transition: background 120ms ease, opacity 120ms ease; } .bp-button:hover:not(:disabled) { background: var(--bp-accent); } .bp-button:disabled { opacity: .55; cursor: progress; } .bp-button-primary { border-color: var(--bp-fg); background: var(--bp-fg); color: var(--bp-bg); } .bp-button-primary:hover:not(:disabled) { background: var(--bp-fg); opacity: .88; } .bp-dialog button:focus-visible, .bp-dialog summary:focus-visible { outline: 2px solid var(--bp-ring); outline-offset: 2px; } .bp-stack { display: flex; flex-direction: column; gap: 8px; } .bp-section { margin-bottom: 20px; } .bp-section:last-child { margin-bottom: 0; } .bp-section-heading { display: flex; align-items: center; justify-content: space-between; margin: 0 0 10px; color: var(--bp-muted); font-size: 10px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; } .bp-hint { margin: 12px 0 0; color: var(--bp-muted); font-size: 12px; } .bp-switch { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 10px 12px; border: 1px solid var(--bp-border); border-radius: 10px; cursor: pointer; transition: background 120ms ease; } .bp-switch:hover { background: var(--bp-accent); } .bp-switch-text { display: flex; flex-direction: column; min-width: 0; } .bp-switch input { position: absolute; opacity: 0; pointer-events: none; } .bp-switch-track { position: relative; flex-shrink: 0; width: 34px; height: 20px; border-radius: 999px; background: var(--bp-track); transition: background 140ms ease; } .bp-switch-track::after { content: ''; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: var(--bp-bg); box-shadow: 0 1px 3px rgb(0 0 0 / 30%); transition: transform 140ms ease; } .bp-switch input:checked + .bp-switch-track { background: var(--bp-fg); } .bp-switch input:checked + .bp-switch-track::after { transform: translateX(14px); } .bp-switch input:focus-visible + .bp-switch-track { outline: 2px solid var(--bp-ring); outline-offset: 2px; } .bp-data-list { overflow: hidden; border: 1px solid var(--bp-border); border-radius: 10px; } .bp-data-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-height: 34px; padding: 7px 12px; border-bottom: 1px solid var(--bp-border); } .bp-data-row:last-child { border-bottom: 0; } .bp-data-label { color: var(--bp-muted); } .bp-data-value { overflow-wrap: anywhere; font-weight: 500; text-align: right; } .bp-data-value.positive { color: var(--bp-green); } .bp-data-value.negative { color: var(--bp-red); } .bp-empty { padding: 14px; border: 1px dashed var(--bp-border); border-radius: 10px; color: var(--bp-muted); text-align: center; } .bp-error { padding: 11px 12px; border: 1px solid hsl(0 84% 60% / 30%); border-radius: 10px; background: hsl(0 84% 60% / 8%); color: var(--bp-red); } .bp-badge { display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px; background: var(--bp-accent); color: var(--bp-muted); font-size: 10px; font-weight: 600; letter-spacing: .02em; white-space: nowrap; } .bp-badge.healthy { background: hsl(142 71% 45% / 14%); color: var(--bp-green); } .bp-badge.low { background: hsl(38 92% 50% / 16%); color: var(--bp-yellow); } .bp-badge.critical, .bp-badge.empty { background: hsl(0 84% 60% / 14%); color: var(--bp-red); } .bp-progress { height: 5px; overflow: hidden; border-radius: 99px; background: var(--bp-accent); } .bp-progress-fill { width: 0; height: 100%; border-radius: inherit; background: var(--bp-green); transition: width 400ms ease; } .bp-progress-fill.low { background: var(--bp-yellow); } .bp-progress-fill.critical, .bp-progress-fill.empty { background: var(--bp-red); } .bp-progress-fill.timer { background: var(--bp-muted); transition: width 900ms linear; } .bp-field { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 10px 12px; border: 1px solid var(--bp-border); border-radius: 10px; } .bp-input { min-width: 0; padding: 6px 8px; border: 1px solid var(--bp-border); border-radius: 8px; background: var(--bp-bg); color: var(--bp-fg); font: inherit; font-size: 12px; } .bp-input:focus-visible { outline: 2px solid var(--bp-ring); outline-offset: 1px; } input.bp-input[type='number'] { width: 96px; text-align: right; } textarea.bp-input { width: 100%; min-height: 64px; resize: vertical; font-family: ui-monospace, monospace; } .bp-header-btn { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 30px; height: 30px; border: 1px solid var(--bp-border); border-radius: 999px; background: var(--bp-bg); color: var(--bp-fg); cursor: pointer; transition: background 120ms ease; } .bp-header-btn:hover { background: var(--bp-accent); } .bp-header-btn:focus-visible { outline: 2px solid var(--bp-fg); outline-offset: 2px; } `;var Mr=` .bp-dialog { width: min(var(--bp-width, 560px), calc(100vw - 32px)); max-width: none; max-height: min(86vh, 820px); padding: 0; overflow: hidden; border: 1px solid var(--bp-border); border-radius: 14px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 24px 60px -12px rgb(0 0 0 / 35%); font-family: inherit; font-size: 13px; line-height: 1.5; } .bp-dialog[open] { display: flex; flex-direction: column; animation: bp-dialog-in 160ms ease-out; } .bp-dialog::backdrop { background: rgb(0 0 0 / 55%); backdrop-filter: blur(6px); animation: bp-fade-in 160ms ease-out; } .bp-dialog *, .bp-dialog *::before, .bp-dialog *::after { box-sizing: border-box; } @keyframes bp-dialog-in { from { opacity: 0; transform: translateY(8px) scale(.98); } to { opacity: 1; transform: none; } } @keyframes bp-fade-in { from { opacity: 0; } to { opacity: 1; } } @media (prefers-reduced-motion: reduce) { .bp-dialog[open], .bp-dialog::backdrop { animation: none; } } .bp-dialog-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 18px 20px 14px; border-bottom: 1px solid var(--bp-border); } .bp-dialog-title { margin: 0; font-size: 16px; font-weight: 600; letter-spacing: -.02em; } .bp-dialog-description { margin: 3px 0 0; color: var(--bp-muted); font-size: 12px; } .bp-dialog-body { flex: 1; min-height: 0; padding: 16px 20px; overflow-y: auto; overscroll-behavior: contain; } .bp-dialog-footer { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid var(--bp-border); } .bp-dialog-footer:empty { display: none; } .bp-icon-button { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; border: 0; border-radius: 7px; background: transparent; color: var(--bp-muted); font: inherit; font-size: 18px; line-height: 1; cursor: pointer; } .bp-icon-button:hover { background: var(--bp-accent); color: var(--bp-fg); } @media (max-width: 520px) { .bp-dialog-header, .bp-dialog-body, .bp-dialog-footer { padding-right: 14px; padding-left: 14px; } } `;var Ar=` .bp-themed { --bp-bg: hsl(0 0% 100%); --bp-fg: hsl(240 10% 3.9%); --bp-muted: hsl(240 3.8% 46.1%); --bp-border: hsl(240 5.9% 90%); --bp-accent: hsl(240 4.8% 95.9%); --bp-track: hsl(240 5% 78%); --bp-ring: hsl(240 5% 64.9%); --bp-green: hsl(142 71% 40%); --bp-yellow: hsl(38 92% 45%); --bp-red: hsl(0 84% 55%); } @media (prefers-color-scheme: dark) { .bp-themed { --bp-bg: hsl(240 10% 5%); --bp-fg: hsl(0 0% 98%); --bp-muted: hsl(240 5% 64.9%); --bp-border: hsl(240 3.7% 17%); --bp-accent: hsl(240 3.7% 13%); --bp-track: hsl(240 3.7% 28%); --bp-green: hsl(142 71% 45%); --bp-yellow: hsl(38 92% 50%); --bp-red: hsl(0 84% 60%); } } `;var $r=` .bp-tooltip { position: fixed; inset: auto; width: max-content; max-width: min(300px, calc(100vw - 16px)); margin: 0; padding: 0; overflow: visible; border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font: inherit; font-size: 12px; line-height: 1.5; pointer-events: none; } .bp-tooltip:popover-open { animation: bp-tooltip-in 120ms ease-out; } .bp-tooltip *, .bp-tooltip *::before, .bp-tooltip *::after { box-sizing: border-box; } .bp-tooltip-body { padding: 12px 14px; } @keyframes bp-tooltip-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: none; } } @media (prefers-reduced-motion: reduce) { .bp-tooltip:popover-open { animation: none; } } `;var C=()=>{M("better-perplexity-ui-base",[Ar,Mr,Lr,$r].join(` `))};var k=({id:e,title:t,description:n,width:r=560})=>{C();let o=S(a("dialog","bp-dialog bp-themed"));o.id=e,o.style.setProperty("--bp-width",`${r}px`);let i=a("header","bp-dialog-header"),s=a("div");if(s.appendChild(a("h2","bp-dialog-title",t)),n)s.appendChild(a("p","bp-dialog-description",n));let p=a("button","bp-icon-button","×");p.type="button",p.setAttribute("aria-label","Close"),i.append(s,p);let l=a("div","bp-dialog-body"),d=a("footer","bp-dialog-footer");o.append(i,l,d);let c=()=>o.close();return p.addEventListener("click",c),o.addEventListener("click",(m)=>{if(m.target===o)c()}),o.addEventListener("close",()=>o.remove()),{dialog:o,body:l,footer:d,close:c,show:()=>{document.body.appendChild(o),o.showModal()}}};var Rr="better-perplexity-settings-dialog",Pr=(e,t)=>{let n=document.getElementById(Rr);if(n instanceof HTMLDialogElement){n.close();return}let r=k({id:Rr,title:"Better Perplexity",description:"Version 1.0.3",width:480}),o=()=>{let i=e.map((s)=>{let p=ve(s.name),l=a("div","bp-stack"),d=D({label:"Enabled",hint:s.description,checked:s.enabled,onChange:(c)=>{s.enabled=c,t()}});l.appendChild(d.wrapper);for(let c of s.menuEntries())l.appendChild(y(c.label,{onClick:()=>{c.action(),o()}}));return p.appendChild(l),p});r.body.replaceChildren(...i)};o(),r.footer.append(y("Done",{primary:!0,onClick:r.close})),r.show()};class Xt extends Jt{constructor(){super({id:"better-perplexity",name:"Better Perplexity",version:"1.0.3",storage:{gmPrefix:""},ui:Be,observe:Cr,initializationDelay:U.initializationDelay,safetyInterval:U.safetyInterval,clearConsole:!0,isReady:()=>Boolean(document.querySelector("main")?.children.length),openSettings:(e)=>Pr(e.getFeatures(),()=>{e.refreshMenu(),e.requestUpdate()})})}}var xe=new Yt((e)=>({url:e.url,method:e.method,accountId:e.header("x-pplx-account")}));var _r=new WeakSet,Qt=(e)=>_r.has(e),Ne=(e,t)=>{let n=new KeyboardEvent("keydown",{key:"Enter",code:"Enter",keyCode:13,which:13,shiftKey:t,bubbles:!0,cancelable:!0,composed:!0});return _r.add(n),e.dispatchEvent(n)},st=(e)=>{let t=e;for(let n=0;t&&n<8;n++){let r=t.querySelector('button[type="submit"], button[aria-label*="submit" i], button[aria-label*="send" i]');if(r&&!r.disabled)return r;t=t.parentElement}return null};var en=["textarea","input:not([type])",'input[type="text"]','input[type="search"]','input[type="email"]','input[type="url"]','input[type="tel"]','[contenteditable="true"]','[contenteditable="plaintext-only"]','[role="textbox"]'].join(", "),Ir=(e)=>{let t=e.getBoundingClientRect();return t.width>0&&t.height>0&&getComputedStyle(e).visibility!=="hidden"&&getComputedStyle(e).display!=="none"},Or=(e)=>e.replace(/\s+/g," ").trim(),Br=(e)=>e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement,Nr=(e)=>J(e)?.closest(en)??null,A=()=>{let e=document.activeElement;if(e instanceof HTMLElement&&e.matches(en)&&!O(e)&&Ir(e))return e;return[...document.querySelectorAll(en)].filter((n)=>!O(n)&&Ir(n)&&!n.hasAttribute("disabled")&&!n.hasAttribute("readonly")).at(-1)??null},G=(e)=>{if(Br(e))return e.value;return e.innerText??e.textContent??""},Dr=(e)=>!e.isConnected||G(e).trim()==="",tn=(e,t)=>Or(G(e))===Or(t),Fr=(e,t,n)=>{e.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0,inputType:t,data:n}))},Ss=(e,t)=>{let n=new DataTransfer;n.setData("text/plain",t);let r=new ClipboardEvent("paste",{clipboardData:n,bubbles:!0,cancelable:!0,composed:!0});return e.dispatchEvent(r),r.defaultPrevented},Es=(e)=>{let t=e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,"value")?.set;return n?(r)=>n.call(e,r):null},ks=(e,t)=>{e.focus();let n=Es(e);if(n)n(t);else e.value=t;try{e.setSelectionRange(t.length,t.length)}catch{}return Fr(e,t?"insertText":"deleteContent",t||null),e.value===t},Ts=(e)=>{let t=document.createRange();t.selectNodeContents(e);let n=window.getSelection();return n?.removeAllRanges(),n?.addRange(t),t},Cs=(e,t)=>{let n=window.getSelection();if(!n)return!1;let r=Ts(e);if(r.deleteContents(),t){let o=document.createTextNode(t);r.insertNode(o),r.setStartAfter(o)}else r.selectNodeContents(e);return r.collapse(!0),n.removeAllRanges(),n.addRange(r),Fr(e,t?"insertText":"deleteContent",t||null),tn(e,t)},Zt=async(e,t,n=300)=>{let o=Math.ceil(n/30);for(let i=0;i{if(!e.isConnected)return!1;if(e.hasAttribute("disabled")||e.hasAttribute("readonly")||e.getAttribute("aria-disabled")==="true")return!1;if(e.focus(),Br(e))return ks(e,t),Zt(e,t);if(!e.isContentEditable&&e.getAttribute("role")!=="textbox")return!1;if(t){if(Ss(e,t),await Zt(e,t,150))return!0}if(!Cs(e,t))return!1;return Zt(e,t)},we=async(e)=>{if(!e.isConnected)return!1;let t=!Ne(e,!1);if(await ee(t?500:150),Dr(e))return!0;return st(e)?.click(),await ee(500),Dr(e)},Hr=(e,t)=>{let n=new DataTransfer;n.items.add(t);let o=[...document.querySelectorAll('input[type="file"]')].find((s)=>!O(s)&&!s.disabled);if(o)return o.files=n.files,o.dispatchEvent(new Event("change",{bubbles:!0,composed:!0})),o.files?.length===1;let i=new ClipboardEvent("paste",{clipboardData:n,bubbles:!0,cancelable:!0,composed:!0});return e.dispatchEvent(i),i.defaultPrevented},at=(e)=>{let t=[e.getAttribute("aria-label")??"",e.title,e.textContent??""].join(" ").toLowerCase();return e.type==="submit"||/\b(send|submit|ask)\b/.test(t)};var pt=["aria-pressed","aria-checked","aria-selected","aria-current","data-state","data-active","data-selected"],jr=/^(?:switch to |select |use )?(pro search|pro|search|deep research|research|labs?|computer|agentic(?: research)?)(?: mode)?$/i,Ls='button, [role="button"], [role="radio"], [role="tab"], [role="option"], [role="menuitemradio"], [role="switch"]',Ms=['[data-testid*="avatar" i]','img[alt*="avatar" i]','img[alt*="profile" i]','[class*="avatar" i]','button[aria-label*="account" i]','button[aria-label*="profile" i]','button[aria-label*="user" i]'].join(", "),As=/^(sign in|log in|sign up|create account|se connecter|connexion)$/i,$s=80,Ur={first:null,submit:null},lt=null,Kr=(e)=>{let t=e.getBoundingClientRect();return t.width>0&&t.height>0},He=(e)=>(e.getAttribute("aria-label")||e.getAttribute("title")||e.textContent||"").replace(/\s+/g," ").trim(),ct=(e,t=Ls)=>[...e.querySelectorAll(t)].filter((n)=>!O(n)&&Kr(n)),Rs=(e)=>e.type==="submit"||/\b(submit|send|ask|envoyer)\b/i.test(He(e)),Ps=()=>{let e=A();if(!e)return null;let t=e;for(let n=0;n<7;n++){let r=t.parentElement;if(!r||r===document.body||r.tagName==="MAIN")break;if(ct(r).length>40)break;t=r}return t},nn=()=>{let e=Ps()??document.body;return ct(e).flatMap((t)=>{let n=He(t);return n.length<=32&&jr.test(n)?[{element:t,label:n}]:[]})},_s=()=>{let e=A();if(!e)return Ur;let t=e.getBoundingClientRect(),n=t.top+t.height/2,r=e.parentElement;for(let o=0;r&&o<8;o++,r=r.parentElement){let i=[...r.querySelectorAll("button")].filter((l)=>{if(O(l)||!Kr(l)||e.contains(l))return!1;let d=l.getBoundingClientRect();return Math.abs(d.top+d.height/2-n)<=Math.max(160,t.height)});if(i.length<2)continue;let s=i.find(Rs)??i[i.length-1]??null;return{first:i.find((l)=>l!==s&&!jr.test(He(l)))??null,submit:s}}return Ur},Ue=()=>{let e=performance.now();if(lt&&e-lt.at<$s)return lt.value;let t=_s();return lt={at:e,value:t},t},rn=()=>{let t=ct(document,Ms).filter((r)=>{let o=r.getBoundingClientRect();return o.top<120&&o.left>window.innerWidth*0.4&&o.width<=96&&o.height<=96}).sort((r,o)=>o.getBoundingClientRect().left-r.getBoundingClientRect().left)[0];if(!t)return null;let n=t;for(;;){let r=n.parentElement;if(!r)return n;let o=r.getBoundingClientRect();if(o.width>72||o.height>72)return n;n=r}},on=()=>ct(document,'button, a[href], [role="button"]').some((e)=>As.test(He(e))),Fe=(e)=>e?{tag:e.tagName.toLowerCase(),label:He(e).slice(0,40),class:(e.getAttribute("class")??"").slice(0,120),state:Object.fromEntries(pt.flatMap((t)=>e.getAttribute(t)===null?[]:[[t,e.getAttribute(t)]]))}:null,zr=()=>{let e=Ue();return{path:location.pathname,composer:Fe(A()),avatar:Fe(rn()),signInPrompt:on(),composerActions:{first:Fe(e.first),submit:Fe(e.submit)},modeControls:nn().map(({element:t})=>Fe(t))}};var Is={copy:[["rect",{x:"9",y:"9",width:"13",height:"13",rx:"2"}],["path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"}]],check:[["polyline",{points:"20 6 9 17 4 12"}]],download:[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["polyline",{points:"7 10 12 15 17 10"}],["line",{x1:"12",y1:"15",x2:"12",y2:"3"}]],wrap:[["line",{x1:"3",y1:"6",x2:"21",y2:"6"}],["path",{d:"M3 12h15a3 3 0 1 1 0 6h-4"}],["polyline",{points:"16 16 14 18 16 20"}],["line",{x1:"3",y1:"18",x2:"10",y2:"18"}]],lines:[["line",{x1:"10",y1:"6",x2:"21",y2:"6"}],["line",{x1:"10",y1:"12",x2:"21",y2:"12"}],["line",{x1:"10",y1:"18",x2:"21",y2:"18"}],["path",{d:"M4 6h1v4"}],["path",{d:"M4 10h2"}],["path",{d:"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"}]],fold:[["polyline",{points:"7 20 12 15 17 20"}],["polyline",{points:"7 4 12 9 17 4"}]],file:[["path",{d:"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"}],["polyline",{points:"14 2 14 8 20 8"}],["line",{x1:"16",y1:"13",x2:"8",y2:"13"}],["line",{x1:"16",y1:"17",x2:"8",y2:"17"}]],sliders:[["line",{x1:"21",y1:"4",x2:"14",y2:"4"}],["line",{x1:"10",y1:"4",x2:"3",y2:"4"}],["line",{x1:"21",y1:"12",x2:"12",y2:"12"}],["line",{x1:"8",y1:"12",x2:"3",y2:"12"}],["line",{x1:"21",y1:"20",x2:"16",y2:"20"}],["line",{x1:"12",y1:"20",x2:"3",y2:"20"}],["line",{x1:"14",y1:"2",x2:"14",y2:"6"}],["line",{x1:"8",y1:"10",x2:"8",y2:"14"}],["line",{x1:"16",y1:"18",x2:"16",y2:"22"}]],book:[["path",{d:"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20"}]],layers:[["polygon",{points:"12 2 2 7 12 12 22 7 12 2"}],["polyline",{points:"2 17 12 22 22 17"}],["polyline",{points:"2 12 12 17 22 12"}]],help:[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}],["line",{x1:"12",y1:"17",x2:"12.01",y2:"17"}]]};var j=(e,t=16)=>{let n=document.createElementNS("http://www.w3.org/2000/svg","svg"),r={width:String(t),height:String(t),viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"};for(let[o,i]of Object.entries(r))n.setAttribute(o,i);for(let[o,i]of Is[e]){let s=document.createElementNS("http://www.w3.org/2000/svg",o);for(let[p,l]of Object.entries(i))s.setAttribute(p,l);n.appendChild(s)}return n};var je=8,qr=10,Os=0;class K{anchor;renderer;options;element=S(a("div","bp-tooltip bp-themed"));showTimer=0;hideTimer=0;liveTimer=0;visible=!1;constructor(e,t,n={}){this.anchor=e;this.renderer=t;this.options=n;C(),this.element.id=`bp-tooltip-${++Os}`,this.element.setAttribute("role","tooltip"),this.element.popover="manual",e.setAttribute("aria-describedby",this.element.id),e.addEventListener("pointerenter",this.handleEnter),e.addEventListener("pointerleave",this.handleLeave),e.addEventListener("focus",this.handleFocus),e.addEventListener("blur",this.handleLeave),e.addEventListener("keydown",this.handleKeydown),e.addEventListener("click",this.handleLeave)}show(){if(window.clearTimeout(this.hideTimer),!this.anchor.isConnected)return;if(this.renderContent(),!this.element.isConnected)document.body.appendChild(this.element);if(!this.visible)this.element.showPopover(),this.visible=!0,this.liveTimer=window.setInterval(()=>this.refresh(),1000);this.position()}hide(){if(window.clearTimeout(this.showTimer),!this.visible)return;if(this.visible=!1,window.clearInterval(this.liveTimer),this.element.matches(":popover-open"))this.element.hidePopover()}destroy(){this.hide(),this.anchor.removeEventListener("pointerenter",this.handleEnter),this.anchor.removeEventListener("pointerleave",this.handleLeave),this.anchor.removeEventListener("focus",this.handleFocus),this.anchor.removeEventListener("blur",this.handleLeave),this.anchor.removeEventListener("keydown",this.handleKeydown),this.anchor.removeEventListener("click",this.handleLeave),this.element.remove()}refresh(){if(!this.visible)return;if(!this.anchor.isConnected){this.hide();return}this.renderContent(),this.position()}handleEnter=(e)=>{if(e.pointerType==="touch")return;window.clearTimeout(this.hideTimer),window.clearTimeout(this.showTimer),this.showTimer=window.setTimeout(()=>this.show(),this.options.showDelay??120)};handleLeave=()=>{window.clearTimeout(this.showTimer),window.clearTimeout(this.hideTimer),this.hideTimer=window.setTimeout(()=>this.hide(),this.options.hideDelay??80)};handleFocus=()=>{if(this.anchor.matches(":focus-visible"))this.show()};handleKeydown=(e)=>{if(e.key==="Escape")this.hide()};renderContent(){let e=a("div","bp-tooltip-body");this.renderer(e),this.element.replaceChildren(e)}position(){let e=this.anchor.getBoundingClientRect(),t=this.element.getBoundingClientRect(),n=this.options.align==="end"?e.right-t.width:e.left,r=Math.min(Math.max(n,je),Math.max(je,window.innerWidth-t.width-je)),o=e.bottom+qr,i=e.top-qr-t.height,s=o+t.height>window.innerHeight-je&&i>=je?i:o;this.element.style.left=`${Math.round(r)}px`,this.element.style.top=`${Math.round(s)}px`}}var Ds=".bp-config-button";class de{options;element=S(a("button"));tooltip;appliedClass="";constructor(e,t,n,r,o){this.options=o;C(),this.element.type="button",this.element.setAttribute("aria-label",e),this.element.style.cssText="display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;cursor:pointer",this.element.appendChild(j(t)),this.element.addEventListener("click",(i)=>{i.preventDefault(),i.stopPropagation(),r()}),this.tooltip=new K(this.element,(i)=>i.append(a("div","bp-tip-mode",e),a("div","bp-tip-sub",n)))}mount(){let{first:e,submit:t}=Ue(),r=(this.options.after??[]).map((i)=>document.querySelector(`.bp-cb-${i}`)).find(Boolean)??document.querySelector(Ds)??e;if(!r&&!t){this.unmount();return}let o=`${e?.className??""} bp-composer-button bp-cb-${this.options.id}`;if(o!==this.appliedClass)this.element.className=o,this.appliedClass=o;if(r){if(r.nextElementSibling!==this.element)r.insertAdjacentElement("afterend",this.element);return}if(t&&t.previousElementSibling!==this.element)t.insertAdjacentElement("beforebegin",this.element)}unmount(){this.tooltip.hide(),this.element.remove()}}var Gr=/\{\{\s*([^{}]+?)\s*\}\}/g,Bs=/text|body|content|list|items?|description|code|paste|notes|context|article/i,Ns=(e)=>{let t=e.startsWith("ask:")?e.slice(4).trim():e.replace(/[_-]+/g," ");return t.charAt(0).toUpperCase()+t.slice(1)},Ke=(e,t)=>{let n=[];for(let r of e.matchAll(Gr)){let o=r[1]??"";if(!o||t(o)||n.some((i)=>i.key===o))continue;n.push({key:o,label:Ns(o),long:Bs.test(o)})}return n},dt=(e,t)=>e.replace(Gr,(n,r)=>(r in t)?t[r]??"":n);var Wr="better-perplexity-fields-dialog",Se=(e,{title:t,description:n,confirm:r="Continue"})=>new Promise((o)=>{document.getElementById(Wr)?.remove();let i=k({id:Wr,title:t,description:n,width:540}),s=Object.fromEntries(e.map((m)=>[m.key,m.value??""])),p=!1,l=(m)=>{if(p)return;p=!0,o(m)},d=()=>{l({...s}),i.close()},c=a("div","bp-stack"),u=null;for(let m of e){let f=a("label","bp-stack");f.appendChild(a("span","bp-data-label",m.label));let g=m.long?a("textarea","bp-input"):a("input","bp-input");if(g.value=s[m.key]??"",g.placeholder=m.long?"Type or paste here…":"Type here…",g instanceof HTMLTextAreaElement)g.rows=5;g.addEventListener("input",()=>s[m.key]=g.value),g.addEventListener("keydown",(x)=>{let v=x;if(v.key==="Enter"&&(!m.long||v.ctrlKey||v.metaKey))v.preventDefault(),d()}),f.appendChild(g),c.appendChild(f),u??=g}i.body.appendChild(c),i.dialog.addEventListener("close",()=>l(null)),i.footer.append(y("Cancel",{onClick:i.close}),y(r,{primary:!0,onClick:d})),i.show(),u?.focus()});var Fs=/\{\{\s*(item|index|total|date|\d+)\s*\}\}/g,sn=(e)=>e.split(` `).map((t)=>t.trim()).filter(Boolean),ut=(e,t,n,r)=>{let o=t.includes("\t")?t.split("\t"):t.split(",");return e.replace(Fs,(i,s)=>{if(s==="item")return t;if(s==="index")return String(n+1);if(s==="total")return String(r);if(s==="date")return new Date().toLocaleDateString();return(o[Number(s)-1]??"").trim()})};var Vr="better-perplexity-batch-dialog",Yr=200,an=3,Hs=[{label:"Research companies",template:"Give me a short profile of {{item}}: what they do, funding, main competitors.",items:`Stripe Notion Linear`},{label:"Translate sentences",template:'Translate to French and explain any tricky words: "{{item}}"',items:`Good morning, how are you? The meeting was moved to Friday.`},{label:"Summarize pages",template:"Summarize this page in 3 bullet points: {{item}}",items:`https://example.com/a https://example.com/b`}],ln=(e,t,n,r)=>{let o=a("section","bp-stack");o.dataset.tour=r;let i=a("div");i.append(a("div","bp-dialog-title",`${e}. ${t}`),a("div","bp-dialog-description",n));let s=a("div","bp-stack");return o.append(i,s),{root:o,body:s}},Jr=(e)=>{if(document.getElementById(Vr))return;let t=k({id:Vr,title:"Batch Runner",description:"Send the same kind of message many times, one after another, in this conversation.",width:700}),n="",r="",o=2,i=!1,s=y("Start",{primary:!0}),p=a("div","bp-split-summary"),l=a("div","bp-stack"),d=a("div","bp-hint"),c=ln(1,"Write your message","Put {{item}} where each list entry should go. Example: Give me a short profile of {{item}}.","batch-template"),u=te("Give me a short profile of {{item}}.","",(h)=>{n=h,v()});u.rows=3;let m=a("div","bp-actions");m.style.cssText="display:flex;flex-wrap:wrap;gap:6px;align-items:center",m.appendChild(a("span","bp-data-label","Not sure? Try an example:"));for(let h of Hs)m.appendChild(y(h.label,{onClick:()=>{n=h.template,r=h.items,u.value=n,g.value=r,v()}}));c.body.append(u,m);let f=ln(2,"Paste your list","One entry per line. Each line becomes one message. For several columns, separate them with commas and use {{1}}, {{2}}…","batch-items"),g=te(`Stripe Notion Linear`,"",(h)=>{r=h,v()});g.rows=6,f.body.append(g,p);let x=ln(3,"Review and run","Check the first messages below. The runner sends them one by one and waits for each answer before sending the next.","batch-review");x.body.append(l,pe({label:"Pause between messages",hint:"Seconds. A short pause is kinder to your limits.",value:o,min:0,max:300,onChange:(h)=>o=h}).wrapper,d,D({label:"I understand every message uses one query",checked:!1,onChange:(h)=>{i=h,v()}}).wrapper);let v=()=>{let h=sn(r),w=h.length>Yr,I=/\{\{\s*(item|\d+)\s*\}\}/.test(n);if(p.textContent=h.length?`${h.length} ${h.length===1?"entry":"entries"} found.`:"No entries yet.",l.replaceChildren(...h.slice(0,an).map((N,F)=>{let Oe=a("div","bp-split-part");return Oe.style.cssText="padding:10px 12px;white-space:pre-wrap;font-size:12px",Oe.textContent=`${F+1}. ${ut(n,N,F,h.length)}`,Oe})),h.length>an)l.appendChild(a("div","bp-data-label",`…and ${h.length-an} more.`));d.textContent=w?`Too many entries (${h.length}). The maximum is ${Yr}.`:!n.trim()?"Write your message in step 1.":!I?"Tip: add {{item}} to your message so each entry is included. Without it, every message is identical.":`This will send ${h.length} messages and use ${h.length} queries. Other {{blanks}} in your message are asked once before starting.`,s.disabled=!h.length||w||!n.trim()||!i};s.addEventListener("click",()=>{let h=sn(r);t.close(),e({template:n,items:h,delay:o})});let L=a("div","bp-stack");L.style.gap="20px",L.append(c.root,f.root,x.root),t.body.appendChild(L),t.footer.append(y("Cancel",{onClick:t.close}),s),v(),t.show()};var Xr="better-perplexity-batch-styles",Us={sending:"sending",waiting:"waiting for the answer",paused:"paused",resting:"resting"};class pn{element=S(a("div","bp-batch-panel bp-themed"));label=a("div");fill=a("div","bp-progress-fill");actions=a("div","bp-batch-actions");constructor(){if(C(),!document.getElementById(Xr)){let t=a("style");t.id=Xr,t.textContent=` .bp-batch-panel { position: fixed; right: 20px; bottom: 20px; z-index: 100000; display: flex; flex-direction: column; gap: 8px; width: 300px; padding: 12px 14px; border: 1px solid var(--bp-border); border-radius: 12px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 12px 32px rgb(0 0 0 / 22%); font-size: 12px; } .bp-batch-actions { display: flex; gap: 6px; flex-wrap: wrap; } `,document.head.appendChild(t)}let e=a("div","bp-progress");e.appendChild(this.fill),this.element.append(this.label,e,this.actions)}mount(){if(!this.element.isConnected)document.body.appendChild(this.element)}setActions(...e){this.actions.replaceChildren(...e)}running(e){let t=y("Pause",{onClick:()=>{if(e.isPaused())e.onResume(),t.textContent="Pause";else e.onPause(),t.textContent="Resume"}});this.setActions(t,y("Cancel",{onClick:e.onCancel})),this.mount()}update(e,t,n){this.label.textContent=`Item ${e+1}/${t}: ${Us[n]}`,this.fill.style.width=`${((e+(n==="waiting"?0.6:0.2))/t*100).toFixed(0)}%`}finish(e,t){this.label.textContent=e==="finished"?"Batch finished.":e==="cancelled"?"Batch cancelled.":"Batch stopped: a message could not be sent.",this.fill.style.width=e==="finished"?"100%":this.fill.style.width,this.setActions(y("Export thread",{primary:!0,onClick:t}),y("Close",{onClick:()=>this.element.remove()})),this.mount()}offerResume(e,t,n){this.label.textContent=`An interrupted batch has ${e} items left.`,this.fill.style.width="0%",this.setActions(y("Resume",{primary:!0,onClick:t}),y("Discard",{onClick:()=>{n(),this.element.remove()}})),this.mount()}}var cn=0,dn=()=>cn>0,Qr=async(e)=>{cn++;try{return await e()}finally{cn--}};var E=ae("Better Perplexity");var js='button[aria-label*="stop" i], button[title*="stop" i], [data-testid*="stop" i]',mt=()=>[...document.querySelectorAll(js)].some((e)=>!O(e)),ht=async({startTimeout:e=15000,settle:t=1500,timeout:n=300000,signal:r}={})=>{await le(()=>mt()||null,{timeout:e,interval:150,signal:r});let o=Date.now()+n,i=0;while(Date.now()=t)return!0;await ee(250,r)}return E.warning("Timed out waiting for the answer to finish."),!1};var b=ot({namespace:"better-perplexity",gmPrefix:""});var un="batch-runner:state",Ks=21600000,Zr=()=>{let e=b.get(un,null);return e&&e.nextb.set(un,null);class mn{controller=null;paused=!1;release=null;get active(){return this.controller!==null}get isPaused(){return this.paused}pause(){this.paused=!0}resume(){this.paused=!1,this.release?.()}cancel(){this.controller?.abort(),this.resume()}async run(e,t){if(this.controller)return"failed";let n=new AbortController;this.controller=n;let{signal:r}=n,o=e.prompts.length;try{return await Qr(async()=>{for(let i=e.next;i{this.release=s,r.addEventListener("abort",()=>s(),{once:!0})});if(r.throwIfAborted(),t(i,o,"sending"),!await this.send(e.prompts[i],r))return"failed";if(t(i,o,"waiting"),await ht({signal:r}),b.set(un,{...e,next:i+1,at:Date.now()}),e.delay>0&&ithis.open(),{id:"batch",after:["prompts","big"]});offered=!1;constructor(e){super(e)}run(){if(!this.enabled){this.button.unmount();return}if(this.button.mount(),this.offered||this.runner.active)return;let e=Zr();if(!e)return;this.offered=!0,this.panel.offerResume(e.prompts.length-e.next,()=>void this.start(e),ft)}menuEntries(){return[{id:"open",label:"Batch Runner…",action:()=>this.open()}]}open(){if(this.runner.active)return;Jr((e)=>void this.prepare(e))}async start(e){this.panel.running({onPause:()=>this.runner.pause(),onResume:()=>this.runner.resume(),onCancel:()=>this.runner.cancel(),isPaused:()=>this.runner.isPaused});let t=await this.runner.run(e,(n,r,o)=>this.panel.update(n,r,o));if(t==="cancelled")ft();this.panel.finish(t,()=>this.context.runCommand("exporter:export"))}async prepare({template:e,items:t,delay:n}){let r=Ke(e,(s)=>/^(item|index|total|date|\d+)$/.test(s)),o=e;if(r.length){let s=await Se(r,{title:"Fill in the blanks",description:"These are the same for every message in the batch.",confirm:"Start batch"});if(!s)return;o=dt(e,s)}let i=t.map((s,p)=>ut(o,s,p,t.length));await this.start({prompts:i,next:0,delay:n,at:Date.now()})}}var X=async(e)=>{try{return await navigator.clipboard.writeText(e),!0}catch{let t=document.createElement("textarea");t.value=e,t.style.cssText="position:fixed;opacity:0;pointer-events:none",document.body.appendChild(t),t.select();let n=document.execCommand("copy");return t.remove(),n}};var ze=(e="")=>{let t=a("span",e?`bp-line ${e}`:"bp-line"),n=a("span","bp-text");return t.append(a("span","bp-num"),n),{line:t,text:n}},zs=(e)=>{if(e.startsWith("@@"))return"hunk";if(e.startsWith("+")&&!e.startsWith("+++"))return"add";if(e.startsWith("-")&&!e.startsWith("---"))return"del";return""},gt=(e,t)=>e.split(` `).map((n)=>{let{line:r,text:o}=ze(t?zs(n):"");return o.textContent=n,r}),eo=(e)=>{let{line:t,text:n}=ze(),r=n;for(let o of e){let i=o.cloneNode(!1);r.appendChild(i),r=i}return{line:t,tip:r}},to=(e,t)=>{let n=[],r=[],o=eo(n);r.push(o.line);let i=(s)=>{if(s.nodeType===Node.TEXT_NODE){(s.textContent??"").split(` `).forEach((d,c)=>{if(c>0)o=eo(n),r.push(o.line);if(d)o.tip.appendChild(document.createTextNode(d))});return}if(!(s instanceof Element))return;n.push(s);let p=s.cloneNode(!1);o.tip.appendChild(p),o.tip=p,s.childNodes.forEach(i),n.pop(),o.tip=o.tip.parentElement??o.line};e.childNodes.forEach(i);while(r.length>t&&!r.at(-1)?.textContent)r.pop();return r};var qe=String.raw`(?![\s\S])`,W=String.raw`"(?:\\.|[^"\\\n])*"?`,Q=String.raw`'(?:\\.|[^'\\\n])*'?`,qs=String.raw`\x60(?:\\[\s\S]|[^\x60\\])*\x60?`,ue=String.raw`\b(?:0[xX][\da-fA-F_]+|\d[\d_]*(?:\.\d+)?(?:[eE][+-]?\d+)?)\b`,bt=String.raw`\/\*[\s\S]*?(?:\*\/|${qe})`,ro=String.raw`\/\/[^\n]*`,Ee=String.raw`#[^\n]*`,fn=String.raw`\b[A-Za-z_$][\w$]*(?=\s*\()`,oo=String.raw`\b[A-Z][A-Za-z0-9_]*\b`,Gs=String.raw`"""[\s\S]*?(?:"""|${qe})|'''[\s\S]*?(?:'''|${qe})`,ce=(e)=>String.raw`\b(?:${e.trim().split(/\s+/).join("|")})\b`,ke={javascript:"break case catch class const continue debugger default delete do else export extends finally for function if import in instanceof let new of return static super switch this throw try typeof var void while with yield async await true false null undefined from as",typescript:"interface type enum implements namespace declare readonly abstract public private protected keyof infer is satisfies string number boolean any unknown never object",go:"break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var true false nil",rust:"as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while",java:"abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient true false try void volatile while var record",c:"auto break case char const continue default do double else enum extern float for goto if inline int long register return short signed sizeof static struct switch typedef union unsigned void volatile while class namespace template typename using new delete public private protected virtual nullptr true false bool this operator",csharp:"using namespace string object bool decimal foreach in is as async await var readonly override virtual interface struct enum delegate event get set public private protected internal static class new return if else for while switch case break continue try catch finally throw null true false void int",kotlin:"fun val var class object interface when if else for while return break continue is in as import package null true false this super override open data sealed suspend companion init",swift:"func let var class struct enum protocol extension import return if else guard switch case default for in while break continue nil true false self super init deinit throws try catch defer public private internal static",php:"function class public private protected static return if else elseif foreach for while switch case break continue new try catch throw namespace use echo null true false array isset empty",ruby:"def end class module if elsif else unless while until for in do begin rescue ensure return yield self nil true false and or not puts require include",python:"False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield self",shell:"if then else elif fi for while do done case esac function in return exit export local echo cd sudo",powershell:"if else elseif foreach for while switch function param return try catch finally throw true false null",sql:"select from where and or not in is null insert into values update set delete create table alter drop index view join left right inner outer on group by order having limit offset as distinct union all case when then else end primary key foreign references default unique exists between like asc desc count sum avg min max"},ne=(e,t="")=>[["comment",`${ro}|${bt}`],["string",`${W}|${Q}|${qs}`],["number",ue],["keyword",ce(`${ke[e]??""} ${t}`)],["fn",fn],["type",oo]],no=(e,t=`${W}|${Q}`)=>[["comment",Ee],["string",t],["number",ue],["keyword",ce(ke[e]??"")],["fn",fn],["type",oo]],P=(e,t="g")=>({rules:e,regex:new RegExp(e.map(([,n],r)=>`(?${n})`).join("|"),t)}),Ws={javascript:P(ne("javascript")),typescript:P(ne("javascript",ke.typescript)),go:P(ne("go")),rust:P(ne("rust")),java:P(ne("java")),c:P(ne("c")),csharp:P(ne("csharp")),kotlin:P(ne("kotlin")),swift:P(ne("swift")),php:P([["comment",`${ro}|${Ee}|${bt}`],...ne("php").slice(1)]),python:P([["attr",String.raw`^[ \t]*@[\w.]+`],...no("python",`${Gs}|${W}|${Q}`)],"gm"),ruby:P(no("ruby")),bash:P([["comment",String.raw`(?:^|(?<=\s))#[^\n]*`],["string",`${W}|${Q}`],["attr",String.raw`\$\{?[\w@#?*-]+\}?`],["key",String.raw`(?<=\s)--?[A-Za-z][\w-]*`],["keyword",ce(ke.shell??"")],["number",ue]],"gm"),powershell:P([["comment",Ee],["string",`${W}|${Q}`],["attr",String.raw`\$[\w:]+`],["keyword",ce(ke.powershell??"")],["fn",String.raw`\b[A-Z][a-z]+-[A-Za-z]+\b`]]),json:P([["key",String.raw`"(?:\\.|[^"\\\n])*"(?=\s*:)`],["string",W],["number",ue],["keyword",ce("true false null")]]),yaml:P([["comment",Ee],["key",String.raw`^[ \t-]*[\w.\-/"']+(?=\s*:(?:\s|${qe}))`],["string",`${W}|${Q}`],["number",ue],["keyword",ce("true false null yes no on off")]],"gm"),toml:P([["comment",Ee],["tag",String.raw`^\[[^\]\n]+\]`],["key",String.raw`^[\w.\-]+(?=\s*=)`],["string",`${W}|${Q}`],["number",ue],["keyword",ce("true false")]],"gm"),html:P([["comment",String.raw`|${qe})`],["keyword",String.raw`]*>`],["tag",String.raw`<\/?[A-Za-z][\w:.-]*|\/?>`],["attr",String.raw`[\w:@.-]+(?==)`],["string",`${W}|${Q}`]],"gi"),css:P([["comment",bt],["string",`${W}|${Q}`],["keyword",String.raw`@[\w-]+`],["key",String.raw`[\w-]+(?=\s*:)`],["number",String.raw`#[0-9a-fA-F]{3,8}\b|-?\d*\.?\d+(?:px|r?em|%|vh|vw|ms|s|deg|fr)?`],["type",String.raw`[.#][\w-]+`]]),sql:P([["comment",String.raw`--[^\n]*|${bt}`],["string",`${Q}|${W}`],["number",ue],["keyword",ce(ke.sql??"")],["fn",fn]],"gi"),dockerfile:P([["comment",Ee],["string",`${W}|${Q}`],["keyword",String.raw`^(?:FROM|RUN|CMD|COPY|ADD|ENTRYPOINT|ENV|EXPOSE|WORKDIR|USER|ARG|LABEL|VOLUME|AS)\b`]],"gm")},Vs={cpp:"c",xml:"html",objectivec:"c",dart:"java",scala:"java",groovy:"java",solidity:"javascript",perl:"ruby",zig:"rust",nim:"python",julia:"python"},Ys=(e,{rules:t,regex:n})=>{let r=[],o=0;for(let i of e.matchAll(n)){let s=i.index??0;if(s>o)r.push({type:"plain",text:e.slice(o,s)});let p=t.findIndex((l,d)=>i.groups?.[`r${d}`]!==void 0);r.push({type:t[p]?.[0]??"plain",text:i[0]}),o=s+i[0].length}if(o{let n=Ws[Vs[t]??t];if(!n)return null;let r=[],o=ze();r.push(o.line);for(let i of Ys(e,n))i.text.split(` `).forEach((s,p)=>{if(p>0)o=ze(),r.push(o.line);if(!s)return;if(i.type==="plain")o.text.appendChild(document.createTextNode(s));else o.text.appendChild(a("span",`bp-tok bp-tok-${i.type}`,s))});return r};var Js=[["javascript","JavaScript",50,"js","js jsx mjs cjs node nodejs"],["typescript","TypeScript",211,"ts","ts tsx"],["python","Python",207,"py","py python3 py3 ipython"],["bash","Shell",140,"sh","sh shell zsh bash console terminal shellscript"],["powershell","PowerShell",215,"ps1","ps1 pwsh"],["json","JSON",90,"json","json jsonc json5"],["yaml","YAML",0,"yml","yml yaml"],["toml","TOML",25,"toml","toml ini cfg"],["html","HTML",15,"html","html htm xhtml svg vue svelte"],["xml","XML",165,"xml","xml xsl plist"],["css","CSS",265,"css","css scss sass less"],["sql","SQL",200,"sql","sql mysql postgres postgresql sqlite plsql tsql"],["go","Go",190,"go","go golang"],["rust","Rust",20,"rs","rs rust"],["java","Java",10,"java","java"],["kotlin","Kotlin",280,"kt","kt kotlin kts"],["swift","Swift",15,"swift","swift"],["c","C",220,"c","c h"],["cpp","C++",215,"cpp","cpp c++ cc cxx hpp"],["csharp","C#",280,"cs","cs csharp c#"],["php","PHP",240,"php","php"],["ruby","Ruby",0,"rb","rb ruby"],["markdown","Markdown",200,"md","md markdown mdx"],["diff","Diff",130,"diff","diff patch"],["dockerfile","Dockerfile",205,"Dockerfile","dockerfile docker"],["text","Text",0,"txt","text txt plain plaintext none"],["lua","Lua",240,"lua","lua"],["r","R",210,"r","r rscript"],["dart","Dart",200,"dart","dart"],["scala","Scala",5,"scala","scala sc"],["perl","Perl",230,"pl","pl perl"],["haskell","Haskell",270,"hs","hs haskell"],["elixir","Elixir",280,"ex","ex exs elixir"],["clojure","Clojure",220,"clj","clj cljs clojure"],["matlab","MATLAB",15,"m","matlab octave"],["vim","Vim script",140,"vim","vim vimscript"],["nginx","Nginx",145,"conf","nginx"],["graphql","GraphQL",320,"graphql","graphql gql"],["protobuf","Protobuf",210,"proto","proto protobuf"],["makefile","Makefile",200,"mk","make makefile mk"],["latex","LaTeX",180,"tex","tex latex"],["groovy","Groovy",200,"groovy","groovy gradle"],["solidity","Solidity",0,"sol","sol solidity"],["zig","Zig",35,"zig","zig"],["nim","Nim",55,"nim","nim"],["julia","Julia",285,"jl","jl julia"],["assembly","Assembly",40,"asm","asm assembly nasm"],["objectivec","Objective-C",215,"m","objc objectivec objective-c"],["regex","Regex",260,"txt","regex regexp"],["http","HTTP",215,"http","http"],["log","Log",0,"log","log logs"],["csv","CSV",150,"csv","csv tsv"],["batch","Batch",0,"bat","bat batch cmd"]],gn=new Map,yt=new Map;for(let[e,t,n,r,o]of Js){gn.set(e,{id:e,name:t,hue:n,ext:r}),yt.set(e,e);for(let i of o.split(" "))yt.set(i,e)}var so=(e)=>{let t=e.trim().toLowerCase().replace(/^\./,"");return yt.get(t)??t},ao=(e)=>gn.has(e)&&e!=="text",bn=(e)=>gn.get(e)??{id:e,name:e.charAt(0).toUpperCase()+e.slice(1),hue:0,ext:"txt"},lo=(e)=>{if(/(^|[\\/])Dockerfile$/i.test(e))return"dockerfile";let t=e.split(".").pop()?.toLowerCase(),n=t?yt.get(t):void 0;return n&&n!=="text"?n:null};var Xs=` .bp-code { --bp-edge: color-mix(in srgb, currentColor 13%, transparent); --bp-muted: color-mix(in srgb, currentColor 52%, transparent); --bp-hover: color-mix(in srgb, currentColor 9%, transparent); position: relative; margin: 14px 0; overflow: hidden; border: 1px solid var(--bp-edge); border-radius: 10px; background: color-mix(in srgb, currentColor 3.5%, transparent); font-size: 13px; } .bp-code * { box-sizing: border-box; } .bp-code ::selection { background: color-mix(in srgb, #3b82f6 38%, transparent); } .bp-code-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; height: 42px; padding: 0 8px 0 12px; border-bottom: 1px solid var(--bp-edge); } .bp-code-meta { display: flex; align-items: center; gap: 8px; min-width: 0; } .bp-code-lang { font-size: 13px; font-weight: 500; white-space: nowrap; } .bp-code-file { overflow: hidden; color: var(--bp-muted); font: 12px ui-monospace, SFMono-Regular, Menlo, monospace; text-overflow: ellipsis; white-space: nowrap; } .bp-code-count { color: var(--bp-muted); font-size: 12px; white-space: nowrap; } .bp-code-count::before { content: '·'; margin-right: 8px; } .bp-code-actions { display: flex; flex-shrink: 0; gap: 2px; } .bp-code-btn { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: 0; border-radius: 6px; background: transparent; color: var(--bp-muted); cursor: pointer; transition: background 120ms ease, color 120ms ease; } .bp-code-btn:hover { background: var(--bp-hover); color: inherit; } .bp-code-btn[aria-pressed='true'] { background: var(--bp-hover); color: inherit; } .bp-code-btn[data-done='true'] { color: hsl(142 71% 45%); } .bp-code-btn:focus-visible { outline: 2px solid color-mix(in srgb, #3b82f6 70%, transparent); outline-offset: 1px; } .bp-code-body { overflow: auto; } .bp-code[data-collapsed='true'] .bp-code-body { max-height: calc(var(--bp-code-collapse, 30) * 1.6em + 28px); overflow: hidden; -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 64px), transparent); mask-image: linear-gradient(to bottom, #000 calc(100% - 64px), transparent); } .bp-code-pre { width: max-content; min-width: 100%; margin: 0 !important; padding: 14px 0 !important; border: 0 !important; background: transparent !important; font: 13px/1.6 ui-monospace, 'Geist Mono', 'JetBrains Mono', SFMono-Regular, Menlo, Consolas, monospace !important; overflow: visible !important; tab-size: 2; counter-reset: bp-line; } .bp-code-pre code { display: block; padding: 0 !important; background: transparent !important; font: inherit !important; } .bp-code[data-wrap='true'] .bp-code-pre { width: auto; min-width: 0; } .bp-line { display: flex; align-items: flex-start; counter-increment: bp-line; } .bp-line:hover { background: color-mix(in srgb, currentColor 5%, transparent); } .bp-num { flex: 0 0 calc(var(--bp-digits, 2) * 1ch + 30px); padding-right: 14px; color: var(--bp-muted); opacity: .7; text-align: right; user-select: none; } .bp-num::before { content: counter(bp-line); } .bp-text { flex: 1; min-width: 0; min-height: 1.6em; padding-right: 16px; white-space: pre; } .bp-code[data-lines='false'] .bp-num { display: none; } .bp-code[data-lines='false'] .bp-text { padding-left: 16px; } .bp-code[data-wrap='true'] .bp-text { white-space: pre-wrap; overflow-wrap: anywhere; } .bp-line.add { background: hsl(142 71% 45% / 14%); } .bp-line.del { background: hsl(0 84% 60% / 14%); } .bp-line.hunk { color: var(--bp-muted); } .bp-tok-comment { color: var(--bp-muted); font-style: italic; } .bp-tok-string { color: color-mix(in srgb, hsl(28 82% 52%) 72%, currentColor); } .bp-tok-number { color: color-mix(in srgb, hsl(160 60% 42%) 72%, currentColor); } .bp-tok-keyword { color: color-mix(in srgb, hsl(285 65% 58%) 74%, currentColor); } .bp-tok-fn { color: color-mix(in srgb, hsl(215 78% 56%) 74%, currentColor); } .bp-tok-type { color: color-mix(in srgb, hsl(185 62% 42%) 74%, currentColor); } .bp-tok-tag { color: color-mix(in srgb, hsl(350 70% 55%) 74%, currentColor); } .bp-tok-attr { color: color-mix(in srgb, hsl(40 80% 48%) 74%, currentColor); } .bp-tok-key { color: color-mix(in srgb, hsl(215 70% 55%) 74%, currentColor); } .bp-code-more { position: absolute; bottom: 12px; left: 50%; display: none; height: 32px; padding: 0 14px; border: 1px solid var(--bp-edge); border-radius: 6px; background: color-mix(in srgb, currentColor 8%, Canvas); color: inherit; font: inherit; font-size: 12.5px; font-weight: 500; transform: translateX(-50%); cursor: pointer; } .bp-code[data-collapsed='true'] .bp-code-more { display: block; } .bp-code-more:hover { background: color-mix(in srgb, currentColor 14%, Canvas); } .bp-lang-icon { flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 6px; } .bp-lang-badge { background: linear-gradient(145deg, var(--c), color-mix(in srgb, var(--c) 70%, #000)); box-shadow: inset 0 0 0 1px rgb(255 255 255 / 20%), 0 1px 2px rgb(0 0 0 / 28%); font: 700 9.5px/1 ui-sans-serif, system-ui, sans-serif; letter-spacing: -.03em; } .bp-lang-badge[data-size='3'] { font-size: 8px; } .bp-lang-badge[data-size='4'] { font-size: 6.8px; letter-spacing: -.05em; } .bp-lang-plain { color: var(--bp-muted); } `,po=()=>M("better-perplexity-code-styles",Xs);var Qs={javascript:["JS","#f7df1e","#000"],typescript:["TS","#3178c6","#fff"],python:["PY","#3776ab","#ffd43b"],bash:[">_","#3b8f2b","#fff"],powershell:["PS","#012456","#fff"],batch:["BAT","#4d4d4d","#fff"],json:["{}","#e9a620","#000"],yaml:["YML","#cb171e","#fff"],toml:["TOML","#9c4221","#fff"],html:["","#e34f26","#fff"],xml:["XML","#0060ac","#fff"],css:["CSS","#1572b6","#fff"],sql:["SQL","#e48e00","#000"],graphql:["GQL","#e10098","#fff"],protobuf:["PB","#4a7fb0","#fff"],go:["GO","#00add8","#fff"],rust:["RS","#ce422b","#fff"],zig:["ZIG","#f7a41d","#000"],nim:["NIM","#ffe953","#000"],java:["JV","#e76f00","#fff"],kotlin:["KT","#7f52ff","#fff"],scala:["SC","#dc322f","#fff"],groovy:["GRV","#4298b8","#fff"],swift:["SW","#f05138","#fff"],objectivec:["OBJ","#438eff","#fff"],dart:["DRT","#0175c2","#fff"],c:["C","#00599c","#fff"],cpp:["C++","#00599c","#fff"],csharp:["C#","#68217a","#fff"],php:["PHP","#777bb4","#fff"],ruby:["RB","#cc342d","#fff"],perl:["PL","#39457e","#fff"],lua:["LUA","#000080","#fff"],r:["R","#276dc3","#fff"],julia:["JL","#9558b2","#fff"],matlab:["M","#e16737","#fff"],haskell:["HS","#5d4f85","#fff"],elixir:["EX","#6e4a7e","#fff"],clojure:["CLJ","#5881d8","#fff"],solidity:["SOL","#363636","#fff"],assembly:["ASM","#6e4c13","#fff"],vim:["VIM","#019733","#fff"],nginx:["NGX","#009639","#fff"],makefile:["MK","#6d8086","#fff"],dockerfile:["DK","#2496ed","#fff"],latex:["TEX","#008080","#fff"],markdown:["M↓","#083fa1","#fff"],diff:["±","#6f42c1","#fff"],regex:[".*","#6f42c1","#fff"],http:["HTTP","#1f6feb","#fff"],log:["LOG","#6e7681","#fff"],csv:["CSV","#217346","#fff"]},co=(e)=>{let t=Qs[e];if(!t){let s=a("span","bp-lang-icon bp-lang-plain");return s.title="Plain text",s.appendChild(j("file",16)),s}let[n,r,o]=t,i=a("span","bp-lang-icon bp-lang-badge",n);return i.style.setProperty("--c",r),i.style.color=o,i.dataset.size=String(n.length),i};var Zs=1200;class yn{source;root;info;settings;element=S(a("div","bp-code"));lineCount;collapsible;toggles=new Map;constructor(e,t,n,r){this.source=e;this.root=t;this.info=n;this.settings=r;po(),this.lineCount=n.text.split(` `).length,this.collapsible=r.collapseAfter>0&&this.lineCount>r.collapseAfter,this.build()}get text(){return this.info.text}get fenced(){return`\`\`\`${this.info.language==="text"?"":this.info.language} ${this.info.text} \`\`\``}mount(){this.root.insertAdjacentElement("beforebegin",this.element),this.ensureHidden()}ensureHidden(){if(this.root.style.getPropertyValue("display")!=="none")this.root.style.setProperty("display","none","important")}destroy(){this.element.remove(),this.root.style.removeProperty("display")}setFlag(e,t){this.element.dataset[e]=String(t),this.toggles.get(e)?.setAttribute("aria-pressed",String(t))}button(e,t,n){let r=a("button","bp-code-btn");return r.type="button",r.title=t,r.setAttribute("aria-label",t),r.appendChild(j(e,15)),r.addEventListener("click",()=>n(r)),r}toggle(e,t,n,r){let o=this.button(t,n,()=>this.setFlag(e,this.element.dataset[e]!=="true"));return this.toggles.set(e,o),this.setFlag(e,r),o}swapIcon(e,t,n){e.replaceChildren(j(t,15)),e.dataset.done="true",window.setTimeout(()=>{e.replaceChildren(j(n,15)),delete e.dataset.done},Zs)}download(){let{filename:e,language:t,text:n}=this.info,r=(e??`snippet.${bn(t).ext}`).split(/[\\/]/).pop()??"snippet.txt",o=URL.createObjectURL(new Blob([n],{type:"text/plain"})),i=a("a");i.href=o,i.download=r,i.click(),URL.revokeObjectURL(o)}renderLines(){let{language:e,text:t}=this.info,n=e==="diff";if(n||this.settings.highlight==="plain")return gt(t,n);if(this.settings.highlight==="builtin")return io(t,e)??gt(t,!1);let r=this.source.querySelector("code")??this.source;return r.hasChildNodes()?to(r,this.lineCount):gt(t,!1)}build(){let{language:e,filename:t}=this.info,n=bn(e),r=a("div","bp-code-meta");if(r.append(co(e),a("span","bp-code-lang",n.name)),t)r.appendChild(a("span","bp-code-file",t));r.appendChild(a("span","bp-code-count",`${this.lineCount} ${this.lineCount===1?"line":"lines"}`));let o=a("div","bp-code-actions");if(o.append(this.toggle("wrap","wrap","Wrap lines",this.settings.wrap),this.toggle("lines","lines","Line numbers",this.settings.lineNumbers)),this.collapsible)o.appendChild(this.toggle("collapsed","fold","Fold long code",!0));o.append(this.button("copy","Copy code",(c)=>void X(this.info.text).then((u)=>u&&this.swapIcon(c,"check","copy"))),this.button("download","Download as file",()=>this.download()));let i=a("div","bp-code-head");i.append(r,o);let s=a("pre","bp-code-pre"),p=a("code");p.append(...this.renderLines()),s.appendChild(p);let l=a("div","bp-code-body");if(l.appendChild(s),this.element.style.setProperty("--bp-lang-hue",String(n.hue)),this.element.style.setProperty("--bp-code-collapse",String(this.settings.collapseAfter)),this.element.style.setProperty("--bp-digits",String(String(this.lineCount).length)),this.element.dataset.collapsed="false",this.element.append(i,l),this.element.addEventListener("copy",this.handleCopy),!this.collapsible)return;this.setFlag("collapsed",!0);let d=a("button","bp-code-more",`Show ${this.lineCount-this.settings.collapseAfter} more lines`);d.type="button",d.addEventListener("click",()=>this.setFlag("collapsed",!1)),this.element.appendChild(d)}locate(e,t,n,r,o){let s=(n instanceof Element?n:n.parentElement)?.closest(".bp-line");if(s){let d=e.indexOf(s),c=s.querySelector(".bp-text");if(d<0||!c)return null;if(!c.contains(n))return{line:d,column:o?(c.textContent??"").length:0};let u=document.createRange();return u.selectNodeContents(c),u.setEnd(n,r),{line:d,column:u.toString().length}}let p=e.length-1;if(n!==t)return o?{line:p,column:(e[p]?.querySelector(".bp-text")?.textContent??"").length}:{line:0,column:0};let l=Math.min(Math.max(o?r-1:r,0),p);return{line:l,column:o?(e[l]?.querySelector(".bp-text")?.textContent??"").length:0}}handleCopy=(e)=>{let t=window.getSelection();if(!t||t.isCollapsed||!t.rangeCount||!e.clipboardData)return;let n=t.getRangeAt(0);if(!this.element.contains(n.startContainer)||!this.element.contains(n.endContainer))return;let r=[...this.element.querySelectorAll(".bp-line")],o=this.element.querySelector("code"),i=this.locate(r,o,n.startContainer,n.startOffset,!1),s=this.locate(r,o,n.endContainer,n.endOffset,!0);if(!i||!s||s.line({...vn,...b.get(uo,{})}),ho=(e)=>b.set(uo,e);var fo="better-perplexity-code-dialog",xn=(e,t)=>{let n=document.getElementById(fo);if(n instanceof HTMLDialogElement){n.close();return}let r=k({id:fo,title:"Code Block Pro",description:"Applies to code blocks as soon as an answer finishes.",width:460}),o={...e},i=a("div","bp-stack");i.append(D({label:"Wrap long lines",checked:o.wrap,onChange:(l)=>o.wrap=l}).wrapper,D({label:"Show line numbers",checked:o.lineNumbers,onChange:(l)=>o.lineNumbers=l}).wrapper,D({label:"Hide the site’s own block header",checked:o.hideSiteChrome,onChange:(l)=>o.hideSiteChrome=l}).wrapper,oe("Syntax colours",[{value:"builtin",label:"Built-in (recommended)"},{value:"site",label:"Site’s own"},{value:"plain",label:"None"}],o.highlight,(l)=>o.highlight=l),pe({label:"Fold after N lines",hint:"0 never folds",value:o.collapseAfter,min:0,max:1000,onChange:(l)=>o.collapseAfter=l}).wrapper),r.body.appendChild(i);let s=()=>{t({...o}),r.close()},p=()=>{r.close(),xn({...vn},t)};r.footer.append(y("Cancel",{onClick:r.close}),y("Reset",{onClick:p}),y("Save",{primary:!0,onClick:s})),r.show()};var ea=[["python",/^\s*def \w+\(.*\)\s*(?:->.*)?:/m,4],["python",/^\s*(?:elif|except|finally)\b.*:/m,3],["python",/^\s*import [\w.]+(?: as \w+)?\s*$/m,3],["python",/^\s*from [\w.]+ import /m,3],["python",/\bif __name__\b/,5],["python",/\bself\./,1],["python",/\bf"[^"]*\{/,2],["python",/\bprint\(/,1],["javascript",/\b(?:const|let)\s+\w+\s*=/,2],["javascript",/=>/,1],["javascript",/\bfunction\b/,1],["javascript",/console\.\w+\(/,3],["javascript",/\brequire\(/,3],["javascript",/^\s*import .+ from ['"]/m,3],["javascript",/\bexport (?:default|const|function|class)\b/,3],["javascript",/\b(?:document|window)\./,2],["bash",/^\s*\$ \S/m,3],["bash",/^\s*(?:sudo|apt(?:-get)?|brew|npm|pnpm|yarn|pip3?|git|cd|ls|mkdir|curl|wget|chmod|docker|echo|export|bun)\b/m,3],["bash",/\s&&\s/,1],["bash",/\$\{?\w+\}?/,1],["bash",/^\s*(?:if|for|while) .*; (?:then|do)\b/m,3],["sql",/\bSELECT\b[\s\S]*\bFROM\b/i,5],["sql",/\b(?:INSERT INTO|UPDATE \w+ SET|DELETE FROM|CREATE (?:TABLE|INDEX|VIEW)|ALTER TABLE|DROP TABLE)\b/i,5],["html",/]/i,6],["html",/<\/?(?:div|span|p|a|ul|li|head|body|script|style|meta|link|h[1-6]|button|input|form|table)\b[^>]*>/i,3],["xml",/^\s*<\?xml/,6],["xml",/<\/\w+>/,1],["css",/[.#]?[\w-]+(?:\s*,\s*[.#]?[\w-]+)*\s*\{[^}]*:[^}]*\}/,4],["css",/@(?:media|import|keyframes|font-face)\b/,3],["yaml",/^(?:\s*[\w.-]+:.*\n){2,}/,3],["yaml",/^\s*- \w+/m,1],["toml",/^\[[\w.-]+\]\s*$/m,3],["toml",/^[\w.-]+\s*=\s*["\d[tf]/m,2],["go",/^package \w+/m,5],["go",/\bfunc\b.*\{/,2],["go",/:=/,2],["go",/\bfmt\.\w+/,3],["rust",/\bfn \w+\(/,4],["rust",/\blet mut\b/,4],["rust",/\bimpl\b|\bpub (?:fn|struct)\b/,3],["rust",/println!\(/,4],["java",/\bpublic (?:static )?(?:class|void|interface)\b/,4],["java",/System\.out\.print/,5],["java",/^import java\./m,5],["csharp",/^using System/m,5],["csharp",/Console\.Write/,4],["csharp",/\bnamespace \w+/,2],["c",/#include\s*[<"]/,5],["c",/\bint main\s*\(/,4],["c",/\bprintf\(/,3],["cpp",/std::|\bcout\b|template\s*/,5],["php",/<\?php/,6],["ruby",/^\s*def \w+.*\n[\s\S]*^\s*end\b/m,4],["ruby",/\bputs\b|\bdo \|\w+\|/,2],["kotlin",/\bfun \w+\(/,4],["kotlin",/\bval \w+/,2],["swift",/\bguard let\b|\bfunc \w+\(.*\)\s*->/,4],["dockerfile",/^FROM \S+/m,5],["dockerfile",/^(?:RUN|CMD|COPY|ENTRYPOINT|WORKDIR|EXPOSE|ENV) /m,3],["diff",/^diff --git|^@@ .* @@|^\+\+\+ |^--- /m,6],["markdown",/^#{1,6} \S/m,2],["markdown",/^```/m,3],["powershell",/\bGet-\w+|\$env:\w+|\bWrite-Host\b/,4]],ta=[/:\s*(?:string|number|boolean|void|any|unknown)\b/,/\binterface \w+/,/^\s*type \w+\s*=/m,/\bas const\b/,/\benum \w+/],na=/^#!.*\b(bash|sh|zsh|python3?|node|ruby|php|pwsh)\b/;var ra={bash:"bash",sh:"bash",zsh:"bash",python:"python",python3:"python",node:"javascript",ruby:"ruby",php:"php",pwsh:"powershell"},go=(e)=>{let t=e.slice(0,6000).trim();if(!t)return null;if(/^[[{]/.test(t))try{return JSON.parse(e),"json"}catch{t.length}let n=na.exec(t)?.[1];if(n)return ra[n]??null;let r=new Map;for(let[l,d,c]of ea)if(d.test(t))r.set(l,(r.get(l)??0)+c);let o=ta.filter((l)=>l.test(t)).length,i=r.get("javascript")??0;if(o>=1&&i+o*3>=3)r.set("typescript",i+o*3);let[[s,p]]=[...r.entries()].sort(([,l],[,d])=>d-l);return s&&p>=3?s:null};var oa=/(?:^|\s)(?:language|lang)-([\w+#.-]+)/i,ia=/^(?:\/\/|#|--|\/\*|)?$/,sa=/^[\w./\\-]+\.[A-Za-z0-9]{1,8}$/,aa=/^(copy|copied|download|save|wrap|code|edit)$/,bo=(e)=>((e.querySelector("code")??e).textContent??"").replace(/\n$/,""),yo=(e,t)=>[...e.querySelectorAll("span, div, p")].filter((n)=>!t.contains(n)&&n.children.length===0).map((n)=>n.textContent?.trim()??"").filter((n)=>n.length>0&&n.length<=40),la=(e,t)=>{let n=e.querySelector("code"),r=oa.exec(`${n?.className??""} ${e.className}`)?.[1];if(r)return r;let o=e.dataset.language??e.dataset.lang??n?.dataset.language;if(o)return o;return yo(t,e).find((i)=>/^[A-Za-z][\w+#. -]{0,18}$/.test(i)&&!aa.test(i.toLowerCase()))??null},pa=(e,t,n)=>{let r=ia.exec(e.split(` `,1)[0]?.trim()??"")?.[1];if(r)return r;return yo(t,n).find((o)=>sa.test(o))??null},ca=(e,t,n,r)=>{let o=la(e,t),i=o?so(o):null;if(i&&ao(i))return i;let s=r?lo(r):null;if(s)return s;return go(n)??i??"text"},vo=(e,t)=>{if(!t)return e;let n=(e.textContent??"").length,r=e;for(let o=0;o<3;o++){let i=r.parentElement;if(!i||i===document.body||i.querySelectorAll("pre").length!==1)break;if((i.textContent??"").length-n>120)break;r=i}return r},xo=(e,t,n)=>{let r=pa(n,t,e);return{language:ca(e,t,n,r),filename:r,text:n}};var da=900,ua=6000,ma=500;class wn extends T{id="code-blocks";name="Code Block Pro";description="Replaces code blocks with copy, wrap, line numbers, folding and download.";settings=mo();blocks=new Map;seen=new WeakMap;rescan=0;run(){if(!this.enabled){this.clear();return}this.prune();let e=mt(),t=Date.now(),n=!1;for(let r of document.querySelectorAll("pre")){if(O(r)||r.closest("[contenteditable], textarea"))continue;let o=bo(r);if(!o.trim())continue;let i=this.blocks.get(r);if(i?.text===o)continue;if(i)this.release(r);let s=this.seen.get(r);if(!s||s.text!==o){this.seen.set(r,{text:o,since:t}),n=!0;continue}let p=t-s.since;if(pthis.configure()},{label:"Copy All Code Blocks",action:()=>void this.copyAll()}]}enhance(e,t){try{let n=vo(e,this.settings.hideSiteChrome),r=new yn(e,n,xo(e,n,t),this.settings);r.mount(),this.blocks.set(e,r)}catch(n){E.errorOnce("Code block enhancement failed; the original block is kept.",n)}}release(e){this.blocks.get(e)?.destroy(),this.blocks.delete(e),this.seen.delete(e)}prune(){for(let[e,t]of this.blocks)if(!e.isConnected||!t.root.isConnected||!t.element.isConnected)this.release(e);else t.ensureHidden()}clear(){for(let e of[...this.blocks.keys()])this.release(e)}scheduleRescan(){if(this.rescan)return;this.rescan=window.setTimeout(()=>{this.rescan=0,this.context.requestUpdate()},ma)}configure(){xn(this.settings,(e)=>{this.settings=e,ho(e),this.clear(),this.context.requestUpdate()})}async copyAll(){let e=[...this.blocks.values()].sort((n,r)=>n.element.compareDocumentPosition(r.element)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1);if(!e.length)return;let t=await X(e.map((n)=>n.fenced).join(` `));E.info(t?`Copied ${e.length} code blocks.`:"Could not copy code blocks.")}}var wo="command-palette:shortcut",ha=/^(Control|Alt|Shift|Meta|OS)(Left|Right)?$/,Sn={ctrl:!1,alt:!0,shift:!0,meta:!1,code:"KeyP"},Ge=()=>({...Sn,...b.get(wo,{})}),So=(e)=>b.set(wo,e),Te=(e,t)=>e.code===t.code&&e.ctrlKey===t.ctrl&&e.altKey===t.alt&&e.shiftKey===t.shift&&e.metaKey===t.meta,We=(e)=>[...[e.ctrl&&"Ctrl",e.alt&&"Alt",e.shift&&"Shift",e.meta&&"Meta"].filter(Boolean),e.code.replace(/^(Key|Digit)/,"")].join(" + "),Eo=(e)=>{if(ha.test(e.code)||!(e.ctrlKey||e.altKey||e.metaKey))return null;return{ctrl:e.ctrlKey,alt:e.altKey,shift:e.shiftKey,meta:e.metaKey,code:e.code}};var fa=` .bp-palette { max-height: min(70vh, 480px); } .bp-palette .bp-dialog-header, .bp-palette .bp-dialog-footer { display: none; } .bp-palette .bp-dialog-body { padding: 0; } .bp-palette-input { width: 100%; padding: 16px 18px; border: 0; border-bottom: 1px solid var(--bp-border); outline: 0; background: transparent; color: var(--bp-fg); font: inherit; font-size: 15px; } .bp-palette-list { max-height: 360px; overflow-y: auto; padding: 6px; } .bp-palette-item { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 12px; border-radius: 8px; cursor: pointer; } .bp-palette-item[aria-selected='true'] { background: var(--bp-accent); } .bp-palette-group { color: var(--bp-muted); font-size: 11px; } .bp-palette-empty { padding: 18px; color: var(--bp-muted); text-align: center; } .bp-shortcut-box { padding: 14px; border: 1px dashed var(--bp-border); border-radius: 10px; font-size: 15px; font-weight: 600; text-align: center; } `,Ce=()=>M("better-perplexity-palette-styles",fa);var ko="better-perplexity-shortcut-dialog",vt=(e,t,n="Palette shortcut")=>{let r=document.getElementById(ko);if(r instanceof HTMLDialogElement){r.close();return}Ce();let o=k({id:ko,title:n,description:"Use at least one of Ctrl, Alt or Meta.",width:420}),i={...e},s=!1,p=a("div","bp-shortcut-box",We(i)),l=y("Record new shortcut"),d=()=>{s=!1,l.textContent="Record new shortcut",p.textContent=We(i)};l.addEventListener("click",()=>{s=!0,l.textContent="Press the shortcut…",p.textContent="…"}),o.dialog.addEventListener("keydown",(c)=>{if(!s)return;if(c.preventDefault(),c.stopPropagation(),c.key==="Escape"){d();return}let u=Eo(c);if(!u)return;i=u,d()},!0),o.body.append(p),o.footer.append(l,y("Reset",{onClick:()=>{i={...Sn},d()}}),y("Save",{primary:!0,onClick:()=>{t(i),o.close()}})),o.show()};var Ve=(e,t)=>{if(!e)return 1;let n=e.toLowerCase(),r=t.toLowerCase(),o=0,i=0,s=0;for(let p of n){let l=r.indexOf(p,i);if(l===-1)return 0;s=l===i?s+1:0;let d=l===0||/[\s\-_:.]/.test(r[l-1]??"");o+=1+s*2+(d?3:0)-Math.min(l-i,5)*0.2,i=l+1}return Math.max(o,0.01)};var To="better-perplexity-palette",En="command-palette:recent",ga=6,Co=60,ba=(e,t,n)=>{if(!t){let r=(o)=>{let i=n.indexOf(o.id);return i===-1?n.length:i};return[...e].sort((o,i)=>r(o)-r(i)||o.group.localeCompare(i.group)||o.title.localeCompare(i.title)).slice(0,Co)}return e.map((r)=>({command:r,score:Math.max(Ve(t,r.title)*2,Ve(t,`${r.group} ${r.title} ${r.keywords??""}`))})).filter(({score:r})=>r>0).sort((r,o)=>o.score-r.score).slice(0,Co).map(({command:r})=>r)},Lo=(e)=>{let t=document.getElementById(To);if(t instanceof HTMLDialogElement){t.close();return}Ce();let n=k({id:To,title:"Command palette",width:560});n.dialog.classList.add("bp-palette");let r=e(),o=a("input","bp-palette-input");o.placeholder="Type a command…",o.setAttribute("aria-label","Command");let i=a("div","bp-palette-list");i.setAttribute("role","listbox"),n.body.append(o,i);let s=[],p=0,l=(c)=>{let u=[c.id,...b.get(En,[]).filter((m)=>m!==c.id)].slice(0,ga);b.set(En,u),n.close(),window.setTimeout(()=>void c.run(),0)},d=()=>{if(s=ba(r,o.value.trim(),b.get(En,[])),p=Math.min(p,Math.max(0,s.length-1)),!s.length){i.replaceChildren(a("div","bp-palette-empty","No matching commands"));return}i.replaceChildren(...s.map((c,u)=>{let m=a("div","bp-palette-item");return m.setAttribute("role","option"),m.setAttribute("aria-selected",String(u===p)),m.append(a("span",void 0,c.title),a("span","bp-palette-group",c.group)),m.addEventListener("click",()=>l(c)),m.addEventListener("pointermove",()=>{if(p===u)return;p=u,d()}),m})),i.children[p]?.scrollIntoView({block:"nearest"})};o.addEventListener("input",()=>{p=0,d()}),o.addEventListener("keydown",(c)=>{if(c.key==="ArrowDown"||c.key==="ArrowUp"){c.preventDefault();let u=c.key==="ArrowDown"?1:-1;p=(p+u+s.length)%Math.max(1,s.length),d()}else if(c.key==="Enter"){c.preventDefault();let u=s[p];if(u)l(u)}}),d(),n.show(),o.focus()};class kn extends T{id="command-palette";name="Command Palette";description="Search and run any action with a keyboard shortcut.";shortcut=Ge();attached=!1;run(){if(this.enabled&&!this.attached){window.addEventListener("keydown",this.handleKeydown,!0),this.attached=!0;return}if(!this.enabled&&this.attached)window.removeEventListener("keydown",this.handleKeydown,!0),this.attached=!1}menuEntries(){return[{id:"open",label:"Open Command Palette",action:()=>this.open()},{id:"shortcut",label:"Configure Palette Shortcut",action:()=>this.configure()}]}commands(){return[{id:"focus-input",title:"Focus message input",run:()=>A()?.focus()},{id:"clear-input",title:"Clear message input",run:()=>void this.clearInput()},{id:"scroll-top",title:"Scroll to top",keywords:"beginning start",run:()=>window.scrollTo({top:0,behavior:"smooth"})},{id:"scroll-bottom",title:"Scroll to bottom",keywords:"end latest",run:()=>window.scrollTo({top:document.documentElement.scrollHeight,behavior:"smooth"})},{id:"home",title:"Go to home",keywords:"new thread",run:()=>location.assign("/")},{id:"copy-url",title:"Copy page URL",keywords:"link share",run:()=>void X(location.href)}]}open(){Lo(this.context.getCommands)}configure(){vt(this.shortcut,(e)=>{this.shortcut=e,So(e)})}async clearInput(){let e=A();if(e)await H(e,"")}handleKeydown=(e)=>{if(e.repeat||!Te(e,this.shortcut))return;e.preventDefault(),e.stopImmediatePropagation(),this.open()}}var Mo="message-splitter:settings",ya={limit:7500,autoIntercept:!0,balanced:!0,mode:"parts"},xt=()=>({...ya,...b.get(Mo,{})}),Ao=(e)=>b.set(Mo,e);var va=/```[\s\S]*?(?:```|$)/g,xa=/[\u3040-\u30ff\u3400-\u9fff\uac00-\ud7af]/g,R=(e,t=!1)=>{if(!e)return 0;let n=t?e.length:0,r=t?"":e.replace(va,(i)=>(n+=i.length,"")),o=r.match(xa)?.length??0;return Math.ceil((r.length-o)/4+o+n/3.2)};var wa=` .bp-draft-meter, .bp-draft-banner { position: fixed; z-index: 99990; display: none; align-items: center; gap: 8px; padding: 4px 10px; border: 1px solid var(--bp-border); border-radius: 999px; background: var(--bp-bg); color: var(--bp-fg); box-shadow: 0 4px 14px rgb(0 0 0 / 14%); font: 11px/1.4 ui-sans-serif, system-ui, sans-serif; white-space: nowrap; } .bp-draft-meter[data-visible='true'], .bp-draft-banner[data-visible='true'] { display: inline-flex; } .bp-draft-meter[data-level='warn'] { border-color: var(--bp-yellow); color: var(--bp-yellow); } .bp-draft-meter[data-level='danger'] { border-color: var(--bp-red); color: var(--bp-red); } .bp-draft-meter button, .bp-draft-banner button { padding: 1px 8px; border: 1px solid var(--bp-border); border-radius: 999px; background: transparent; color: inherit; font: inherit; cursor: pointer; } .bp-draft-meter button:hover, .bp-draft-banner button:hover { background: var(--bp-accent); } .bp-draft-meter button[hidden] { display: none; } `,$o=()=>M("better-perplexity-draft-styles",wa);var Sa=0.7,Ea=0.9,wt=8,ka=(e)=>{let t=Math.floor(e/60000);if(t<1)return"just now";if(t<60)return`${t}m ago`;let n=Math.floor(t/60);return n<24?`${n}h ago`:`${Math.floor(n/24)}d ago`};class Tn{meter=S(a("div","bp-draft-meter bp-themed"));meterText=a("span");splitButton=a("button",void 0,"Split");banner=S(a("div","bp-draft-banner bp-themed"));bannerText=a("span");restoreButton=a("button",void 0,"Restore");discardButton=a("button",void 0,"Discard");constructor(){C(),$o(),this.splitButton.type="button",this.splitButton.hidden=!0,this.restoreButton.type="button",this.discardButton.type="button",this.meter.append(this.meterText,this.splitButton),this.banner.append(this.bannerText,this.restoreButton,this.discardButton)}onSplit(e){this.splitButton.onclick=e}showMeter(e,t,n){let r=R(t),o=r/n,i=Math.round(n*4);this.meterText.textContent=`${t.length.toLocaleString()} / ~${i.toLocaleString()} chars · ~${r.toLocaleString()} / ${n.toLocaleString()} tokens`,this.meter.dataset.level=o>=Ea?"danger":o>=Sa?"warn":"ok",this.splitButton.hidden=o<1,this.mount(this.meter),this.meter.dataset.visible="true",this.position(e)}hideMeter(){this.meter.dataset.visible="false"}showBanner(e,t,n,r){this.bannerText.textContent=`Draft from ${ka(Date.now()-t.at)}`,this.restoreButton.onclick=n,this.discardButton.onclick=r,this.mount(this.banner),this.banner.dataset.visible="true",this.position(e)}hideBanner(){this.banner.dataset.visible="false"}position(e){let t=e.getBoundingClientRect(),n=Math.max(wt,t.top-this.meter.offsetHeight-wt);this.meter.style.top=`${n}px`,this.meter.style.left=`${Math.max(wt,t.right-this.meter.offsetWidth)}px`,this.banner.style.top=`${n}px`,this.banner.style.left=`${Math.max(wt,t.left)}px`}hideAll(){this.hideMeter(),this.hideBanner()}mount(e){if(!e.isConnected)document.body.appendChild(e)}}var Ro="draft-guard:drafts",Po=2592000000,Ta=50,Ca=200000;class Cn{get(e){let t=this.read()[e];return t&&Date.now()-t.atDate.now()-n.atr[1].at-n[1].at),Object.fromEntries(t.slice(0,Ta))}}var La=/\/rest\/(?:event|events|analytics|metrics|telemetry|log|logs|rate-limit|user\/settings|user\/info|auth|experiments|flags|ping)\b/i,Ma=/\/rest\/sse\/|\/rest\/(?:agent|agents|computer|ask|query|chat|conversation)\b|perplexity_ask/i,Aa=(e)=>{try{return new URL(e,location.origin).pathname}catch{return e}},St=(e,t)=>{let n=Aa(t);return e==="POST"&&!La.test(n)&&Ma.test(n)};var $a=400,Ra=3000,_o="draft-guard:warn-on-close",Pa="message-splitter:split",Io=()=>location.pathname||"/",Le=(e)=>e.replace(/[\s\u200b]/g,"")!=="";class Ln extends T{id="draft-guard";name="Draft Guard";description="Autosaves drafts, shows a size meter and warns about unsent text.";store=new Cn;overlay=new Tn;wired=new WeakSet;dismissed=new Set;typed=new Set;offered=new Map;key=Io();lastText="";saveTimer=0;sendIntentAt=0;guardAttached=!1;composer=null;constructor(e){super(e);this.overlay.onSplit(()=>this.context.runCommand(Pa)),xe.subscribe(({method:t,url:n})=>{if(this.enabled&&St(t,n)&&Le(this.lastText))this.discard(this.key)}),document.addEventListener("click",this.handleClick,!0),document.addEventListener("keydown",this.handleKeydown,!0),window.addEventListener("scroll",this.reposition,!0),window.addEventListener("resize",this.reposition)}get warnOnClose(){return b.get(_o,!0)}set warnOnClose(e){b.set(_o,e)}run(){if(!this.enabled){this.teardown();return}this.syncGuard();let e=A();if(this.composer=e,!e){this.overlay.hideAll();return}this.wire(e),this.syncThread();let t=G(e);if(t!==this.lastText)this.handleChange(t);this.refreshOverlay(e,t)}menuEntries(){return[{id:"guard",label:`${this.warnOnClose?"Disable":"Enable"} Unsent-Text Warning`,action:()=>this.toggleGuard()}]}wire(e){if(this.wired.has(e))return;this.wired.add(e),e.addEventListener("input",(t)=>{if(t.isTrusted)this.typed.add(this.key);this.run()})}syncThread(){let e=Io();if(e===this.key)return;window.clearTimeout(this.saveTimer),this.key=e,this.lastText=""}handleChange(e){let t=this.lastText;if(this.lastText=e,window.clearTimeout(this.saveTimer),!Le(e)){if(Le(t)&&Date.now()-this.sendIntentAtthis.store.set(n,e),$a)}discard(e){window.clearTimeout(this.saveTimer),this.store.remove(e),this.offered.delete(e),this.dismissed.add(e),this.overlay.hideBanner()}refreshOverlay(e,t){if(Le(t))this.overlay.showMeter(e,t,xt().limit);else this.overlay.hideMeter();let n=this.key;if(this.dismissed.has(n)||this.typed.has(n)){this.offered.delete(n),this.overlay.hideBanner();return}let r=this.offered.get(n)??this.store.get(n);if(!r){this.overlay.hideBanner();return}this.offered.set(n,r),this.overlay.showBanner(e,r,()=>{this.offered.delete(n),this.dismissed.add(n),this.overlay.hideBanner(),H(e,r.text)},()=>this.discard(n))}isComposerControl(e){let t=this.composer;if(!t)return!1;let n=t.closest("form");if(n)return n.contains(e);let r=t;for(let o=0;r&&o<4;o++){if(r.contains(e))return!0;r=r.parentElement}return!1}handleClick=(e)=>{let t=J(e.target)?.closest("button");if(!this.enabled||!t||!at(t)||!this.isComposerControl(t))return;this.sendIntentAt=Date.now(),this.dismissed.add(this.key),this.offered.delete(this.key),this.overlay.hideBanner()};handleKeydown=(e)=>{if(e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&Le(this.lastText))this.sendIntentAt=Date.now()};reposition=()=>{if(this.composer?.isConnected)this.overlay.position(this.composer)};handleBeforeUnload=(e)=>{let t=this.composer??A();if(!t||!Le(G(t)))return;e.preventDefault(),e.returnValue=""};syncGuard(){if(this.warnOnClose&&!this.guardAttached)window.addEventListener("beforeunload",this.handleBeforeUnload),this.guardAttached=!0;else if(!this.warnOnClose&&this.guardAttached)window.removeEventListener("beforeunload",this.handleBeforeUnload),this.guardAttached=!1}toggleGuard(){this.warnOnClose=!this.warnOnClose,this.context.refreshMenu(),this.context.requestUpdate()}teardown(){if(this.overlay.hideAll(),this.guardAttached)window.removeEventListener("beforeunload",this.handleBeforeUnload);this.guardAttached=!1}}var _a=` .bp-config-button { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; cursor: pointer; } .bp-config-button svg { pointer-events: none; } `,Oo=()=>M("better-perplexity-enter-styles",_a);var Mn="http://www.w3.org/2000/svg",Ia=()=>{let e=document.createElementNS(Mn,"svg");for(let[r,o]of Object.entries({width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"}))e.setAttribute(r,o);let t=document.createElementNS(Mn,"polyline");t.setAttribute("points","9 10 4 15 9 20");let n=document.createElementNS(Mn,"path");return n.setAttribute("d","M20 4v7a4 4 0 0 1-4 4H4"),e.append(t,n),e};class An{element=S(a("button","bp-config-button"));tooltip;appliedClass="";constructor(e,t){C(),Oo(),this.element.type="button",this.element.setAttribute("aria-label","Configure Enter as Newline"),this.element.appendChild(Ia()),this.element.addEventListener("click",(n)=>{n.preventDefault(),n.stopPropagation(),e()}),this.tooltip=new K(this.element,(n)=>{n.append(a("div","bp-tip-mode","Enter as Newline"),a("div","bp-tip-sub",t()),a("div","bp-tip-foot","Click to configure"))})}mount(){let{first:e,submit:t}=Ue();if(!e&&!t){this.unmount();return}if(e)this.syncClass(e);if(e?e.nextElementSibling===this.element:t?.previousElementSibling===this.element)return;if(e)e.insertAdjacentElement("afterend",this.element);else t?.insertAdjacentElement("beforebegin",this.element)}unmount(){this.tooltip.hide(),this.element.remove()}syncClass(e){let t=`${e.className} bp-config-button`;if(t===this.appliedClass)return;this.element.className=t,this.appliedClass=t}}var Do="enter-as-newline:shortcuts",Me=[{key:"ctrl",label:"Ctrl + Enter",flag:"ctrlKey"},{key:"alt",label:"Alt + Enter",flag:"altKey"},{key:"meta",label:"Meta / Cmd + Enter",flag:"metaKey"},{key:"shift",label:"Shift + Enter",flag:"shiftKey"}],Ye={ctrl:!0,alt:!1,meta:!0,shift:!1},Bo=()=>{let e=b.get(Do,Ye),t=Me.map(({key:n})=>[n,typeof e?.[n]==="boolean"?e[n]:Ye[n]]);return Object.fromEntries(t)},No=(e)=>b.set(Do,e),Fo=(e,t)=>{let n=Me.filter(({flag:r})=>e[r]);return n.length===1&&t[n[0].key]},Ho=(e)=>Me.some(({flag:t})=>e[t]),Ae=(e)=>{let t=Me.filter(({key:n})=>e[n]).map(({label:n})=>n);return t.length?`Sends with: ${t.join(", ")}. Plain Enter inserts a newline.`:"No send shortcut selected: messages can only be sent with the button."};var Uo="better-perplexity-enter-dialog",jo=(e,t)=>{let n=document.getElementById(Uo);if(n instanceof HTMLDialogElement){n.close();return}let r=k({id:Uo,title:"Enter as Newline",description:"Choose which keyboard shortcuts send your message.",width:440}),o={...e},i=a("p","bp-hint",Ae(o)),s=a("div","bp-stack"),p=new Map;for(let{key:c,label:u}of Me){let{wrapper:m,input:f}=D({label:u,checked:o[c],onChange:(g)=>{o[c]=g,i.textContent=Ae(o)}});p.set(c,f),s.appendChild(m)}r.body.append(s,i);let l=()=>{for(let[c,u]of p)o[c]=Ye[c],u.checked=Ye[c];i.textContent=Ae(o)},d=()=>{t({...o}),E.success("Send shortcuts saved.",o),r.close()};r.footer.append(y("Cancel",{onClick:r.close}),y("Reset",{onClick:l}),y("Save",{primary:!0,onClick:d})),r.show()};var Oa='textarea, [contenteditable="true"], [contenteditable="plaintext-only"]',Ko=(e)=>{let t=e.composedPath()[0]??e.target,n=J(t)?.closest(Oa);if(!n?.isConnected)return null;return n instanceof HTMLTextAreaElement||n.isContentEditable?n:null},zo=(e)=>e.isComposing||e.keyCode===229,Da=(e)=>{if(e instanceof HTMLTextAreaElement){e.setRangeText(` `,e.selectionStart,e.selectionEnd,"end"),e.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0,inputType:"insertLineBreak",data:` `}));return}let t=window.getSelection();if(!t)return;let n=t.rangeCount>0?t.getRangeAt(0):document.createRange();if(!e.contains(n.commonAncestorContainer))n.selectNodeContents(e),n.collapse(!1);n.deleteContents();let r=document.createElement("br");n.insertNode(r),n.setStartAfter(r),n.collapse(!0),t.removeAllRanges(),t.addRange(n),e.dispatchEvent(new InputEvent("input",{bubbles:!0,composed:!0,inputType:"insertLineBreak",data:null}))},qo=(e)=>{if(Ne(e,!0))Da(e)},Go=(e)=>{if(Ne(e,!1))st(e)?.click()};class $n extends T{id="enter-as-newline";name="Enter as Newline";description="Use Enter for newlines and configurable shortcuts to send messages.";shortcuts=Bo();attached=!1;configButton=new An(()=>this.configure(),()=>Ae(this.shortcuts));run(){if(this.enabled)this.configButton.mount();else this.configButton.unmount();if(this.enabled&&!this.attached){window.addEventListener("keydown",this.handleKeydown,!0),this.attached=!0,E.success("Enter as Newline listener registered.");return}if(!this.enabled&&this.attached)window.removeEventListener("keydown",this.handleKeydown,!0),this.attached=!1,E.info("Enter as Newline listener removed.")}menuEntries(){return[{label:"Configure Enter as Newline",action:()=>this.configure()}]}configure(){jo(this.shortcuts,(e)=>{this.shortcuts=e,No(e)})}handleKeydown=(e)=>{if(e.key!=="Enter"||zo(e)||Qt(e))return;let t=Ko(e);if(!t)return;if(Fo(e,this.shortcuts)){e.preventDefault(),e.stopImmediatePropagation(),Go(t);return}if(Ho(e))return;e.preventDefault(),e.stopImmediatePropagation(),qo(t)}}var Ba=new RegExp("(?:^|;\\s*)__Host-pplx-last-active-account=([^;]+)"),Na=/(?:^|;\s*)__Secure-pplx\.session\.([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})=/i,Et=()=>{let e=document.cookie,t=Ba.exec(e)?.[1];if(t)return decodeURIComponent(t);return Na.exec(e)?.[1]??null};var Fa=new Set(["discover","library","spaces","settings","account","finance","computer","pages","collections"]),Ha="usage-status:account-id",Ua={"x-app-apiclient":"default","x-app-apiversion":"2.18"},ja=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Vo=(e,t={})=>{let n=Et()??b.get(Ha,null),r=t.headers??{};return fetch(`${location.origin}${e}`,{credentials:"include",...t,headers:{...Ua,...n?{"x-pplx-account":n}:{},...r}})},$e=()=>{let e=location.pathname.split("/").filter(Boolean);return e.length>=2&&!Fa.has(e[0])?e.at(-1)??null:null},Yo=(e,t,n=0)=>{if(!e||typeof e!=="object"||n>6)return null;for(let[r,o]of Object.entries(e))if(t.includes(r)&&typeof o==="string"&&ja.test(o))return o;for(let r of Object.values(e)){let o=Yo(r,t,n+1);if(o)return o}return null},Wo=async(e,t,n)=>{let r=await Vo("/rest/thread/export",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({thread_uuid:e,format:t,filename:n})});if(!r.ok)throw Error(`Export request returned HTTP ${r.status}`);let o=await r.json();if(!o.file_content_64)throw Error("The export response had no file content.");return{filename:o.filename??`${n}.${t}`,bytes:Uint8Array.from(atob(o.file_content_64),(i)=>i.charCodeAt(0))}},Jo=async(e)=>{let t=await Vo(`/rest/thread/${encodeURIComponent(e)}`);if(!t.ok)throw Error(`Thread request returned HTTP ${t.status}`);return t.json()},Xo=async(e,t)=>{let n=$e();if(!n)throw Error("Open a thread first.");try{return await Wo(n,e,t)}catch(r){let o=Yo(await Jo(n).catch(()=>null),["thread_uuid","uuid"]);if(!o||o===n)throw r;return Wo(o,e,t)}},Qo=async()=>{let e=$e();if(!e)throw Error("Open a thread first.");return JSON.stringify(await Jo(e),null,2)};var kt=(e,t,n="text/plain")=>{let r=URL.createObjectURL(new Blob([t],{type:n})),o=document.createElement("a");o.href=r,o.download=e,o.click(),URL.revokeObjectURL(r)};var Ka=/^\[\^(\w+)\]:[ \t]*(.*)$/gm,za=/\[\^(\w+)\]/g,Rn=(e)=>{try{return new URL(e).hostname.replace(/^www\./,"")}catch{return e}},qa=(e)=>{let t=/\[([^\]]*)\]\((https?:\/\/[^)\s]+)\)/.exec(e);if(t?.[2])return{url:t[2],title:t[1]||Rn(t[2])};let n=/https?:\/\/\S+/.exec(e);return n?{url:n[0],title:Rn(n[0])}:null},Zo=(e)=>e.replace(/^\s*]*>\s*/i,""),ei=(e,t)=>{let n=new Map,r=e.replace(Ka,(d,c,u)=>{let m=qa(u);if(m)n.set(c,m);return""}),o=new Map,i=[],s=(d)=>{let c=o.get(d.url);if(c===void 0)i.push(d),c=i.length,o.set(d.url,c);return c},p=r.replace(za,(d,c)=>{let u=n.get(c);if(!u)return d;if(t==="none")return"";let m=s(u);switch(t){case"inline":return`[${m}](${u.url})`;case"parenthesized":return`([${m}](${u.url}))`;case"named":return`([${Rn(u.url)}](${u.url}))`;case"footnotes":return`[^${m}]`;default:return`[${m}]`}}),l="";if(t==="endnotes")l=` ## Sources ${i.map((d,c)=>`${c+1}. [${d.title}](${d.url})`).join(` `)}`;if(t==="footnotes")l=` ${i.map((d,c)=>`[^${c+1}]: ${d.url}`).join(` `)}`;return`${p.replace(/\n{3,}/g,` `).trim()}${i.length?l:""} `};var Ga=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t++){let n=t;for(let r=0;r<8;r++)n=n&1?3988292384^n>>>1:n>>>1;e[t]=n>>>0}return e})(),Wa=(e)=>{let t=4294967295;for(let n of e)t=Ga[(t^n)&255]^t>>>8;return(t^4294967295)>>>0},Va=(e)=>{let t=new Uint8Array(e.reduce((r,o)=>r+o.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t},ti=(e)=>{let t=new TextEncoder,n=[],r=[],o=0;for(let{name:p,data:l}of e){let d=t.encode(p),c=Wa(l),u=new DataView(new ArrayBuffer(30));u.setUint32(0,67324752,!0),u.setUint16(4,20,!0),u.setUint16(6,2048,!0),u.setUint16(12,33,!0),u.setUint32(14,c,!0),u.setUint32(18,l.length,!0),u.setUint32(22,l.length,!0),u.setUint16(26,d.length,!0),n.push(new Uint8Array(u.buffer),d,l);let m=new DataView(new ArrayBuffer(46));m.setUint32(0,33639248,!0),m.setUint16(4,20,!0),m.setUint16(6,20,!0),m.setUint16(8,2048,!0),m.setUint16(14,33,!0),m.setUint32(16,c,!0),m.setUint32(20,l.length,!0),m.setUint32(24,l.length,!0),m.setUint16(28,d.length,!0),m.setUint32(42,o,!0),r.push(new Uint8Array(m.buffer),d),o+=30+d.length+l.length}let i=r.reduce((p,l)=>p+l.length,0),s=new DataView(new ArrayBuffer(22));return s.setUint32(0,101010256,!0),s.setUint16(8,e.length,!0),s.setUint16(10,e.length,!0),s.setUint32(12,i,!0),s.setUint32(16,o,!0),Va([...n,...r,new Uint8Array(s.buffer)])};var ni="http://schemas.openxmlformats.org/wordprocessingml/2006/main",Tt="http://schemas.openxmlformats.org/officeDocument/2006/relationships",Ya=[40,32,28,26,24,22],Ja=["top","left","bottom","right","insideH","insideV"],Pn=(e)=>e.replace(/[&<>"]/g,(t)=>({"&":"&","<":"<",">":">",'"':"""})[t]??t),Xa=()=>{let e=Ya.map((n,r)=>``).join(""),t=Ja.map((n)=>``).join("");return`${e}${t}`},ri=(e)=>{let t=[],n=(f)=>{let g=t.indexOf(f);if(g<0)t.push(f),g=t.length-1;return g+10},r=(f,g=!1)=>{let x=`${f.link?'':""}${f.code?'':""}${f.bold||g?"":""}${f.italic?"":""}${f.code?'':""}`,v=`${x?`${x}`:""}${Pn(f.text)}`;return f.link?`${v}`:v},o=(f,g=!1)=>f.map((x)=>r(x,g)).join(""),i=(f,g="",x="")=>`${g||x?`${g?``:""}${x}`:""}${f}`,s=(f)=>`${Pn(f)}`,p=e.map((f)=>{switch(f.type){case"heading":return i(o(f.inlines),`Heading${Math.min(f.level,6)}`);case"paragraph":return i(o(f.inlines));case"quote":return i(o(f.inlines),"Quote");case"rule":return i("","",'');case"item":return i(`${s(f.ordered?`${f.number}.`:"•")}${o(f.inlines)}`,"",``);case"code":return f.text.split(` `).map((g)=>i(s(g.replace(/\t/g," ")),"Code")).join("")+i("");case"table":{let g=Math.max(1,f.header.length),x=Math.floor(9600/g),v=(h,w)=>`${Array.from({length:g},(I,N)=>`${w?'':""}${i(o(h[N]??[],w))}`).join("")}`;return`${Array.from({length:g},()=>``).join("")}${v(f.header,!0)}${f.rows.map((h)=>v(h,!1)).join("")}${i("")}`}}}).join(""),l=`${p}${i("")}`,d=`${t.map((f,g)=>``).join("")}`,c='',u=``,m=new TextEncoder;return ti([{name:"[Content_Types].xml",data:m.encode('')},{name:"_rels/.rels",data:m.encode(u)},{name:"word/document.xml",data:m.encode(l)},{name:"word/styles.xml",data:m.encode(Xa())},{name:"word/_rels/document.xml.rels",data:m.encode(d)}])};var Qa=/`(?[^`]+)`|\*\*(?.+?)\*\*|__(?.+?)__|\[(?