From 34728ae097e18b09bebd32dd74bc65332554a504 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Thu, 3 Jul 2025 17:05:55 +0200 Subject: [PATCH] [build] /static --- searx/static/themes/simple/js/searxng.head.min.js | 2 +- searx/static/themes/simple/js/searxng.head.min.js.map | 2 +- searx/static/themes/simple/js/searxng.min.js | 4 ++-- searx/static/themes/simple/js/searxng.min.js.map | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/searx/static/themes/simple/js/searxng.head.min.js b/searx/static/themes/simple/js/searxng.head.min.js index e2cabc4a9..77a2e6364 100644 --- a/searx/static/themes/simple/js/searxng.head.min.js +++ b/searx/static/themes/simple/js/searxng.head.min.js @@ -1,2 +1,2 @@ -(function(n,t){var r=t.currentScript||function(){var s=t.getElementsByTagName("script");return s[s.length-1]}();n.searxng={settings:JSON.parse(atob(r.getAttribute("client_settings")))};var e=t.getElementsByTagName("html")[0];e.classList.remove("no-js"),e.classList.add("js")})(window,document); +((n,t)=>{const c=()=>{const s=t.getElementsByTagName("script");return s[s.length-1]},r=t.currentScript||c();n.searxng={settings:JSON.parse(atob(r.getAttribute("client_settings")))};const e=t.getElementsByTagName("html")[0];e.classList.remove("no-js"),e.classList.add("js")})(window,document); //# sourceMappingURL=searxng.head.min.js.map diff --git a/searx/static/themes/simple/js/searxng.head.min.js.map b/searx/static/themes/simple/js/searxng.head.min.js.map index 058ea4b20..132c74cf8 100644 --- a/searx/static/themes/simple/js/searxng.head.min.js.map +++ b/searx/static/themes/simple/js/searxng.head.min.js.map @@ -1 +1 @@ -{"version":3,"file":"searxng.head.min.js","sources":["../../../../../client/simple/src/js/head/00_init.js"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d) {\n 'use strict';\n\n // add data- properties\n var script = d.currentScript || (function () {\n var scripts = d.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n\n w.searxng = {\n settings: JSON.parse(atob(script.getAttribute('client_settings')))\n };\n\n // update the css\n var htmlElement = d.getElementsByTagName(\"html\")[0];\n htmlElement.classList.remove('no-js');\n htmlElement.classList.add('js');\n\n})(window, document);\n"],"names":["w","d","script","scripts","htmlElement"],"mappings":"CACC,SAAUA,EAAGC,EAAG,CAIf,IAAIC,EAASD,EAAE,eAAmB,UAAY,CAC5C,IAAIE,EAAUF,EAAE,qBAAqB,QAAQ,EAC7C,OAAOE,EAAQA,EAAQ,OAAS,CAAC,CACrC,EAAM,EAEJH,EAAE,QAAU,CACV,SAAU,KAAK,MAAM,KAAKE,EAAO,aAAa,iBAAiB,CAAC,CAAC,CAClE,EAGD,IAAIE,EAAcH,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAClDG,EAAY,UAAU,OAAO,OAAO,EACpCA,EAAY,UAAU,IAAI,IAAI,CAEhC,GAAG,OAAQ,QAAQ"} +{"version":3,"file":"searxng.head.min.js","sources":["../../../../../client/simple/src/js/head/00_init.js"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n((w, d) => {\n // add data- properties\n const getLastScriptElement = () => {\n const scripts = d.getElementsByTagName(\"script\");\n return scripts[scripts.length - 1];\n };\n\n const script = d.currentScript || getLastScriptElement();\n\n w.searxng = {\n settings: JSON.parse(atob(script.getAttribute(\"client_settings\")))\n };\n\n // update the css\n const htmlElement = d.getElementsByTagName(\"html\")[0];\n htmlElement.classList.remove(\"no-js\");\n htmlElement.classList.add(\"js\");\n})(window, document);\n"],"names":["w","d","getLastScriptElement","scripts","script","htmlElement"],"mappings":"CACC,CAACA,EAAGC,IAAM,CAET,MAAMC,EAAuB,IAAM,CACjC,MAAMC,EAAUF,EAAE,qBAAqB,QAAQ,EAC/C,OAAOE,EAAQA,EAAQ,OAAS,CAAC,CACrC,EAEQC,EAASH,EAAE,eAAiBC,EAAoB,EAEtDF,EAAE,QAAU,CACV,SAAU,KAAK,MAAM,KAAKI,EAAO,aAAa,iBAAiB,CAAC,CAAC,CACrE,EAGE,MAAMC,EAAcJ,EAAE,qBAAqB,MAAM,EAAE,CAAC,EACpDI,EAAY,UAAU,OAAO,OAAO,EACpCA,EAAY,UAAU,IAAI,IAAI,CAChC,GAAG,OAAQ,QAAQ"} \ No newline at end of file diff --git a/searx/static/themes/simple/js/searxng.min.js b/searx/static/themes/simple/js/searxng.min.js index 8d0362fab..eddb8cd23 100644 --- a/searx/static/themes/simple/js/searxng.min.js +++ b/searx/static/themes/simple/js/searxng.min.js @@ -3,12 +3,12 @@ * (C) Copyright Contributors to the SearXNG project. * (C) Copyright Contributors to the searx project (2014 - 2021). * SPDX-License-Identifier: AGPL-3.0-or-later - */window.searxng=function(h,s){h.Element&&function(n){n.matches=n.matches||n.matchesSelector||n.webkitMatchesSelector||n.msMatchesSelector||function(l){for(var t=this,r=(t.parentNode||t.document).querySelectorAll(l),o=-1;r[++o]&&r[o]!=t;);return!!r[o]}}(Element.prototype);function a(n,l,t){try{n.call(l,t)}catch(r){console.log(r)}}var f=window.searxng||{};f.on=function(n,l,t,r){r=r||!1,typeof n!="string"?n.addEventListener(l,t,r):s.addEventListener(l,function(o){for(var i=o.target||o.srcElement,p=!1;i&&i.matches&&i!==s&&!(p=i.matches(n));)i=i.parentElement;p&&a(t,i,o)},r)},f.ready=function(n){document.readyState!="loading"?n.call(h):h.addEventListener("DOMContentLoaded",n.bind(h))},f.http=function(n,l,t=null){return new Promise(function(r,o){try{var i=new XMLHttpRequest;i.open(n,l,!0),i.timeout=2e4,i.onload=function(){i.status==200?r(i.response,i.responseType):o(Error(i.statusText))},i.onerror=function(){o(Error("Network Error"))},i.onabort=function(){o(Error("Transaction is aborted"))},i.ontimeout=function(){o(Error("Timeout"))},t?i.send(t):i.send()}catch(p){o(p)}})},f.loadStyle=function(n){var l=f.settings.theme_static_path+"/"+n,t="style_"+n.replace(".","_"),r=s.getElementById(t);r===null&&(r=s.createElement("link"),r.setAttribute("id",t),r.setAttribute("rel","stylesheet"),r.setAttribute("type","text/css"),r.setAttribute("href",l),s.body.appendChild(r))},f.loadScript=function(n,l){var t=f.settings.theme_static_path+"/"+n,r="script_"+n.replace(".","_"),o=s.getElementById(r);if(o===null)o=s.createElement("script"),o.setAttribute("id",r),o.setAttribute("src",t),o.onload=l,o.onerror=function(){o.setAttribute("error","1")},s.body.appendChild(o);else if(o.hasAttribute("error"))console.log("callback not executed : script '"+t+"' not loaded.");else try{l.apply(o,[])}catch(i){console.log(i)}},f.insertBefore=function(n,l){l.parentNode.insertBefore(n,l)},f.insertAfter=function(n,l){l.parentNode.insertAfter(n,l.nextSibling)},f.on(".close","click",function(){this.parentNode.classList.add("invisible")});function m(){for(var n of s.getElementsByTagName("body")[0].classList.values())if(n.endsWith("_endpoint"))return n.split("_")[0];return""}return f.endpoint=m(),f}(window,document);searxng.ready(function(){if(searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype,searxng.endpoint!=="results")return;if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let h=document;var s=h.getElementById("results").classList.contains("only_template_images");function a(){var n=h.createElement("div");return n.classList.add("loader"),n}function f(n,l){n.textContent="",l.forEach(t=>n.appendChild(t))}function m(n){var l=h.querySelector("#pagination form.next_page");if(l){f(h.querySelector("#pagination"),[a()]);var t=new FormData(l);searxng.http("POST",h.querySelector("#search").getAttribute("action"),t).then(function(r){var o=new DOMParser().parseFromString(r,"text/html"),i=o.querySelectorAll("#urls article"),p=o.querySelector("#pagination");h.querySelector("#pagination").remove(),i.length>0&&!s&&h.querySelector("#urls").appendChild(h.createElement("hr")),i.forEach(b=>{h.querySelector("#urls").appendChild(b)}),p&&(h.querySelector("#results").appendChild(p),n())}).catch(function(r){console.log(r);var o=h.createElement("div");o.textContent=searxng.settings.translations.error_loading_next_page,o.classList.add("dialog-error"),o.setAttribute("role","alert"),f(h.querySelector("#pagination"),[o])})}}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const n={rootMargin:"20rem"},l="article.result:last-child",t=new IntersectionObserver(r=>{const o=r[0];o.isIntersecting&&(t.unobserve(o.target),m(()=>t.observe(h.querySelector(l),n)))});t.observe(h.querySelector(l),n)}});searxng.ready(function(){function h(e){for(;e!==void 0;){if(e.classList.contains("detail"))return!0;if(e.classList.contains("result"))return!1;e=e.parentNode}return!1}function s(e){for(;e!==void 0;){if(e.classList.contains("result"))return e;e=e.parentNode}}function a(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(e){if(!h(e.target)){l(this)(!0,!0);let u=s(e.target);a(u)&&(e.preventDefault(),searxng.selectImage(u))}}),searxng.on(".result a","focus",function(e){if(!h(e.target)){let u=s(e.target);u&&u.getAttribute("data-vim-selected")===null&&l(u)(!0),a(u)&&searxng.selectImage(u)}},!0);var f={Escape:{key:"ESC",fun:r,des:"remove focus from the focused input",cat:"Control"},c:{key:"c",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"},h:{key:"h",fun:w,des:"toggle help window",cat:"Other"},i:{key:"i",fun:g,des:"focus on the search input",cat:"Control"},n:{key:"n",fun:i(),des:"go to next page",cat:"Results"},o:{key:"o",fun:v(!1),des:"open search result",cat:"Results"},p:{key:"p",fun:p(),des:"go to previous page",cat:"Results"},r:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},t:{key:"t",fun:v(!0),des:"open the result in a new tab",cat:"Results"}},m={default:Object.assign({ArrowLeft:{key:"←",fun:l("up"),des:"select previous search result",cat:"Results"},ArrowRight:{key:"→",fun:l("down"),des:"select next search result",cat:"Results"}},f),vim:Object.assign({b:{key:"b",fun:c(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},f:{key:"f",fun:c(window.innerHeight),des:"scroll one page down",cat:"Navigation"},u:{key:"u",fun:c(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},d:{key:"d",fun:c(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},g:{key:"g",fun:d(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},v:{key:"v",fun:d(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},k:{key:"k",fun:l("up"),des:"select previous search result",cat:"Results"},j:{key:"j",fun:l("down"),des:"select next search result",cat:"Results"},y:{key:"y",fun:A,des:"copy url of the selected result to the clipboard",cat:"Results"}},f)},n=m[searxng.settings.hotkeys]||m.default;searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(n,e.key)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var u=e.target.tagName.toLowerCase();e.key==="Escape"?n[e.key].fun(e):(e.target===document.body||u==="a"||u==="button")&&(e.preventDefault(),n[e.key].fun())}});function l(e){return function(u,_){var k=document.querySelector(".result[data-vim-selected]"),T=e;if(k===null){if(k=document.querySelector(".result"),k===null)return;(e==="down"||e==="up")&&(T=k)}var y,S=document.querySelectorAll(".result");if(S=Array.from(S),typeof T!="string")y=T;else switch(T){case"visible":for(var q=document.documentElement.scrollTop||document.body.scrollTop,B=q+document.documentElement.clientHeight,x=0;xq)break}break;case"down":y=S[S.indexOf(k)+1]||k;break;case"up":y=S[S.indexOf(k)-1]||k;break;case"bottom":y=S[S.length-1];break;case"top":default:y=S[0]}if(y){if(k.removeAttribute("data-vim-selected"),y.setAttribute("data-vim-selected","true"),!_){var C=y.querySelector("h3 a")||y.querySelector("a");C!==null&&C.focus()}u||b()}}}function t(){document.location.reload(!0)}function r(e){const u=e.target.tagName.toLowerCase();document.activeElement&&(u==="input"||u==="select"||u==="textarea")?document.activeElement.blur():searxng.closeDetail()}function o(e){return function(){var u=document.querySelector(e);u&&u.click()}}function i(){return o('nav#pagination .next_page button[type="submit"]')}function p(){return o('nav#pagination .previous_page button[type="submit"]')}function b(){var e=document.querySelector(".result[data-vim-selected]");if(e!==null){var u=document.documentElement.scrollTop||document.body.scrollTop,_=document.documentElement.clientHeight,k=e.offsetTop,T=k+e.clientHeight,y=120;if(e.previousElementSibling===null&&T<_){window.scroll(window.scrollX,0);return}if(u>k-y)window.scroll(window.scrollX,k-y);else{var S=u+_;S a")),u!==null){var _=u.getAttribute("href");e?window.open(_):window.location.href=_}}}function E(e){var u={};for(var _ in n){var k=n[_];u[k.cat]=u[k.cat]||[],u[k.cat].push(k)}var T=Object.keys(u).sort(function(M,C){return u[C].length-u[M].length});if(T.length!==0){var y='×';y+="

How to navigate SearXNG with hotkeys

",y+="";for(var S=0;S"),y+="",(!x||B)&&(y+="")}y+="
",y+="

"+q[0].cat+"

",y+='
    ';for(var I in q)y+="
  • "+q[I].key+" "+q[I].des+"
  • ";y+="
",y+="
",e.innerHTML=y}}function w(){var e=document.querySelector("#vim-hotkeys-help");if(e==null){e=document.createElement("div"),e.id="vim-hotkeys-help",e.className="dialog-modal",E(e);var u=document.getElementsByTagName("body")[0];u.appendChild(e)}else{e.classList.toggle("invisible");return}}function A(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null)return;const u=e.getAttribute("href");navigator.clipboard.writeText(u)}searxng.scrollPageToSelected=b,searxng.selectNext=l("down"),searxng.selectPrevious=l("up")});(function(h,s,a){a.ready(function(){a.on(".searxng_init_map","click",function(f){this.classList.remove("searxng_init_map");var m=this.dataset.leafletTarget,n=parseFloat(this.dataset.mapLon),l=parseFloat(this.dataset.mapLat),t=parseFloat(this.dataset.mapZoom),r=JSON.parse(this.dataset.mapBoundingbox),o=JSON.parse(this.dataset.mapGeojson);a.loadStyle("css/leaflet.css"),a.loadScript("js/leaflet.js",function(){var i=null;if(r){var p=L.latLng(r[0],r[2]),b=L.latLng(r[1],r[3]);i=L.latLngBounds(p,b)}var c=L.map(m),d="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",g='Map data © OpenStreetMap contributors',v=new L.TileLayer(d,{minZoom:1,maxZoom:19,attribution:g}),E="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",w='Wikimedia maps | Maps data © OpenStreetMap contributors',A=new L.TileLayer(E,{minZoom:1,maxZoom:19,attribution:w});i?setTimeout(function(){c.fitBounds(i,{maxZoom:17})},0):n&&l&&(t?c.setView(new L.latLng(l,n),t):c.setView(new L.latLng(l,n),8)),c.addLayer(v);var e={"OSM Mapnik":v,"OSM Wikimedia":A};L.control.layers(e).addTo(c),o&&L.geoJson(o).addTo(c)}),f.preventDefault()})})})(window,document,window.searxng);(function(h,s,a){a.endpoint==="preferences"&&a.ready(function(){let f=null;function m(){f==null&&a.http("GET","engine_descriptions.json").then(function(i){f=JSON.parse(i);for(const[p,b]of Object.entries(f)){let c=s.querySelectorAll('[data-engine-name="'+p+'"] .engine-description');for(const d of c){let g=" ("+a.settings.translations.Source+": "+b[1]+")";d.innerHTML=b[0]+g}}})}for(const i of s.querySelectorAll("[data-engine-name]"))a.on(i,"mouseenter",m);const n=s.querySelectorAll(".enable-all-engines"),l=s.querySelectorAll(".disable-all-engines"),t=s.querySelectorAll("tbody input[type=checkbox][class~=checkbox-onoff]"),r=i=>{for(const p of t)p.offsetParent!==null&&(p.checked=!i)};for(const i of n)a.on(i,"click",()=>r(!0));for(const i of l)a.on(i,"click",()=>r(!1));const o=s.querySelector("#copy-hash");a.on(o,"click",i=>{i.preventDefault(),navigator.clipboard.writeText(o.dataset.hash),o.innerText=o.dataset.copiedText})})})(window,document,window.searxng);/*! + */window.searxng=((h,r)=>{h.Element&&(o=>{o.matches=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.msMatchesSelector||function(a){const t=(this.parentNode||this.document).querySelectorAll(a);let s=-1;for(;t[++s]&&t[s]!==this;);return!!t[s]}})(Element.prototype);function i(o,a,t){try{o.call(a,t)}catch(s){console.log(s)}}const p=window.searxng||{};p.on=(o,a,t,s)=>{s=s||!1,typeof o!="string"?o.addEventListener(a,t,s):r.addEventListener(a,l=>{let n=l.target||l.srcElement,f=!1;for(;n!=null&&n.matches&&n!==r&&(f=n.matches(o),!f);)n=n.parentElement;f&&i(t,n,l)},s)},p.ready=o=>{document.readyState!=="loading"?o.call(h):h.addEventListener("DOMContentLoaded",o.bind(h))},p.http=(o,a,t=null)=>new Promise((s,l)=>{try{const n=new XMLHttpRequest;n.open(o,a,!0),n.timeout=2e4,n.onload=()=>{n.status===200?s(n.response,n.responseType):l(Error(n.statusText))},n.onerror=()=>{l(Error("Network Error"))},n.onabort=()=>{l(Error("Transaction is aborted"))},n.ontimeout=()=>{l(Error("Timeout"))},t?n.send(t):n.send()}catch(n){l(n)}}),p.loadStyle=o=>{const a=`${p.settings.theme_static_path}/${o}`,t=`style_${o.replace(".","_")}`;let s=r.getElementById(t);s===null&&(s=r.createElement("link"),s.setAttribute("id",t),s.setAttribute("rel","stylesheet"),s.setAttribute("type","text/css"),s.setAttribute("href",a),r.body.appendChild(s))},p.loadScript=(o,a)=>{const t=`${p.settings.theme_static_path}/${o}`,s=`script_${o.replace(".","_")}`;let l=r.getElementById(s);if(l===null)l=r.createElement("script"),l.setAttribute("id",s),l.setAttribute("src",t),l.onload=a,l.onerror=()=>{l.setAttribute("error","1")},r.body.appendChild(l);else if(l.hasAttribute("error"))console.log(`callback not executed : script '${t}' not loaded.`);else try{a.apply(l,[])}catch(n){console.log(n)}},p.insertBefore=(o,a)=>{a.parentNode.insertBefore(o,a)},p.insertAfter=(o,a)=>{a.parentNode.insertAfter(o,a.nextSibling)},p.on(".close","click",function(){this.parentNode.classList.add("invisible")});function m(){for(const o of r.getElementsByTagName("body")[0].classList.values())if(o.endsWith("_endpoint"))return o.split("_")[0];return""}return p.endpoint=m(),p})(window,document);searxng.ready(()=>{if(searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype,searxng.endpoint!=="results")return;if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}const h=document,r=h.getElementById("results").classList.contains("only_template_images");function i(){const o=h.createElement("div");return o.classList.add("loader"),o}function p(o,a){o.textContent="",a.forEach(t=>o.appendChild(t))}function m(o){const a=h.querySelector("#pagination form.next_page");if(!a)return;p(h.querySelector("#pagination"),[i()]);const t=new FormData(a);searxng.http("POST",h.querySelector("#search").getAttribute("action"),t).then(s=>{const l=new DOMParser().parseFromString(s,"text/html"),n=l.querySelectorAll("#urls article"),f=l.querySelector("#pagination");h.querySelector("#pagination").remove(),n.length>0&&!r&&h.querySelector("#urls").appendChild(h.createElement("hr")),n.forEach(w=>{h.querySelector("#urls").appendChild(w)}),f&&(h.querySelector("#results").appendChild(f),o())}).catch(s=>{console.log(s);const l=h.createElement("div");l.textContent=searxng.settings.translations.error_loading_next_page,l.classList.add("dialog-error"),l.setAttribute("role","alert"),p(h.querySelector("#pagination"),[l])})}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const o={rootMargin:"20rem"},a="article.result:last-child",t=new IntersectionObserver(s=>{const l=s[0];l.isIntersecting&&(t.unobserve(l.target),m(()=>t.observe(h.querySelector(a),o)))});t.observe(h.querySelector(a),o)}});searxng.ready(()=>{function h(e){for(;e!==void 0;){if(e.classList.contains("detail"))return!0;if(e.classList.contains("result"))return!1;e=e.parentNode}return!1}function r(e){for(;e!==void 0;){if(e.classList.contains("result"))return e;e=e.parentNode}}function i(e){return e==null?void 0:e.classList.contains("result-images")}searxng.on(".result","click",function(e){if(!h(e.target)){a(this)(!0,!0);const c=r(e.target);i(c)&&(e.preventDefault(),searxng.selectImage(c))}}),searxng.on(".result a","focus",e=>{if(!h(e.target)){const c=r(e.target);c&&c.getAttribute("data-vim-selected")===null&&a(c)(!0),i(c)&&searxng.selectImage(c)}},!0);const p={Escape:{key:"ESC",fun:s,des:"remove focus from the focused input",cat:"Control"},c:{key:"c",fun:q,des:"copy url of the selected result to the clipboard",cat:"Results"},h:{key:"h",fun:E,des:"toggle help window",cat:"Other"},i:{key:"i",fun:g,des:"focus on the search input",cat:"Control"},n:{key:"n",fun:n(),des:"go to next page",cat:"Results"},o:{key:"o",fun:y(!1),des:"open search result",cat:"Results"},p:{key:"p",fun:f(),des:"go to previous page",cat:"Results"},r:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},t:{key:"t",fun:y(!0),des:"open the result in a new tab",cat:"Results"}},m={default:Object.assign({ArrowLeft:{key:"←",fun:a("up"),des:"select previous search result",cat:"Results"},ArrowRight:{key:"→",fun:a("down"),des:"select next search result",cat:"Results"}},p),vim:Object.assign({b:{key:"b",fun:d(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},f:{key:"f",fun:d(window.innerHeight),des:"scroll one page down",cat:"Navigation"},u:{key:"u",fun:d(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},d:{key:"d",fun:d(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},g:{key:"g",fun:u(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},v:{key:"v",fun:u(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},k:{key:"k",fun:a("up"),des:"select previous search result",cat:"Results"},j:{key:"j",fun:a("down"),des:"select next search result",cat:"Results"},y:{key:"y",fun:q,des:"copy url of the selected result to the clipboard",cat:"Results"}},p)},o=m[searxng.settings.hotkeys]||m.default;searxng.on(document,"keydown",e=>{if(Object.prototype.hasOwnProperty.call(o,e.key)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const c=e.target.tagName.toLowerCase();e.key==="Escape"?o[e.key].fun(e):(e.target===document.body||c==="a"||c==="button")&&(e.preventDefault(),o[e.key].fun())}});function a(e){return(c,T)=>{let v=document.querySelector(".result[data-vim-selected]"),k=e;if(v===null){if(v=document.querySelector(".result"),v===null)return;(e==="down"||e==="up")&&(k=v)}let b,_=document.querySelectorAll(".result");if(_=Array.from(_),typeof k!="string")b=k;else switch(k){case"visible":{const A=document.documentElement.scrollTop||document.body.scrollTop,x=A+document.documentElement.clientHeight;for(let I=0;I<_.length;I++){b=_[I];const C=b.offsetTop;if(C+b.clientHeight<=x&&C>A)break}break}case"down":b=_[_.indexOf(v)+1]||v;break;case"up":b=_[_.indexOf(v)-1]||v;break;case"bottom":b=_[_.length-1];break;case"top":default:b=_[0]}if(b){if(v.removeAttribute("data-vim-selected"),b.setAttribute("data-vim-selected","true"),!T){const A=b.querySelector("h3 a")||b.querySelector("a");A!==null&&A.focus()}c||w()}}}function t(){document.location.reload(!0)}function s(e){const c=e.target.tagName.toLowerCase();document.activeElement&&(c==="input"||c==="select"||c==="textarea")?document.activeElement.blur():searxng.closeDetail()}function l(e){return()=>{const c=document.querySelector(e);c&&c.click()}}function n(){return l('nav#pagination .next_page button[type="submit"]')}function f(){return l('nav#pagination .previous_page button[type="submit"]')}function w(){const e=document.querySelector(".result[data-vim-selected]");if(e===null)return;const c=document.documentElement.scrollTop||document.body.scrollTop,T=document.documentElement.clientHeight,v=e.offsetTop,k=v+e.clientHeight,b=120;if(e.previousElementSibling===null&&kv-b?window.scroll(window.scrollX,v-b):c+T{window.scrollBy(0,e),a("visible")()}}function u(e,c){return()=>{window.scrollTo(0,e),a(c)()}}function g(){window.scrollTo(0,0);const e=document.querySelector("#q");if(e.focus(),e.setSelectionRange){const c=e.value.length;e.setSelectionRange(c,c)}}function y(e){return()=>{let c=document.querySelector(".result[data-vim-selected] h3 a");if(c===null&&(c=document.querySelector(".result[data-vim-selected] > a")),c!==null){const T=c.getAttribute("href");e?window.open(T):window.location.href=T}}}function S(e){const c={};for(const k in o){const b=o[k];c[b.cat]=c[b.cat]||[],c[b.cat].push(b)}const T=Object.keys(c).sort((k,b)=>c[b].length-c[k].length);if(T.length===0)return;let v='×';v+="

How to navigate SearXNG with hotkeys

",v+="";for(let k=0;k"),v+="",(!A||_)&&(v+="")}v+="
",v+=`

${b[0].cat}

`,v+='
    ';for(const x in b)v+=`
  • ${b[x].key} ${b[x].des}
  • `;v+="
",v+="
",e.innerHTML=v}function E(){let e=document.querySelector("#vim-hotkeys-help");e==null?(e=document.createElement("div"),e.id="vim-hotkeys-help",e.className="dialog-modal",S(e),document.getElementsByTagName("body")[0].appendChild(e)):e.classList.toggle("invisible")}function q(){const e=document.querySelector(".result[data-vim-selected] h3 a");if(e===null)return;const c=e.getAttribute("href");navigator.clipboard.writeText(c)}searxng.scrollPageToSelected=w,searxng.selectNext=a("down"),searxng.selectPrevious=a("up")});((h,r,i)=>{i.ready(()=>{i.on(".searxng_init_map","click",function(p){this.classList.remove("searxng_init_map");const m=this.dataset.leafletTarget,o=parseFloat(this.dataset.mapLon),a=parseFloat(this.dataset.mapLat),t=parseFloat(this.dataset.mapZoom),s=JSON.parse(this.dataset.mapBoundingbox),l=JSON.parse(this.dataset.mapGeojson);i.loadStyle("css/leaflet.css"),i.loadScript("js/leaflet.js",()=>{let n=null;if(s){const q=L.latLng(s[0],s[2]),e=L.latLng(s[1],s[3]);n=L.latLngBounds(q,e)}const f=L.map(m),w="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",d='Map data © OpenStreetMap contributors',u=new L.TileLayer(w,{minZoom:1,maxZoom:19,attribution:d}),g="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",y='Wikimedia maps | Maps data © OpenStreetMap contributors',S=new L.TileLayer(g,{minZoom:1,maxZoom:19,attribution:y});n?setTimeout(()=>{f.fitBounds(n,{maxZoom:17})},0):o&&a&&(t?f.setView(new L.LatLng(a,o),t):f.setView(new L.LatLng(a,o),8)),f.addLayer(u);const E={"OSM Mapnik":u,"OSM Wikimedia":S};L.control.layers(E).addTo(f),l&&L.geoJson(l).addTo(f)}),p.preventDefault()})})})(window,document,window.searxng);((h,r,i)=>{i.endpoint==="preferences"&&i.ready(()=>{let p=null;function m(){p==null&&i.http("GET","engine_descriptions.json").then(n=>{p=JSON.parse(n);for(const[f,w]of Object.entries(p)){const d=r.querySelectorAll(`[data-engine-name="${f}"] .engine-description`);for(const u of d){const g=` (${i.settings.translations.Source}: ${w[1]})`;u.innerHTML=w[0]+g}}})}for(const n of r.querySelectorAll("[data-engine-name]"))i.on(n,"mouseenter",m);const o=r.querySelectorAll(".enable-all-engines"),a=r.querySelectorAll(".disable-all-engines"),t=r.querySelectorAll("tbody input[type=checkbox][class~=checkbox-onoff]"),s=n=>{for(const f of t)f.offsetParent!==null&&(f.checked=!n)};for(const n of o)i.on(n,"click",()=>s(!0));for(const n of a)i.on(n,"click",()=>s(!1));const l=r.querySelector("#copy-hash");i.on(l,"click",n=>{n.preventDefault(),navigator.clipboard.writeText(l.dataset.hash),l.innerText=l.dataset.copiedText})})})(window,document,window.searxng);/*! * swiped-events.js - v@version@ * Pure JavaScript swipe events * https://github.com/john-doherty/swiped-events * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element * @author John Doherty * @license MIT - */(function(h,s){typeof h.CustomEvent!="function"&&(h.CustomEvent=function(c,d){d=d||{bubbles:!1,cancelable:!1,detail:void 0};var g=s.createEvent("CustomEvent");return g.initCustomEvent(c,d.bubbles,d.cancelable,d.detail),g},h.CustomEvent.prototype=h.Event.prototype),s.addEventListener("touchstart",i,!1),s.addEventListener("touchmove",p,!1),s.addEventListener("touchend",o,!1);var a=null,f=null,m=null,n=null,l=null,t=null,r=0;function o(c){if(t===c.target){var d=parseInt(b(t,"data-swipe-threshold","20"),10),g=b(t,"data-swipe-unit","px"),v=parseInt(b(t,"data-swipe-timeout","500"),10),E=Date.now()-l,w="",A=c.changedTouches||c.touches||[];if(g==="vh"&&(d=Math.round(d/100*s.documentElement.clientHeight)),g==="vw"&&(d=Math.round(d/100*s.documentElement.clientWidth)),Math.abs(m)>Math.abs(n)?Math.abs(m)>d&&E0?w="swiped-left":w="swiped-right"):Math.abs(n)>d&&E0?w="swiped-up":w="swiped-down"),w!==""){var e={dir:w.replace(/swiped-/,""),touchType:(A[0]||{}).touchType||"direct",fingers:r,xStart:parseInt(a,10),xEnd:parseInt((A[0]||{}).clientX||-1,10),yStart:parseInt(f,10),yEnd:parseInt((A[0]||{}).clientY||-1,10)};t.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:e})),t.dispatchEvent(new CustomEvent(w,{bubbles:!0,cancelable:!0,detail:e}))}a=null,f=null,l=null}}function i(c){c.target.getAttribute("data-swipe-ignore")!=="true"&&(t=c.target,l=Date.now(),a=c.touches[0].clientX,f=c.touches[0].clientY,m=0,n=0,r=c.touches.length)}function p(c){if(!(!a||!f)){var d=c.touches[0].clientX,g=c.touches[0].clientY;m=a-d,n=f-g}}function b(c,d,g){for(;c&&c!==s.documentElement;){var v=c.getAttribute(d);if(v)return v;c=c.parentNode}return g}})(window,document);(function(h,s,a){a.endpoint==="results"&&a.ready(function(){s.querySelectorAll("#urls img").forEach(t=>t.addEventListener("error",()=>{t.src=window.searxng.settings.theme_static_path+"/img/img_load_error.svg"},{once:!0})),s.querySelector("#search_url button#copy_url")&&(s.querySelector("#search_url button#copy_url").style.display="block"),a.on(".btn-collapse","click",function(){var t=this.getAttribute("data-btn-text-collapsed"),r=this.getAttribute("data-btn-text-not-collapsed"),o=this.getAttribute("data-target"),i=s.querySelector(o),p=this.innerHTML;this.classList.contains("collapsed")?p=p.replace(t,r):p=p.replace(r,t),this.innerHTML=p,this.classList.toggle("collapsed"),i.classList.toggle("invisible")}),a.on(".media-loader","click",function(){var t=this.getAttribute("data-target"),r=s.querySelector(t+" > iframe"),o=r.getAttribute("src");(o==null||o===!1)&&r.setAttribute("src",r.getAttribute("data-src"))}),a.on("#copy_url","click",function(){var t=this.parentElement.querySelector("pre");navigator.clipboard.writeText(t.innerText),this.innerText=this.dataset.copiedText});let f;const m=s.createElement("div");m.classList.add("loader");const n=new Image,l=(t,r)=>{f&&clearTimeout(f),f=setTimeout(()=>{n.src=t},1e3),n.onload=()=>{r(),m.remove()},n.onerror=()=>{m.remove()}};a.selectImage=t=>{if(s.getElementById("results").classList.add("image-detail-open"),window.location.hash="#image-viewer",a.scrollPageToSelected(),!t)return;const r=t.querySelector(".result-images-source img");if(!r)return;const o=r.getAttribute("data-src");if(!o)return;const i=t.querySelector(".image_thumbnail");r.src=i.src,t.querySelector(".detail").appendChild(m),l(o,()=>{r.src=o,r.removeAttribute("data-src")})},a.closeDetail=function(){s.getElementById("results").classList.remove("image-detail-open"),window.location.hash=="#image-viewer"&&window.history.back(),a.scrollPageToSelected()},a.on(".result-detail-close","click",t=>{t.preventDefault(),a.closeDetail()}),a.on(".result-detail-previous","click",t=>{t.preventDefault(),a.selectPrevious(!1)}),a.on(".result-detail-next","click",t=>{t.preventDefault(),a.selectNext(!1)}),window.addEventListener("hashchange",()=>{window.location.hash!="#image-viewer"&&a.closeDetail()}),s.querySelectorAll(".swipe-horizontal").forEach(t=>{t.addEventListener("swiped-left",function(){a.selectNext(!1)}),t.addEventListener("swiped-right",function(){a.selectPrevious(!1)})}),h.addEventListener("scroll",function(){var t=s.getElementById("backToTop"),r=document.documentElement.scrollTop||document.body.scrollTop,o=s.getElementById("results");t!==null&&(r>=100?o.classList.add("scrolling"):o.classList.remove("scrolling"))},!0)})})(window,document,window.searxng);(function(h,s,a){var f="q",m;const n=window.matchMedia("only screen and (max-width: 50em)").matches,l=document.querySelector("main").id=="main_results";function t(){if(m.value.length>0){var i=document.getElementById("search");setTimeout(i.submit.bind(i),0)}}function r(i){var p=document.getElementById("clear_search"),b=function(){i.value.length===0?p.classList.add("empty"):p.classList.remove("empty")};b(),p.addEventListener("click",function(c){i.value="",i.focus(),b(),c.preventDefault()}),i.addEventListener("input",b,!1)}const o=async i=>{let p;if(a.settings.method==="GET"){const b=new URLSearchParams;b.append("q",i),p=fetch("./autocompleter?"+b.toString())}else{const b=new FormData;b.append("q",i),p=fetch("./autocompleter",{method:"POST",body:b})}p.then(async function(b){const c=await b.json();if(!c)return;const d=s.querySelector(".autocomplete"),g=s.querySelector(".autocomplete ul");if(d.classList.add("open"),g.innerHTML="",!c[1]||c[1].length==0){const v=document.createElement("li");v.classList.add("no-item-found"),v.innerHTML=a.settings.translations.no_item_found,g.appendChild(v);return}for(let v of c[1]){const E=document.createElement("li");E.innerText=v,a.on(E,"mousedown",()=>{m.value=v,s.querySelector("#search").submit(),d.classList.remove("open")}),g.appendChild(E)}})};a.ready(function(){!n&&!l&&document.getElementById("q").focus(),m=s.getElementById(f);const i=s.querySelector(".autocomplete"),p=s.querySelector(".autocomplete ul");m!==null&&(r(m),a.settings.autocomplete&&(a.on(m,"input",()=>{const d=m.value;d.length{d==m.value&&o(d)},300)}),a.on(m,"keyup",d=>{let g=-1;const v=p.children;for(let w=0;w=0&&v[g].classList.remove("active"),E=(g-1+v.length)%v.length):d.key==="ArrowDown"?(g>=0&&v[g].classList.remove("active"),E=(g+1)%v.length):(d.key==="Tab"||d.key==="Enter")&&i.classList.remove("open"),E!=-1){const w=v[E];w.classList.add("active"),w.classList.contains("no-item-found")||(m.value=w.innerText)}}))),m!==null&&a.settings.search_on_category_select&&s.querySelector(".search_filters")!=null&&(a.on(s.getElementById("safesearch"),"change",t),a.on(s.getElementById("time_range"),"change",t),a.on(s.getElementById("language"),"change",t));const b=s.querySelectorAll("button.category_button");for(let d of b)a.on(d,"click",g=>{if(g.shiftKey){g.preventDefault(),d.classList.toggle("selected");return}const v=s.querySelectorAll("button.category_button.selected");for(let E of v)E.classList.remove("selected");d.classList.add("selected")});const c=s.querySelector("#search");c!=null&&a.on(c,"submit",d=>{d.preventDefault();const g=s.querySelector("#selected-categories");if(g){let v=[];for(let E of b)E.classList.contains("selected")&&v.push(E.name.replace("category_",""));g.value=v.join(",")}c.submit()})})})(window,document,window.searxng); + */(function(h,r){typeof h.CustomEvent!="function"&&(h.CustomEvent=function(d,u){u=u||{bubbles:!1,cancelable:!1,detail:void 0};var g=r.createEvent("CustomEvent");return g.initCustomEvent(d,u.bubbles,u.cancelable,u.detail),g},h.CustomEvent.prototype=h.Event.prototype),r.addEventListener("touchstart",n,!1),r.addEventListener("touchmove",f,!1),r.addEventListener("touchend",l,!1);var i=null,p=null,m=null,o=null,a=null,t=null,s=0;function l(d){if(t===d.target){var u=parseInt(w(t,"data-swipe-threshold","20"),10),g=w(t,"data-swipe-unit","px"),y=parseInt(w(t,"data-swipe-timeout","500"),10),S=Date.now()-a,E="",q=d.changedTouches||d.touches||[];if(g==="vh"&&(u=Math.round(u/100*r.documentElement.clientHeight)),g==="vw"&&(u=Math.round(u/100*r.documentElement.clientWidth)),Math.abs(m)>Math.abs(o)?Math.abs(m)>u&&S0?E="swiped-left":E="swiped-right"):Math.abs(o)>u&&S0?E="swiped-up":E="swiped-down"),E!==""){var e={dir:E.replace(/swiped-/,""),touchType:(q[0]||{}).touchType||"direct",fingers:s,xStart:parseInt(i,10),xEnd:parseInt((q[0]||{}).clientX||-1,10),yStart:parseInt(p,10),yEnd:parseInt((q[0]||{}).clientY||-1,10)};t.dispatchEvent(new CustomEvent("swiped",{bubbles:!0,cancelable:!0,detail:e})),t.dispatchEvent(new CustomEvent(E,{bubbles:!0,cancelable:!0,detail:e}))}i=null,p=null,a=null}}function n(d){d.target.getAttribute("data-swipe-ignore")!=="true"&&(t=d.target,a=Date.now(),i=d.touches[0].clientX,p=d.touches[0].clientY,m=0,o=0,s=d.touches.length)}function f(d){if(!(!i||!p)){var u=d.touches[0].clientX,g=d.touches[0].clientY;m=i-u,o=p-g}}function w(d,u,g){for(;d&&d!==r.documentElement;){var y=d.getAttribute(u);if(y)return y;d=d.parentNode}return g}})(window,document);((h,r,i)=>{i.endpoint==="results"&&i.ready(()=>{r.querySelectorAll("#urls img").forEach(t=>t.addEventListener("error",()=>{t.src=`${window.searxng.settings.theme_static_path}/img/img_load_error.svg`},{once:!0})),r.querySelector("#search_url button#copy_url")&&(r.querySelector("#search_url button#copy_url").style.display="block"),i.on(".btn-collapse","click",function(){const t=this.getAttribute("data-btn-text-collapsed"),s=this.getAttribute("data-btn-text-not-collapsed"),l=this.getAttribute("data-target"),n=r.querySelector(l);let f=this.innerHTML;this.classList.contains("collapsed")?f=f.replace(t,s):f=f.replace(s,t),this.innerHTML=f,this.classList.toggle("collapsed"),n.classList.toggle("invisible")}),i.on(".media-loader","click",function(){const t=this.getAttribute("data-target"),s=r.querySelector(`${t} > iframe`),l=s.getAttribute("src");(l==null||l===!1)&&s.setAttribute("src",s.getAttribute("data-src"))}),i.on("#copy_url","click",function(){const t=this.parentElement.querySelector("pre");navigator.clipboard.writeText(t.innerText),this.innerText=this.dataset.copiedText});let p;const m=r.createElement("div");m.classList.add("loader");const o=new Image,a=(t,s)=>{p&&clearTimeout(p),p=setTimeout(()=>{o.src=t},1e3),o.onload=()=>{s(),m.remove()},o.onerror=()=>{m.remove()}};i.selectImage=t=>{if(r.getElementById("results").classList.add("image-detail-open"),window.location.hash="#image-viewer",i.scrollPageToSelected(),!t)return;const s=t.querySelector(".result-images-source img");if(!s)return;const l=s.getAttribute("data-src");if(!l)return;const n=t.querySelector(".image_thumbnail");s.src=n.src,t.querySelector(".detail").appendChild(m),a(l,()=>{s.src=l,s.removeAttribute("data-src")})},i.closeDetail=()=>{r.getElementById("results").classList.remove("image-detail-open"),window.location.hash==="#image-viewer"&&window.history.back(),i.scrollPageToSelected()},i.on(".result-detail-close","click",t=>{t.preventDefault(),i.closeDetail()}),i.on(".result-detail-previous","click",t=>{t.preventDefault(),i.selectPrevious(!1)}),i.on(".result-detail-next","click",t=>{t.preventDefault(),i.selectNext(!1)}),window.addEventListener("hashchange",()=>{window.location.hash!=="#image-viewer"&&i.closeDetail()}),r.querySelectorAll(".swipe-horizontal").forEach(t=>{t.addEventListener("swiped-left",()=>{i.selectNext(!1)}),t.addEventListener("swiped-right",()=>{i.selectPrevious(!1)})}),h.addEventListener("scroll",()=>{const t=r.getElementById("backToTop"),s=document.documentElement.scrollTop||document.body.scrollTop,l=r.getElementById("results");t!==null&&(s>=100?l.classList.add("scrolling"):l.classList.remove("scrolling"))},!0)})})(window,document,window.searxng);((h,r,i)=>{const p="q";let m;const o=window.matchMedia("only screen and (max-width: 50em)").matches,a=document.querySelector("main").id==="main_results";function t(){if(m.value.length>0){const n=document.getElementById("search");setTimeout(n.submit.bind(n),0)}}function s(n){const f=document.getElementById("clear_search"),w=()=>{n.value.length===0?f.classList.add("empty"):f.classList.remove("empty")};w(),f.addEventListener("click",d=>{n.value="",n.focus(),w(),d.preventDefault()}),n.addEventListener("input",w,!1)}const l=async n=>{let f;if(i.settings.method==="GET"){const w=new URLSearchParams;w.append("q",n),f=fetch(`./autocompleter?${w.toString()}`)}else{const w=new FormData;w.append("q",n),f=fetch("./autocompleter",{method:"POST",body:w})}f.then(async w=>{const d=await w.json();if(!d)return;const u=r.querySelector(".autocomplete"),g=r.querySelector(".autocomplete ul");if(u.classList.add("open"),g.innerHTML="",!d[1]||d[1].length===0){const y=document.createElement("li");y.classList.add("no-item-found"),y.innerHTML=i.settings.translations.no_item_found,g.appendChild(y);return}for(const y of d[1]){const S=document.createElement("li");S.innerText=y,i.on(S,"mousedown",()=>{m.value=y,r.querySelector("#search").submit(),u.classList.remove("open")}),g.appendChild(S)}})};i.ready(()=>{!o&&!a&&document.getElementById("q").focus(),m=r.getElementById(p);const n=r.querySelector(".autocomplete"),f=r.querySelector(".autocomplete ul");m!==null&&(s(m),i.settings.autocomplete&&(i.on(m,"input",()=>{const u=m.value;u.length{u===m.value&&l(u)},300)}),i.on(m,"keyup",u=>{let g=-1;const y=f.children;for(let E=0;E=0&&y[g].classList.remove("active"),S=(g-1+y.length)%y.length):u.key==="ArrowDown"?(g>=0&&y[g].classList.remove("active"),S=(g+1)%y.length):(u.key==="Tab"||u.key==="Enter")&&n.classList.remove("open"),S!==-1){const E=y[S];E.classList.add("active"),E.classList.contains("no-item-found")||(m.value=E.innerText)}}))),m!==null&&i.settings.search_on_category_select&&r.querySelector(".search_filters")!=null&&(i.on(r.getElementById("safesearch"),"change",t),i.on(r.getElementById("time_range"),"change",t),i.on(r.getElementById("language"),"change",t));const w=r.querySelectorAll("button.category_button");for(const u of w)i.on(u,"click",g=>{if(g.shiftKey){g.preventDefault(),u.classList.toggle("selected");return}const y=r.querySelectorAll("button.category_button.selected");for(const S of y)S.classList.remove("selected");u.classList.add("selected")});const d=r.querySelector("#search");d!=null&&i.on(d,"submit",u=>{u.preventDefault();const g=r.querySelector("#selected-categories");if(g){const y=[];for(const S of w)S.classList.contains("selected")&&y.push(S.name.replace("category_",""));g.value=y.join(",")}d.submit()})})})(window,document,window.searxng); //# sourceMappingURL=searxng.min.js.map diff --git a/searx/static/themes/simple/js/searxng.min.js.map b/searx/static/themes/simple/js/searxng.min.js.map index f53971a15..00d2dc93a 100644 --- a/searx/static/themes/simple/js/searxng.min.js.map +++ b/searx/static/themes/simple/js/searxng.min.js.map @@ -1 +1 @@ -{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/src/js/main/search.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add
element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a
element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n /* common base for layouts */\n var baseKeyBinding = {\n 'Escape': {\n key: 'ESC',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 'c': {\n key: 'c',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n 'h': {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n },\n 'i': {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 'n': {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 'o': {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 'p': {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 'r': {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 't': {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n };\n var keyBindingLayouts = {\n\n \"default\": Object.assign(\n { /* SearXNG layout */\n 'ArrowLeft': {\n key: '←',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'ArrowRight': {\n key: '→',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding),\n\n 'vim': Object.assign(\n { /* Vim-like Key Layout. */\n 'b': {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 'f': {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 'u': {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 'd': {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 'g': {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 'v': {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 'k': {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'j': {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 'y': {\n key: 'y',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\n },\n }, baseKeyBinding)\n }\n\n var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (\n Object.prototype.hasOwnProperty.call(keyBindings, e.key)\n && !e.ctrlKey && !e.altKey\n && !e.shiftKey && !e.metaKey\n ) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.key === 'Escape') {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult (which) {\n return function (noScroll, keepFocus) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = results[results.indexOf(current) + 1] || current;\n break;\n case 'up':\n next = results[results.indexOf(current) - 1] || current;\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n if (!keepFocus) {\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n var q = document.querySelector('#q');\n q.focus();\n if (q.setSelectionRange) {\n var len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in keyBindings) {\n var key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

How to navigate SearXNG with hotkeys

';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
';\n\n html += '

' + cat[0].cat + '

';\n html += '
    ';\n\n for (var cj in cat) {\n html += '
  • ' + cat[cj].key + ' ' + cat[cj].des + '
  • ';\n }\n\n html += '
';\n html += '
';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // toggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n function copyURLToClipboard () {\n var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute('href');\n navigator.clipboard.writeText(url);\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occur only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n\n const enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(false));\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, 'click', (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty \n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n d.querySelectorAll('#urls img').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = window.searxng.settings.theme_static_path + \"/img/img_load_error.svg\";\n },\n {once: true}\n ));\n\n if (d.querySelector('#search_url button#copy_url')) {\n d.querySelector('#search_url button#copy_url').style.display = \"block\";\n }\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.on('#copy_url', 'click', function () {\n var target = this.parentElement.querySelector('pre');\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n // searxng.selectImage (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement('div');\n imgLoaderSpinner.classList.add('loader');\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById('results').classList.add('image-detail-open');\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = '#image-viewer';\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find object in the element, if there is none, stop here.\n const img = resultElement.querySelector('.result-images-source img');\n if (!img) return;\n\n // \n const src = img.getAttribute('data-src');\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector('.image_thumbnail');\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector('.detail');\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin as src property.\n img.src = src;\n img.removeAttribute('data-src');\n });\n };\n\n searxng.closeDetail = function () {\n d.getElementById('results').classList.remove('image-detail-open');\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash == '#image-viewer') window.history.back();\n searxng.scrollPageToSelected();\n };\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => {\n e.preventDefault();\n searxng.selectPrevious(false);\n });\n searxng.on('.result-detail-next', 'click', e => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener('hashchange', () => {\n if (window.location.hash != '#image-viewer') searxng.closeDetail();\n });\n\n d.querySelectorAll('.swipe-horizontal').forEach(\n obj => {\n obj.addEventListener('swiped-left', function () {\n searxng.selectNext(false);\n });\n obj.addEventListener('swiped-right', function () {\n searxng.selectPrevious(false);\n });\n }\n );\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\n(function (w, d, searxng) {\n 'use strict';\n\n var qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n const isResultsPage = document.querySelector(\"main\").id == \"main_results\";\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('input', updateClearButton, false);\n }\n\n const fetchResults = async (query) => {\n let request;\n if (searxng.settings.method === 'GET') {\n const reqParams = new URLSearchParams();\n reqParams.append(\"q\", query);\n request = fetch(\"./autocompleter?\" + reqParams.toString());\n } else {\n const formData = new FormData();\n formData.append(\"q\", query);\n request = fetch(\"./autocompleter\", {\n method: 'POST',\n body: formData,\n });\n }\n\n request.then(async function (response) {\n const results = await response.json();\n\n if (!results) return;\n\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n autocomplete.classList.add(\"open\");\n autocompleteList.innerHTML = \"\";\n\n // show an error message that no result was found\n if (!results[1] || results[1].length == 0) {\n const noItemFoundMessage = document.createElement(\"li\");\n noItemFoundMessage.classList.add('no-item-found');\n noItemFoundMessage.innerHTML = searxng.settings.translations.no_item_found;\n autocompleteList.appendChild(noItemFoundMessage);\n return;\n }\n\n for (let result of results[1]) {\n const li = document.createElement(\"li\");\n li.innerText = result;\n\n searxng.on(li, 'mousedown', () => {\n qinput.value = result;\n const form = d.querySelector(\"#search\");\n form.submit();\n autocomplete.classList.remove('open');\n });\n autocompleteList.appendChild(li);\n }\n });\n };\n\n searxng.ready(function () {\n // focus search input on large screens\n if (!isMobile && !isResultsPage) document.getElementById(\"q\").focus();\n\n qinput = d.getElementById(qinput_id);\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete) {\n searxng.on(qinput, 'input', () => {\n const query = qinput.value;\n if (query.length < searxng.settings.autocomplete_min) return;\n\n setTimeout(() => {\n if (query == qinput.value) fetchResults(query);\n }, 300);\n });\n\n searxng.on(qinput, 'keyup', (e) => {\n let currentIndex = -1;\n const listItems = autocompleteList.children;\n for (let i = 0; i < listItems.length; i++) {\n if (listItems[i].classList.contains('active')) {\n currentIndex = i;\n break;\n }\n }\n\n let newCurrentIndex = -1;\n if (e.key === \"ArrowUp\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n // we need to add listItems.length to the index calculation here because the JavaScript modulos\n // operator doesn't work with negative numbers\n newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;\n } else if (e.key === \"ArrowDown\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove('active');\n newCurrentIndex = (currentIndex + 1) % listItems.length;\n } else if (e.key === \"Tab\" || e.key === \"Enter\") {\n autocomplete.classList.remove('open');\n }\n\n if (newCurrentIndex != -1) {\n const selectedItem = listItems[newCurrentIndex];\n selectedItem.classList.add('active');\n\n if (!selectedItem.classList.contains('no-item-found')) qinput.value = selectedItem.innerText;\n }\n });\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null\n && searxng.settings.search_on_category_select\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n && d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (let button of categoryButtons) {\n searxng.on(button, 'click', (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (let categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n });\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, 'submit', (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n let categoryValues = [];\n for (let categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\n });\n }\n });\n\n})(window, document, window.searxng);\n"],"names":["w","d","ElementPrototype","selector","node","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","ebot","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","offset","wbot","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","k","key","sorted","a","b","html","cat","lastCategory","first","cj","helpPanel","body","currentUrlElement","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","qinput_id","qinput","isMobile","isResultsPage","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","fetchResults","query","request","reqParams","autocomplete","autocompleteList","noItemFoundMessage","result","li","currentIndex","listItems","newCurrentIndex","selectedItem","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"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","x_google_ignoreList":[5]} +{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/src/js/main/search.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = ((w, d) => {\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n ((ElementPrototype) => {\n ElementPrototype.matches =\n ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n const nodes = (this.parentNode || this.document).querySelectorAll(selector);\n let i = -1;\n while (nodes[++i] && nodes[i] !== this);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe(callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n const searxng = window.searxng || {};\n\n searxng.on = (obj, eventType, callback, useCapture) => {\n useCapture = useCapture || false;\n if (typeof obj !== \"string\") {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(\n eventType,\n (e) => {\n let el = e.target || e.srcElement;\n let found = false;\n\n while (el?.matches && el !== d) {\n found = el.matches(obj);\n\n if (found) break;\n\n el = el.parentElement;\n }\n\n if (found) {\n callbackSafe(callback, el, e);\n }\n },\n useCapture\n );\n }\n };\n\n searxng.ready = (callback) => {\n if (document.readyState !== \"loading\") {\n callback.call(w);\n } else {\n w.addEventListener(\"DOMContentLoaded\", callback.bind(w));\n }\n };\n\n searxng.http = (method, url, data = null) =>\n new Promise((resolve, reject) => {\n try {\n const req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = () => {\n if (req.status === 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = () => {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = () => {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = () => {\n reject(Error(\"Timeout\"));\n };\n\n // Make the request\n if (data) {\n req.send(data);\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n\n searxng.loadStyle = (src) => {\n const path = `${searxng.settings.theme_static_path}/${src}`;\n const id = `style_${src.replace(\".\", \"_\")}`;\n let s = d.getElementById(id);\n if (s === null) {\n s = d.createElement(\"link\");\n s.setAttribute(\"id\", id);\n s.setAttribute(\"rel\", \"stylesheet\");\n s.setAttribute(\"type\", \"text/css\");\n s.setAttribute(\"href\", path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = (src, callback) => {\n const path = `${searxng.settings.theme_static_path}/${src}`;\n const id = `script_${src.replace(\".\", \"_\")}`;\n let s = d.getElementById(id);\n if (s === null) {\n s = d.createElement(\"script\");\n s.setAttribute(\"id\", id);\n s.setAttribute(\"src\", path);\n s.onload = callback;\n s.onerror = () => {\n s.setAttribute(\"error\", \"1\");\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute(\"error\")) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(`callback not executed : script '${path}' not loaded.`);\n }\n };\n\n searxng.insertBefore = (newNode, referenceNode) => {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = (newNode, referenceNode) => {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on(\".close\", \"click\", function () {\n this.parentNode.classList.add(\"invisible\");\n });\n\n function getEndpoint() {\n for (const className of d.getElementsByTagName(\"body\")[0].classList.values()) {\n if (className.endsWith(\"_endpoint\")) {\n return className.split(\"_\")[0];\n }\n }\n return \"\";\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(() => {\n searxng.infinite_scroll_supported =\n \"IntersectionObserver\" in window &&\n \"IntersectionObserverEntry\" in window &&\n \"intersectionRatio\" in window.IntersectionObserverEntry.prototype;\n\n if (searxng.endpoint !== \"results\") {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log(\"IntersectionObserver not supported\");\n return;\n }\n\n const d = document;\n const onlyImages = d.getElementById(\"results\").classList.contains(\"only_template_images\");\n\n function newLoadSpinner() {\n const loader = d.createElement(\"div\");\n loader.classList.add(\"loader\");\n return loader;\n }\n\n function replaceChildrenWith(element, children) {\n element.textContent = \"\";\n children.forEach((child) => element.appendChild(child));\n }\n\n function loadNextPage(callback) {\n const form = d.querySelector(\"#pagination form.next_page\");\n if (!form) {\n return;\n }\n replaceChildrenWith(d.querySelector(\"#pagination\"), [newLoadSpinner()]);\n const formData = new FormData(form);\n searxng\n .http(\"POST\", d.querySelector(\"#search\").getAttribute(\"action\"), formData)\n .then((response) => {\n const nextPageDoc = new DOMParser().parseFromString(response, \"text/html\");\n const articleList = nextPageDoc.querySelectorAll(\"#urls article\");\n const paginationElement = nextPageDoc.querySelector(\"#pagination\");\n d.querySelector(\"#pagination\").remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add
element when there are only images\n d.querySelector(\"#urls\").appendChild(d.createElement(\"hr\"));\n }\n articleList.forEach((articleElement) => {\n d.querySelector(\"#urls\").appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector(\"#results\").appendChild(paginationElement);\n callback();\n }\n })\n .catch((err) => {\n console.log(err);\n const e = d.createElement(\"div\");\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add(\"dialog-error\");\n e.setAttribute(\"role\", \"alert\");\n replaceChildrenWith(d.querySelector(\"#pagination\"), [e]);\n });\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\"\n };\n const observedSelector = \"article.result:last-child\";\n const observer = new IntersectionObserver((entries) => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(() => {\n function isElementInDetail(el) {\n while (el !== undefined) {\n if (el.classList.contains(\"detail\")) {\n return true;\n }\n if (el.classList.contains(\"result\")) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a
element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement(el) {\n while (el !== undefined) {\n if (el.classList.contains(\"result\")) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult(resultElement) {\n return resultElement?.classList.contains(\"result-images\");\n }\n\n searxng.on(\".result\", \"click\", function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n const resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on(\n \".result a\",\n \"focus\",\n (e) => {\n if (!isElementInDetail(e.target)) {\n const resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n },\n true\n );\n\n /* common base for layouts */\n const baseKeyBinding = {\n Escape: {\n key: \"ESC\",\n fun: removeFocus,\n des: \"remove focus from the focused input\",\n cat: \"Control\"\n },\n c: {\n key: \"c\",\n fun: copyURLToClipboard,\n des: \"copy url of the selected result to the clipboard\",\n cat: \"Results\"\n },\n h: {\n key: \"h\",\n fun: toggleHelp,\n des: \"toggle help window\",\n cat: \"Other\"\n },\n i: {\n key: \"i\",\n fun: searchInputFocus,\n des: \"focus on the search input\",\n cat: \"Control\"\n },\n n: {\n key: \"n\",\n fun: GoToNextPage(),\n des: \"go to next page\",\n cat: \"Results\"\n },\n o: {\n key: \"o\",\n fun: openResult(false),\n des: \"open search result\",\n cat: \"Results\"\n },\n p: {\n key: \"p\",\n fun: GoToPreviousPage(),\n des: \"go to previous page\",\n cat: \"Results\"\n },\n r: {\n key: \"r\",\n fun: reloadPage,\n des: \"reload page from the server\",\n cat: \"Control\"\n },\n t: {\n key: \"t\",\n fun: openResult(true),\n des: \"open the result in a new tab\",\n cat: \"Results\"\n }\n };\n const keyBindingLayouts = {\n default: Object.assign(\n {\n /* SearXNG layout */\n ArrowLeft: {\n key: \"←\",\n fun: highlightResult(\"up\"),\n des: \"select previous search result\",\n cat: \"Results\"\n },\n ArrowRight: {\n key: \"→\",\n fun: highlightResult(\"down\"),\n des: \"select next search result\",\n cat: \"Results\"\n }\n },\n baseKeyBinding\n ),\n\n vim: Object.assign(\n {\n /* Vim-like Key Layout. */\n b: {\n key: \"b\",\n fun: scrollPage(-window.innerHeight),\n des: \"scroll one page up\",\n cat: \"Navigation\"\n },\n f: {\n key: \"f\",\n fun: scrollPage(window.innerHeight),\n des: \"scroll one page down\",\n cat: \"Navigation\"\n },\n u: {\n key: \"u\",\n fun: scrollPage(-window.innerHeight / 2),\n des: \"scroll half a page up\",\n cat: \"Navigation\"\n },\n d: {\n key: \"d\",\n fun: scrollPage(window.innerHeight / 2),\n des: \"scroll half a page down\",\n cat: \"Navigation\"\n },\n g: {\n key: \"g\",\n fun: scrollPageTo(-document.body.scrollHeight, \"top\"),\n des: \"scroll to the top of the page\",\n cat: \"Navigation\"\n },\n v: {\n key: \"v\",\n fun: scrollPageTo(document.body.scrollHeight, \"bottom\"),\n des: \"scroll to the bottom of the page\",\n cat: \"Navigation\"\n },\n k: {\n key: \"k\",\n fun: highlightResult(\"up\"),\n des: \"select previous search result\",\n cat: \"Results\"\n },\n j: {\n key: \"j\",\n fun: highlightResult(\"down\"),\n des: \"select next search result\",\n cat: \"Results\"\n },\n y: {\n key: \"y\",\n fun: copyURLToClipboard,\n des: \"copy url of the selected result to the clipboard\",\n cat: \"Results\"\n }\n },\n baseKeyBinding\n )\n };\n\n const keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", (e) => {\n // check for modifiers so we don't break browser's hotkeys\n if (\n // biome-ignore lint/suspicious/noPrototypeBuiltins: FIXME: support for Chromium 93-87, Firefox 92-78, Safari 15.4-14\n Object.prototype.hasOwnProperty.call(keyBindings, e.key) &&\n !e.ctrlKey &&\n !e.altKey &&\n !e.shiftKey &&\n !e.metaKey\n ) {\n const tagName = e.target.tagName.toLowerCase();\n if (e.key === \"Escape\") {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === \"a\" || tagName === \"button\") {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult(which) {\n return (noScroll, keepFocus) => {\n let current = document.querySelector(\".result[data-vim-selected]\"),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector(\".result\");\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n let next,\n results = document.querySelectorAll(\".result\");\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== \"string\") {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case \"visible\": {\n const top = document.documentElement.scrollTop || document.body.scrollTop;\n const bot = top + document.documentElement.clientHeight;\n\n for (let i = 0; i < results.length; i++) {\n next = results[i];\n const etop = next.offsetTop;\n const ebot = etop + next.clientHeight;\n\n if (ebot <= bot && etop > top) {\n break;\n }\n }\n break;\n }\n case \"down\":\n next = results[results.indexOf(current) + 1] || current;\n break;\n case \"up\":\n next = results[results.indexOf(current) - 1] || current;\n break;\n case \"bottom\":\n next = results[results.length - 1];\n break;\n // biome-ignore lint/complexity/noUselessSwitchCase: fallthrough is intended\n case \"top\":\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute(\"data-vim-selected\");\n next.setAttribute(\"data-vim-selected\", \"true\");\n if (!keepFocus) {\n const link = next.querySelector(\"h3 a\") || next.querySelector(\"a\");\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage() {\n document.location.reload(true);\n }\n\n function removeFocus(e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === \"input\" || tagName === \"select\" || tagName === \"textarea\")) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick(css_selector) {\n return () => {\n const button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage() {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage() {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected() {\n const sel = document.querySelector(\".result[data-vim-selected]\");\n if (sel === null) {\n return;\n }\n const wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if (sel.previousElementSibling === null && ebot < wheight) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > etop - offset) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n const wbot = wtop + wheight;\n if (wbot < ebot + offset) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage(amount) {\n return () => {\n window.scrollBy(0, amount);\n highlightResult(\"visible\")();\n };\n }\n\n function scrollPageTo(position, nav) {\n return () => {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus() {\n window.scrollTo(0, 0);\n const q = document.querySelector(\"#q\");\n q.focus();\n if (q.setSelectionRange) {\n const len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult(newTab) {\n return () => {\n let link = document.querySelector(\".result[data-vim-selected] h3 a\");\n if (link === null) {\n link = document.querySelector(\".result[data-vim-selected] > a\");\n }\n if (link !== null) {\n const url = link.getAttribute(\"href\");\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent(divElement) {\n const categories = {};\n\n for (const k in keyBindings) {\n const key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n const sorted = Object.keys(categories).sort((a, b) => categories[b].length - categories[a].length);\n\n if (sorted.length === 0) {\n return;\n }\n\n let html = '×';\n html += \"

How to navigate SearXNG with hotkeys

\";\n html += \"\";\n\n for (let i = 0; i < sorted.length; i++) {\n const cat = categories[sorted[i]];\n\n const lastCategory = i === sorted.length - 1;\n const first = i % 2 === 0;\n\n if (first) {\n html += \"\";\n }\n html += \"\"; // col-sm-*\n\n if (!first || lastCategory) {\n html += \"\"; // row\n }\n }\n\n html += \"
\";\n\n html += `

${cat[0].cat}

`;\n html += '
    ';\n\n for (const cj in cat) {\n html += `
  • ${cat[cj].key} ${cat[cj].des}
  • `;\n }\n\n html += \"
\";\n html += \"
\";\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp() {\n let helpPanel = document.querySelector(\"#vim-hotkeys-help\");\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement(\"div\");\n helpPanel.id = \"vim-hotkeys-help\";\n helpPanel.className = \"dialog-modal\";\n initHelpContent(helpPanel);\n const body = document.getElementsByTagName(\"body\")[0];\n body.appendChild(helpPanel);\n } else {\n // toggle hidden\n helpPanel.classList.toggle(\"invisible\");\n }\n }\n\n function copyURLToClipboard() {\n const currentUrlElement = document.querySelector(\".result[data-vim-selected] h3 a\");\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute(\"href\");\n navigator.clipboard.writeText(url);\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult(\"down\");\n searxng.selectPrevious = highlightResult(\"up\");\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n((_w, _d, searxng) => {\n searxng.ready(() => {\n searxng.on(\".searxng_init_map\", \"click\", function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n const leaflet_target = this.dataset.leafletTarget;\n const map_lon = parseFloat(this.dataset.mapLon);\n const map_lat = parseFloat(this.dataset.mapLat);\n const map_zoom = parseFloat(this.dataset.mapZoom);\n const map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n const map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle(\"css/leaflet.css\");\n searxng.loadScript(\"js/leaflet.js\", () => {\n let map_bounds = null;\n if (map_boundingbox) {\n const southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n const northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n const map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n const osmMapnikUrl = \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\";\n const osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n const osmMapnik = new L.TileLayer(osmMapnikUrl, { minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib });\n const osmWikimediaUrl = \"https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png\";\n const osmWikimediaAttrib =\n 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n const osmWikimedia = new L.TileLayer(osmWikimediaUrl, {\n minZoom: 1,\n maxZoom: 19,\n attribution: osmWikimediaAttrib\n });\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(() => {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.LatLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.LatLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n const baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occur only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n((_w, d, searxng) => {\n if (searxng.endpoint !== \"preferences\") {\n return;\n }\n\n searxng.ready(() => {\n let engine_descriptions = null;\n\n function load_engine_descriptions() {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then((content) => {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n const elements = d.querySelectorAll(`[data-engine-name=\"${engine_name}\"] .engine-description`);\n for (const element of elements) {\n const source = ` (${searxng.settings.translations.Source}: ${description[1]})`;\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll(\"[data-engine-name]\")) {\n searxng.on(el, \"mouseenter\", load_engine_descriptions);\n }\n\n const enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll(\"tbody input[type=checkbox][class~=checkbox-onoff]\");\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, \"click\", () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, \"click\", () => toggleEngines(false));\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, \"click\", (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty \n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\n((w, d, searxng) => {\n if (searxng.endpoint !== \"results\") {\n return;\n }\n\n searxng.ready(() => {\n d.querySelectorAll(\"#urls img\").forEach((img) =>\n img.addEventListener(\n \"error\",\n () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = `${window.searxng.settings.theme_static_path}/img/img_load_error.svg`;\n },\n { once: true }\n )\n );\n\n if (d.querySelector(\"#search_url button#copy_url\")) {\n d.querySelector(\"#search_url button#copy_url\").style.display = \"block\";\n }\n\n searxng.on(\".btn-collapse\", \"click\", function () {\n const btnLabelCollapsed = this.getAttribute(\"data-btn-text-collapsed\");\n const btnLabelNotCollapsed = this.getAttribute(\"data-btn-text-not-collapsed\");\n const target = this.getAttribute(\"data-target\");\n const targetElement = d.querySelector(target);\n let html = this.innerHTML;\n if (this.classList.contains(\"collapsed\")) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle(\"collapsed\");\n targetElement.classList.toggle(\"invisible\");\n });\n\n searxng.on(\".media-loader\", \"click\", function () {\n const target = this.getAttribute(\"data-target\");\n const iframe_load = d.querySelector(`${target} > iframe`);\n const srctest = iframe_load.getAttribute(\"src\");\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute(\"src\", iframe_load.getAttribute(\"data-src\"));\n }\n });\n\n searxng.on(\"#copy_url\", \"click\", function () {\n const target = this.parentElement.querySelector(\"pre\");\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n // searxng.selectImage (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement(\"div\");\n imgLoaderSpinner.classList.add(\"loader\");\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById(\"results\").classList.add(\"image-detail-open\");\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = \"#image-viewer\";\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find object in the element, if there is none, stop here.\n const img = resultElement.querySelector(\".result-images-source img\");\n if (!img) return;\n\n // \n const src = img.getAttribute(\"data-src\");\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector(\".image_thumbnail\");\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector(\".detail\");\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin as src property.\n img.src = src;\n img.removeAttribute(\"data-src\");\n });\n };\n\n searxng.closeDetail = () => {\n d.getElementById(\"results\").classList.remove(\"image-detail-open\");\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash === \"#image-viewer\") window.history.back();\n searxng.scrollPageToSelected();\n };\n searxng.on(\".result-detail-close\", \"click\", (e) => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on(\".result-detail-previous\", \"click\", (e) => {\n e.preventDefault();\n searxng.selectPrevious(false);\n });\n searxng.on(\".result-detail-next\", \"click\", (e) => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener(\"hashchange\", () => {\n if (window.location.hash !== \"#image-viewer\") searxng.closeDetail();\n });\n\n d.querySelectorAll(\".swipe-horizontal\").forEach((obj) => {\n obj.addEventListener(\"swiped-left\", () => {\n searxng.selectNext(false);\n });\n obj.addEventListener(\"swiped-right\", () => {\n searxng.selectPrevious(false);\n });\n });\n\n w.addEventListener(\n \"scroll\",\n () => {\n const e = d.getElementById(\"backToTop\"),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById(\"results\");\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add(\"scrolling\");\n } else {\n results.classList.remove(\"scrolling\");\n }\n }\n },\n true\n );\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\n((_w, d, searxng) => {\n const qinput_id = \"q\";\n let qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n const isResultsPage = document.querySelector(\"main\").id === \"main_results\";\n\n function submitIfQuery() {\n if (qinput.value.length > 0) {\n const search = document.getElementById(\"search\");\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton(qinput) {\n const cs = document.getElementById(\"clear_search\");\n const updateClearButton = () => {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener(\"click\", (ev) => {\n qinput.value = \"\";\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener(\"input\", updateClearButton, false);\n }\n\n const fetchResults = async (query) => {\n let request;\n if (searxng.settings.method === \"GET\") {\n const reqParams = new URLSearchParams();\n reqParams.append(\"q\", query);\n request = fetch(`./autocompleter?${reqParams.toString()}`);\n } else {\n const formData = new FormData();\n formData.append(\"q\", query);\n request = fetch(\"./autocompleter\", {\n method: \"POST\",\n body: formData\n });\n }\n\n request.then(async (response) => {\n const results = await response.json();\n\n if (!results) return;\n\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n autocomplete.classList.add(\"open\");\n autocompleteList.innerHTML = \"\";\n\n // show an error message that no result was found\n if (!results[1] || results[1].length === 0) {\n const noItemFoundMessage = document.createElement(\"li\");\n noItemFoundMessage.classList.add(\"no-item-found\");\n noItemFoundMessage.innerHTML = searxng.settings.translations.no_item_found;\n autocompleteList.appendChild(noItemFoundMessage);\n return;\n }\n\n for (const result of results[1]) {\n const li = document.createElement(\"li\");\n li.innerText = result;\n\n searxng.on(li, \"mousedown\", () => {\n qinput.value = result;\n const form = d.querySelector(\"#search\");\n form.submit();\n autocomplete.classList.remove(\"open\");\n });\n autocompleteList.appendChild(li);\n }\n });\n };\n\n searxng.ready(() => {\n // focus search input on large screens\n if (!isMobile && !isResultsPage) document.getElementById(\"q\").focus();\n\n qinput = d.getElementById(qinput_id);\n const autocomplete = d.querySelector(\".autocomplete\");\n const autocompleteList = d.querySelector(\".autocomplete ul\");\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete) {\n searxng.on(qinput, \"input\", () => {\n const query = qinput.value;\n if (query.length < searxng.settings.autocomplete_min) return;\n\n setTimeout(() => {\n if (query === qinput.value) fetchResults(query);\n }, 300);\n });\n\n searxng.on(qinput, \"keyup\", (e) => {\n let currentIndex = -1;\n const listItems = autocompleteList.children;\n for (let i = 0; i < listItems.length; i++) {\n if (listItems[i].classList.contains(\"active\")) {\n currentIndex = i;\n break;\n }\n }\n\n let newCurrentIndex = -1;\n if (e.key === \"ArrowUp\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove(\"active\");\n // we need to add listItems.length to the index calculation here because the JavaScript modulos\n // operator doesn't work with negative numbers\n newCurrentIndex = (currentIndex - 1 + listItems.length) % listItems.length;\n } else if (e.key === \"ArrowDown\") {\n if (currentIndex >= 0) listItems[currentIndex].classList.remove(\"active\");\n newCurrentIndex = (currentIndex + 1) % listItems.length;\n } else if (e.key === \"Tab\" || e.key === \"Enter\") {\n autocomplete.classList.remove(\"open\");\n }\n\n if (newCurrentIndex !== -1) {\n const selectedItem = listItems[newCurrentIndex];\n selectedItem.classList.add(\"active\");\n\n if (!selectedItem.classList.contains(\"no-item-found\")) qinput.value = selectedItem.innerText;\n }\n });\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null &&\n searxng.settings.search_on_category_select &&\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById(\"safesearch\"), \"change\", submitIfQuery);\n searxng.on(d.getElementById(\"time_range\"), \"change\", submitIfQuery);\n searxng.on(d.getElementById(\"language\"), \"change\", submitIfQuery);\n }\n\n const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (const button of categoryButtons) {\n searxng.on(button, \"click\", (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (const categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n });\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, \"submit\", (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n const categoryValues = [];\n for (const categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\n });\n }\n });\n})(window, document, window.searxng);\n"],"names":["w","d","ElementPrototype","selector","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","ebot","offset","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","key","sorted","a","html","cat","lastCategory","first","cj","helpPanel","currentUrlElement","_w","_d","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","qinput_id","qinput","isMobile","isResultsPage","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","fetchResults","query","request","reqParams","autocomplete","autocompleteList","noItemFoundMessage","result","li","currentIndex","listItems","newCurrentIndex","selectedItem","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMA,OAAO,SAAW,CAACA,EAAGC,IAAM,CAKtBD,EAAE,UACFE,GAAqB,CACrBA,EAAiB,QACfA,EAAiB,SACjBA,EAAiB,iBACjBA,EAAiB,uBACjBA,EAAiB,mBACjB,SAAUC,EAAU,CAClB,MAAMC,GAAS,KAAK,YAAc,KAAK,UAAU,iBAAiBD,CAAQ,EAC1E,IAAIE,EAAI,GACR,KAAOD,EAAM,EAAEC,CAAC,GAAKD,EAAMC,CAAC,IAAM,MAAK,CACvC,MAAO,CAAC,CAACD,EAAMC,CAAC,CAC1B,CACA,GAAO,QAAQ,SAAS,EAGtB,SAASC,EAAaC,EAAUC,EAAIC,EAAG,CACrC,GAAI,CACFF,EAAS,KAAKC,EAAIC,CAAC,CACzB,OAAaC,EAAW,CAClB,QAAQ,IAAIA,CAAS,CAC3B,CACA,CAEE,MAAMC,EAAU,OAAO,SAAW,CAAA,EAElCA,EAAQ,GAAK,CAACC,EAAKC,EAAWN,EAAUO,IAAe,CACrDA,EAAaA,GAAc,GACvB,OAAOF,GAAQ,SAEjBA,EAAI,iBAAiBC,EAAWN,EAAUO,CAAU,EAGpDb,EAAE,iBACAY,EACCJ,GAAM,CACL,IAAID,EAAKC,EAAE,QAAUA,EAAE,WACnBM,EAAQ,GAEZ,KAAOP,GAAA,MAAAA,EAAI,SAAWA,IAAOP,IAC3Bc,EAAQP,EAAG,QAAQI,CAAG,EAElB,CAAAG,IAEJP,EAAKA,EAAG,cAGNO,GACFT,EAAaC,EAAUC,EAAIC,CAAC,CAExC,EACQK,CACR,CAEA,EAEEH,EAAQ,MAASJ,GAAa,CACxB,SAAS,aAAe,UAC1BA,EAAS,KAAKP,CAAC,EAEfA,EAAE,iBAAiB,mBAAoBO,EAAS,KAAKP,CAAC,CAAC,CAE7D,EAEEW,EAAQ,KAAO,CAACK,EAAQC,EAAKC,EAAO,OAClC,IAAI,QAAQ,CAACC,EAASC,IAAW,CAC/B,GAAI,CACF,MAAMC,EAAM,IAAI,eAChBA,EAAI,KAAKL,EAAQC,EAAK,EAAI,EAC1BI,EAAI,QAAU,IAGdA,EAAI,OAAS,IAAM,CACbA,EAAI,SAAW,IACjBF,EAAQE,EAAI,SAAUA,EAAI,YAAY,EAEtCD,EAAO,MAAMC,EAAI,UAAU,CAAC,CAExC,EAGQA,EAAI,QAAU,IAAM,CAClBD,EAAO,MAAM,eAAe,CAAC,CACvC,EAEQC,EAAI,QAAU,IAAM,CAClBD,EAAO,MAAM,wBAAwB,CAAC,CAChD,EAEQC,EAAI,UAAY,IAAM,CACpBD,EAAO,MAAM,SAAS,CAAC,CACjC,EAGYF,EACFG,EAAI,KAAKH,CAAI,EAEbG,EAAI,KAAI,CAElB,OAAeC,EAAI,CACXF,EAAOE,CAAE,CACjB,CACA,CAAK,EAEHX,EAAQ,UAAaY,GAAQ,CAC3B,MAAMC,EAAO,GAAGb,EAAQ,SAAS,iBAAiB,IAAIY,CAAG,GACnDE,EAAK,SAASF,EAAI,QAAQ,IAAK,GAAG,CAAC,GACzC,IAAI,EAAItB,EAAE,eAAewB,CAAE,EACvB,IAAM,OACR,EAAIxB,EAAE,cAAc,MAAM,EAC1B,EAAE,aAAa,KAAMwB,CAAE,EACvB,EAAE,aAAa,MAAO,YAAY,EAClC,EAAE,aAAa,OAAQ,UAAU,EACjC,EAAE,aAAa,OAAQD,CAAI,EAC3BvB,EAAE,KAAK,YAAY,CAAC,EAE1B,EAEEU,EAAQ,WAAa,CAACY,EAAKhB,IAAa,CACtC,MAAMiB,EAAO,GAAGb,EAAQ,SAAS,iBAAiB,IAAIY,CAAG,GACnDE,EAAK,UAAUF,EAAI,QAAQ,IAAK,GAAG,CAAC,GAC1C,IAAIG,EAAIzB,EAAE,eAAewB,CAAE,EAC3B,GAAIC,IAAM,KACRA,EAAIzB,EAAE,cAAc,QAAQ,EAC5ByB,EAAE,aAAa,KAAMD,CAAE,EACvBC,EAAE,aAAa,MAAOF,CAAI,EAC1BE,EAAE,OAASnB,EACXmB,EAAE,QAAU,IAAM,CAChBA,EAAE,aAAa,QAAS,GAAG,CACnC,EACMzB,EAAE,KAAK,YAAYyB,CAAC,UACVA,EAAE,aAAa,OAAO,EAOhC,QAAQ,IAAI,mCAAmCF,CAAI,eAAe,MANlE,IAAI,CACFjB,EAAS,MAAMmB,EAAG,EAAE,CAC5B,OAAehB,EAAW,CAClB,QAAQ,IAAIA,CAAS,CAC7B,CAIA,EAEEC,EAAQ,aAAe,CAACgB,EAASC,IAAkB,CACjDA,EAAc,WAAW,aAAaD,EAASC,CAAa,CAChE,EAEEjB,EAAQ,YAAc,CAACgB,EAASC,IAAkB,CAChDA,EAAc,WAAW,YAAYD,EAASC,EAAc,WAAW,CAC3E,EAEEjB,EAAQ,GAAG,SAAU,QAAS,UAAY,CACxC,KAAK,WAAW,UAAU,IAAI,WAAW,CAC7C,CAAG,EAED,SAASkB,GAAc,CACrB,UAAWC,KAAa7B,EAAE,qBAAqB,MAAM,EAAE,CAAC,EAAE,UAAU,SAClE,GAAI6B,EAAU,SAAS,WAAW,EAChC,OAAOA,EAAU,MAAM,GAAG,EAAE,CAAC,EAGjC,MAAO,EACX,CAEE,OAAAnB,EAAQ,SAAWkB,EAAW,EAEvBlB,CACT,GAAG,OAAQ,QAAQ,EC7KnB,QAAQ,MAAM,IAAM,CAMlB,GALA,QAAQ,0BACN,yBAA0B,QAC1B,8BAA+B,QAC/B,sBAAuB,OAAO,0BAA0B,UAEtD,QAAQ,WAAa,UACvB,OAGF,GAAI,CAAC,QAAQ,0BAA2B,CACtC,QAAQ,IAAI,oCAAoC,EAChD,MACJ,CAEE,MAAMV,EAAI,SACJ8B,EAAa9B,EAAE,eAAe,SAAS,EAAE,UAAU,SAAS,sBAAsB,EAExF,SAAS+B,GAAiB,CACxB,MAAMC,EAAShC,EAAE,cAAc,KAAK,EACpC,OAAAgC,EAAO,UAAU,IAAI,QAAQ,EACtBA,CACX,CAEE,SAASC,EAAoBC,EAASC,EAAU,CAC9CD,EAAQ,YAAc,GACtBC,EAAS,QAASC,GAAUF,EAAQ,YAAYE,CAAK,CAAC,CAC1D,CAEE,SAASC,EAAa/B,EAAU,CAC9B,MAAMgC,EAAOtC,EAAE,cAAc,4BAA4B,EACzD,GAAI,CAACsC,EACH,OAEFL,EAAoBjC,EAAE,cAAc,aAAa,EAAG,CAAC+B,EAAc,CAAE,CAAC,EACtE,MAAMQ,EAAW,IAAI,SAASD,CAAI,EAClC,QACG,KAAK,OAAQtC,EAAE,cAAc,SAAS,EAAE,aAAa,QAAQ,EAAGuC,CAAQ,EACxE,KAAMC,GAAa,CAClB,MAAMC,EAAc,IAAI,UAAS,EAAG,gBAAgBD,EAAU,WAAW,EACnEE,EAAcD,EAAY,iBAAiB,eAAe,EAC1DE,EAAoBF,EAAY,cAAc,aAAa,EACjEzC,EAAE,cAAc,aAAa,EAAE,OAAM,EACjC0C,EAAY,OAAS,GAAK,CAACZ,GAE7B9B,EAAE,cAAc,OAAO,EAAE,YAAYA,EAAE,cAAc,IAAI,CAAC,EAE5D0C,EAAY,QAASE,GAAmB,CACtC5C,EAAE,cAAc,OAAO,EAAE,YAAY4C,CAAc,CAC7D,CAAS,EACGD,IACF3C,EAAE,cAAc,UAAU,EAAE,YAAY2C,CAAiB,EACzDrC,EAAQ,EAElB,CAAO,EACA,MAAOuC,GAAQ,CACd,QAAQ,IAAIA,CAAG,EACf,MAAMrC,EAAIR,EAAE,cAAc,KAAK,EAC/BQ,EAAE,YAAc,QAAQ,SAAS,aAAa,wBAC9CA,EAAE,UAAU,IAAI,cAAc,EAC9BA,EAAE,aAAa,OAAQ,OAAO,EAC9ByB,EAAoBjC,EAAE,cAAc,aAAa,EAAG,CAACQ,CAAC,CAAC,CAC/D,CAAO,CACP,CAEE,GAAI,QAAQ,SAAS,iBAAmB,QAAQ,0BAA2B,CACzE,MAAMsC,EAA6B,CACjC,WAAY,OAClB,EACUC,EAAmB,4BACnBC,EAAW,IAAI,qBAAsBC,GAAY,CACrD,MAAMC,EAAkBD,EAAQ,CAAC,EAC7BC,EAAgB,iBAClBF,EAAS,UAAUE,EAAgB,MAAM,EACzCb,EAAa,IAAMW,EAAS,QAAQhD,EAAE,cAAc+C,CAAgB,EAAGD,CAA0B,CAAC,EAE1G,CAAK,EACDE,EAAS,QAAQhD,EAAE,cAAc+C,CAAgB,EAAGD,CAA0B,CAClF,CACA,CAAC,EChFD,QAAQ,MAAM,IAAM,CAClB,SAASK,EAAkB5C,EAAI,CAC7B,KAAOA,IAAO,QAAW,CACvB,GAAIA,EAAG,UAAU,SAAS,QAAQ,EAChC,MAAO,GAET,GAAIA,EAAG,UAAU,SAAS,QAAQ,EAGhC,MAAO,GAETA,EAAKA,EAAG,UACd,CACI,MAAO,EACX,CAEE,SAAS6C,EAAiB7C,EAAI,CAC5B,KAAOA,IAAO,QAAW,CACvB,GAAIA,EAAG,UAAU,SAAS,QAAQ,EAChC,OAAOA,EAETA,EAAKA,EAAG,UACd,CAEA,CAEE,SAAS8C,EAAcC,EAAe,CACpC,OAAOA,GAAA,YAAAA,EAAe,UAAU,SAAS,gBAC7C,CAEE,QAAQ,GAAG,UAAW,QAAS,SAAU,EAAG,CAC1C,GAAI,CAACH,EAAkB,EAAE,MAAM,EAAG,CAChCI,EAAgB,IAAI,EAAE,GAAM,EAAI,EAChC,MAAMD,EAAgBF,EAAiB,EAAE,MAAM,EAC3CC,EAAcC,CAAa,IAC7B,EAAE,eAAc,EAChB,QAAQ,YAAYA,CAAa,EAEzC,CACA,CAAG,EAED,QAAQ,GACN,YACA,QACC,GAAM,CACL,GAAI,CAACH,EAAkB,EAAE,MAAM,EAAG,CAChC,MAAMG,EAAgBF,EAAiB,EAAE,MAAM,EAC3CE,GAAiBA,EAAc,aAAa,mBAAmB,IAAM,MACvEC,EAAgBD,CAAa,EAAE,EAAI,EAEjCD,EAAcC,CAAa,GAC7B,QAAQ,YAAYA,CAAa,CAE3C,CACA,EACI,EACJ,EAGE,MAAME,EAAiB,CACrB,OAAQ,CACN,IAAK,MACL,IAAKC,EACL,IAAK,sCACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EACL,IAAK,mDACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EACL,IAAK,qBACL,IAAK,OACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EACL,IAAK,4BACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EAAY,EACjB,IAAK,kBACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EAAW,EAAK,EACrB,IAAK,qBACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EAAgB,EACrB,IAAK,sBACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKC,EACL,IAAK,8BACL,IAAK,SACX,EACI,EAAG,CACD,IAAK,IACL,IAAKF,EAAW,EAAI,EACpB,IAAK,+BACL,IAAK,SACX,CACA,EACQG,EAAoB,CACxB,QAAS,OAAO,OACd,CAEE,UAAW,CACT,IAAK,IACL,IAAKV,EAAgB,IAAI,EACzB,IAAK,gCACL,IAAK,SACf,EACQ,WAAY,CACV,IAAK,IACL,IAAKA,EAAgB,MAAM,EAC3B,IAAK,4BACL,IAAK,SACf,CACA,EACMC,CACN,EAEI,IAAK,OAAO,OACV,CAEE,EAAG,CACD,IAAK,IACL,IAAKU,EAAW,CAAC,OAAO,WAAW,EACnC,IAAK,qBACL,IAAK,YACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKA,EAAW,OAAO,WAAW,EAClC,IAAK,uBACL,IAAK,YACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKA,EAAW,CAAC,OAAO,YAAc,CAAC,EACvC,IAAK,wBACL,IAAK,YACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKA,EAAW,OAAO,YAAc,CAAC,EACtC,IAAK,0BACL,IAAK,YACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKC,EAAa,CAAC,SAAS,KAAK,aAAc,KAAK,EACpD,IAAK,gCACL,IAAK,YACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKA,EAAa,SAAS,KAAK,aAAc,QAAQ,EACtD,IAAK,mCACL,IAAK,YACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKZ,EAAgB,IAAI,EACzB,IAAK,gCACL,IAAK,SACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKA,EAAgB,MAAM,EAC3B,IAAK,4BACL,IAAK,SACf,EACQ,EAAG,CACD,IAAK,IACL,IAAKG,EACL,IAAK,mDACL,IAAK,SACf,CACA,EACMF,CACN,CACA,EAEQY,EAAcH,EAAkB,QAAQ,SAAS,OAAO,GAAKA,EAAkB,QAErF,QAAQ,GAAG,SAAU,UAAY,GAAM,CAErC,GAEE,OAAO,UAAU,eAAe,KAAKG,EAAa,EAAE,GAAG,GACvD,CAAC,EAAE,SACH,CAAC,EAAE,QACH,CAAC,EAAE,UACH,CAAC,EAAE,QACH,CACA,MAAMC,EAAU,EAAE,OAAO,QAAQ,YAAW,EACxC,EAAE,MAAQ,SACZD,EAAY,EAAE,GAAG,EAAE,IAAI,CAAC,GAEpB,EAAE,SAAW,SAAS,MAAQC,IAAY,KAAOA,IAAY,YAC/D,EAAE,eAAc,EAChBD,EAAY,EAAE,GAAG,EAAE,IAAG,EAGhC,CACA,CAAG,EAED,SAASb,EAAgBe,EAAO,CAC9B,MAAO,CAACC,EAAUC,IAAc,CAC9B,IAAIC,EAAU,SAAS,cAAc,4BAA4B,EAC/DC,EAAiBJ,EACnB,GAAIG,IAAY,KAAM,CAGpB,GADAA,EAAU,SAAS,cAAc,SAAS,EACtCA,IAAY,KAEd,QAGEH,IAAU,QAAUA,IAAU,QAChCI,EAAiBD,EAE3B,CAEM,IAAIE,EACFC,EAAU,SAAS,iBAAiB,SAAS,EAG/C,GAFAA,EAAU,MAAM,KAAKA,CAAO,EAExB,OAAOF,GAAmB,SAC5BC,EAAOD,MAEP,QAAQA,EAAc,CACpB,IAAK,UAAW,CACd,MAAMG,EAAM,SAAS,gBAAgB,WAAa,SAAS,KAAK,UAC1DC,EAAMD,EAAM,SAAS,gBAAgB,aAE3C,QAASzE,EAAI,EAAGA,EAAIwE,EAAQ,OAAQxE,IAAK,CACvCuE,EAAOC,EAAQxE,CAAC,EAChB,MAAM2E,EAAOJ,EAAK,UAGlB,GAFaI,EAAOJ,EAAK,cAEbG,GAAOC,EAAOF,EACxB,KAEhB,CACY,KACZ,CACU,IAAK,OACHF,EAAOC,EAAQA,EAAQ,QAAQH,CAAO,EAAI,CAAC,GAAKA,EAChD,MACF,IAAK,KACHE,EAAOC,EAAQA,EAAQ,QAAQH,CAAO,EAAI,CAAC,GAAKA,EAChD,MACF,IAAK,SACHE,EAAOC,EAAQA,EAAQ,OAAS,CAAC,EACjC,MAEF,IAAK,MAEL,QACED,EAAOC,EAAQ,CAAC,CAC5B,CAGM,GAAID,EAAM,CAGR,GAFAF,EAAQ,gBAAgB,mBAAmB,EAC3CE,EAAK,aAAa,oBAAqB,MAAM,EACzC,CAACH,EAAW,CACd,MAAMQ,EAAOL,EAAK,cAAc,MAAM,GAAKA,EAAK,cAAc,GAAG,EAC7DK,IAAS,MACXA,EAAK,MAAK,CAEtB,CACaT,GACHU,EAAoB,CAE9B,CACA,CACA,CAEE,SAASjB,GAAa,CACpB,SAAS,SAAS,OAAO,EAAI,CACjC,CAEE,SAASP,EAAY,EAAG,CACtB,MAAMY,EAAU,EAAE,OAAO,QAAQ,YAAW,EACxC,SAAS,gBAAkBA,IAAY,SAAWA,IAAY,UAAYA,IAAY,YACxF,SAAS,cAAc,KAAI,EAE3B,QAAQ,YAAW,CAEzB,CAEE,SAASa,EAAgBC,EAAc,CACrC,MAAO,IAAM,CACX,MAAMC,EAAS,SAAS,cAAcD,CAAY,EAC9CC,GACFA,EAAO,MAAK,CAEpB,CACA,CAEE,SAASvB,GAAe,CACtB,OAAOqB,EAAgB,iDAAiD,CAC5E,CAEE,SAASnB,GAAmB,CAC1B,OAAOmB,EAAgB,qDAAqD,CAChF,CAEE,SAASD,GAAuB,CAC9B,MAAMI,EAAM,SAAS,cAAc,4BAA4B,EAC/D,GAAIA,IAAQ,KACV,OAEF,MAAMC,EAAO,SAAS,gBAAgB,WAAa,SAAS,KAAK,UAC/DC,EAAU,SAAS,gBAAgB,aACnCR,EAAOM,EAAI,UACXG,EAAOT,EAAOM,EAAI,aAClBI,EAAS,IAEX,GAAIJ,EAAI,yBAA2B,MAAQG,EAAOD,EAAS,CAGzD,OAAO,OAAO,OAAO,QAAS,CAAC,EAC/B,MACN,CACQD,EAAOP,EAAOU,EAChB,OAAO,OAAO,OAAO,QAASV,EAAOU,CAAM,EAE9BH,EAAOC,EACTC,EAAOC,GAChB,OAAO,OAAO,OAAO,QAASD,EAAOD,EAAUE,CAAM,CAG7D,CAEE,SAASvB,EAAWwB,EAAQ,CAC1B,MAAO,IAAM,CACX,OAAO,SAAS,EAAGA,CAAM,EACzBnC,EAAgB,SAAS,EAAC,CAChC,CACA,CAEE,SAASY,EAAawB,EAAUC,EAAK,CACnC,MAAO,IAAM,CACX,OAAO,SAAS,EAAGD,CAAQ,EAC3BpC,EAAgBqC,CAAG,EAAC,CAC1B,CACA,CAEE,SAAShC,GAAmB,CAC1B,OAAO,SAAS,EAAG,CAAC,EACpB,MAAMiC,EAAI,SAAS,cAAc,IAAI,EAErC,GADAA,EAAE,MAAK,EACHA,EAAE,kBAAmB,CACvB,MAAMC,EAAMD,EAAE,MAAM,OACpBA,EAAE,kBAAkBC,EAAKA,CAAG,CAClC,CACA,CAEE,SAAShC,EAAWiC,EAAQ,CAC1B,MAAO,IAAM,CACX,IAAIf,EAAO,SAAS,cAAc,iCAAiC,EAInE,GAHIA,IAAS,OACXA,EAAO,SAAS,cAAc,gCAAgC,GAE5DA,IAAS,KAAM,CACjB,MAAMhE,EAAMgE,EAAK,aAAa,MAAM,EAChCe,EACF,OAAO,KAAK/E,CAAG,EAEf,OAAO,SAAS,KAAOA,CAEjC,CACA,CACA,CAEE,SAASgF,EAAgBC,EAAY,CACnC,MAAMC,EAAa,CAAA,EAEnB,UAAW,KAAK9B,EAAa,CAC3B,MAAM+B,EAAM/B,EAAY,CAAC,EACzB8B,EAAWC,EAAI,GAAG,EAAID,EAAWC,EAAI,GAAG,GAAK,CAAA,EAC7CD,EAAWC,EAAI,GAAG,EAAE,KAAKA,CAAG,CAClC,CAEI,MAAMC,EAAS,OAAO,KAAKF,CAAU,EAAE,KAAK,CAACG,EAAG,IAAMH,EAAW,CAAC,EAAE,OAASA,EAAWG,CAAC,EAAE,MAAM,EAEjG,GAAID,EAAO,SAAW,EACpB,OAGF,IAAIE,EAAO,mEACXA,GAAQ,gDACRA,GAAQ,UAER,QAASlG,EAAI,EAAGA,EAAIgG,EAAO,OAAQhG,IAAK,CACtC,MAAMmG,EAAML,EAAWE,EAAOhG,CAAC,CAAC,EAE1BoG,EAAepG,IAAMgG,EAAO,OAAS,EACrCK,EAAQrG,EAAI,IAAM,EAEpBqG,IACFH,GAAQ,QAEVA,GAAQ,OAERA,GAAQ,OAAOC,EAAI,CAAC,EAAE,GAAG,QACzBD,GAAQ,6BAER,UAAWI,KAAMH,EACfD,GAAQ,YAAYC,EAAIG,CAAE,EAAE,GAAG,UAAUH,EAAIG,CAAE,EAAE,GAAG,QAGtDJ,GAAQ,QACRA,GAAQ,SAEJ,CAACG,GAASD,KACZF,GAAQ,QAEhB,CAEIA,GAAQ,WAERL,EAAW,UAAYK,CAC3B,CAEE,SAAS3C,GAAa,CACpB,IAAIgD,EAAY,SAAS,cAAc,mBAAmB,EAC3BA,GAAc,MAE3CA,EAAY,SAAS,cAAc,KAAK,EACxCA,EAAU,GAAK,mBACfA,EAAU,UAAY,eACtBX,EAAgBW,CAAS,EACZ,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAC/C,YAAYA,CAAS,GAG1BA,EAAU,UAAU,OAAO,WAAW,CAE5C,CAEE,SAASjD,GAAqB,CAC5B,MAAMkD,EAAoB,SAAS,cAAc,iCAAiC,EAClF,GAAIA,IAAsB,KAAM,OAEhC,MAAM5F,EAAM4F,EAAkB,aAAa,MAAM,EACjD,UAAU,UAAU,UAAU5F,CAAG,CACrC,CAEE,QAAQ,qBAAuBiE,EAC/B,QAAQ,WAAa1B,EAAgB,MAAM,EAC3C,QAAQ,eAAiBA,EAAgB,IAAI,CAC/C,CAAC,GCtdA,CAACsD,EAAIC,EAAIpG,IAAY,CACpBA,EAAQ,MAAM,IAAM,CAClBA,EAAQ,GAAG,oBAAqB,QAAS,SAAUqG,EAAO,CAExD,KAAK,UAAU,OAAO,kBAAkB,EAGxC,MAAMC,EAAiB,KAAK,QAAQ,cAC9BC,EAAU,WAAW,KAAK,QAAQ,MAAM,EACxCC,EAAU,WAAW,KAAK,QAAQ,MAAM,EACxCC,EAAW,WAAW,KAAK,QAAQ,OAAO,EAC1CC,EAAkB,KAAK,MAAM,KAAK,QAAQ,cAAc,EACxDC,EAAc,KAAK,MAAM,KAAK,QAAQ,UAAU,EAEtD3G,EAAQ,UAAU,iBAAiB,EACnCA,EAAQ,WAAW,gBAAiB,IAAM,CACxC,IAAI4G,EAAa,KACjB,GAAIF,EAAiB,CACnB,MAAMG,EAAY,EAAE,OAAOH,EAAgB,CAAC,EAAGA,EAAgB,CAAC,CAAC,EAC3DI,EAAY,EAAE,OAAOJ,EAAgB,CAAC,EAAGA,EAAgB,CAAC,CAAC,EACjEE,EAAa,EAAE,aAAaC,EAAWC,CAAS,CAC1D,CAGQ,MAAMC,EAAM,EAAE,IAAIT,CAAc,EAE1BU,EAAe,qDACfC,EAAkB,gFAClBC,EAAY,IAAI,EAAE,UAAUF,EAAc,CAAE,QAAS,EAAG,QAAS,GAAI,YAAaC,CAAe,CAAE,EACnGE,EAAkB,sDAClBC,EACJ,kGACIC,EAAe,IAAI,EAAE,UAAUF,EAAiB,CACpD,QAAS,EACT,QAAS,GACT,YAAaC,CACvB,CAAS,EAEGR,EAGF,WAAW,IAAM,CACfG,EAAI,UAAUH,EAAY,CACxB,QAAS,EACvB,CAAa,CACb,EAAa,CAAC,EACKL,GAAWC,IAChBC,EACFM,EAAI,QAAQ,IAAI,EAAE,OAAOP,EAASD,CAAO,EAAGE,CAAQ,EAEpDM,EAAI,QAAQ,IAAI,EAAE,OAAOP,EAASD,CAAO,EAAG,CAAC,GAIjDQ,EAAI,SAASG,CAAS,EAEtB,MAAMI,EAAa,CACjB,aAAcJ,EACd,gBAAiBG,CAC3B,EAEQ,EAAE,QAAQ,OAAOC,CAAU,EAAE,MAAMP,CAAG,EAElCJ,GACF,EAAE,QAAQA,CAAW,EAAE,MAAMI,CAAG,CAI1C,CAAO,EAGDV,EAAM,eAAc,CAC1B,CAAK,CACL,CAAG,CACH,GAAG,OAAQ,SAAU,OAAO,OAAO,GC3ElC,CAACF,EAAI7G,EAAGU,IAAY,CACfA,EAAQ,WAAa,eAIzBA,EAAQ,MAAM,IAAM,CAClB,IAAIuH,EAAsB,KAE1B,SAASC,GAA2B,CAC9BD,GAAuB,MACzBvH,EAAQ,KAAK,MAAO,0BAA0B,EAAE,KAAMyH,GAAY,CAChEF,EAAsB,KAAK,MAAME,CAAO,EACxC,SAAW,CAACC,EAAaC,CAAW,IAAK,OAAO,QAAQJ,CAAmB,EAAG,CAC5E,MAAMK,EAAWtI,EAAE,iBAAiB,sBAAsBoI,CAAW,wBAAwB,EAC7F,UAAWlG,KAAWoG,EAAU,CAC9B,MAAMC,EAAS,QAAQ7H,EAAQ,SAAS,aAAa,MAAM,UAAU2H,EAAY,CAAC,CAAC,QACnFnG,EAAQ,UAAYmG,EAAY,CAAC,EAAIE,CACnD,CACA,CACA,CAAS,CAET,CAEI,UAAWhI,KAAMP,EAAE,iBAAiB,oBAAoB,EACtDU,EAAQ,GAAGH,EAAI,aAAc2H,CAAwB,EAGvD,MAAMM,EAAmBxI,EAAE,iBAAiB,qBAAqB,EAC3DyI,EAAoBzI,EAAE,iBAAiB,sBAAsB,EAC7D0I,EAAgB1I,EAAE,iBAAiB,mDAAmD,EACtF2I,EAAiBC,GAAW,CAChC,UAAWrI,KAAMmI,EAEXnI,EAAG,eAAiB,OAAMA,EAAG,QAAU,CAACqI,EAEpD,EACI,UAAWrI,KAAMiI,EACf9H,EAAQ,GAAGH,EAAI,QAAS,IAAMoI,EAAc,EAAI,CAAC,EAEnD,UAAWpI,KAAMkI,EACf/H,EAAQ,GAAGH,EAAI,QAAS,IAAMoI,EAAc,EAAK,CAAC,EAGpD,MAAME,EAAiB7I,EAAE,cAAc,YAAY,EACnDU,EAAQ,GAAGmI,EAAgB,QAAUrI,GAAM,CACzCA,EAAE,eAAc,EAChB,UAAU,UAAU,UAAUqI,EAAe,QAAQ,IAAI,EACzDA,EAAe,UAAYA,EAAe,QAAQ,UACxD,CAAK,CACL,CAAG,CACH,GAAG,OAAQ,SAAU,OAAO,OAAO,ECnDnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQC,SAAUC,EAAQC,EAAU,CAKrB,OAAOD,EAAO,aAAgB,aAE9BA,EAAO,YAAc,SAAU/B,EAAOiC,EAAQ,CAE1CA,EAASA,GAAU,CAAE,QAAS,GAAO,WAAY,GAAO,OAAQ,MAAS,EAEzE,IAAIC,EAAMF,EAAS,YAAY,aAAa,EAC5C,OAAAE,EAAI,gBAAgBlC,EAAOiC,EAAO,QAASA,EAAO,WAAYA,EAAO,MAAM,EACpEC,CACnB,EAEQH,EAAO,YAAY,UAAYA,EAAO,MAAM,WAGhDC,EAAS,iBAAiB,aAAcG,EAAkB,EAAK,EAC/DH,EAAS,iBAAiB,YAAaI,EAAiB,EAAK,EAC7DJ,EAAS,iBAAiB,WAAYK,EAAgB,EAAK,EAE3D,IAAIC,EAAQ,KACRC,EAAQ,KACRC,EAAQ,KACRC,EAAQ,KACRC,EAAW,KACXC,EAAU,KACVC,EAAa,EAOjB,SAASP,EAAe5I,EAAG,CAGvB,GAAIkJ,IAAYlJ,EAAE,OAElB,KAAIoJ,EAAiB,SAASC,EAAoBH,EAAS,uBAAwB,IAAI,EAAG,EAAE,EACxFI,EAAYD,EAAoBH,EAAS,kBAAmB,IAAI,EAChEK,EAAe,SAASF,EAAoBH,EAAS,qBAAsB,KAAK,EAAG,EAAE,EACrFM,EAAW,KAAK,IAAG,EAAKP,EACxB7I,EAAY,GACZqJ,EAAiBzJ,EAAE,gBAAkBA,EAAE,SAAW,CAAA,EA4BtD,GA1BIsJ,IAAc,OACdF,EAAiB,KAAK,MAAOA,EAAiB,IAAOb,EAAS,gBAAgB,YAAY,GAE1Fe,IAAc,OACdF,EAAiB,KAAK,MAAOA,EAAiB,IAAOb,EAAS,gBAAgB,WAAW,GAGzF,KAAK,IAAIQ,CAAK,EAAI,KAAK,IAAIC,CAAK,EAC5B,KAAK,IAAID,CAAK,EAAIK,GAAkBI,EAAWD,IAC3CR,EAAQ,EACR3I,EAAY,cAGZA,EAAY,gBAIf,KAAK,IAAI4I,CAAK,EAAII,GAAkBI,EAAWD,IAChDP,EAAQ,EACR5I,EAAY,YAGZA,EAAY,eAIhBA,IAAc,GAAI,CAElB,IAAIsJ,EAAY,CACZ,IAAKtJ,EAAU,QAAQ,UAAW,EAAE,EACpC,WAAYqJ,EAAe,CAAC,GAAK,CAAA,GAAI,WAAa,SAClD,QAASN,EACT,OAAQ,SAASN,EAAO,EAAE,EAC1B,KAAM,UAAUY,EAAe,CAAC,GAAK,IAAI,SAAW,GAAI,EAAE,EAC1D,OAAQ,SAASX,EAAO,EAAE,EAC1B,KAAM,UAAUW,EAAe,CAAC,GAAK,IAAI,SAAW,GAAI,EAAE,CAC1E,EAGYP,EAAQ,cAAc,IAAI,YAAY,SAAU,CAAE,QAAS,GAAM,WAAY,GAAM,OAAQQ,CAAS,CAAE,CAAC,EAGvGR,EAAQ,cAAc,IAAI,YAAY9I,EAAW,CAAE,QAAS,GAAM,WAAY,GAAM,OAAQsJ,CAAS,CAAE,CAAC,CACpH,CAGQb,EAAQ,KACRC,EAAQ,KACRG,EAAW,KACnB,CAMI,SAASP,EAAiB1I,EAAG,CAGrBA,EAAE,OAAO,aAAa,mBAAmB,IAAM,SAEnDkJ,EAAUlJ,EAAE,OAEZiJ,EAAW,KAAK,IAAG,EACnBJ,EAAQ7I,EAAE,QAAQ,CAAC,EAAE,QACrB8I,EAAQ9I,EAAE,QAAQ,CAAC,EAAE,QACrB+I,EAAQ,EACRC,EAAQ,EACRG,EAAanJ,EAAE,QAAQ,OAC/B,CAOI,SAAS2I,EAAgB3I,EAAG,CAExB,GAAI,GAAC6I,GAAS,CAACC,GAEf,KAAIa,EAAM3J,EAAE,QAAQ,CAAC,EAAE,QACnB4J,EAAM5J,EAAE,QAAQ,CAAC,EAAE,QAEvB+I,EAAQF,EAAQc,EAChBX,EAAQF,EAAQc,EACxB,CASI,SAASP,EAAoBtJ,EAAI8J,EAAeC,EAAc,CAG1D,KAAO/J,GAAMA,IAAOwI,EAAS,iBAAiB,CAE1C,IAAIwB,EAAiBhK,EAAG,aAAa8J,CAAa,EAElD,GAAIE,EACA,OAAOA,EAGXhK,EAAKA,EAAG,UACpB,CAEQ,OAAO+J,CACf,CAEA,GAAE,OAAQ,QAAQ,GClKjB,CAACvK,EAAGC,EAAGU,IAAY,CACdA,EAAQ,WAAa,WAIzBA,EAAQ,MAAM,IAAM,CAClBV,EAAE,iBAAiB,WAAW,EAAE,QAASwK,GACvCA,EAAI,iBACF,QACA,IAAM,CAEJA,EAAI,IAAM,GAAG,OAAO,QAAQ,SAAS,iBAAiB,yBAChE,EACQ,CAAE,KAAM,EAAI,CACpB,CACA,EAEQxK,EAAE,cAAc,6BAA6B,IAC/CA,EAAE,cAAc,6BAA6B,EAAE,MAAM,QAAU,SAGjEU,EAAQ,GAAG,gBAAiB,QAAS,UAAY,CAC/C,MAAM+J,EAAoB,KAAK,aAAa,yBAAyB,EAC/DC,EAAuB,KAAK,aAAa,6BAA6B,EACtEC,EAAS,KAAK,aAAa,aAAa,EACxCC,EAAgB5K,EAAE,cAAc2K,CAAM,EAC5C,IAAIrE,EAAO,KAAK,UACZ,KAAK,UAAU,SAAS,WAAW,EACrCA,EAAOA,EAAK,QAAQmE,EAAmBC,CAAoB,EAE3DpE,EAAOA,EAAK,QAAQoE,EAAsBD,CAAiB,EAE7D,KAAK,UAAYnE,EACjB,KAAK,UAAU,OAAO,WAAW,EACjCsE,EAAc,UAAU,OAAO,WAAW,CAChD,CAAK,EAEDlK,EAAQ,GAAG,gBAAiB,QAAS,UAAY,CAC/C,MAAMiK,EAAS,KAAK,aAAa,aAAa,EACxCE,EAAc7K,EAAE,cAAc,GAAG2K,CAAM,WAAW,EAClDG,EAAUD,EAAY,aAAa,KAAK,GAC1CC,GAAY,MAAiCA,IAAY,KAC3DD,EAAY,aAAa,MAAOA,EAAY,aAAa,UAAU,CAAC,CAE5E,CAAK,EAEDnK,EAAQ,GAAG,YAAa,QAAS,UAAY,CAC3C,MAAMiK,EAAS,KAAK,cAAc,cAAc,KAAK,EACrD,UAAU,UAAU,UAAUA,EAAO,SAAS,EAC9C,KAAK,UAAY,KAAK,QAAQ,UACpC,CAAK,EAMD,IAAII,EAGJ,MAAMC,EAAmBhL,EAAE,cAAc,KAAK,EAC9CgL,EAAiB,UAAU,IAAI,QAAQ,EAIvC,MAAMC,EAAY,IAAI,MAEhBC,EAAY,CAACC,EAAQC,IAAc,CAEnCL,GAAc,aAAaA,CAAY,EAG3CA,EAAe,WAAW,IAAM,CAC9BE,EAAU,IAAME,CACxB,EAAS,GAAI,EAGPF,EAAU,OAAS,IAAM,CACvBG,EAAS,EACTJ,EAAiB,OAAM,CAC/B,EACMC,EAAU,QAAU,IAAM,CACxBD,EAAiB,OAAM,CAC/B,CACA,EAEItK,EAAQ,YAAe4C,GAAkB,CAavC,GAVAtD,EAAE,eAAe,SAAS,EAAE,UAAU,IAAI,mBAAmB,EAK7D,OAAO,SAAS,KAAO,gBAEvBU,EAAQ,qBAAoB,EAGxB,CAAC4C,EAAe,OAGpB,MAAMkH,EAAMlH,EAAc,cAAc,2BAA2B,EACnE,GAAI,CAACkH,EAAK,OAGV,MAAMlJ,EAAMkJ,EAAI,aAAa,UAAU,EAGvC,GAAI,CAAClJ,EAAK,OAGV,MAAM+J,EAAY/H,EAAc,cAAc,kBAAkB,EAChEkH,EAAI,IAAMa,EAAU,IAGE/H,EAAc,cAAc,SAAS,EAC7C,YAAY0H,CAAgB,EAG1CE,EAAU5J,EAAK,IAAM,CAGnBkJ,EAAI,IAAMlJ,EACVkJ,EAAI,gBAAgB,UAAU,CACtC,CAAO,CACP,EAEI9J,EAAQ,YAAc,IAAM,CAC1BV,EAAE,eAAe,SAAS,EAAE,UAAU,OAAO,mBAAmB,EAE5D,OAAO,SAAS,OAAS,iBAAiB,OAAO,QAAQ,KAAI,EACjEU,EAAQ,qBAAoB,CAClC,EACIA,EAAQ,GAAG,uBAAwB,QAAUF,GAAM,CACjDA,EAAE,eAAc,EAChBE,EAAQ,YAAW,CACzB,CAAK,EACDA,EAAQ,GAAG,0BAA2B,QAAUF,GAAM,CACpDA,EAAE,eAAc,EAChBE,EAAQ,eAAe,EAAK,CAClC,CAAK,EACDA,EAAQ,GAAG,sBAAuB,QAAUF,GAAM,CAChDA,EAAE,eAAc,EAChBE,EAAQ,WAAW,EAAK,CAC9B,CAAK,EAGD,OAAO,iBAAiB,aAAc,IAAM,CACtC,OAAO,SAAS,OAAS,iBAAiBA,EAAQ,YAAW,CACvE,CAAK,EAEDV,EAAE,iBAAiB,mBAAmB,EAAE,QAASW,GAAQ,CACvDA,EAAI,iBAAiB,cAAe,IAAM,CACxCD,EAAQ,WAAW,EAAK,CAChC,CAAO,EACDC,EAAI,iBAAiB,eAAgB,IAAM,CACzCD,EAAQ,eAAe,EAAK,CACpC,CAAO,CACP,CAAK,EAEDX,EAAE,iBACA,SACA,IAAM,CACJ,MAAMS,EAAIR,EAAE,eAAe,WAAW,EACpCsL,EAAY,SAAS,gBAAgB,WAAa,SAAS,KAAK,UAChE1G,EAAU5E,EAAE,eAAe,SAAS,EAClCQ,IAAM,OACJ8K,GAAa,IACf1G,EAAQ,UAAU,IAAI,WAAW,EAEjCA,EAAQ,UAAU,OAAO,WAAW,EAGhD,EACM,EACN,CACA,CAAG,CACH,GAAG,OAAQ,SAAU,OAAO,OAAO,GClLlC,CAACiC,EAAI7G,EAAGU,IAAY,CACnB,MAAM6K,EAAY,IAClB,IAAIC,EAEJ,MAAMC,EAAW,OAAO,WAAW,mCAAmC,EAAE,QAClEC,EAAgB,SAAS,cAAc,MAAM,EAAE,KAAO,eAE5D,SAASC,GAAgB,CACvB,GAAIH,EAAO,MAAM,OAAS,EAAG,CAC3B,MAAMI,EAAS,SAAS,eAAe,QAAQ,EAC/C,WAAWA,EAAO,OAAO,KAAKA,CAAM,EAAG,CAAC,CAC9C,CACA,CAEE,SAASC,EAAkBL,EAAQ,CACjC,MAAMM,EAAK,SAAS,eAAe,cAAc,EAC3CC,EAAoB,IAAM,CAC1BP,EAAO,MAAM,SAAW,EAC1BM,EAAG,UAAU,IAAI,OAAO,EAExBA,EAAG,UAAU,OAAO,OAAO,CAEnC,EAGIC,EAAiB,EACjBD,EAAG,iBAAiB,QAAUE,GAAO,CACnCR,EAAO,MAAQ,GACfA,EAAO,MAAK,EACZO,EAAiB,EACjBC,EAAG,eAAc,CACvB,CAAK,EACDR,EAAO,iBAAiB,QAASO,EAAmB,EAAK,CAC7D,CAEE,MAAME,EAAe,MAAOC,GAAU,CACpC,IAAIC,EACJ,GAAIzL,EAAQ,SAAS,SAAW,MAAO,CACrC,MAAM0L,EAAY,IAAI,gBACtBA,EAAU,OAAO,IAAKF,CAAK,EAC3BC,EAAU,MAAM,mBAAmBC,EAAU,SAAQ,CAAE,EAAE,CAC/D,KAAW,CACL,MAAM7J,EAAW,IAAI,SACrBA,EAAS,OAAO,IAAK2J,CAAK,EAC1BC,EAAU,MAAM,kBAAmB,CACjC,OAAQ,OACR,KAAM5J,CACd,CAAO,CACP,CAEI4J,EAAQ,KAAK,MAAO3J,GAAa,CAC/B,MAAMoC,EAAU,MAAMpC,EAAS,KAAI,EAEnC,GAAI,CAACoC,EAAS,OAEd,MAAMyH,EAAerM,EAAE,cAAc,eAAe,EAC9CsM,EAAmBtM,EAAE,cAAc,kBAAkB,EAK3D,GAJAqM,EAAa,UAAU,IAAI,MAAM,EACjCC,EAAiB,UAAY,GAGzB,CAAC1H,EAAQ,CAAC,GAAKA,EAAQ,CAAC,EAAE,SAAW,EAAG,CAC1C,MAAM2H,EAAqB,SAAS,cAAc,IAAI,EACtDA,EAAmB,UAAU,IAAI,eAAe,EAChDA,EAAmB,UAAY7L,EAAQ,SAAS,aAAa,cAC7D4L,EAAiB,YAAYC,CAAkB,EAC/C,MACR,CAEM,UAAWC,KAAU5H,EAAQ,CAAC,EAAG,CAC/B,MAAM6H,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAYD,EAEf9L,EAAQ,GAAG+L,EAAI,YAAa,IAAM,CAChCjB,EAAO,MAAQgB,EACFxM,EAAE,cAAc,SAAS,EACjC,OAAM,EACXqM,EAAa,UAAU,OAAO,MAAM,CAC9C,CAAS,EACDC,EAAiB,YAAYG,CAAE,CACvC,CACA,CAAK,CACL,EAEE/L,EAAQ,MAAM,IAAM,CAEd,CAAC+K,GAAY,CAACC,GAAe,SAAS,eAAe,GAAG,EAAE,MAAK,EAEnEF,EAASxL,EAAE,eAAeuL,CAAS,EACnC,MAAMc,EAAerM,EAAE,cAAc,eAAe,EAC9CsM,EAAmBtM,EAAE,cAAc,kBAAkB,EAEvDwL,IAAW,OAEbK,EAAkBL,CAAM,EAGpB9K,EAAQ,SAAS,eACnBA,EAAQ,GAAG8K,EAAQ,QAAS,IAAM,CAChC,MAAMU,EAAQV,EAAO,MACjBU,EAAM,OAASxL,EAAQ,SAAS,kBAEpC,WAAW,IAAM,CACXwL,IAAUV,EAAO,OAAOS,EAAaC,CAAK,CAC1D,EAAa,GAAG,CAChB,CAAS,EAEDxL,EAAQ,GAAG8K,EAAQ,QAAUhL,GAAM,CACjC,IAAIkM,EAAe,GACnB,MAAMC,EAAYL,EAAiB,SACnC,QAASlM,EAAI,EAAGA,EAAIuM,EAAU,OAAQvM,IACpC,GAAIuM,EAAUvM,CAAC,EAAE,UAAU,SAAS,QAAQ,EAAG,CAC7CsM,EAAetM,EACf,KACd,CAGU,IAAIwM,EAAkB,GAatB,GAZIpM,EAAE,MAAQ,WACRkM,GAAgB,GAAGC,EAAUD,CAAY,EAAE,UAAU,OAAO,QAAQ,EAGxEE,GAAmBF,EAAe,EAAIC,EAAU,QAAUA,EAAU,QAC3DnM,EAAE,MAAQ,aACfkM,GAAgB,GAAGC,EAAUD,CAAY,EAAE,UAAU,OAAO,QAAQ,EACxEE,GAAmBF,EAAe,GAAKC,EAAU,SACxCnM,EAAE,MAAQ,OAASA,EAAE,MAAQ,UACtC6L,EAAa,UAAU,OAAO,MAAM,EAGlCO,IAAoB,GAAI,CAC1B,MAAMC,EAAeF,EAAUC,CAAe,EAC9CC,EAAa,UAAU,IAAI,QAAQ,EAE9BA,EAAa,UAAU,SAAS,eAAe,IAAGrB,EAAO,MAAQqB,EAAa,UAC/F,CACA,CAAS,IASHrB,IAAW,MACX9K,EAAQ,SAAS,2BAGjBV,EAAE,cAAc,iBAAiB,GAAK,OAEtCU,EAAQ,GAAGV,EAAE,eAAe,YAAY,EAAG,SAAU2L,CAAa,EAClEjL,EAAQ,GAAGV,EAAE,eAAe,YAAY,EAAG,SAAU2L,CAAa,EAClEjL,EAAQ,GAAGV,EAAE,eAAe,UAAU,EAAG,SAAU2L,CAAa,GAGlE,MAAMmB,EAAkB9M,EAAE,iBAAiB,wBAAwB,EACnE,UAAWoF,KAAU0H,EACnBpM,EAAQ,GAAG0E,EAAQ,QAAU2B,GAAU,CACrC,GAAIA,EAAM,SAAU,CAClBA,EAAM,eAAc,EACpB3B,EAAO,UAAU,OAAO,UAAU,EAClC,MACV,CAGQ,MAAM2H,EAAqB/M,EAAE,iBAAiB,iCAAiC,EAC/E,UAAWgN,KAAkBD,EAC3BC,EAAe,UAAU,OAAO,UAAU,EAE5C5H,EAAO,UAAU,IAAI,UAAU,CACvC,CAAO,EAIH,MAAM9C,EAAOtC,EAAE,cAAc,SAAS,EAClCsC,GAAQ,MACV5B,EAAQ,GAAG4B,EAAM,SAAWyE,GAAU,CACpCA,EAAM,eAAc,EACpB,MAAMkG,EAAsBjN,EAAE,cAAc,sBAAsB,EAClE,GAAIiN,EAAqB,CACvB,MAAMC,EAAiB,CAAA,EACvB,UAAWF,KAAkBF,EACvBE,EAAe,UAAU,SAAS,UAAU,GAC9CE,EAAe,KAAKF,EAAe,KAAK,QAAQ,YAAa,EAAE,CAAC,EAGpEC,EAAoB,MAAQC,EAAe,KAAK,GAAG,CAC7D,CACQ5K,EAAK,OAAM,CACnB,CAAO,CAEP,CAAG,CACH,GAAG,OAAQ,SAAU,OAAO,OAAO","x_google_ignoreList":[5]} \ No newline at end of file