From 2c746412601c222a84c8ffdd569bc219b7a98baf Mon Sep 17 00:00:00 2001 From: Alexander Menk Date: Fri, 1 Mar 2024 10:24:10 +0100 Subject: [PATCH] Update to friendly-challenge from 0.9.9 to 0.9.14 --- README.md | 15 + .../friendly-challenge/compat/index.d.ts | 10 +- .../vendor/friendly-challenge/compat/index.js | 227 +++++++----- .../friendly-challenge/compat/index.js.map | 2 +- .../custom-localization.html | 38 -- .../friendly-challenge/friendly-captcha.d.ts | 83 ----- .../friendly-challenge.d.ts | 10 +- .../js/vendor/friendly-challenge/index.html | 20 ++ .../web/js/vendor/friendly-challenge/index.js | 227 +++++++----- .../js/vendor/friendly-challenge/index.js.map | 2 +- .../js/vendor/friendly-challenge/package.json | 2 +- .../js/vendor/friendly-challenge/widget.js | 328 ++++++++++-------- .../vendor/friendly-challenge/widget.min.js | 2 +- .../friendly-challenge/widget.module.js | 225 +++++++----- .../friendly-challenge/widget.module.min.js | 2 +- .../widget.polyfilled.min.js | 2 +- 16 files changed, 637 insertions(+), 558 deletions(-) delete mode 100644 view/frontend/web/js/vendor/friendly-challenge/custom-localization.html delete mode 100644 view/frontend/web/js/vendor/friendly-challenge/friendly-captcha.d.ts diff --git a/README.md b/README.md index b5969e2..1e7c718 100644 --- a/README.md +++ b/README.md @@ -37,3 +37,18 @@ IMI_FriendlyCaptcha adds a Friendly Captcha widget to: ## Security Scan This module is accepted by the Magento security scan by Adobe, which normally looks for Google ReCAPTCHA, i.e. replacing the ReCAPTCHA with the Friendly Captcha should not trigger any false positives. + +## Development + +### Updating the vendor code + +```bash +cd view/frontend/web/js/vendor +rm -r friendly-challenge +npm pack friendly-challenge +tar -xvf friendly-challenge-*.tgz +rm friendly-challenge-*.tgz +mv package friendly-challenge +``` + +Then make a pullrequest. diff --git a/view/frontend/web/js/vendor/friendly-challenge/compat/index.d.ts b/view/frontend/web/js/vendor/friendly-challenge/compat/index.d.ts index 36ba924..343156f 100644 --- a/view/frontend/web/js/vendor/friendly-challenge/compat/index.d.ts +++ b/view/frontend/web/js/vendor/friendly-challenge/compat/index.d.ts @@ -11,6 +11,7 @@ interface Localization { text_error: string; button_retry: string; text_fetch_error: string; + rtl?: boolean; } declare const localizations: { en: Localization; @@ -43,8 +44,10 @@ declare const localizations: { hu: Localization; ro: Localization; zh: Localization; - zh_TW: Localization; + zh_tw: Localization; vi: Localization; + he: Localization; + th: Localization; nb: Localization; }; @@ -92,6 +95,11 @@ declare class WidgetInstance { private expiryTimeout; constructor(element: HTMLElement, options?: Partial); init(forceStart?: boolean): void; + /** + * Loads the configured language, or a language passed to this function. + * Note that only the next update will be in the new language, consider calling `reset()` after switching languages. + */ + loadLanguage(lang?: keyof typeof localizations | Localization): void; /** * Add a listener to the button that calls `this.start` on click. */ diff --git a/view/frontend/web/js/vendor/friendly-challenge/compat/index.js b/view/frontend/web/js/vendor/friendly-challenge/compat/index.js index 9cd98a7..c090ebf 100644 --- a/view/frontend/web/js/vendor/friendly-challenge/compat/index.js +++ b/view/frontend/web/js/vendor/friendly-challenge/compat/index.js @@ -51,7 +51,7 @@ function decode(base64) { return bytes; } -var css = '.frc-captcha *{margin:0;padding:0;border:0;text-align:initial;border-radius:px;filter:none!important;transition:none!important;font-weight:400;font-size:14px;line-height:1.2;text-decoration:none;background-color:initial;color:#222}.frc-captcha{position:relative;min-width:250px;max-width:312px;border:1px solid #f4f4f4;padding-bottom:12px;background-color:#fff}.frc-captcha b{font-weight:700}.frc-container{display:flex;align-items:center;min-height:52px}.frc-icon{fill:#222;stroke:#222;flex-shrink:0;margin:8px 8px 0}.frc-icon.frc-warning{fill:#c00}.frc-success .frc-icon{animation:1s ease-in both frc-fade-in}.frc-content{white-space:nowrap;display:flex;flex-direction:column;margin:4px 6px 0 0;overflow-x:auto;flex-grow:1}.frc-banner{position:absolute;bottom:0;right:6px;line-height:1}.frc-banner *{font-size:10px;opacity:.8;text-decoration:none}.frc-progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:3px 0;height:4px;border:none;background-color:#eee;color:#222;width:100%;transition:.5s linear}.frc-progress::-webkit-progress-bar{background:#eee}.frc-progress::-webkit-progress-value{background:#222}.frc-progress::-moz-progress-bar{background:#222}.frc-button{cursor:pointer;padding:2px 6px;background-color:#f1f1f1;border:1px solid transparent;text-align:center;font-weight:600;text-transform:none}.frc-button:focus{border:1px solid #333}.frc-button:hover{background-color:#ddd}.frc-captcha-solution{display:none}.frc-err-url{text-decoration:underline;font-size:.9em}.dark.frc-captcha{color:#fff;background-color:#222;border-color:#333}.dark.frc-captcha *{color:#fff}.dark.frc-captcha button{background-color:#444}.dark .frc-icon{fill:#fff;stroke:#fff}.dark .frc-progress{background-color:#444}.dark .frc-progress::-webkit-progress-bar{background:#444}.dark .frc-progress::-webkit-progress-value{background:#ddd}.dark .frc-progress::-moz-progress-bar{background:#ddd}@keyframes frc-fade-in{from{opacity:0}to{opacity:1}}'; +var css = '.frc-captcha *{margin:0;padding:0;border:0;text-align:initial;border-radius:px;filter:none!important;transition:none!important;font-weight:400;font-size:14px;line-height:1.2;text-decoration:none;background-color:initial;color:#222}.frc-captcha{position:relative;min-width:250px;max-width:312px;border:1px solid #f4f4f4;padding-bottom:12px;background-color:#fff}.frc-captcha b{font-weight:700}.frc-container{display:flex;align-items:center;min-height:52px}.frc-icon{fill:#222;stroke:#222;flex-shrink:0;margin:8px 8px 0}.frc-icon.frc-warning{fill:#c00}.frc-success .frc-icon{animation:1s ease-in both frc-fade-in}.frc-content{white-space:nowrap;display:flex;flex-direction:column;margin:4px 6px 0 0;overflow-x:auto;flex-grow:1}.frc-banner{position:absolute;bottom:0;right:6px;line-height:1}.frc-banner *{font-size:10px;opacity:.8;text-decoration:none}.frc-progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:3px 0;height:4px;border:none;background-color:#eee;color:#222;width:100%;transition:.5s linear}.frc-progress::-webkit-progress-bar{background:#eee}.frc-progress::-webkit-progress-value{background:#222}.frc-progress::-moz-progress-bar{background:#222}.frc-button{cursor:pointer;padding:2px 6px;background-color:#f1f1f1;border:1px solid transparent;text-align:center;font-weight:600;text-transform:none}.frc-button:focus{border:1px solid #333}.frc-button:hover{background-color:#ddd}.frc-captcha-solution{display:none}.frc-err-url{text-decoration:underline;font-size:.9em}.frc-rtl{direction:rtl}.frc-rtl .frc-content{margin:4px 0 0 6px}.frc-banner.frc-rtl{left:6px;right:auto}.dark.frc-captcha{color:#fff;background-color:#222;border-color:#333}.dark.frc-captcha *{color:#fff}.dark.frc-captcha button{background-color:#444}.dark .frc-icon{fill:#fff;stroke:#fff}.dark .frc-progress{background-color:#444}.dark .frc-progress::-webkit-progress-bar{background:#444}.dark .frc-progress::-webkit-progress-value{background:#ddd}.dark .frc-progress::-moz-progress-bar{background:#ddd}@keyframes frc-fade-in{from{opacity:0}to{opacity:1}}'; // This is not an enum to save some bytes in the output bundle. const SOLVER_TYPE_JS = 1; @@ -64,44 +64,44 @@ const errorSVG = ` -${svgContent} +function getTemplate(fieldName, rtl, svgContent, svgAriaHidden, textContent, solutionString, buttonText, progress = false, debugData, additionalContainerClasses) { + return `
+
- ${textContent} + ${textContent} ${buttonText ? `` : ""} ${progress ? `0%` : ""}
-
FriendlyCaptcha ⇗ -`; +FriendlyCaptcha ⇗ +${fieldName === "-" ? "" : ``}`; } /** * Used when the widget is ready to start solving. */ function getReadyHTML(fieldName, l) { - return getTemplate(fieldName, ``, true, l.text_ready, ".UNSTARTED", l.button_start, false); + return getTemplate(fieldName, l.rtl, ``, true, l.text_ready, ".UNSTARTED", l.button_start, false); } /** * Used when the widget is retrieving a puzzle */ function getFetchingHTML(fieldName, l) { - return getTemplate(fieldName, loaderSVG, true, l.text_fetching, ".FETCHING", undefined, true); + return getTemplate(fieldName, l.rtl, loaderSVG, true, l.text_fetching, ".FETCHING", undefined, true); } /** * Used when the solver is running, displays a progress bar. */ function getRunningHTML(fieldName, l) { - return getTemplate(fieldName, loaderSVG, true, l.text_solving, ".UNFINISHED", undefined, true); + return getTemplate(fieldName, l.rtl, loaderSVG, true, l.text_solving, ".UNFINISHED", undefined, true); } function getDoneHTML(fieldName, l, solution, data) { const timeData = `${data.t.toFixed(0)}s (${((data.h / data.t) * 0.001).toFixed(0)}K/s)${data.solver === SOLVER_TYPE_JS ? " JS Fallback" : ""}`; - return getTemplate(fieldName, `${l.text_completed_sr}`, false, l.text_completed, solution, undefined, false, timeData, "frc-success"); + return getTemplate(fieldName, l.rtl, `${l.text_completed_sr}`, false, l.text_completed, solution, undefined, false, timeData, "frc-success"); } function getExpiredHTML(fieldName, l) { - return getTemplate(fieldName, errorSVG, true, l.text_expired, ".EXPIRED", l.button_restart); + return getTemplate(fieldName, l.rtl, errorSVG, true, l.text_expired, ".EXPIRED", l.button_restart); } function getErrorHTML(fieldName, l, errorDescription, recoverable = true, headless = false) { - return getTemplate(fieldName, errorSVG, true, `${l.text_error}
${errorDescription}`, headless ? ".HEADLESS_ERROR" : ".ERROR", recoverable ? l.button_retry : undefined); + return getTemplate(fieldName, l.rtl, errorSVG, true, `${l.text_error}
${errorDescription}`, headless ? ".HEADLESS_ERROR" : ".ERROR", recoverable ? l.button_retry : undefined); } /** * Injects the style if no #frc-style element is already present @@ -147,7 +147,7 @@ function executeOnceOnFocusInEvent(element, listener) { element.addEventListener("focusin", listener, { once: true, passive: true }); } -// Defensive init to make it easier to integrate with Gatsby and friends. +// Defensive init to make it easier to integrate with Gatsby, NextJS, and friends. let nav; let ua; if (typeof navigator !== "undefined") { @@ -160,15 +160,6 @@ if (typeof navigator !== "undefined") { * it stops unsophisticated scripters from making any request whatsoever. */ function isHeadless() { - let correctPluginPrototype = true; - try { - if (nav.plugins.length > 0) { - correctPluginPrototype = Plugin.prototype === nav.plugins[0].__proto__; - } - } - catch (e) { - /* Do nothing, this browser misbehaves in mysterious ways */ - } return ( //tell-tale bot signs ua.indexOf("headless") !== -1 || @@ -177,8 +168,8 @@ function isHeadless() { ua.indexOf("crawl") !== -1 || // Only IE5 has two distributions that has this on windows NT.. so yeah. nav.webdriver === true || !nav.language || - (nav.languages !== undefined && !nav.languages.length) || // IE 11 does not support NavigatorLanguage.languages https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages - !correctPluginPrototype); + (nav.languages !== undefined && !nav.languages.length) // IE 11 does not support NavigatorLanguage.languages https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages + ); } /** @@ -228,7 +219,7 @@ async function getPuzzle(urlsSeparatedByComma, siteKey, lang) { const urls = urlsSeparatedByComma.split(","); for (let i = 0; i < urls.length; i++) { try { - const response = await fetchAndRetryWithBackoff(urls[i] + "?sitekey=" + siteKey, { headers: [["x-frc-client", "js-0.9.9"]], mode: "cors" }, 2); + const response = await fetchAndRetryWithBackoff(urls[i] + "?sitekey=" + siteKey, { headers: [["x-frc-client", "js-0.9.14"]], mode: "cors" }, 2); if (response.ok) { const json = await response.json(); return json.data.puzzle; @@ -278,11 +269,11 @@ async function fetchAndRetryWithBackoff(url, opts, n) { // English const LANG_EN = { - text_init: "Initializing..", + text_init: "Initializing...", text_ready: "Anti-Robot Verification", button_start: "Click to start verification", text_fetching: "Fetching Challenge", - text_solving: "Verifying you are human..", + text_solving: "Verifying you are human...", text_completed: "I am human", text_completed_sr: "Automatic spam check completed", text_expired: "Anti-Robot verification expired", @@ -293,26 +284,26 @@ const LANG_EN = { }; // French const LANG_FR = { - text_init: "Chargement..", - text_ready: "Verification Anti-Robot", - button_start: "Cliquez ici pour vérifier", - text_fetching: "Chargement du challenge", - text_solving: "Vérification que vous êtes humain..", - text_completed: "Je suis humain", + text_init: "Chargement...", + text_ready: "Vérification Anti-Robot", + button_start: "Clique ici pour vérifier", + text_fetching: "Chargement du défi", + text_solving: "Nous vérifions que vous n'êtes pas un robot...", + text_completed: "Je ne suis pas un robot", text_completed_sr: "Vérification automatique des spams terminée", - text_expired: "Verification échue", - button_restart: "Recommencer", - text_error: "Echec de verification", + text_expired: "Vérification anti-robot expirée", + button_restart: "Redémarrer", + text_error: "Échec de la vérification", button_retry: "Recommencer", text_fetch_error: "Problème de connexion avec", }; // German const LANG_DE = { - text_init: "Initialisierung..", + text_init: "Initialisierung...", text_ready: "Anti-Roboter-Verifizierung", button_start: "Hier klicken", - text_fetching: "Herausforderung laden..", - text_solving: "Verifizierung, dass Sie ein Mensch sind..", + text_fetching: "Herausforderung laden...", + text_solving: "Verifizierung, dass Sie ein Mensch sind...", text_completed: "Ich bin ein Mensch", text_completed_sr: "Automatische Spamprüfung abgeschlossen", text_expired: "Verifizierung abgelaufen", @@ -323,11 +314,11 @@ const LANG_DE = { }; // Dutch const LANG_NL = { - text_init: "Initializeren..", + text_init: "Initializeren...", text_ready: "Anti-robotverificatie", button_start: "Klik om te starten", - text_fetching: "Aan het laden..", - text_solving: "Anti-robotverificatie bezig..", + text_fetching: "Aan het laden...", + text_solving: "Anti-robotverificatie bezig...", text_completed: "Ik ben een mens", text_completed_sr: "Automatische anti-spamcheck voltooid", text_expired: "Verificatie verlopen", @@ -353,11 +344,11 @@ const LANG_IT = { }; // Portuguese const LANG_PT = { - text_init: "Inicializando..", + text_init: "Inicializando...", text_ready: "Verificação Anti-Robô", button_start: "Clique para iniciar verificação", - text_fetching: "Carregando..", - text_solving: "Verificando se você é humano..", + text_fetching: "Carregando...", + text_solving: "Verificando se você é humano...", text_completed: "Eu sou humano", text_completed_sr: "Verificação automática de spam concluída", text_expired: "Verificação Anti-Robô expirada", @@ -368,11 +359,11 @@ const LANG_PT = { }; // Spanish const LANG_ES = { - text_init: "Inicializando..", + text_init: "Inicializando...", text_ready: "Verificación Anti-Robot", button_start: "Haga clic para iniciar la verificación", text_fetching: "Cargando desafío", - text_solving: "Verificando que eres humano..", + text_solving: "Verificando que eres humano...", text_completed: "Soy humano", text_completed_sr: "Verificación automática de spam completada", text_expired: "Verificación Anti-Robot expirada", @@ -387,7 +378,7 @@ const LANG_CA = { text_ready: "Verificació Anti-Robot", button_start: "Fes clic per començar la verificació", text_fetching: "Carregant repte", - text_solving: "Verificant que ets humà..", + text_solving: "Verificant que ets humà...", text_completed: "Soc humà", text_completed_sr: "Verificació automàtica de correu brossa completada", text_expired: "La verificació Anti-Robot ha expirat", @@ -428,11 +419,11 @@ const LANG_DA = { }; // Russian const LANG_RU = { - text_init: "Инициализация..", + text_init: "Инициализация...", text_ready: "АнтиРобот проверка", button_start: "Нажмите, чтобы начать проверку", text_fetching: "Получаю задачу", - text_solving: "Проверяю, что вы человек..", + text_solving: "Проверяю, что вы человек...", text_completed: "Я человек", text_completed_sr: "Aвтоматическая проверка на спам завершена", text_expired: "Срок АнтиРоботной проверки истёк", @@ -458,11 +449,11 @@ const LANG_SV = { }; // Turkish const LANG_TR = { - text_init: "Başlatılıyor..", + text_init: "Başlatılıyor...", text_ready: "Anti-Robot Doğrulaması", button_start: "Doğrulamayı başlatmak için tıklayın", text_fetching: "Yükleniyor", - text_solving: "Robot olmadığınız doğrulanıyor..", + text_solving: "Robot olmadığınız doğrulanıyor...", text_completed: "Ben bir insanım", text_completed_sr: "Otomatik spam kontrolü tamamlandı", text_expired: "Anti-Robot doğrulamasının süresi doldu", @@ -473,26 +464,26 @@ const LANG_TR = { }; // Greek const LANG_EL = { - text_init: "Προετοιμασία..", + text_init: "Προετοιμασία...", text_ready: "Anti-Robot Επαλήθευση", - button_start: " Κάντε κλικ για να ξεκινήσει η επαλήθευσης", + button_start: " Κάντε κλικ για να ξεκινήσει η επαλήθευση", text_fetching: " Λήψη πρόκλησης", - text_solving: " Επιβεβαίωση ανθρώπου..", + text_solving: " Επιβεβαίωση ανθρώπου...", text_completed: "Είμαι άνθρωπος", text_completed_sr: " Ο αυτόματος έλεγχος ανεπιθύμητου περιεχομένου ολοκληρώθηκε", text_expired: " Η επαλήθευση Anti-Robot έληξε", button_restart: " Επανεκκίνηση", text_error: " Η επαλήθευση απέτυχε", - button_retry: " Δοκιμάσετε ξανά", + button_retry: " Δοκιμάστε ξανά", text_fetch_error: " Αποτυχία σύνδεσης με", }; // Ukrainian const LANG_UK = { - text_init: "Ініціалізація..", + text_init: "Ініціалізація...", text_ready: "Антиробот верифікація", button_start: "Натисніть, щоб розпочати верифікацію", text_fetching: "З’єднання", - text_solving: "Перевірка, що ви не робот..", + text_solving: "Перевірка, що ви не робот...", text_completed: "Я не робот", text_completed_sr: "Автоматична перевірка спаму завершена", text_expired: "Час вичерпано", @@ -518,11 +509,11 @@ const LANG_BG = { }; // Czech const LANG_CS = { - text_init: "Inicializace..", + text_init: "Inicializace...", text_ready: "Ověření proti robotům", button_start: "Klikněte pro ověření", text_fetching: "Problém při načítání", - text_solving: "Ověření, že jste člověk..", + text_solving: "Ověření, že jste člověk...", text_completed: "Jsem člověk", text_completed_sr: "Automatická kontrola spamu dokončena", text_expired: "Ověření proti robotům vypršelo", @@ -533,11 +524,11 @@ const LANG_CS = { }; // Slovak const LANG_SK = { - text_init: "Inicializácia..", + text_init: "Inicializácia...", text_ready: "Overenie proti robotom", button_start: "Kliknite pre overenie", text_fetching: "Problém pri načítaní", - text_solving: "Overenie, že ste človek..", + text_solving: "Overenie, že ste človek...", text_completed: "Som človek", text_completed_sr: "Automatická kontrola spamu dokončená", text_expired: "Overenie proti robotom vypršalo", @@ -578,11 +569,11 @@ const LANG_FI = { }; // Latvian const LANG_LV = { - text_init: "Notiek inicializēšana..", + text_init: "Notiek inicializēšana...", text_ready: "Verifikācija, ka neesat robots", button_start: "Noklikšķiniet, lai sāktu verifikāciju", text_fetching: "Notiek drošības uzdevuma izgūšana", - text_solving: "Notiek pārbaude, vai esat cilvēks..", + text_solving: "Notiek pārbaude, vai esat cilvēks...", text_completed: "Es esmu cilvēks", text_completed_sr: "Automātiska surogātpasta pārbaude pabeigta", text_expired: "Verifikācijas, ka neesat robots, derīgums beidzies", @@ -593,11 +584,11 @@ const LANG_LV = { }; // Lithuanian const LANG_LT = { - text_init: "Inicijuojama..", + text_init: "Inicijuojama...", text_ready: "Patikrinimas, ar nesate robotas", button_start: "Spustelėkite patikrinimui pradėti", text_fetching: "Gavimo iššūkis", - text_solving: "Tikrinama, ar esate žmogus..", + text_solving: "Tikrinama, ar esate žmogus...", text_completed: "Esu žmogus", text_completed_sr: "Automatinė patikra dėl pašto šiukšlių atlikta", text_expired: "Patikrinimas, ar nesate robotas, baigė galioti", @@ -608,11 +599,11 @@ const LANG_LT = { }; // Polish const LANG_PL = { - text_init: "Inicjowanie..", + text_init: "Inicjowanie...", text_ready: "Weryfikacja antybotowa", button_start: "Kliknij, aby rozpocząć weryfikację", text_fetching: "Pobieranie", - text_solving: "Weryfikacja, czy nie jesteś robotem..", + text_solving: "Weryfikacja, czy nie jesteś robotem...", text_completed: "Nie jestem robotem", text_completed_sr: "Zakończono automatyczne sprawdzanie spamu", text_expired: "Weryfikacja antybotowa wygasła", @@ -623,11 +614,11 @@ const LANG_PL = { }; // Estonian const LANG_ET = { - text_init: "Initsialiseerimine..", + text_init: "Initsialiseerimine...", text_ready: "Robotivastane kinnitus", button_start: "Kinnitamisega alustamiseks klõpsake", text_fetching: "Väljakutse toomine", - text_solving: "Kinnitatakse, et sa oled inimene..", + text_solving: "Kinnitatakse, et sa oled inimene...", text_completed: "Ma olen inimene", text_completed_sr: "Automaatne rämpsposti kontroll on lõpetatud", text_expired: "Robotivastane kinnitus aegus", @@ -642,7 +633,7 @@ const LANG_HR = { text_ready: "Provjera protiv robota", button_start: "Kliknite za početak provjere", text_fetching: "Dohvaćanje izazova", - text_solving: "Provjeravamo jeste li čovjek..", + text_solving: "Provjeravamo jeste li čovjek...", text_completed: "Nisam robot", text_completed_sr: "Automatska provjera je završena", text_expired: "Vrijeme za provjeru protiv robota je isteklo", @@ -668,7 +659,7 @@ const LANG_SR = { }; // Slovenian const LANG_SL = { - text_init: "Inicializiranje..", + text_init: "Inicializiranje...", text_ready: "Preverjanje robotov", button_start: "Kliknite za začetek preverjanja", text_fetching: "Prenašanje izziva", @@ -698,18 +689,18 @@ const LANG_HU = { }; // Romanian const LANG_RO = { - text_init: "Se inițializează..", + text_init: "Se inițializează...", text_ready: "Verificare anti-robot", button_start: "Click pentru a începe verificarea", text_fetching: "Downloading", - text_solving: "Verificare ca ești om..", + text_solving: "Verificare că ești om...", text_completed: "Sunt om", text_completed_sr: "Verificarea automată a spam-ului a fost finalizată", text_expired: "Verificarea anti-robot a expirat", button_restart: "Restart", text_error: "Verificare eșuată", button_retry: "Reîncearcă", - text_fetch_error: "Nu s-a putut conecta la", + text_fetch_error: "Nu s-a putut conecta", }; // Chinese const LANG_ZH = { @@ -743,12 +734,12 @@ const LANG_ZH_TW = { }; // Vietnamese const LANG_VI = { - text_init: "Đang khởi tạo..", + text_init: "Đang khởi tạo...", text_ready: "Xác minh chống Robot", button_start: "Bấm vào đây để xác minh", text_fetching: "Tìm nạp và xử lý thử thách", - text_solving: "Xác minh bạn là người..", - text_completed: "Bạn là người", + text_solving: "Xác minh bạn là người...", + text_completed: "Bạn là con người", text_completed_sr: "Xác minh hoàn tất", text_expired: "Xác minh đã hết hạn", button_restart: "Khởi động lại", @@ -756,6 +747,37 @@ const LANG_VI = { button_retry: "Thử lại", text_fetch_error: "Không kết nối được", }; +// Hebrew +const LANG_HE = { + text_init: "בביצוע...", + text_ready: "אימות אנוש", + button_start: "צריך ללחוץ להתחלת האימות", + text_fetching: "אתגר המענה בהכנה", + text_solving: "מתבצע אימות אנוש...", + text_completed: "אני לא רובוט", + text_completed_sr: "בדיקת הספאם האוטומטית הסתיימה", + text_expired: "פג תוקף אימות האנוש", + button_restart: "להתחיל שוב", + text_error: "אימות האנוש נכשל", + button_retry: "לנסות שוב", + text_fetch_error: "נכשל החיבור אל", + rtl: true, +}; +// Thai +const LANG_TH = { + text_init: "การเริ่มต้น...", + text_ready: " การตรวจสอบต่อต้านหุ่นยนต์", + button_start: "คลิกเพื่อเริ่มการตรวจสอบ", + text_fetching: "การดึงความท้าทาย", + text_solving: "ยืนยันว่าคุณเป็นมนุษย์...", + text_completed: "ฉันเป็นมนุษย์", + text_completed_sr: "การตรวจสอบสแปมอัตโนมัติเสร็จสมบูรณ์", + text_expired: "การตรวจสอบ ต่อต้านหุ่นยนต์ หมดอายุ", + button_restart: "รีสตาร์ท", + text_error: "การยืนยันล้มเหลว", + button_retry: "ลองใหม่", + text_fetch_error: "ไม่สามารถเชื่อมต่อได้" +}; const localizations = { en: LANG_EN, de: LANG_DE, @@ -787,8 +809,10 @@ const localizations = { hu: LANG_HU, ro: LANG_RO, zh: LANG_ZH, - zh_TW: LANG_ZH_TW, + zh_tw: LANG_ZH_TW, vi: LANG_VI, + he: LANG_HE, + th: LANG_TH, // alternative language codes nb: LANG_NO, }; @@ -972,20 +996,8 @@ class WidgetInstance { }, options); this.e = element; this.e.friendlyChallengeWidget = this; - // Load language - if (typeof this.opts.language === "string") { - let l = localizations[this.opts.language.toLowerCase()]; - if (l === undefined) { - console.error('FriendlyCaptcha: language "' + this.opts.language + '" not found.'); - // Fall back to English - l = localizations.en; - } - this.lang = l; - } - else { - // We assign to a copy of the English language localization, so that any missing values will be English - this.lang = Object.assign(Object.assign({}, localizations.en), this.opts.language); - } + this.loadLanguage(); + // @ts-ignore Ignore is required as TS thinks that `this.lang` is not assigned yet, but it happens in `this.loadLanguage()` above. element.innerText = this.lang.text_init; if (!this.opts.skipStyleInjection) { injectStyle(); @@ -1012,6 +1024,31 @@ class WidgetInstance { } } } + /** + * Loads the configured language, or a language passed to this function. + * Note that only the next update will be in the new language, consider calling `reset()` after switching languages. + */ + loadLanguage(lang) { + if (lang !== undefined) { + this.opts.language = lang; + } + else if (this.e.dataset["lang"]) { + this.opts.language = this.e.dataset["lang"]; + } + if (typeof this.opts.language === "string") { + let l = localizations[this.opts.language.toLowerCase()]; + if (l === undefined) { + console.error('FriendlyCaptcha: language "' + this.opts.language + '" not found.'); + // Fall back to English + l = localizations.en; + } + this.lang = l; + } + else { + // We assign to a copy of the English language localization, so that any missing values will be English + this.lang = Object.assign(Object.assign({}, localizations.en), this.opts.language); + } + } /** * Add a listener to the button that calls `this.start` on click. */ @@ -1166,5 +1203,5 @@ class WidgetInstance { } } -export { WidgetInstance }; +export { WidgetInstance, localizations }; //# sourceMappingURL=index.js.map diff --git a/view/frontend/web/js/vendor/friendly-challenge/compat/index.js.map b/view/frontend/web/js/vendor/friendly-challenge/compat/index.js.map index 6ae8659..59681d1 100644 --- a/view/frontend/web/js/vendor/friendly-challenge/compat/index.js.map +++ b/view/frontend/web/js/vendor/friendly-challenge/compat/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../../node_modules/friendly-pow/base64.js","../../node_modules/friendly-pow/constants.js","../../src/dom.ts","../../src/headless.ts","../../node_modules/friendly-pow/encoding.js","../../node_modules/friendly-pow/puzzle.js","../../src/puzzle.ts","../../src/localization.ts","../../node_modules/friendly-pow/diagnostics.js","../../src/workergroup.ts","../../src/captcha.ts"],"sourcesContent":["// Adapted from the base64-arraybuffer package implementation\n// (https://github.com/niklasvh/base64-arraybuffer, MIT licensed)\nconst CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst EQ_CHAR = \"=\".charCodeAt(0);\n// Use a lookup table to find the index.\nconst lookup = new Uint8Array(256);\nfor (let i = 0; i < CHARS.length; i++) {\n lookup[CHARS.charCodeAt(i)] = i;\n}\nexport function encode(bytes) {\n const len = bytes.length;\n let base64 = \"\";\n for (let i = 0; i < len; i += 3) {\n const b0 = bytes[i + 0];\n const b1 = bytes[i + 1];\n const b2 = bytes[i + 2];\n // This temporary variable stops the NextJS 13 compiler from breaking this code in optimization.\n // See issue https://github.com/FriendlyCaptcha/friendly-challenge/issues/165\n let t = \"\";\n t += CHARS.charAt(b0 >>> 2);\n t += CHARS.charAt(((b0 & 3) << 4) | (b1 >>> 4));\n t += CHARS.charAt(((b1 & 15) << 2) | (b2 >>> 6));\n t += CHARS.charAt(b2 & 63);\n base64 += t;\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + \"=\";\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + \"==\";\n }\n return base64;\n}\nexport function decode(base64) {\n const len = base64.length;\n let bufferLength = (len * 3) >>> 2; // * 0.75\n if (base64.charCodeAt(len - 1) === EQ_CHAR)\n bufferLength--;\n if (base64.charCodeAt(len - 2) === EQ_CHAR)\n bufferLength--;\n const bytes = new Uint8Array(bufferLength);\n for (let i = 0, p = 0; i < len; i += 4) {\n const encoded1 = lookup[base64.charCodeAt(i + 0)];\n const encoded2 = lookup[base64.charCodeAt(i + 1)];\n const encoded3 = lookup[base64.charCodeAt(i + 2)];\n const encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return bytes;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2U2NC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsaUVBQWlFO0FBRWpFLE1BQU0sS0FBSyxHQUFHLGtFQUFrRSxDQUFDO0FBQ2pGLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEMsd0NBQXdDO0FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2pDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFpQjtJQUN0QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsZ0dBQWdHO1FBQ2hHLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWCxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFD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YXB0ZWQgZnJvbSB0aGUgYmFzZTY0LWFycmF5YnVmZmVyIHBhY2thZ2UgaW1wbGVtZW50YXRpb25cbi8vIChodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyLCBNSVQgbGljZW5zZWQpXG5cbmNvbnN0IENIQVJTID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5jb25zdCBFUV9DSEFSID0gXCI9XCIuY2hhckNvZGVBdCgwKTtcblxuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUlMubGVuZ3RoOyBpKyspIHtcbiAgbG9va3VwW0NIQVJTLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IGxlbiA9IGJ5dGVzLmxlbmd0aDtcbiAgbGV0IGJhc2U2NCA9IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgIGNvbnN0IGIwID0gYnl0ZXNbaSArIDBdO1xuICAgIGNvbnN0IGIxID0gYnl0ZXNbaSArIDFdO1xuICAgIGNvbnN0IGIyID0gYnl0ZXNbaSArIDJdO1xuICAgIC8vIFRoaXMgdGVtcG9yYXJ5IHZhcmlhYmxlIHN0b3BzIHRoZSBOZXh0SlMgMTMgY29tcGlsZXIgZnJvbSBicmVha2luZyB0aGlzIGNvZGUgaW4gb3B0aW1pemF0aW9uLlxuICAgIC8vIFNlZSBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vRnJpZW5kbHlDYXB0Y2hhL2ZyaWVuZGx5LWNoYWxsZW5nZS9pc3N1ZXMvMTY1XG4gICAgbGV0IHQgPSBcIlwiO1xuICAgIHQgKz0gQ0hBUlMuY2hhckF0KGIwID4+PiAyKTtcbiAgICB0ICs9IENIQVJTLmNoYXJBdCgoKGIwICYgMykgPDwgNCkgfCAoYjEgPj4+IDQpKTtcbiAgICB0ICs9IENIQVJTLmNoYXJBdCgoKGIxICYgMTUpIDw8IDIpIHwgKGIyID4+PiA2KSk7XG4gICAgdCArPSBDSEFSUy5jaGFyQXQoYjIgJiA2Myk7XG4gICAgYmFzZTY0ICs9IHQ7XG4gIH1cblxuICBpZiAobGVuICUgMyA9PT0gMikge1xuICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgXCI9XCI7XG4gIH0gZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgXCI9PVwiO1xuICB9XG5cbiAgcmV0dXJuIGJhc2U2NDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShiYXNlNjQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICBsZXQgYnVmZmVyTGVuZ3RoID0gKGxlbiAqIDMpID4+PiAyOyAvLyAqIDAuNzVcblxuICBpZiAoYmFzZTY0LmNoYXJDb2RlQXQobGVuIC0gMSkgPT09IEVRX0NIQVIpIGJ1ZmZlckxlbmd0aC0tO1xuICBpZiAoYmFzZTY0LmNoYXJDb2RlQXQobGVuIC0gMikgPT09IEVRX0NIQVIpIGJ1ZmZlckxlbmd0aC0tO1xuXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBjb25zdCBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMCldO1xuICAgIGNvbnN0IGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgY29uc3QgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICBjb25zdCBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuXG4gICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuIl19","// This is not an enum to save some bytes in the output bundle.\nexport const SOLVER_TYPE_JS = 1;\nexport const SOLVER_TYPE_WASM = 2;\nexport const CHALLENGE_SIZE_BYTES = 128;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUNoQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyBub3QgYW4gZW51bSB0byBzYXZlIHNvbWUgYnl0ZXMgaW4gdGhlIG91dHB1dCBidW5kbGUuXG5leHBvcnQgY29uc3QgU09MVkVSX1RZUEVfSlMgPSAxO1xuZXhwb3J0IGNvbnN0IFNPTFZFUl9UWVBFX1dBU00gPSAyO1xuXG5leHBvcnQgY29uc3QgQ0hBTExFTkdFX1NJWkVfQllURVMgPSAxMjg7XG4iXX0=","// @ts-ignore\nimport css from \"./styles.css\";\nimport { ProgressMessage, DoneMessage } from \"./types\";\nimport { SOLVER_TYPE_JS } from \"friendly-pow/constants\";\nimport { Localization } from \"./localization\";\n\nconst loaderSVG = ``;\nconst errorSVG = ``;\n\n/**\n * Base template used for all widget states\n * The reason we use raw string interpolation here is so we don't have to ship something like lit-html.\n */\nfunction getTemplate(\n fieldName: string,\n svgContent: string,\n svgAriaHidden: boolean,\n textContent: string,\n solutionString: string,\n buttonText?: string,\n progress = false,\n debugData?: string,\n additionalContainerClasses?: string\n) {\n return `
\n${svgContent}\n
\n ${textContent}\n ${buttonText ? `` : \"\"}\n ${progress ? `0%` : \"\"}\n
\n
FriendlyCaptcha ⇗\n`;\n}\n\n/**\n * Used when the widget is ready to start solving.\n */\nexport function getReadyHTML(fieldName: string, l: Localization) {\n return getTemplate(\n fieldName,\n ``,\n true,\n l.text_ready,\n \".UNSTARTED\",\n l.button_start,\n false\n );\n}\n\n/**\n * Used when the widget is retrieving a puzzle\n */\nexport function getFetchingHTML(fieldName: string, l: Localization) {\n return getTemplate(fieldName, loaderSVG, true, l.text_fetching, \".FETCHING\", undefined, true);\n}\n\n/**\n * Used when the solver is running, displays a progress bar.\n */\nexport function getRunningHTML(fieldName: string, l: Localization) {\n return getTemplate(fieldName, loaderSVG, true, l.text_solving, \".UNFINISHED\", undefined, true);\n}\n\nexport function getDoneHTML(fieldName: string, l: Localization, solution: string, data: DoneMessage) {\n const timeData = `${data.t.toFixed(0)}s (${((data.h / data.t) * 0.001).toFixed(0)}K/s)${\n data.solver === SOLVER_TYPE_JS ? \" JS Fallback\" : \"\"\n }`;\n return getTemplate(\n fieldName,\n `${l.text_completed_sr}`,\n false,\n l.text_completed,\n solution,\n undefined,\n false,\n timeData,\n \"frc-success\"\n );\n}\n\nexport function getExpiredHTML(fieldName: string, l: Localization) {\n return getTemplate(fieldName, errorSVG, true, l.text_expired, \".EXPIRED\", l.button_restart);\n}\n\nexport function getErrorHTML(fieldName: string, l: Localization, errorDescription: string, recoverable = true, headless = false) {\n return getTemplate(\n fieldName,\n errorSVG,\n true,\n `${l.text_error}
${errorDescription}`,\n headless ? \".HEADLESS_ERROR\" : \".ERROR\",\n recoverable ? l.button_retry : undefined\n );\n}\n\nexport function findCaptchaElements() {\n const elements = document.querySelectorAll(\".frc-captcha\");\n if (elements.length === 0) {\n console.warn(\"FriendlyCaptcha: No div was found with .frc-captcha class\");\n }\n return elements;\n}\n\n/**\n * Injects the style if no #frc-style element is already present\n * (to support custom stylesheets)\n */\nexport function injectStyle() {\n if (!document.querySelector(\"#frc-style\")) {\n const styleSheet = document.createElement(\"style\");\n styleSheet.id = \"frc-style\";\n styleSheet.innerHTML = css;\n document.head.appendChild(styleSheet);\n }\n}\n\n/**\n * @param element parent element of friendlycaptcha\n * @param progress value between 0 and 1\n */\nexport function updateProgressBar(element: HTMLElement, data: ProgressMessage) {\n const p = element.querySelector(\".frc-progress\") as HTMLProgressElement;\n const perc = (data.i + 1) / data.n;\n if (p) {\n p.value = perc;\n p.innerText = perc.toFixed(2) + \"%\";\n p.title = data.i + 1 + \"/\" + data.n + \" (\" + ((data.h / data.t) * 0.001).toFixed(0) + \"K/s)\";\n }\n}\n\n/**\n * Traverses parent nodes until a
is found, returns null if not found.\n */\nexport function findParentFormElement(element: HTMLElement) {\n while (element.tagName !== \"FORM\") {\n element = element.parentElement as HTMLElement;\n if (!element) {\n return null;\n }\n }\n return element;\n}\n\n/**\n * Add listener to specified element that will only fire once on focus.\n */\nexport function executeOnceOnFocusInEvent(element: HTMLElement, listener: (this: HTMLElement, fe: FocusEvent) => any) {\n element.addEventListener(\"focusin\", listener, { once: true, passive: true });\n}\n","// Defensive init to make it easier to integrate with Gatsby and friends.\nlet nav: Navigator;\nlet ua: string;\nif (typeof navigator !== \"undefined\") {\n nav = navigator;\n ua = nav.userAgent.toLowerCase();\n}\n\n/**\n * Headless browser detection on the clientside is imperfect. One can modify any clientside code to disable or change this check,\n * and one can spoof whatever is checked here. However, that doesn't make it worthless: it's yet another hurdle for spammers and\n * it stops unsophisticated scripters from making any request whatsoever.\n */\nexport function isHeadless() {\n let correctPluginPrototype = true;\n try {\n if (nav.plugins.length > 0) {\n correctPluginPrototype = Plugin.prototype === (nav.plugins as any)[0].__proto__;\n }\n } catch (e) {\n /* Do nothing, this browser misbehaves in mysterious ways */\n }\n\n return (\n //tell-tale bot signs\n ua.indexOf(\"headless\") !== -1 ||\n nav.appVersion.indexOf(\"Headless\") !== -1 ||\n ua.indexOf(\"bot\") !== -1 || // http://www.useragentstring.com/pages/useragentstring.php?typ=Browser\n ua.indexOf(\"crawl\") !== -1 || // Only IE5 has two distributions that has this on windows NT.. so yeah.\n nav.webdriver === true ||\n !nav.language ||\n (nav.languages !== undefined && !nav.languages.length) || // IE 11 does not support NavigatorLanguage.languages https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages\n !correctPluginPrototype\n );\n}\n","/**\n * Maps a value between 0 and 255 to a difficulty threshold (as uint32)\n * Difficulty 0 maps to 99.99% probability of being right on the first attempt\n * Anything above 250 needs 2^32 tries on average to solve.\n * 150 to 180 seems reasonable\n */\nexport function difficultyToThreshold(value) {\n if (value > 255) {\n value = 255;\n }\n else if (value < 0) {\n value = 0;\n }\n return Math.pow(2, (255.999 - value) / 8.0) >>> 0;\n}\n/**\n * Maps a value between 0 and 255 to a time duration in seconds that a puzzle is valid for.\n */\nexport function expiryToDurationInSeconds(value) {\n if (value > 255) {\n value = 255;\n }\n else if (value < 0) {\n value = 0;\n }\n return value * 300;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBUztJQUM3QyxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDZixLQUFLLEdBQUcsR0FBRyxDQUFDO0tBQ2I7U0FBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDcEIsS0FBSyxHQUFHLENBQUMsQ0FBQztLQUNYO0lBRUQsT0FBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBSSxLQUFhLENBQUMsR0FBRyxHQUFHLENBQVMsS0FBSyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQVM7SUFDakQsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2YsS0FBSyxHQUFHLEdBQUcsQ0FBQztLQUNiO1NBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDWDtJQUVELE9BQVEsS0FBYSxHQUFHLEdBQUcsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXBzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgdG8gYSBkaWZmaWN1bHR5IHRocmVzaG9sZCAoYXMgdWludDMyKVxuICogRGlmZmljdWx0eSAwIG1hcHMgdG8gOTkuOTklIHByb2JhYmlsaXR5IG9mIGJlaW5nIHJpZ2h0IG9uIHRoZSBmaXJzdCBhdHRlbXB0XG4gKiBBbnl0aGluZyBhYm92ZSAyNTAgbmVlZHMgMl4zMiB0cmllcyBvbiBhdmVyYWdlIHRvIHNvbHZlLlxuICogMTUwIHRvIDE4MCBzZWVtcyByZWFzb25hYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmaWN1bHR5VG9UaHJlc2hvbGQodmFsdWU6IHU4KTogdTMyIHtcbiAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgdmFsdWUgPSAyNTU7XG4gIH0gZWxzZSBpZiAodmFsdWUgPCAwKSB7XG4gICAgdmFsdWUgPSAwO1xuICB9XG5cbiAgcmV0dXJuIChNYXRoLnBvdygyLCAoMjU1Ljk5OSAtICh2YWx1ZSBhcyBmNjQpKSAvIDguMCkgYXMgdTMyKSA+Pj4gMDtcbn1cblxuLyoqXG4gKiBNYXBzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgdG8gYSB0aW1lIGR1cmF0aW9uIGluIHNlY29uZHMgdGhhdCBhIHB1enpsZSBpcyB2YWxpZCBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBpcnlUb0R1cmF0aW9uSW5TZWNvbmRzKHZhbHVlOiB1OCk6IHUzMiB7XG4gIGlmICh2YWx1ZSA+IDI1NSkge1xuICAgIHZhbHVlID0gMjU1O1xuICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgIHZhbHVlID0gMDtcbiAgfVxuXG4gIHJldHVybiAodmFsdWUgYXMgdTMyKSAqIDMwMDtcbn1cbiJdfQ==","import { expiryToDurationInSeconds } from \"./encoding\";\nimport { CHALLENGE_SIZE_BYTES } from \"./constants\";\nexport const PUZZLE_TIMESTAMP_OFFSET = 0;\nexport const ACCOUNT_ID_OFFSET = 4;\nexport const APP_ID_OFFSET = 8;\nexport const PUZZLE_VERSION_OFFSET = 12;\nexport const PUZZLE_EXPIRY_OFFSET = 13;\nexport const NUMBER_OF_PUZZLES_OFFSET = 14;\nexport const PUZZLE_DIFFICULTY_OFFSET = 15;\nexport const PUZZLE_NONCE_OFFSET = 24;\nexport const PUZZLE_USER_DATA_OFFSET = 32;\nexport const PUZZLE_USER_DATA_MAX_LENGTH = 32;\nexport function getPuzzleSolverInputs(puzzleBuffer, numPuzzles) {\n const startingPoints = [];\n for (let i = 0; i < numPuzzles; i++) {\n const input = new Uint8Array(CHALLENGE_SIZE_BYTES);\n input.set(puzzleBuffer);\n input[120] = i;\n startingPoints.push(input);\n }\n return startingPoints;\n}\n/**\n * Combine multiple solutions (8 byte values) into a single array\n * @param solutions\n */\nexport function combineSolutions(solutions) {\n const combined = new Uint8Array(solutions.length * 8);\n for (let i = 0; i < solutions.length; i++) {\n combined.set(solutions[i], i * 8);\n }\n return combined;\n}\n/**\n * Time in seconds the puzzle is valid for.\n * @param puzzleBuffer\n */\nexport function getPuzzleTTL(puzzleBuffer) {\n return expiryToDurationInSeconds(puzzleBuffer[PUZZLE_EXPIRY_OFFSET]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHV6emxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3B1enpsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFlBQXdCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxjQUFjLEdBQWlCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtJQUNELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsU0FBdUI7SUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDbkM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxZQUF3QjtJQUNuRCxPQUFPLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGlyeVRvRHVyYXRpb25JblNlY29uZHMgfSBmcm9tIFwiLi9lbmNvZGluZ1wiO1xuaW1wb3J0IHsgQ0hBTExFTkdFX1NJWkVfQllURVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGNvbnN0IFBVWlpMRV9USU1FU1RBTVBfT0ZGU0VUID0gMDtcbmV4cG9ydCBjb25zdCBBQ0NPVU5UX0lEX09GRlNFVCA9IDQ7XG5leHBvcnQgY29uc3QgQVBQX0lEX09GRlNFVCA9IDg7XG5leHBvcnQgY29uc3QgUFVaWkxFX1ZFUlNJT05fT0ZGU0VUID0gMTI7XG5leHBvcnQgY29uc3QgUFVaWkxFX0VYUElSWV9PRkZTRVQgPSAxMztcbmV4cG9ydCBjb25zdCBOVU1CRVJfT0ZfUFVaWkxFU19PRkZTRVQgPSAxNDtcbmV4cG9ydCBjb25zdCBQVVpaTEVfRElGRklDVUxUWV9PRkZTRVQgPSAxNTtcbmV4cG9ydCBjb25zdCBQVVpaTEVfTk9OQ0VfT0ZGU0VUID0gMjQ7XG5leHBvcnQgY29uc3QgUFVaWkxFX1VTRVJfREFUQV9PRkZTRVQgPSAzMjtcblxuZXhwb3J0IGNvbnN0IFBVWlpMRV9VU0VSX0RBVEFfTUFYX0xFTkdUSCA9IDMyO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHV6emxlU29sdmVySW5wdXRzKHB1enpsZUJ1ZmZlcjogVWludDhBcnJheSwgbnVtUHV6emxlczogbnVtYmVyKTogVWludDhBcnJheVtdIHtcbiAgY29uc3Qgc3RhcnRpbmdQb2ludHM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHV6emxlczsgaSsrKSB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgVWludDhBcnJheShDSEFMTEVOR0VfU0laRV9CWVRFUyk7XG4gICAgaW5wdXQuc2V0KHB1enpsZUJ1ZmZlcik7XG4gICAgaW5wdXRbMTIwXSA9IGk7XG4gICAgc3RhcnRpbmdQb2ludHMucHVzaChpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0aW5nUG9pbnRzO1xufVxuXG4vKipcbiAqIENvbWJpbmUgbXVsdGlwbGUgc29sdXRpb25zICg4IGJ5dGUgdmFsdWVzKSBpbnRvIGEgc2luZ2xlIGFycmF5XG4gKiBAcGFyYW0gc29sdXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lU29sdXRpb25zKHNvbHV0aW9uczogVWludDhBcnJheVtdKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoc29sdXRpb25zLmxlbmd0aCAqIDgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvbHV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbWJpbmVkLnNldChzb2x1dGlvbnNbaV0sIGkgKiA4KTtcbiAgfVxuICByZXR1cm4gY29tYmluZWQ7XG59XG5cbi8qKlxuICogVGltZSBpbiBzZWNvbmRzIHRoZSBwdXp6bGUgaXMgdmFsaWQgZm9yLlxuICogQHBhcmFtIHB1enpsZUJ1ZmZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHV6emxlVFRMKHB1enpsZUJ1ZmZlcjogVWludDhBcnJheSkge1xuICByZXR1cm4gZXhwaXJ5VG9EdXJhdGlvbkluU2Vjb25kcyhwdXp6bGVCdWZmZXJbUFVaWkxFX0VYUElSWV9PRkZTRVRdKTtcbn1cbiJdfQ==","import { decode } from \"friendly-pow/base64\";\nimport { difficultyToThreshold } from \"friendly-pow/encoding\";\nimport { NUMBER_OF_PUZZLES_OFFSET, PUZZLE_DIFFICULTY_OFFSET, PUZZLE_EXPIRY_OFFSET } from \"friendly-pow/puzzle\";\nimport { Localization } from \"./localization\";\n\nexport interface Puzzle {\n signature: string;\n base64: string;\n buffer: Uint8Array; // input puzzle\n threshold: number; // Related to difficulty\n n: number; // Amount of puzzles to solve\n expiry: number; // Expiry in milliseconds from now\n}\n\nexport function decodeBase64Puzzle(base64Puzzle: string): Puzzle {\n const parts = base64Puzzle.split(\".\");\n const puzzle = parts[1];\n const arr = decode(puzzle);\n return {\n signature: parts[0],\n base64: puzzle,\n buffer: arr,\n n: arr[NUMBER_OF_PUZZLES_OFFSET],\n threshold: difficultyToThreshold(arr[PUZZLE_DIFFICULTY_OFFSET]),\n expiry: arr[PUZZLE_EXPIRY_OFFSET] * 300000,\n };\n}\n\nexport async function getPuzzle(urlsSeparatedByComma: string, siteKey: string, lang: Localization): Promise {\n const urls = urlsSeparatedByComma.split(\",\");\n for (let i = 0; i < urls.length; i++) {\n try {\n const response = await fetchAndRetryWithBackoff(\n urls[i] + \"?sitekey=\" + siteKey,\n { headers: [[\"x-frc-client\", \"js-0.9.9\"]], mode: \"cors\" },\n 2\n );\n if (response.ok) {\n const json = await response.json();\n return json.data.puzzle;\n } else {\n let json;\n try {\n json = await response.json();\n } catch (e) {\n /* Do nothing, the error is not valid JSON */\n }\n\n if (json && json.errors && json.errors[0] === \"endpoint_not_enabled\") {\n throw Error(`Endpoint not allowed (${response.status})`);\n }\n\n if (i === urls.length - 1) {\n throw Error(`Response status ${response.status} ${response.statusText} ${json ? json.errors : \"\"}`);\n }\n }\n } catch (e) {\n console.error(\"[FRC Fetch]:\", e);\n const err = new Error(`${lang.text_fetch_error} ${urls[i]}`);\n (err as any).rawError = e;\n throw err;\n }\n }\n // This code should never be reached.\n throw Error(`Internal error`);\n}\n\n/**\n * Retries given request with exponential backoff (starting with 1000ms delay, multiplying by 4 every time)\n * @param url Request (can be string url) to fetch\n * @param opts Options for fetch\n * @param n Number of times to attempt before giving up.\n */\nexport async function fetchAndRetryWithBackoff(url: RequestInfo, opts: RequestInit, n: number): Promise {\n let time = 1000;\n return fetch(url, opts).catch(async (error) => {\n if (n === 0) throw error;\n await new Promise((r) => setTimeout(r, time));\n time *= 4;\n return fetchAndRetryWithBackoff(url, opts, n - 1);\n });\n}\n","/* eslint-disable @typescript-eslint/camelcase */\n// Tip: keep the messages short, there isn't a lot of space in the widget\nexport interface Localization {\n // While the widget is starting: usually not visible as it initializes instantly.\n text_init: string;\n\n // Before the widget is started\n text_ready: string;\n button_start: string;\n\n // While the widget is downloading a puzzle (usually only takes a split second)\n // If this is hard to translate, you could put something simple like \"Loading..\"\n text_fetching: string;\n\n // While the widget is solving\n text_solving: string;\n\n // Completed\n text_completed: string;\n // Additional text shown in label. Especially useful for screen readers used by blind users.\n text_completed_sr: string;\n\n // Expired (the puzzle was solved, but then waited say a day without submitting)\n text_expired: string;\n button_restart: string;\n\n // Error\n text_error: string;\n button_retry: string;\n // This error message is followed by the URL, a space is added.\n text_fetch_error: string;\n}\n\n// English\nconst LANG_EN: Localization = {\n text_init: \"Initializing..\",\n\n text_ready: \"Anti-Robot Verification\",\n button_start: \"Click to start verification\",\n\n text_fetching: \"Fetching Challenge\",\n\n text_solving: \"Verifying you are human..\",\n text_completed: \"I am human\",\n text_completed_sr: \"Automatic spam check completed\",\n\n text_expired: \"Anti-Robot verification expired\",\n button_restart: \"Restart\",\n\n text_error: \"Verification failed\",\n button_retry: \"Retry\",\n text_fetch_error: \"Failed to connect to\",\n};\n\n// French\nconst LANG_FR: Localization = {\n text_init: \"Chargement..\",\n\n text_ready: \"Verification Anti-Robot\",\n button_start: \"Cliquez ici pour vérifier\",\n\n text_fetching: \"Chargement du challenge\",\n\n text_solving: \"Vérification que vous êtes humain..\",\n text_completed: \"Je suis humain\",\n text_completed_sr: \"Vérification automatique des spams terminée\", // TODO: verify by native speaker\n\n text_expired: \"Verification échue\",\n button_restart: \"Recommencer\",\n\n text_error: \"Echec de verification\",\n button_retry: \"Recommencer\",\n text_fetch_error: \"Problème de connexion avec\",\n};\n\n// German\nconst LANG_DE: Localization = {\n text_init: \"Initialisierung..\",\n\n text_ready: \"Anti-Roboter-Verifizierung\",\n button_start: \"Hier klicken\",\n\n text_fetching: \"Herausforderung laden..\",\n\n text_solving: \"Verifizierung, dass Sie ein Mensch sind..\",\n text_completed: \"Ich bin ein Mensch\",\n text_completed_sr: \"Automatische Spamprüfung abgeschlossen\",\n\n text_expired: \"Verifizierung abgelaufen\",\n button_restart: \"Erneut starten\",\n\n text_error: \"Verifizierung fehlgeschlagen\",\n button_retry: \"Erneut versuchen\",\n text_fetch_error: \"Verbindungsproblem mit\",\n};\n\n// Dutch\nconst LANG_NL: Localization = {\n text_init: \"Initializeren..\",\n\n text_ready: \"Anti-robotverificatie\",\n button_start: \"Klik om te starten\",\n\n text_fetching: \"Aan het laden..\",\n\n text_solving: \"Anti-robotverificatie bezig..\",\n text_completed: \"Ik ben een mens\",\n text_completed_sr: \"Automatische anti-spamcheck voltooid\",\n\n text_expired: \"Verificatie verlopen\",\n button_restart: \"Opnieuw starten\",\n\n text_error: \"Verificatie mislukt\",\n button_retry: \"Opnieuw proberen\",\n text_fetch_error: \"Verbinding mislukt met\",\n};\n\n// Italian\nconst LANG_IT: Localization = {\n text_init: \"Inizializzazione...\",\n\n text_ready: \"Verifica Anti-Robot\",\n button_start: \"Clicca per iniziare\",\n\n text_fetching: \"Caricamento...\",\n\n text_solving: \"Verificando che sei umano...\",\n text_completed: \"Non sono un robot\",\n text_completed_sr: \"Controllo automatico dello spam completato\", // TODO: verify by native speaker\n\n text_expired: \"Verifica Anti-Robot scaduta\",\n button_restart: \"Ricomincia\",\n\n text_error: \"Verifica fallita\",\n button_retry: \"Riprova\",\n text_fetch_error: \"Problema di connessione con\",\n};\n\n// Portuguese\nconst LANG_PT: Localization = {\n text_init: \"Inicializando..\",\n\n text_ready: \"Verificação Anti-Robô\",\n button_start: \"Clique para iniciar verificação\",\n\n text_fetching: \"Carregando..\",\n\n text_solving: \"Verificando se você é humano..\",\n text_completed: \"Eu sou humano\",\n text_completed_sr: \"Verificação automática de spam concluída\", // TODO: verify by native speaker\n\n text_expired: \"Verificação Anti-Robô expirada\",\n button_restart: \"Reiniciar\",\n\n text_error: \"Verificação falhou\",\n button_retry: \"Tentar novamente\",\n text_fetch_error: \"Falha de conexão com\",\n};\n\n// Spanish\nconst LANG_ES: Localization = {\n text_init: \"Inicializando..\",\n\n text_ready: \"Verificación Anti-Robot\",\n button_start: \"Haga clic para iniciar la verificación\",\n\n text_fetching: \"Cargando desafío\",\n\n text_solving: \"Verificando que eres humano..\",\n text_completed: \"Soy humano\",\n text_completed_sr: \"Verificación automática de spam completada\", // TODO: verify by native speaker\n\n text_expired: \"Verificación Anti-Robot expirada\",\n button_restart: \"Reiniciar\",\n\n text_error: \"Ha fallado la verificación\",\n button_retry: \"Intentar de nuevo\",\n text_fetch_error: \"Error al conectarse a\",\n};\n\n// Catalan\nconst LANG_CA: Localization = {\n text_init: \"Inicialitzant...\",\n\n text_ready: \"Verificació Anti-Robot\",\n button_start: \"Fes clic per començar la verificació\",\n\n text_fetching: \"Carregant repte\",\n\n text_solving: \"Verificant que ets humà..\",\n text_completed: \"Soc humà\",\n text_completed_sr: \"Verificació automàtica de correu brossa completada\", // TODO: verify by native speaker\n\n text_expired: \"La verificació Anti-Robot ha expirat\",\n button_restart: \"Reiniciar\",\n\n text_error: \"Ha fallat la verificació\",\n button_retry: \"Tornar a provar\",\n text_fetch_error: \"Error connectant a\",\n};\n\n// Japanese\nconst LANG_JA: Localization = {\n text_init: \"開始しています...\",\n\n text_ready: \"アンチロボット認証\",\n button_start: \"クリックして認証を開始\",\n\n text_fetching: \"ロードしています\",\n\n text_solving: \"認証中...\",\n text_completed: \"私はロボットではありません\",\n text_completed_sr: \"自動スパムチェックが完了しました\", // TODO: verify by native speaker\n\n text_expired: \"認証の期限が切れています\",\n button_restart: \"再度認証を行う\",\n\n text_error: \"認証にエラーが発生しました\",\n button_retry: \"再度認証を行う\",\n text_fetch_error: \"接続ができませんでした\",\n};\n\n// Danish\nconst LANG_DA: Localization = {\n text_init: \"Aktiverer...\",\n\n text_ready: \"Jeg er ikke en robot\",\n button_start: \"Klik for at starte verifikationen\",\n\n text_fetching: \"Henter data\",\n\n text_solving: \"Kontrollerer at du er et menneske...\",\n text_completed: \"Jeg er et menneske.\",\n text_completed_sr: \"Automatisk spamkontrol gennemført\",\n\n text_expired: \"Verifikationen kunne ikke fuldføres\",\n button_restart: \"Genstart\",\n\n text_error: \"Bekræftelse mislykkedes\",\n button_retry: \"Prøv igen\",\n text_fetch_error: \"Forbindelsen mislykkedes\",\n};\n\n// Russian\nconst LANG_RU: Localization = {\n text_init: \"Инициализация..\",\n\n text_ready: \"АнтиРобот проверка\",\n button_start: \"Нажмите, чтобы начать проверку\",\n\n text_fetching: \"Получаю задачу\",\n\n text_solving: \"Проверяю, что вы человек..\",\n text_completed: \"Я человек\",\n text_completed_sr: \"Aвтоматическая проверка на спам завершена\", // TODO: verify by native speaker\n\n text_expired: \"Срок АнтиРоботной проверки истёк\",\n button_restart: \"Начать заново\",\n\n text_error: \"Ошибка проверки\",\n button_retry: \"Повторить ещё раз\",\n text_fetch_error: \"Ошибка подключения\",\n};\n\n// Swedish\nconst LANG_SV: Localization = {\n text_init: \"Aktiverar...\",\n\n text_ready: \"Jag är inte en robot\",\n button_start: \"Klicka för att verifiera\",\n\n text_fetching: \"Hämtar data\",\n\n text_solving: \"Kontrollerar att du är människa...\",\n text_completed: \"Jag är en människa\",\n text_completed_sr: \"Automatisk spamkontroll slutförd\",\n\n text_expired: \"Anti-robot-verifieringen har löpt ut\",\n button_restart: \"Börja om\",\n\n text_error: \"Verifiering kunde inte slutföras\",\n button_retry: \"Omstart\",\n text_fetch_error: \"Verifiering misslyckades\",\n};\n\n// Turkish\nconst LANG_TR: Localization = {\n text_init: \"Başlatılıyor..\",\n\n text_ready: \"Anti-Robot Doğrulaması\",\n button_start: \"Doğrulamayı başlatmak için tıklayın\",\n\n text_fetching: \"Yükleniyor\",\n\n text_solving: \"Robot olmadığınız doğrulanıyor..\",\n text_completed: \"Ben bir insanım\",\n text_completed_sr: \"Otomatik spam kontrolü tamamlandı\",\n\n text_expired: \"Anti-Robot doğrulamasının süresi doldu\",\n button_restart: \"Yeniden başlat\",\n\n text_error: \"Doğrulama başarısız oldu\",\n button_retry: \"Tekrar dene\",\n text_fetch_error: \"Bağlantı başarısız oldu\",\n};\n\n// Greek\nconst LANG_EL: Localization = {\n text_init: \"Προετοιμασία..\",\n\n text_ready: \"Anti-Robot Επαλήθευση\",\n button_start: \" Κάντε κλικ για να ξεκινήσει η επαλήθευσης\",\n\n text_fetching: \" Λήψη πρόκλησης\",\n\n text_solving: \" Επιβεβαίωση ανθρώπου..\",\n text_completed: \"Είμαι άνθρωπος\",\n text_completed_sr: \" Ο αυτόματος έλεγχος ανεπιθύμητου περιεχομένου ολοκληρώθηκε\",\n\n text_expired: \" Η επαλήθευση Anti-Robot έληξε\",\n button_restart: \" Επανεκκίνηση\",\n\n text_error: \" Η επαλήθευση απέτυχε\",\n button_retry: \" Δοκιμάσετε ξανά\",\n text_fetch_error: \" Αποτυχία σύνδεσης με\",\n};\n\n// Ukrainian\nconst LANG_UK: Localization = {\n text_init: \"Ініціалізація..\",\n\n text_ready: \"Антиробот верифікація\",\n button_start: \"Натисніть, щоб розпочати верифікацію\",\n\n text_fetching: \"З’єднання\",\n\n text_solving: \"Перевірка, що ви не робот..\",\n text_completed: \"Я не робот\",\n text_completed_sr: \"Автоматична перевірка спаму завершена\",\n\n text_expired: \"Час вичерпано\",\n button_restart: \"Почати знову\",\n\n text_error: \"Верифікація не вдалась\",\n button_retry: \"Спробувати знову\",\n text_fetch_error: \"Не вдалось з’єднатись\",\n};\n\n// Bulgarian\nconst LANG_BG: Localization = {\n text_init: \"Инициализиране...\",\n\n text_ready: \"Анти-робот проверка\",\n button_start: \"Щракнете, за да започнете проверката\",\n\n text_fetching: \"Предизвикателство\",\n\n text_solving: \"Проверяваме дали си човек...\",\n text_completed: \"Аз съм човек\",\n text_completed_sr: \"Автоматичната проверка за спам е завършена\",\n\n text_expired: \"Анти-Робот проверката изтече\",\n button_restart: \"Рестартирайте\",\n\n text_error: \"Неуспешна проверка\",\n button_retry: \"Опитайте пак\",\n text_fetch_error: \"Неуспешно свързване с\",\n};\n\n// Czech\nconst LANG_CS: Localization = {\n text_init: \"Inicializace..\",\n\n text_ready: \"Ověření proti robotům\",\n button_start: \"Klikněte pro ověření\",\n\n text_fetching: \"Problém při načítání\",\n\n text_solving: \"Ověření, že jste člověk..\",\n text_completed: \"Jsem člověk\",\n text_completed_sr: \"Automatická kontrola spamu dokončena\",\n\n text_expired: \"Ověření proti robotům vypršelo\",\n button_restart: \"Restartovat\",\n\n text_error: \"Ověření se nezdařilo\",\n button_retry: \"Zkusit znovu\",\n text_fetch_error: \"Připojení se nezdařilo\",\n};\n\n// Slovak\nconst LANG_SK: Localization = {\n text_init: \"Inicializácia..\",\n\n text_ready: \"Overenie proti robotom\",\n button_start: \"Kliknite pre overenie\",\n\n text_fetching: \"Problém pri načítaní\",\n\n text_solving: \"Overenie, že ste človek..\",\n text_completed: \"Som človek\",\n text_completed_sr: \"Automatická kontrola spamu dokončená\",\n\n text_expired: \"Overenie proti robotom vypršalo\",\n button_restart: \"Reštartovať\",\n\n text_error: \"Overenie sa nepodarilo\",\n button_retry: \"Skúsiť znova\",\n text_fetch_error: \"Pripojenie sa nepodarilo\",\n};\n\n// Norwegian\nconst LANG_NO: Localization = {\n text_init: \" Aktiverer...\",\n\n text_ready: \"Jeg er ikke en robot\",\n button_start: \"Klikk for å starte verifiseringen\",\n\n text_fetching: \"Henter data\",\n\n text_solving: \"Sjekker at du er et menneske...\",\n text_completed: \"Jeg er et menneske\",\n text_completed_sr: \"Automatisk spam-sjekk fullført\",\n\n text_expired: \"Verifisering kunne ikke fullføres\",\n button_restart: \"Omstart\",\n\n text_error: \"Bekreftelsen mislyktes\",\n button_retry: \"Prøv på nytt\",\n text_fetch_error: \"Tilkoblingen mislyktes\",\n};\n\n// Finnish\nconst LANG_FI: Localization = {\n text_init: \"Aktivoidaan...\",\n\n text_ready: \"En ole robotti\",\n button_start: \"Aloita vahvistus klikkaamalla\",\n\n text_fetching: \"Haetaan tietoja\",\n\n text_solving: \"Tarkistaa, että olet ihminen...\",\n text_completed: \"Olen ihminen\",\n text_completed_sr: \"Automaattinen roskapostin tarkistus suoritettu\",\n\n text_expired: \"Vahvistusta ei voitu suorittaa loppuun\",\n button_restart: \"Uudelleenkäynnistys\",\n\n text_error: \"Vahvistus epäonnistui\",\n button_retry: \"Yritä uudelleen\",\n text_fetch_error: \"Yhteys epäonnistui\",\n};\n\n// Latvian\nconst LANG_LV: Localization = {\n text_init: \"Notiek inicializēšana..\",\n\n text_ready: \"Verifikācija, ka neesat robots\",\n button_start: \"Noklikšķiniet, lai sāktu verifikāciju\",\n\n text_fetching: \"Notiek drošības uzdevuma izgūšana\",\n\n text_solving: \"Notiek pārbaude, vai esat cilvēks..\",\n text_completed: \"Es esmu cilvēks\",\n text_completed_sr: \"Automātiska surogātpasta pārbaude pabeigta\",\n\n text_expired: \"Verifikācijas, ka neesat robots, derīgums beidzies\",\n button_restart: \"Restartēt\",\n\n text_error: \"Verifikācija neizdevās\",\n button_retry: \"Mēģināt vēlreiz\",\n text_fetch_error: \"Neizdevās izveidot savienojumu ar\",\n};\n\n// Lithuanian\nconst LANG_LT: Localization = {\n text_init: \"Inicijuojama..\",\n\n text_ready: \"Patikrinimas, ar nesate robotas\",\n button_start: \"Spustelėkite patikrinimui pradėti\",\n\n text_fetching: \"Gavimo iššūkis\",\n\n text_solving: \"Tikrinama, ar esate žmogus..\",\n text_completed: \"Esu žmogus\",\n text_completed_sr: \"Automatinė patikra dėl pašto šiukšlių atlikta\",\n\n text_expired: \"Patikrinimas, ar nesate robotas, baigė galioti\",\n button_restart: \"Pradėti iš naujo\",\n\n text_error: \"Patikrinimas nepavyko\",\n button_retry: \"Kartoti\",\n text_fetch_error: \"Nepavyko prisijungti prie\",\n};\n\n// Polish\nconst LANG_PL: Localization = {\n text_init: \"Inicjowanie..\",\n\n text_ready: \"Weryfikacja antybotowa\",\n button_start: \"Kliknij, aby rozpocząć weryfikację\",\n\n text_fetching: \"Pobieranie\",\n\n text_solving: \"Weryfikacja, czy nie jesteś robotem..\",\n text_completed: \"Nie jestem robotem\",\n text_completed_sr: \"Zakończono automatyczne sprawdzanie spamu\",\n\n text_expired: \"Weryfikacja antybotowa wygasła\",\n button_restart: \"Uruchom ponownie\",\n\n text_error: \"Weryfikacja nie powiodła się\",\n button_retry: \"Spróbuj ponownie\",\n text_fetch_error: \"Nie udało się połączyć z\",\n};\n\n// Estonian\nconst LANG_ET: Localization = {\n text_init: \"Initsialiseerimine..\",\n\n text_ready: \"Robotivastane kinnitus\",\n button_start: \"Kinnitamisega alustamiseks klõpsake\",\n\n text_fetching: \"Väljakutse toomine\",\n\n text_solving: \"Kinnitatakse, et sa oled inimene..\",\n text_completed: \"Ma olen inimene\",\n text_completed_sr: \"Automaatne rämpsposti kontroll on lõpetatud\",\n\n text_expired: \"Robotivastane kinnitus aegus\",\n button_restart: \"Taaskäivita\",\n\n text_error: \"Kinnitamine nurjus\",\n button_retry: \"Proovi uuesti\",\n text_fetch_error: \"Ühenduse loomine nurjus\",\n};\n\n// Croatian\nconst LANG_HR: Localization = {\n text_init: \"Početno postavljanje...\",\n\n text_ready: \"Provjera protiv robota\",\n button_start: \"Kliknite za početak provjere\",\n\n text_fetching: \"Dohvaćanje izazova\",\n\n text_solving: \"Provjeravamo jeste li čovjek..\",\n text_completed: \"Nisam robot\",\n text_completed_sr: \"Automatska provjera je završena\",\n\n text_expired: \"Vrijeme za provjeru protiv robota je isteklo\",\n button_restart: \"Osvježi\",\n\n text_error: \"Provjera nije uspjlela\",\n button_retry: \" Ponovo pokreni\",\n text_fetch_error: \"Nije moguće uspostaviti vezu\",\n};\n\n// Serbian\nconst LANG_SR: Localization = {\n text_init: \"Pokretanje...\",\n\n text_ready: \"Anti-Robot Verifikacija\",\n button_start: \"Kliknite da biste započeli verifikaciju\",\n\n text_fetching: \"Učitavanje izazova\",\n\n text_solving: \"Verifikacija da ste čovek...\",\n text_completed: \"Ja sam čovek\",\n text_completed_sr: \"Automatska provera neželjene pošte je završena\",\n\n text_expired: \"Anti-Robot verifikacija je istekla\",\n button_restart: \"Ponovo pokrenuti\",\n\n text_error: \"Verifikacija nije uspela\",\n button_retry: \"Pokušajte ponovo\",\n text_fetch_error: \"Neuspelo povezivanje sa...\",\n};\n\n// Slovenian\nconst LANG_SL: Localization = {\n text_init: \"Inicializiranje..\",\n\n text_ready: \"Preverjanje robotov\",\n button_start: \"Kliknite za začetek preverjanja\",\n\n text_fetching: \"Prenašanje izziva\",\n\n text_solving: \"Preverjamo, ali ste človek\",\n text_completed: \"Nisem robot\",\n text_completed_sr: \"Avtomatsko preverjanje je zaključeno\",\n\n text_expired: \"Preverjanje robotov je poteklo\",\n button_restart: \"Osveži\",\n\n text_error: \"Preverjanje ni uspelo\",\n button_retry: \"Poskusi ponovno\",\n text_fetch_error: \"Povezave ni bilo mogoče vzpostaviti\",\n};\n\n// Hungarian\nconst LANG_HU: Localization = {\n text_init: \"Inicializálás...\",\n\n text_ready: \"Robotellenes ellenőrzés\",\n button_start: \"Kattintson az ellenőrzés megkezdéséhez\",\n\n text_fetching: \"Feladvány lekérése\",\n\n text_solving: \"Annak igazolása, hogy Ön nem robot...\",\n text_completed: \"Nem vagyok robot\",\n text_completed_sr: \"Automatikus spam ellenőrzés befejeződött\",\n\n text_expired: \"Robotellenes ellenőrzés lejárt\",\n button_restart: \"Újraindítás\",\n\n text_error: \"Az ellenőrzés nem sikerült\",\n button_retry: \"Próbálja újra\",\n text_fetch_error: \"Nem sikerült csatlakozni\",\n};\n\n// Romanian\nconst LANG_RO: Localization = {\n text_init: \"Se inițializează..\",\n\n text_ready: \"Verificare anti-robot\",\n button_start: \"Click pentru a începe verificarea\",\n\n text_fetching: \"Downloading\",\n\n text_solving: \"Verificare ca ești om..\",\n text_completed: \"Sunt om\",\n text_completed_sr: \"Verificarea automată a spam-ului a fost finalizată\",\n\n text_expired: \"Verificarea anti-robot a expirat\",\n button_restart: \"Restart\",\n\n text_error: \"Verificare eșuată\",\n button_retry: \"Reîncearcă\",\n text_fetch_error: \"Nu s-a putut conecta la\",\n};\n\n// Chinese\nconst LANG_ZH: Localization = {\n text_init: \"初始化中……\",\n\n text_ready: \"人机验证\",\n button_start: \"点击开始\",\n\n text_fetching: \"正在加载\",\n\n text_solving: \"人机校验中……\",\n text_completed: \"我不是机器人\",\n text_completed_sr: \"人机验证完成\",\n\n text_expired: \"验证已过期\",\n button_restart: \"重新开始\",\n\n text_error: \"校验失败\",\n button_retry: \"重试\",\n text_fetch_error: \"无法连接到\",\n};\n\n// Traditional Chinese\nconst LANG_ZH_TW: Localization = {\n text_init: \"正在初始化……\",\n\n text_ready: \"反機器人驗證\",\n button_start: \"點擊開始驗證\",\n\n text_fetching: \"載入中\",\n\n text_solving: \"反機器人驗證中……\",\n text_completed: \"我不是機器人\",\n text_completed_sr: \"驗證完成\",\n\n text_expired: \"驗證超時\",\n button_restart: \"重新開始\",\n\n text_error: \"驗證失敗\",\n button_retry: \"重試\",\n text_fetch_error: \"無法連線到\",\n};\n\n// Vietnamese\nconst LANG_VI: Localization = {\n text_init: \"Đang khởi tạo..\",\n\n text_ready: \"Xác minh chống Robot\",\n button_start: \"Bấm vào đây để xác minh\",\n\n text_fetching: \"Tìm nạp và xử lý thử thách\",\n\n text_solving: \"Xác minh bạn là người..\",\n text_completed: \"Bạn là người\",\n text_completed_sr: \"Xác minh hoàn tất\",\n\n text_expired: \"Xác minh đã hết hạn\",\n button_restart: \"Khởi động lại\",\n\n text_error: \"Xác minh thất bại\",\n button_retry: \"Thử lại\",\n text_fetch_error: \"Không kết nối được\",\n};\n\nexport const localizations = {\n en: LANG_EN,\n de: LANG_DE,\n nl: LANG_NL,\n fr: LANG_FR,\n it: LANG_IT,\n pt: LANG_PT,\n es: LANG_ES,\n ca: LANG_CA,\n ja: LANG_JA,\n da: LANG_DA,\n ru: LANG_RU,\n sv: LANG_SV,\n tr: LANG_TR,\n el: LANG_EL,\n uk: LANG_UK,\n bg: LANG_BG,\n cs: LANG_CS,\n sk: LANG_SK,\n no: LANG_NO,\n fi: LANG_FI,\n lv: LANG_LV,\n lt: LANG_LT,\n pl: LANG_PL,\n et: LANG_ET,\n hr: LANG_HR,\n sr: LANG_SR,\n sl: LANG_SL,\n hu: LANG_HU,\n ro: LANG_RO,\n zh: LANG_ZH,\n zh_TW: LANG_ZH_TW,\n vi: LANG_VI,\n\n // alternative language codes\n nb: LANG_NO,\n};\n","export function createDiagnosticsBuffer(solverID, timeToSolved) {\n const arr = new Uint8Array(3);\n const view = new DataView(arr.buffer);\n view.setUint8(0, solverID);\n view.setUint16(1, timeToSolved);\n return arr;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGlhZ25vc3RpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFFBQWUsRUFBRSxZQUFvQjtJQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFaEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpYWdub3N0aWNzQnVmZmVyKHNvbHZlcklEOiAxIHwgMiwgdGltZVRvU29sdmVkOiBudW1iZXIpIHtcbiAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyLmJ1ZmZlcik7XG4gIHZpZXcuc2V0VWludDgoMCwgc29sdmVySUQpO1xuICB2aWV3LnNldFVpbnQxNigxLCB0aW1lVG9Tb2x2ZWQpO1xuXG4gIHJldHVybiBhcnI7XG59XG4iXX0=","import { Puzzle } from \"./puzzle\";\nimport { getPuzzleSolverInputs } from \"friendly-pow/puzzle\";\nimport { createDiagnosticsBuffer } from \"friendly-pow/diagnostics\";\nimport { DoneMessage, ProgressMessage, MessageFromWorker, SolverMessage, StartMessage } from \"./types\";\n// @ts-ignore\nimport workerString from \"../dist/worker.min.js\";\n\n// Defensive init to make it easier to integrate with Gatsby and friends.\nlet URL: any;\nif (typeof window !== \"undefined\") {\n URL = window.URL || window.webkitURL;\n}\n\nexport class WorkerGroup {\n private workers: Worker[] = [];\n\n private puzzleNumber = 0;\n\n private numPuzzles = 0;\n private threshold = 0;\n private startTime = 0;\n private progress = 0;\n private totalHashes = 0;\n private puzzleSolverInputs: Uint8Array[] = [];\n // The index of the next puzzle\n private puzzleIndex = 0;\n private solutionBuffer: Uint8Array = new Uint8Array(0);\n // initialize some value, so ts is happy\n private solverType: 1 | 2 = 1;\n\n private readyCount = 0;\n private startCount = 0;\n\n public progressCallback: (p: ProgressMessage) => any = () => 0;\n public readyCallback: () => any = () => 0;\n public startedCallback: () => any = () => 0;\n public doneCallback: (d: DoneMessage) => any = () => 0;\n public errorCallback: (e: any) => any = () => 0;\n\n public init() {\n this.terminateWorkers();\n\n this.progress = 0;\n this.totalHashes = 0;\n\n this.readyCount = 0;\n this.startCount = 0;\n\n // Setup four workers for now - later we could calculate this depending on the device\n this.workers = new Array(4);\n const workerBlob = new Blob([workerString] as any, { type: \"text/javascript\" });\n\n for (let i = 0; i < this.workers.length; i++) {\n this.workers[i] = new Worker(URL.createObjectURL(workerBlob));\n this.workers[i].onerror = (e: ErrorEvent) => this.errorCallback(e);\n\n this.workers[i].onmessage = (e: any) => {\n const data: MessageFromWorker = e.data;\n if (!data) return;\n if (data.type === \"ready\") {\n this.readyCount++;\n this.solverType = data.solver;\n // We are ready, when all workers are ready\n if (this.readyCount == this.workers.length) {\n this.readyCallback();\n }\n } else if (data.type === \"started\") {\n this.startCount++;\n // We started, when the first worker starts working\n if (this.startCount == 1) {\n this.startTime = Date.now();\n this.startedCallback();\n }\n } else if (data.type === \"done\") {\n if (data.puzzleNumber !== this.puzzleNumber) return; // solution belongs to a previous puzzle\n\n if (this.puzzleIndex < this.puzzleSolverInputs.length) {\n this.workers[i].postMessage({\n type: \"start\",\n puzzleSolverInput: this.puzzleSolverInputs[this.puzzleIndex],\n threshold: this.threshold,\n puzzleIndex: this.puzzleIndex,\n puzzleNumber: this.puzzleNumber,\n } as StartMessage);\n this.puzzleIndex++;\n }\n\n this.progress++;\n this.totalHashes += data.h;\n\n this.progressCallback({\n n: this.numPuzzles,\n h: this.totalHashes,\n t: (Date.now() - this.startTime) / 1000,\n i: this.progress,\n });\n\n this.solutionBuffer.set(data.solution, data.puzzleIndex * 8);\n // We are done, when all puzzles have been solved\n if (this.progress == this.numPuzzles) {\n const totalTime = (Date.now() - this.startTime) / 1000;\n this.doneCallback({\n solution: this.solutionBuffer,\n h: this.totalHashes,\n t: totalTime,\n diagnostics: createDiagnosticsBuffer(this.solverType, totalTime),\n solver: this.solverType,\n });\n }\n } else if (data.type === \"error\") {\n this.errorCallback(data);\n }\n };\n }\n }\n\n public setupSolver(forceJS = false) {\n const msg: SolverMessage = { type: \"solver\", forceJS: forceJS };\n for (let i = 0; i < this.workers.length; i++) {\n this.workers[i].postMessage(msg);\n }\n }\n\n start(puzzle: Puzzle) {\n this.puzzleSolverInputs = getPuzzleSolverInputs(puzzle.buffer, puzzle.n);\n this.solutionBuffer = new Uint8Array(8 * puzzle.n);\n this.numPuzzles = puzzle.n;\n this.threshold = puzzle.threshold;\n this.puzzleIndex = 0;\n this.puzzleNumber++;\n\n for (let i = 0; i < this.workers.length; i++) {\n if (this.puzzleIndex === this.puzzleSolverInputs.length) break;\n\n this.workers[i].postMessage({\n type: \"start\",\n puzzleSolverInput: this.puzzleSolverInputs[i],\n threshold: this.threshold,\n puzzleIndex: this.puzzleIndex,\n puzzleNumber: this.puzzleNumber,\n } as StartMessage);\n this.puzzleIndex++;\n }\n }\n\n public terminateWorkers() {\n if (this.workers.length == 0) return;\n for (let i = 0; i < this.workers.length; i++) {\n this.workers[i].terminate();\n }\n this.workers = [];\n }\n}\n","import { encode } from \"friendly-pow/base64\";\nimport {\n getRunningHTML,\n getReadyHTML,\n getDoneHTML,\n updateProgressBar,\n findParentFormElement,\n executeOnceOnFocusInEvent,\n getErrorHTML,\n getFetchingHTML,\n injectStyle,\n getExpiredHTML,\n} from \"./dom\";\nimport { isHeadless } from \"./headless\";\nimport { DoneMessage } from \"./types\";\nimport { Puzzle, decodeBase64Puzzle, getPuzzle } from \"./puzzle\";\nimport { Localization, localizations } from \"./localization\";\nimport { WorkerGroup } from \"./workergroup\";\n\nconst PUZZLE_ENDPOINT_URL = \"https://api.friendlycaptcha.com/api/v1/puzzle\";\n\nexport interface WidgetInstanceOptions {\n /**\n * Don't set this to true unless you want to see what the experience is like for people using very old browsers.\n * This does not increase security.\n */\n forceJSFallback: boolean;\n skipStyleInjection: boolean;\n startMode: \"auto\" | \"focus\" | \"none\";\n puzzleEndpoint: string;\n language: keyof typeof localizations | Localization;\n solutionFieldName: string;\n\n sitekey: string;\n\n readyCallback: () => any;\n startedCallback: () => any;\n doneCallback: (solution: string) => any;\n errorCallback: (error: any) => any;\n}\n\nexport class WidgetInstance {\n private puzzle?: Puzzle;\n\n private workerGroup: WorkerGroup = new WorkerGroup();\n\n /**\n * The root element of this widget instance.\n * Warning: it is undefined after `destroy()` has been called.\n */\n private e!: HTMLElement & { friendlyChallengeWidget?: WidgetInstance };\n\n /**\n * The captcha has been succesfully solved.\n */\n public valid = false;\n private opts: WidgetInstanceOptions;\n\n /**\n * Some errors may cause a need for the (worker) to be reinitialized. If this is\n * true `init` will be called again when start is called.\n */\n private needsReInit = false;\n\n /**\n * Start() has been called at least once ever.\n */\n private hasBeenStarted = false;\n\n private hasBeenDestroyed = false;\n\n private lang: Localization;\n\n private expiryTimeout: ReturnType | undefined;\n\n constructor(element: HTMLElement, options: Partial = {}) {\n this.opts = Object.assign(\n {\n forceJSFallback: false,\n skipStyleInjection: false,\n startMode: \"focus\",\n puzzleEndpoint: element.dataset[\"puzzleEndpoint\"] || PUZZLE_ENDPOINT_URL,\n startedCallback: () => 0,\n readyCallback: () => 0,\n doneCallback: () => 0,\n errorCallback: () => 0,\n sitekey: element.dataset[\"sitekey\"] || \"\",\n language: element.dataset[\"lang\"] || \"en\",\n solutionFieldName: element.dataset[\"solutionFieldName\"] || \"frc-captcha-solution\",\n },\n options\n );\n this.e = element;\n this.e.friendlyChallengeWidget = this;\n\n // Load language\n if (typeof this.opts.language === \"string\") {\n let l = (localizations as any)[this.opts.language.toLowerCase()];\n if (l === undefined) {\n console.error('FriendlyCaptcha: language \"' + this.opts.language + '\" not found.');\n // Fall back to English\n l = localizations.en;\n }\n this.lang = l;\n } else {\n // We assign to a copy of the English language localization, so that any missing values will be English\n this.lang = Object.assign(Object.assign({}, localizations.en), this.opts.language);\n }\n\n element.innerText = this.lang.text_init;\n if (!this.opts.skipStyleInjection) {\n injectStyle();\n }\n this.init(this.opts.startMode === \"auto\" || this.e.dataset[\"start\"] === \"auto\");\n }\n\n public init(forceStart?: boolean) {\n if (this.hasBeenDestroyed) {\n console.error(\"FriendlyCaptcha widget has been destroyed using destroy(), it can not be used anymore.\");\n return;\n }\n this.initWorkerGroup();\n\n if (forceStart) {\n this.start();\n } else if (\n this.e.dataset[\"start\"] !== \"none\" &&\n (this.opts.startMode === \"focus\" || this.e.dataset[\"start\"] === \"focus\")\n ) {\n const form = findParentFormElement(this.e);\n if (form) {\n executeOnceOnFocusInEvent(form, () => this.start());\n } else {\n console.log(\"FriendlyCaptcha div seems not to be contained in a form, autostart will not work\");\n }\n }\n }\n\n /**\n * Add a listener to the button that calls `this.start` on click.\n */\n private makeButtonStart() {\n const b = this.e.querySelector(\"button\");\n if (b) {\n b.addEventListener(\"click\", (e) => this.start(), { once: true, passive: true });\n b.addEventListener(\"touchstart\", (e) => this.start(), { once: true, passive: true });\n }\n }\n\n private onWorkerError(e: any) {\n this.hasBeenStarted = false;\n this.needsReInit = true;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n console.error(\"[FRC]\", e);\n this.e.innerHTML = getErrorHTML(this.opts.solutionFieldName, this.lang, \"Background worker error \" + e.message);\n this.makeButtonStart();\n\n // Just out of precaution\n this.opts.forceJSFallback = true;\n }\n\n private initWorkerGroup() {\n this.workerGroup.progressCallback = (progress) => {\n updateProgressBar(this.e, progress);\n };\n this.workerGroup.readyCallback = () => {\n this.e.innerHTML = getReadyHTML(this.opts.solutionFieldName, this.lang);\n this.makeButtonStart();\n this.opts.readyCallback();\n };\n this.workerGroup.startedCallback = () => {\n this.e.innerHTML = getRunningHTML(this.opts.solutionFieldName, this.lang);\n this.opts.startedCallback();\n };\n this.workerGroup.doneCallback = (data) => {\n const solutionPayload = this.handleDone(data);\n this.opts.doneCallback(solutionPayload);\n const callback = this.e.dataset[\"callback\"];\n if (callback) {\n (window as any)[callback](solutionPayload);\n }\n };\n this.workerGroup.errorCallback = (e) => {\n this.onWorkerError(e);\n };\n\n this.workerGroup.init();\n this.workerGroup.setupSolver(this.opts.forceJSFallback);\n }\n\n private expire() {\n this.hasBeenStarted = false;\n // Node.isConnected will be undefined in older browsers\n if (this.e.isConnected !== false) {\n this.e.innerHTML = getExpiredHTML(this.opts.solutionFieldName, this.lang);\n this.makeButtonStart();\n }\n }\n\n public async start() {\n if (this.hasBeenDestroyed) {\n console.error(\"Can not start FriendlyCaptcha widget which has been destroyed\");\n return;\n }\n\n if (this.hasBeenStarted) {\n console.warn(\"Can not start FriendlyCaptcha widget which has already been started\");\n return;\n }\n\n const sitekey = this.opts.sitekey || this.e.dataset[\"sitekey\"];\n if (!sitekey) {\n console.error(\"FriendlyCaptcha: sitekey not set on frc-captcha element\");\n this.e.innerHTML = getErrorHTML(\n this.opts.solutionFieldName,\n this.lang,\n \"Website problem: sitekey not set\",\n false\n );\n return;\n }\n\n if (isHeadless()) {\n this.e.innerHTML = getErrorHTML(\n this.opts.solutionFieldName,\n this.lang,\n \"Browser check failed, try a different browser\",\n false,\n true\n );\n return;\n }\n\n if (this.needsReInit) {\n this.needsReInit = false;\n this.init(true);\n return;\n }\n\n this.hasBeenStarted = true;\n\n try {\n this.e.innerHTML = getFetchingHTML(this.opts.solutionFieldName, this.lang);\n this.puzzle = decodeBase64Puzzle(await getPuzzle(this.opts.puzzleEndpoint, sitekey, this.lang));\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n this.expiryTimeout = setTimeout(() => this.expire(), this.puzzle.expiry - 30000); // 30s grace\n } catch (e: any) {\n console.error(\"[FRC]\", e);\n this.hasBeenStarted = false;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n this.e.innerHTML = getErrorHTML(this.opts.solutionFieldName, this.lang, e.message);\n this.makeButtonStart();\n const code = \"error_getting_puzzle\";\n\n this.opts.errorCallback({ code, description: e.toString(), error: e });\n const callback = this.e.dataset[\"callback-error\"];\n if (callback) {\n (window as any)[callback](this);\n }\n return;\n }\n\n this.workerGroup.start(this.puzzle);\n }\n\n /**\n * This is to be called when the puzzle has been succesfully completed.\n * Here the hidden field gets updated with the solution.\n * @param data message from the webworker\n */\n private handleDone(data: DoneMessage) {\n this.valid = true;\n const puzzleSolutionMessage = `${this.puzzle!.signature}.${this.puzzle!.base64}.${encode(data.solution)}.${encode(\n data.diagnostics\n )}`;\n this.e.innerHTML = getDoneHTML(this.opts.solutionFieldName, this.lang, puzzleSolutionMessage, data);\n // this.worker = null; // This literally crashes very old browsers..\n this.needsReInit = true;\n\n return puzzleSolutionMessage;\n }\n\n /**\n * Cleans up the widget entirely, removing any DOM elements and terminating any background workers.\n * After it is destroyed it can no longer be used for any purpose.\n */\n public destroy() {\n this.workerGroup.terminateWorkers();\n this.needsReInit = false;\n this.hasBeenStarted = false;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n if (this.e) {\n this.e.remove();\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n delete this.e;\n }\n this.hasBeenDestroyed = true;\n }\n\n /**\n * Resets the widget to the initial state.\n * This is useful in situations where the page does not refresh when you submit and the form may be re-submitted again\n */\n public reset() {\n if (this.hasBeenDestroyed) {\n console.error(\"FriendlyCaptcha widget has been destroyed, it can not be used anymore\");\n return;\n }\n\n this.workerGroup.terminateWorkers();\n this.needsReInit = false;\n this.hasBeenStarted = false;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n this.init(this.opts.startMode === \"auto\" || this.e.dataset[\"start\"] === \"auto\");\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../node_modules/friendly-pow/base64.js","../../node_modules/friendly-pow/constants.js","../../src/dom.ts","../../src/headless.ts","../../node_modules/friendly-pow/encoding.js","../../node_modules/friendly-pow/puzzle.js","../../src/puzzle.ts","../../src/localization.ts","../../node_modules/friendly-pow/diagnostics.js","../../src/workergroup.ts","../../src/captcha.ts"],"sourcesContent":["// Adapted from the base64-arraybuffer package implementation\n// (https://github.com/niklasvh/base64-arraybuffer, MIT licensed)\nconst CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst EQ_CHAR = \"=\".charCodeAt(0);\n// Use a lookup table to find the index.\nconst lookup = new Uint8Array(256);\nfor (let i = 0; i < CHARS.length; i++) {\n lookup[CHARS.charCodeAt(i)] = i;\n}\nexport function encode(bytes) {\n const len = bytes.length;\n let base64 = \"\";\n for (let i = 0; i < len; i += 3) {\n const b0 = bytes[i + 0];\n const b1 = bytes[i + 1];\n const b2 = bytes[i + 2];\n // This temporary variable stops the NextJS 13 compiler from breaking this code in optimization.\n // See issue https://github.com/FriendlyCaptcha/friendly-challenge/issues/165\n let t = \"\";\n t += CHARS.charAt(b0 >>> 2);\n t += CHARS.charAt(((b0 & 3) << 4) | (b1 >>> 4));\n t += CHARS.charAt(((b1 & 15) << 2) | (b2 >>> 6));\n t += CHARS.charAt(b2 & 63);\n base64 += t;\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + \"=\";\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + \"==\";\n }\n return base64;\n}\nexport function decode(base64) {\n const len = base64.length;\n let bufferLength = (len * 3) >>> 2; // * 0.75\n if (base64.charCodeAt(len - 1) === EQ_CHAR)\n bufferLength--;\n if (base64.charCodeAt(len - 2) === EQ_CHAR)\n bufferLength--;\n const bytes = new Uint8Array(bufferLength);\n for (let i = 0, p = 0; i < len; i += 4) {\n const encoded1 = lookup[base64.charCodeAt(i + 0)];\n const encoded2 = lookup[base64.charCodeAt(i + 1)];\n const encoded3 = lookup[base64.charCodeAt(i + 2)];\n const encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return bytes;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2U2NC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2REFBNkQ7QUFDN0QsaUVBQWlFO0FBRWpFLE1BQU0sS0FBSyxHQUFHLGtFQUFrRSxDQUFDO0FBQ2pGLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEMsd0NBQXdDO0FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2pDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFpQjtJQUN0QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsZ0dBQWdHO1FBQ2hHLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWCxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFD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YXB0ZWQgZnJvbSB0aGUgYmFzZTY0LWFycmF5YnVmZmVyIHBhY2thZ2UgaW1wbGVtZW50YXRpb25cbi8vIChodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyLCBNSVQgbGljZW5zZWQpXG5cbmNvbnN0IENIQVJTID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5jb25zdCBFUV9DSEFSID0gXCI9XCIuY2hhckNvZGVBdCgwKTtcblxuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUlMubGVuZ3RoOyBpKyspIHtcbiAgbG9va3VwW0NIQVJTLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShieXRlczogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IGxlbiA9IGJ5dGVzLmxlbmd0aDtcbiAgbGV0IGJhc2U2NCA9IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgIGNvbnN0IGIwID0gYnl0ZXNbaSArIDBdO1xuICAgIGNvbnN0IGIxID0gYnl0ZXNbaSArIDFdO1xuICAgIGNvbnN0IGIyID0gYnl0ZXNbaSArIDJdO1xuICAgIC8vIFRoaXMgdGVtcG9yYXJ5IHZhcmlhYmxlIHN0b3BzIHRoZSBOZXh0SlMgMTMgY29tcGlsZXIgZnJvbSBicmVha2luZyB0aGlzIGNvZGUgaW4gb3B0aW1pemF0aW9uLlxuICAgIC8vIFNlZSBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vRnJpZW5kbHlDYXB0Y2hhL2ZyaWVuZGx5LWNoYWxsZW5nZS9pc3N1ZXMvMTY1XG4gICAgbGV0IHQgPSBcIlwiO1xuICAgIHQgKz0gQ0hBUlMuY2hhckF0KGIwID4+PiAyKTtcbiAgICB0ICs9IENIQVJTLmNoYXJBdCgoKGIwICYgMykgPDwgNCkgfCAoYjEgPj4+IDQpKTtcbiAgICB0ICs9IENIQVJTLmNoYXJBdCgoKGIxICYgMTUpIDw8IDIpIHwgKGIyID4+PiA2KSk7XG4gICAgdCArPSBDSEFSUy5jaGFyQXQoYjIgJiA2Myk7XG4gICAgYmFzZTY0ICs9IHQ7XG4gIH1cblxuICBpZiAobGVuICUgMyA9PT0gMikge1xuICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgXCI9XCI7XG4gIH0gZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgXCI9PVwiO1xuICB9XG5cbiAgcmV0dXJuIGJhc2U2NDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShiYXNlNjQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICBsZXQgYnVmZmVyTGVuZ3RoID0gKGxlbiAqIDMpID4+PiAyOyAvLyAqIDAuNzVcblxuICBpZiAoYmFzZTY0LmNoYXJDb2RlQXQobGVuIC0gMSkgPT09IEVRX0NIQVIpIGJ1ZmZlckxlbmd0aC0tO1xuICBpZiAoYmFzZTY0LmNoYXJDb2RlQXQobGVuIC0gMikgPT09IEVRX0NIQVIpIGJ1ZmZlckxlbmd0aC0tO1xuXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBjb25zdCBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMCldO1xuICAgIGNvbnN0IGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgY29uc3QgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICBjb25zdCBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuXG4gICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuIl19","// This is not an enum to save some bytes in the output bundle.\nexport const SOLVER_TYPE_JS = 1;\nexport const SOLVER_TYPE_WASM = 2;\nexport const CHALLENGE_SIZE_BYTES = 128;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUNoQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBpcyBub3QgYW4gZW51bSB0byBzYXZlIHNvbWUgYnl0ZXMgaW4gdGhlIG91dHB1dCBidW5kbGUuXG5leHBvcnQgY29uc3QgU09MVkVSX1RZUEVfSlMgPSAxO1xuZXhwb3J0IGNvbnN0IFNPTFZFUl9UWVBFX1dBU00gPSAyO1xuXG5leHBvcnQgY29uc3QgQ0hBTExFTkdFX1NJWkVfQllURVMgPSAxMjg7XG4iXX0=","// @ts-ignore\nimport css from \"./styles.css\";\nimport { ProgressMessage, DoneMessage } from \"./types\";\nimport { SOLVER_TYPE_JS } from \"friendly-pow/constants\";\nimport { Localization } from \"./localization\";\n\nconst loaderSVG = ``;\nconst errorSVG = ``;\n\n/**\n * Base template used for all widget states\n * The reason we use raw string interpolation here is so we don't have to ship something like lit-html.\n */\nfunction getTemplate(\n fieldName: string,\n rtl: boolean | undefined,\n svgContent: string,\n svgAriaHidden: boolean,\n textContent: string,\n solutionString: string,\n buttonText?: string,\n progress = false,\n debugData?: string,\n additionalContainerClasses?: string\n) {\n return `
\n${svgContent}\n
\n ${textContent}\n ${buttonText ? `` : \"\"}\n ${progress ? `0%` : \"\"}\n
\n
FriendlyCaptcha ⇗\n${fieldName === \"-\" ? \"\":``}`;\n}\n\n/**\n * Used when the widget is ready to start solving.\n */\nexport function getReadyHTML(fieldName: string, l: Localization) {\n return getTemplate(\n fieldName,\n l.rtl,\n ``,\n true,\n l.text_ready,\n \".UNSTARTED\",\n l.button_start,\n false\n );\n}\n\n/**\n * Used when the widget is retrieving a puzzle\n */\nexport function getFetchingHTML(fieldName: string, l: Localization) {\n return getTemplate(fieldName, l.rtl, loaderSVG, true, l.text_fetching, \".FETCHING\", undefined, true);\n}\n\n/**\n * Used when the solver is running, displays a progress bar.\n */\nexport function getRunningHTML(fieldName: string, l: Localization) {\n return getTemplate(fieldName, l.rtl, loaderSVG, true, l.text_solving, \".UNFINISHED\", undefined, true);\n}\n\nexport function getDoneHTML(fieldName: string, l: Localization, solution: string, data: DoneMessage) {\n const timeData = `${data.t.toFixed(0)}s (${((data.h / data.t) * 0.001).toFixed(0)}K/s)${\n data.solver === SOLVER_TYPE_JS ? \" JS Fallback\" : \"\"\n }`;\n return getTemplate(\n fieldName,\n l.rtl, \n `${l.text_completed_sr}`,\n false,\n l.text_completed,\n solution,\n undefined,\n false,\n timeData,\n \"frc-success\"\n );\n}\n\nexport function getExpiredHTML(fieldName: string, l: Localization) {\n return getTemplate(fieldName, l.rtl, errorSVG, true, l.text_expired, \".EXPIRED\", l.button_restart);\n}\n\nexport function getErrorHTML(\n fieldName: string,\n l: Localization,\n errorDescription: string,\n recoverable = true,\n headless = false\n) {\n return getTemplate(\n fieldName,\n l.rtl, \n errorSVG,\n true,\n `${l.text_error}
${errorDescription}`,\n headless ? \".HEADLESS_ERROR\" : \".ERROR\",\n recoverable ? l.button_retry : undefined\n );\n}\n\nexport function findCaptchaElements() {\n const elements = document.querySelectorAll(\".frc-captcha\");\n if (elements.length === 0) {\n console.warn(\"FriendlyCaptcha: No div was found with .frc-captcha class\");\n }\n return elements;\n}\n\n/**\n * Injects the style if no #frc-style element is already present\n * (to support custom stylesheets)\n */\nexport function injectStyle() {\n if (!document.querySelector(\"#frc-style\")) {\n const styleSheet = document.createElement(\"style\");\n styleSheet.id = \"frc-style\";\n styleSheet.innerHTML = css;\n document.head.appendChild(styleSheet);\n }\n}\n\n/**\n * @param element parent element of friendlycaptcha\n * @param progress value between 0 and 1\n */\nexport function updateProgressBar(element: HTMLElement, data: ProgressMessage) {\n const p = element.querySelector(\".frc-progress\") as HTMLProgressElement;\n const perc = (data.i + 1) / data.n;\n if (p) {\n p.value = perc;\n p.innerText = perc.toFixed(2) + \"%\";\n p.title = data.i + 1 + \"/\" + data.n + \" (\" + ((data.h / data.t) * 0.001).toFixed(0) + \"K/s)\";\n }\n}\n\n/**\n * Traverses parent nodes until a is found, returns null if not found.\n */\nexport function findParentFormElement(element: HTMLElement) {\n while (element.tagName !== \"FORM\") {\n element = element.parentElement as HTMLElement;\n if (!element) {\n return null;\n }\n }\n return element;\n}\n\n/**\n * Add listener to specified element that will only fire once on focus.\n */\nexport function executeOnceOnFocusInEvent(element: HTMLElement, listener: (this: HTMLElement, fe: FocusEvent) => any) {\n element.addEventListener(\"focusin\", listener, { once: true, passive: true });\n}\n","// Defensive init to make it easier to integrate with Gatsby, NextJS, and friends.\nlet nav: Navigator;\nlet ua: string;\nif (typeof navigator !== \"undefined\") {\n nav = navigator;\n ua = nav.userAgent.toLowerCase();\n}\n\n/**\n * Headless browser detection on the clientside is imperfect. One can modify any clientside code to disable or change this check,\n * and one can spoof whatever is checked here. However, that doesn't make it worthless: it's yet another hurdle for spammers and\n * it stops unsophisticated scripters from making any request whatsoever.\n */\nexport function isHeadless() {\n return (\n //tell-tale bot signs\n ua.indexOf(\"headless\") !== -1 ||\n nav.appVersion.indexOf(\"Headless\") !== -1 ||\n ua.indexOf(\"bot\") !== -1 || // http://www.useragentstring.com/pages/useragentstring.php?typ=Browser\n ua.indexOf(\"crawl\") !== -1 || // Only IE5 has two distributions that has this on windows NT.. so yeah.\n nav.webdriver === true ||\n !nav.language ||\n (nav.languages !== undefined && !nav.languages.length) // IE 11 does not support NavigatorLanguage.languages https://developer.mozilla.org/en-US/docs/Web/API/NavigatorLanguage/languages\n );\n}\n","/**\n * Maps a value between 0 and 255 to a difficulty threshold (as uint32)\n * Difficulty 0 maps to 99.99% probability of being right on the first attempt\n * Anything above 250 needs 2^32 tries on average to solve.\n * 150 to 180 seems reasonable\n */\nexport function difficultyToThreshold(value) {\n if (value > 255) {\n value = 255;\n }\n else if (value < 0) {\n value = 0;\n }\n return Math.pow(2, (255.999 - value) / 8.0) >>> 0;\n}\n/**\n * Maps a value between 0 and 255 to a time duration in seconds that a puzzle is valid for.\n */\nexport function expiryToDurationInSeconds(value) {\n if (value > 255) {\n value = 255;\n }\n else if (value < 0) {\n value = 0;\n }\n return value * 300;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBUztJQUM3QyxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDZixLQUFLLEdBQUcsR0FBRyxDQUFDO0tBQ2I7U0FBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDcEIsS0FBSyxHQUFHLENBQUMsQ0FBQztLQUNYO0lBRUQsT0FBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBSSxLQUFhLENBQUMsR0FBRyxHQUFHLENBQVMsS0FBSyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQVM7SUFDakQsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1FBQ2YsS0FBSyxHQUFHLEdBQUcsQ0FBQztLQUNiO1NBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDWDtJQUVELE9BQVEsS0FBYSxHQUFHLEdBQUcsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXBzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgdG8gYSBkaWZmaWN1bHR5IHRocmVzaG9sZCAoYXMgdWludDMyKVxuICogRGlmZmljdWx0eSAwIG1hcHMgdG8gOTkuOTklIHByb2JhYmlsaXR5IG9mIGJlaW5nIHJpZ2h0IG9uIHRoZSBmaXJzdCBhdHRlbXB0XG4gKiBBbnl0aGluZyBhYm92ZSAyNTAgbmVlZHMgMl4zMiB0cmllcyBvbiBhdmVyYWdlIHRvIHNvbHZlLlxuICogMTUwIHRvIDE4MCBzZWVtcyByZWFzb25hYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmaWN1bHR5VG9UaHJlc2hvbGQodmFsdWU6IHU4KTogdTMyIHtcbiAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgdmFsdWUgPSAyNTU7XG4gIH0gZWxzZSBpZiAodmFsdWUgPCAwKSB7XG4gICAgdmFsdWUgPSAwO1xuICB9XG5cbiAgcmV0dXJuIChNYXRoLnBvdygyLCAoMjU1Ljk5OSAtICh2YWx1ZSBhcyBmNjQpKSAvIDguMCkgYXMgdTMyKSA+Pj4gMDtcbn1cblxuLyoqXG4gKiBNYXBzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgdG8gYSB0aW1lIGR1cmF0aW9uIGluIHNlY29uZHMgdGhhdCBhIHB1enpsZSBpcyB2YWxpZCBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBpcnlUb0R1cmF0aW9uSW5TZWNvbmRzKHZhbHVlOiB1OCk6IHUzMiB7XG4gIGlmICh2YWx1ZSA+IDI1NSkge1xuICAgIHZhbHVlID0gMjU1O1xuICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgIHZhbHVlID0gMDtcbiAgfVxuXG4gIHJldHVybiAodmFsdWUgYXMgdTMyKSAqIDMwMDtcbn1cbiJdfQ==","import { expiryToDurationInSeconds } from \"./encoding\";\nimport { CHALLENGE_SIZE_BYTES } from \"./constants\";\nexport const PUZZLE_TIMESTAMP_OFFSET = 0;\nexport const ACCOUNT_ID_OFFSET = 4;\nexport const APP_ID_OFFSET = 8;\nexport const PUZZLE_VERSION_OFFSET = 12;\nexport const PUZZLE_EXPIRY_OFFSET = 13;\nexport const NUMBER_OF_PUZZLES_OFFSET = 14;\nexport const PUZZLE_DIFFICULTY_OFFSET = 15;\nexport const PUZZLE_NONCE_OFFSET = 24;\nexport const PUZZLE_USER_DATA_OFFSET = 32;\nexport const PUZZLE_USER_DATA_MAX_LENGTH = 32;\nexport function getPuzzleSolverInputs(puzzleBuffer, numPuzzles) {\n const startingPoints = [];\n for (let i = 0; i < numPuzzles; i++) {\n const input = new Uint8Array(CHALLENGE_SIZE_BYTES);\n input.set(puzzleBuffer);\n input[120] = i;\n startingPoints.push(input);\n }\n return startingPoints;\n}\n/**\n * Combine multiple solutions (8 byte values) into a single array\n * @param solutions\n */\nexport function combineSolutions(solutions) {\n const combined = new Uint8Array(solutions.length * 8);\n for (let i = 0; i < solutions.length; i++) {\n combined.set(solutions[i], i * 8);\n }\n return combined;\n}\n/**\n * Time in seconds the puzzle is valid for.\n * @param puzzleBuffer\n */\nexport function getPuzzleTTL(puzzleBuffer) {\n return expiryToDurationInSeconds(puzzleBuffer[PUZZLE_EXPIRY_OFFSET]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHV6emxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3B1enpsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFlBQXdCLEVBQUUsVUFBa0I7SUFDaEYsTUFBTSxjQUFjLEdBQWlCLEVBQUUsQ0FBQztJQUV4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtJQUNELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsU0FBdUI7SUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDbkM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxZQUF3QjtJQUNuRCxPQUFPLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGlyeVRvRHVyYXRpb25JblNlY29uZHMgfSBmcm9tIFwiLi9lbmNvZGluZ1wiO1xuaW1wb3J0IHsgQ0hBTExFTkdFX1NJWkVfQllURVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGNvbnN0IFBVWlpMRV9USU1FU1RBTVBfT0ZGU0VUID0gMDtcbmV4cG9ydCBjb25zdCBBQ0NPVU5UX0lEX09GRlNFVCA9IDQ7XG5leHBvcnQgY29uc3QgQVBQX0lEX09GRlNFVCA9IDg7XG5leHBvcnQgY29uc3QgUFVaWkxFX1ZFUlNJT05fT0ZGU0VUID0gMTI7XG5leHBvcnQgY29uc3QgUFVaWkxFX0VYUElSWV9PRkZTRVQgPSAxMztcbmV4cG9ydCBjb25zdCBOVU1CRVJfT0ZfUFVaWkxFU19PRkZTRVQgPSAxNDtcbmV4cG9ydCBjb25zdCBQVVpaTEVfRElGRklDVUxUWV9PRkZTRVQgPSAxNTtcbmV4cG9ydCBjb25zdCBQVVpaTEVfTk9OQ0VfT0ZGU0VUID0gMjQ7XG5leHBvcnQgY29uc3QgUFVaWkxFX1VTRVJfREFUQV9PRkZTRVQgPSAzMjtcblxuZXhwb3J0IGNvbnN0IFBVWlpMRV9VU0VSX0RBVEFfTUFYX0xFTkdUSCA9IDMyO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHV6emxlU29sdmVySW5wdXRzKHB1enpsZUJ1ZmZlcjogVWludDhBcnJheSwgbnVtUHV6emxlczogbnVtYmVyKTogVWludDhBcnJheVtdIHtcbiAgY29uc3Qgc3RhcnRpbmdQb2ludHM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUHV6emxlczsgaSsrKSB7XG4gICAgY29uc3QgaW5wdXQgPSBuZXcgVWludDhBcnJheShDSEFMTEVOR0VfU0laRV9CWVRFUyk7XG4gICAgaW5wdXQuc2V0KHB1enpsZUJ1ZmZlcik7XG4gICAgaW5wdXRbMTIwXSA9IGk7XG4gICAgc3RhcnRpbmdQb2ludHMucHVzaChpbnB1dCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0aW5nUG9pbnRzO1xufVxuXG4vKipcbiAqIENvbWJpbmUgbXVsdGlwbGUgc29sdXRpb25zICg4IGJ5dGUgdmFsdWVzKSBpbnRvIGEgc2luZ2xlIGFycmF5XG4gKiBAcGFyYW0gc29sdXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lU29sdXRpb25zKHNvbHV0aW9uczogVWludDhBcnJheVtdKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkoc29sdXRpb25zLmxlbmd0aCAqIDgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvbHV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbWJpbmVkLnNldChzb2x1dGlvbnNbaV0sIGkgKiA4KTtcbiAgfVxuICByZXR1cm4gY29tYmluZWQ7XG59XG5cbi8qKlxuICogVGltZSBpbiBzZWNvbmRzIHRoZSBwdXp6bGUgaXMgdmFsaWQgZm9yLlxuICogQHBhcmFtIHB1enpsZUJ1ZmZlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHV6emxlVFRMKHB1enpsZUJ1ZmZlcjogVWludDhBcnJheSkge1xuICByZXR1cm4gZXhwaXJ5VG9EdXJhdGlvbkluU2Vjb25kcyhwdXp6bGVCdWZmZXJbUFVaWkxFX0VYUElSWV9PRkZTRVRdKTtcbn1cbiJdfQ==","import { decode } from \"friendly-pow/base64\";\nimport { difficultyToThreshold } from \"friendly-pow/encoding\";\nimport { NUMBER_OF_PUZZLES_OFFSET, PUZZLE_DIFFICULTY_OFFSET, PUZZLE_EXPIRY_OFFSET } from \"friendly-pow/puzzle\";\nimport { Localization } from \"./localization\";\n\nexport interface Puzzle {\n signature: string;\n base64: string;\n buffer: Uint8Array; // input puzzle\n threshold: number; // Related to difficulty\n n: number; // Amount of puzzles to solve\n expiry: number; // Expiry in milliseconds from now\n}\n\nexport function decodeBase64Puzzle(base64Puzzle: string): Puzzle {\n const parts = base64Puzzle.split(\".\");\n const puzzle = parts[1];\n const arr = decode(puzzle);\n return {\n signature: parts[0],\n base64: puzzle,\n buffer: arr,\n n: arr[NUMBER_OF_PUZZLES_OFFSET],\n threshold: difficultyToThreshold(arr[PUZZLE_DIFFICULTY_OFFSET]),\n expiry: arr[PUZZLE_EXPIRY_OFFSET] * 300000,\n };\n}\n\nexport async function getPuzzle(urlsSeparatedByComma: string, siteKey: string, lang: Localization): Promise {\n const urls = urlsSeparatedByComma.split(\",\");\n for (let i = 0; i < urls.length; i++) {\n try {\n const response = await fetchAndRetryWithBackoff(\n urls[i] + \"?sitekey=\" + siteKey,\n { headers: [[\"x-frc-client\", \"js-0.9.14\"]], mode: \"cors\" },\n 2\n );\n if (response.ok) {\n const json = await response.json();\n return json.data.puzzle;\n } else {\n let json;\n try {\n json = await response.json();\n } catch (e) {\n /* Do nothing, the error is not valid JSON */\n }\n\n if (json && json.errors && json.errors[0] === \"endpoint_not_enabled\") {\n throw Error(`Endpoint not allowed (${response.status})`);\n }\n\n if (i === urls.length - 1) {\n throw Error(`Response status ${response.status} ${response.statusText} ${json ? json.errors : \"\"}`);\n }\n }\n } catch (e) {\n console.error(\"[FRC Fetch]:\", e);\n const err = new Error(`${lang.text_fetch_error} ${urls[i]}`);\n (err as any).rawError = e;\n throw err;\n }\n }\n // This code should never be reached.\n throw Error(`Internal error`);\n}\n\n/**\n * Retries given request with exponential backoff (starting with 1000ms delay, multiplying by 4 every time)\n * @param url Request (can be string url) to fetch\n * @param opts Options for fetch\n * @param n Number of times to attempt before giving up.\n */\nexport async function fetchAndRetryWithBackoff(url: RequestInfo, opts: RequestInit, n: number): Promise {\n let time = 1000;\n return fetch(url, opts).catch(async (error) => {\n if (n === 0) throw error;\n await new Promise((r) => setTimeout(r, time));\n time *= 4;\n return fetchAndRetryWithBackoff(url, opts, n - 1);\n });\n}\n","/* eslint-disable @typescript-eslint/camelcase */\n// Tip: keep the messages short, there isn't a lot of space in the widget\nexport interface Localization {\n // While the widget is starting: usually not visible as it initializes instantly.\n text_init: string;\n\n // Before the widget is started\n text_ready: string;\n button_start: string;\n\n // While the widget is downloading a puzzle (usually only takes a split second)\n // If this is hard to translate, you could put something simple like \"Loading...\"\n text_fetching: string;\n\n // While the widget is solving\n text_solving: string;\n\n // Completed\n text_completed: string;\n // Additional text shown in label. Especially useful for screen readers used by blind users.\n text_completed_sr: string;\n\n // Expired (the puzzle was solved, but then waited say a day without submitting)\n text_expired: string;\n button_restart: string;\n\n // Error\n text_error: string;\n button_retry: string;\n // This error message is followed by the URL, a space is added.\n text_fetch_error: string;\n\n // Right to left language\n rtl?: boolean;\n}\n\n// English\nconst LANG_EN: Localization = {\n text_init: \"Initializing...\",\n\n text_ready: \"Anti-Robot Verification\",\n button_start: \"Click to start verification\",\n\n text_fetching: \"Fetching Challenge\",\n\n text_solving: \"Verifying you are human...\",\n text_completed: \"I am human\",\n text_completed_sr: \"Automatic spam check completed\",\n\n text_expired: \"Anti-Robot verification expired\",\n button_restart: \"Restart\",\n\n text_error: \"Verification failed\",\n button_retry: \"Retry\",\n text_fetch_error: \"Failed to connect to\",\n};\n\n// French\nconst LANG_FR: Localization = {\n text_init: \"Chargement...\",\n\n text_ready: \"Vérification Anti-Robot\",\n button_start: \"Clique ici pour vérifier\",\n\n text_fetching: \"Chargement du défi\",\n\n text_solving: \"Nous vérifions que vous n'êtes pas un robot...\",\n text_completed: \"Je ne suis pas un robot\",\n text_completed_sr: \"Vérification automatique des spams terminée\",\n\n text_expired: \"Vérification anti-robot expirée\",\n button_restart: \"Redémarrer\",\n\n text_error: \"Échec de la vérification\",\n button_retry: \"Recommencer\",\n text_fetch_error: \"Problème de connexion avec\",\n};\n\n// German\nconst LANG_DE: Localization = {\n text_init: \"Initialisierung...\",\n\n text_ready: \"Anti-Roboter-Verifizierung\",\n button_start: \"Hier klicken\",\n\n text_fetching: \"Herausforderung laden...\",\n\n text_solving: \"Verifizierung, dass Sie ein Mensch sind...\",\n text_completed: \"Ich bin ein Mensch\",\n text_completed_sr: \"Automatische Spamprüfung abgeschlossen\",\n\n text_expired: \"Verifizierung abgelaufen\",\n button_restart: \"Erneut starten\",\n\n text_error: \"Verifizierung fehlgeschlagen\",\n button_retry: \"Erneut versuchen\",\n text_fetch_error: \"Verbindungsproblem mit\",\n};\n\n// Dutch\nconst LANG_NL: Localization = {\n text_init: \"Initializeren...\",\n\n text_ready: \"Anti-robotverificatie\",\n button_start: \"Klik om te starten\",\n\n text_fetching: \"Aan het laden...\",\n\n text_solving: \"Anti-robotverificatie bezig...\",\n text_completed: \"Ik ben een mens\",\n text_completed_sr: \"Automatische anti-spamcheck voltooid\",\n\n text_expired: \"Verificatie verlopen\",\n button_restart: \"Opnieuw starten\",\n\n text_error: \"Verificatie mislukt\",\n button_retry: \"Opnieuw proberen\",\n text_fetch_error: \"Verbinding mislukt met\",\n};\n\n// Italian\nconst LANG_IT: Localization = {\n text_init: \"Inizializzazione...\",\n\n text_ready: \"Verifica Anti-Robot\",\n button_start: \"Clicca per iniziare\",\n\n text_fetching: \"Caricamento...\",\n\n text_solving: \"Verificando che sei umano...\",\n text_completed: \"Non sono un robot\",\n text_completed_sr: \"Controllo automatico dello spam completato\", // TODO: verify by native speaker\n\n text_expired: \"Verifica Anti-Robot scaduta\",\n button_restart: \"Ricomincia\",\n\n text_error: \"Verifica fallita\",\n button_retry: \"Riprova\",\n text_fetch_error: \"Problema di connessione con\",\n};\n\n// Portuguese\nconst LANG_PT: Localization = {\n text_init: \"Inicializando...\",\n\n text_ready: \"Verificação Anti-Robô\",\n button_start: \"Clique para iniciar verificação\",\n\n text_fetching: \"Carregando...\",\n\n text_solving: \"Verificando se você é humano...\",\n text_completed: \"Eu sou humano\",\n text_completed_sr: \"Verificação automática de spam concluída\", // TODO: verify by native speaker\n\n text_expired: \"Verificação Anti-Robô expirada\",\n button_restart: \"Reiniciar\",\n\n text_error: \"Verificação falhou\",\n button_retry: \"Tentar novamente\",\n text_fetch_error: \"Falha de conexão com\",\n};\n\n// Spanish\nconst LANG_ES: Localization = {\n text_init: \"Inicializando...\",\n\n text_ready: \"Verificación Anti-Robot\",\n button_start: \"Haga clic para iniciar la verificación\",\n\n text_fetching: \"Cargando desafío\",\n\n text_solving: \"Verificando que eres humano...\",\n text_completed: \"Soy humano\",\n text_completed_sr: \"Verificación automática de spam completada\", // TODO: verify by native speaker\n\n text_expired: \"Verificación Anti-Robot expirada\",\n button_restart: \"Reiniciar\",\n\n text_error: \"Ha fallado la verificación\",\n button_retry: \"Intentar de nuevo\",\n text_fetch_error: \"Error al conectarse a\",\n};\n\n// Catalan\nconst LANG_CA: Localization = {\n text_init: \"Inicialitzant...\",\n\n text_ready: \"Verificació Anti-Robot\",\n button_start: \"Fes clic per començar la verificació\",\n\n text_fetching: \"Carregant repte\",\n\n text_solving: \"Verificant que ets humà...\",\n text_completed: \"Soc humà\",\n text_completed_sr: \"Verificació automàtica de correu brossa completada\", // TODO: verify by native speaker\n\n text_expired: \"La verificació Anti-Robot ha expirat\",\n button_restart: \"Reiniciar\",\n\n text_error: \"Ha fallat la verificació\",\n button_retry: \"Tornar a provar\",\n text_fetch_error: \"Error connectant a\",\n};\n\n// Japanese\nconst LANG_JA: Localization = {\n text_init: \"開始しています...\",\n\n text_ready: \"アンチロボット認証\",\n button_start: \"クリックして認証を開始\",\n\n text_fetching: \"ロードしています\",\n\n text_solving: \"認証中...\",\n text_completed: \"私はロボットではありません\",\n text_completed_sr: \"自動スパムチェックが完了しました\", // TODO: verify by native speaker\n\n text_expired: \"認証の期限が切れています\",\n button_restart: \"再度認証を行う\",\n\n text_error: \"認証にエラーが発生しました\",\n button_retry: \"再度認証を行う\",\n text_fetch_error: \"接続ができませんでした\",\n};\n\n// Danish\nconst LANG_DA: Localization = {\n text_init: \"Aktiverer...\",\n\n text_ready: \"Jeg er ikke en robot\",\n button_start: \"Klik for at starte verifikationen\",\n\n text_fetching: \"Henter data\",\n\n text_solving: \"Kontrollerer at du er et menneske...\",\n text_completed: \"Jeg er et menneske.\",\n text_completed_sr: \"Automatisk spamkontrol gennemført\",\n\n text_expired: \"Verifikationen kunne ikke fuldføres\",\n button_restart: \"Genstart\",\n\n text_error: \"Bekræftelse mislykkedes\",\n button_retry: \"Prøv igen\",\n text_fetch_error: \"Forbindelsen mislykkedes\",\n};\n\n// Russian\nconst LANG_RU: Localization = {\n text_init: \"Инициализация...\",\n\n text_ready: \"АнтиРобот проверка\",\n button_start: \"Нажмите, чтобы начать проверку\",\n\n text_fetching: \"Получаю задачу\",\n\n text_solving: \"Проверяю, что вы человек...\",\n text_completed: \"Я человек\",\n text_completed_sr: \"Aвтоматическая проверка на спам завершена\", // TODO: verify by native speaker\n\n text_expired: \"Срок АнтиРоботной проверки истёк\",\n button_restart: \"Начать заново\",\n\n text_error: \"Ошибка проверки\",\n button_retry: \"Повторить ещё раз\",\n text_fetch_error: \"Ошибка подключения\",\n};\n\n// Swedish\nconst LANG_SV: Localization = {\n text_init: \"Aktiverar...\",\n\n text_ready: \"Jag är inte en robot\",\n button_start: \"Klicka för att verifiera\",\n\n text_fetching: \"Hämtar data\",\n\n text_solving: \"Kontrollerar att du är människa...\",\n text_completed: \"Jag är en människa\",\n text_completed_sr: \"Automatisk spamkontroll slutförd\",\n\n text_expired: \"Anti-robot-verifieringen har löpt ut\",\n button_restart: \"Börja om\",\n\n text_error: \"Verifiering kunde inte slutföras\",\n button_retry: \"Omstart\",\n text_fetch_error: \"Verifiering misslyckades\",\n};\n\n// Turkish\nconst LANG_TR: Localization = {\n text_init: \"Başlatılıyor...\",\n\n text_ready: \"Anti-Robot Doğrulaması\",\n button_start: \"Doğrulamayı başlatmak için tıklayın\",\n\n text_fetching: \"Yükleniyor\",\n\n text_solving: \"Robot olmadığınız doğrulanıyor...\",\n text_completed: \"Ben bir insanım\",\n text_completed_sr: \"Otomatik spam kontrolü tamamlandı\",\n\n text_expired: \"Anti-Robot doğrulamasının süresi doldu\",\n button_restart: \"Yeniden başlat\",\n\n text_error: \"Doğrulama başarısız oldu\",\n button_retry: \"Tekrar dene\",\n text_fetch_error: \"Bağlantı başarısız oldu\",\n};\n\n// Greek\nconst LANG_EL: Localization = {\n text_init: \"Προετοιμασία...\",\n\n text_ready: \"Anti-Robot Επαλήθευση\",\n button_start: \" Κάντε κλικ για να ξεκινήσει η επαλήθευση\",\n\n text_fetching: \" Λήψη πρόκλησης\",\n\n text_solving: \" Επιβεβαίωση ανθρώπου...\",\n text_completed: \"Είμαι άνθρωπος\",\n text_completed_sr: \" Ο αυτόματος έλεγχος ανεπιθύμητου περιεχομένου ολοκληρώθηκε\",\n\n text_expired: \" Η επαλήθευση Anti-Robot έληξε\",\n button_restart: \" Επανεκκίνηση\",\n\n text_error: \" Η επαλήθευση απέτυχε\",\n button_retry: \" Δοκιμάστε ξανά\",\n text_fetch_error: \" Αποτυχία σύνδεσης με\",\n};\n\n// Ukrainian\nconst LANG_UK: Localization = {\n text_init: \"Ініціалізація...\",\n\n text_ready: \"Антиробот верифікація\",\n button_start: \"Натисніть, щоб розпочати верифікацію\",\n\n text_fetching: \"З’єднання\",\n\n text_solving: \"Перевірка, що ви не робот...\",\n text_completed: \"Я не робот\",\n text_completed_sr: \"Автоматична перевірка спаму завершена\",\n\n text_expired: \"Час вичерпано\",\n button_restart: \"Почати знову\",\n\n text_error: \"Верифікація не вдалась\",\n button_retry: \"Спробувати знову\",\n text_fetch_error: \"Не вдалось з’єднатись\",\n};\n\n// Bulgarian\nconst LANG_BG: Localization = {\n text_init: \"Инициализиране...\",\n\n text_ready: \"Анти-робот проверка\",\n button_start: \"Щракнете, за да започнете проверката\",\n\n text_fetching: \"Предизвикателство\",\n\n text_solving: \"Проверяваме дали си човек...\",\n text_completed: \"Аз съм човек\",\n text_completed_sr: \"Автоматичната проверка за спам е завършена\",\n\n text_expired: \"Анти-Робот проверката изтече\",\n button_restart: \"Рестартирайте\",\n\n text_error: \"Неуспешна проверка\",\n button_retry: \"Опитайте пак\",\n text_fetch_error: \"Неуспешно свързване с\",\n};\n\n// Czech\nconst LANG_CS: Localization = {\n text_init: \"Inicializace...\",\n\n text_ready: \"Ověření proti robotům\",\n button_start: \"Klikněte pro ověření\",\n\n text_fetching: \"Problém při načítání\",\n\n text_solving: \"Ověření, že jste člověk...\",\n text_completed: \"Jsem člověk\",\n text_completed_sr: \"Automatická kontrola spamu dokončena\",\n\n text_expired: \"Ověření proti robotům vypršelo\",\n button_restart: \"Restartovat\",\n\n text_error: \"Ověření se nezdařilo\",\n button_retry: \"Zkusit znovu\",\n text_fetch_error: \"Připojení se nezdařilo\",\n};\n\n// Slovak\nconst LANG_SK: Localization = {\n text_init: \"Inicializácia...\",\n\n text_ready: \"Overenie proti robotom\",\n button_start: \"Kliknite pre overenie\",\n\n text_fetching: \"Problém pri načítaní\",\n\n text_solving: \"Overenie, že ste človek...\",\n text_completed: \"Som človek\",\n text_completed_sr: \"Automatická kontrola spamu dokončená\",\n\n text_expired: \"Overenie proti robotom vypršalo\",\n button_restart: \"Reštartovať\",\n\n text_error: \"Overenie sa nepodarilo\",\n button_retry: \"Skúsiť znova\",\n text_fetch_error: \"Pripojenie sa nepodarilo\",\n};\n\n// Norwegian\nconst LANG_NO: Localization = {\n text_init: \" Aktiverer...\",\n\n text_ready: \"Jeg er ikke en robot\",\n button_start: \"Klikk for å starte verifiseringen\",\n\n text_fetching: \"Henter data\",\n\n text_solving: \"Sjekker at du er et menneske...\",\n text_completed: \"Jeg er et menneske\",\n text_completed_sr: \"Automatisk spam-sjekk fullført\",\n\n text_expired: \"Verifisering kunne ikke fullføres\",\n button_restart: \"Omstart\",\n\n text_error: \"Bekreftelsen mislyktes\",\n button_retry: \"Prøv på nytt\",\n text_fetch_error: \"Tilkoblingen mislyktes\",\n};\n\n// Finnish\nconst LANG_FI: Localization = {\n text_init: \"Aktivoidaan...\",\n\n text_ready: \"En ole robotti\",\n button_start: \"Aloita vahvistus klikkaamalla\",\n\n text_fetching: \"Haetaan tietoja\",\n\n text_solving: \"Tarkistaa, että olet ihminen...\",\n text_completed: \"Olen ihminen\",\n text_completed_sr: \"Automaattinen roskapostin tarkistus suoritettu\",\n\n text_expired: \"Vahvistusta ei voitu suorittaa loppuun\",\n button_restart: \"Uudelleenkäynnistys\",\n\n text_error: \"Vahvistus epäonnistui\",\n button_retry: \"Yritä uudelleen\",\n text_fetch_error: \"Yhteys epäonnistui\",\n};\n\n// Latvian\nconst LANG_LV: Localization = {\n text_init: \"Notiek inicializēšana...\",\n\n text_ready: \"Verifikācija, ka neesat robots\",\n button_start: \"Noklikšķiniet, lai sāktu verifikāciju\",\n\n text_fetching: \"Notiek drošības uzdevuma izgūšana\",\n\n text_solving: \"Notiek pārbaude, vai esat cilvēks...\",\n text_completed: \"Es esmu cilvēks\",\n text_completed_sr: \"Automātiska surogātpasta pārbaude pabeigta\",\n\n text_expired: \"Verifikācijas, ka neesat robots, derīgums beidzies\",\n button_restart: \"Restartēt\",\n\n text_error: \"Verifikācija neizdevās\",\n button_retry: \"Mēģināt vēlreiz\",\n text_fetch_error: \"Neizdevās izveidot savienojumu ar\",\n};\n\n// Lithuanian\nconst LANG_LT: Localization = {\n text_init: \"Inicijuojama...\",\n\n text_ready: \"Patikrinimas, ar nesate robotas\",\n button_start: \"Spustelėkite patikrinimui pradėti\",\n\n text_fetching: \"Gavimo iššūkis\",\n\n text_solving: \"Tikrinama, ar esate žmogus...\",\n text_completed: \"Esu žmogus\",\n text_completed_sr: \"Automatinė patikra dėl pašto šiukšlių atlikta\",\n\n text_expired: \"Patikrinimas, ar nesate robotas, baigė galioti\",\n button_restart: \"Pradėti iš naujo\",\n\n text_error: \"Patikrinimas nepavyko\",\n button_retry: \"Kartoti\",\n text_fetch_error: \"Nepavyko prisijungti prie\",\n};\n\n// Polish\nconst LANG_PL: Localization = {\n text_init: \"Inicjowanie...\",\n\n text_ready: \"Weryfikacja antybotowa\",\n button_start: \"Kliknij, aby rozpocząć weryfikację\",\n\n text_fetching: \"Pobieranie\",\n\n text_solving: \"Weryfikacja, czy nie jesteś robotem...\",\n text_completed: \"Nie jestem robotem\",\n text_completed_sr: \"Zakończono automatyczne sprawdzanie spamu\",\n\n text_expired: \"Weryfikacja antybotowa wygasła\",\n button_restart: \"Uruchom ponownie\",\n\n text_error: \"Weryfikacja nie powiodła się\",\n button_retry: \"Spróbuj ponownie\",\n text_fetch_error: \"Nie udało się połączyć z\",\n};\n\n// Estonian\nconst LANG_ET: Localization = {\n text_init: \"Initsialiseerimine...\",\n\n text_ready: \"Robotivastane kinnitus\",\n button_start: \"Kinnitamisega alustamiseks klõpsake\",\n\n text_fetching: \"Väljakutse toomine\",\n\n text_solving: \"Kinnitatakse, et sa oled inimene...\",\n text_completed: \"Ma olen inimene\",\n text_completed_sr: \"Automaatne rämpsposti kontroll on lõpetatud\",\n\n text_expired: \"Robotivastane kinnitus aegus\",\n button_restart: \"Taaskäivita\",\n\n text_error: \"Kinnitamine nurjus\",\n button_retry: \"Proovi uuesti\",\n text_fetch_error: \"Ühenduse loomine nurjus\",\n};\n\n// Croatian\nconst LANG_HR: Localization = {\n text_init: \"Početno postavljanje...\",\n\n text_ready: \"Provjera protiv robota\",\n button_start: \"Kliknite za početak provjere\",\n\n text_fetching: \"Dohvaćanje izazova\",\n\n text_solving: \"Provjeravamo jeste li čovjek...\",\n text_completed: \"Nisam robot\",\n text_completed_sr: \"Automatska provjera je završena\",\n\n text_expired: \"Vrijeme za provjeru protiv robota je isteklo\",\n button_restart: \"Osvježi\",\n\n text_error: \"Provjera nije uspjlela\",\n button_retry: \" Ponovo pokreni\",\n text_fetch_error: \"Nije moguće uspostaviti vezu\",\n};\n\n// Serbian\nconst LANG_SR: Localization = {\n text_init: \"Pokretanje...\",\n\n text_ready: \"Anti-Robot Verifikacija\",\n button_start: \"Kliknite da biste započeli verifikaciju\",\n\n text_fetching: \"Učitavanje izazova\",\n\n text_solving: \"Verifikacija da ste čovek...\",\n text_completed: \"Ja sam čovek\",\n text_completed_sr: \"Automatska provera neželjene pošte je završena\",\n\n text_expired: \"Anti-Robot verifikacija je istekla\",\n button_restart: \"Ponovo pokrenuti\",\n\n text_error: \"Verifikacija nije uspela\",\n button_retry: \"Pokušajte ponovo\",\n text_fetch_error: \"Neuspelo povezivanje sa...\",\n};\n\n// Slovenian\nconst LANG_SL: Localization = {\n text_init: \"Inicializiranje...\",\n\n text_ready: \"Preverjanje robotov\",\n button_start: \"Kliknite za začetek preverjanja\",\n\n text_fetching: \"Prenašanje izziva\",\n\n text_solving: \"Preverjamo, ali ste človek\",\n text_completed: \"Nisem robot\",\n text_completed_sr: \"Avtomatsko preverjanje je zaključeno\",\n\n text_expired: \"Preverjanje robotov je poteklo\",\n button_restart: \"Osveži\",\n\n text_error: \"Preverjanje ni uspelo\",\n button_retry: \"Poskusi ponovno\",\n text_fetch_error: \"Povezave ni bilo mogoče vzpostaviti\",\n};\n\n// Hungarian\nconst LANG_HU: Localization = {\n text_init: \"Inicializálás...\",\n\n text_ready: \"Robotellenes ellenőrzés\",\n button_start: \"Kattintson az ellenőrzés megkezdéséhez\",\n\n text_fetching: \"Feladvány lekérése\",\n\n text_solving: \"Annak igazolása, hogy Ön nem robot...\",\n text_completed: \"Nem vagyok robot\",\n text_completed_sr: \"Automatikus spam ellenőrzés befejeződött\",\n\n text_expired: \"Robotellenes ellenőrzés lejárt\",\n button_restart: \"Újraindítás\",\n\n text_error: \"Az ellenőrzés nem sikerült\",\n button_retry: \"Próbálja újra\",\n text_fetch_error: \"Nem sikerült csatlakozni\",\n};\n\n// Romanian\nconst LANG_RO: Localization = {\n text_init: \"Se inițializează...\",\n\n text_ready: \"Verificare anti-robot\",\n button_start: \"Click pentru a începe verificarea\",\n\n text_fetching: \"Downloading\",\n\n text_solving: \"Verificare că ești om...\",\n text_completed: \"Sunt om\",\n text_completed_sr: \"Verificarea automată a spam-ului a fost finalizată\",\n\n text_expired: \"Verificarea anti-robot a expirat\",\n button_restart: \"Restart\",\n\n text_error: \"Verificare eșuată\",\n button_retry: \"Reîncearcă\",\n text_fetch_error: \"Nu s-a putut conecta\",\n};\n\n// Chinese\nconst LANG_ZH: Localization = {\n text_init: \"初始化中……\",\n\n text_ready: \"人机验证\",\n button_start: \"点击开始\",\n\n text_fetching: \"正在加载\",\n\n text_solving: \"人机校验中……\",\n text_completed: \"我不是机器人\",\n text_completed_sr: \"人机验证完成\",\n\n text_expired: \"验证已过期\",\n button_restart: \"重新开始\",\n\n text_error: \"校验失败\",\n button_retry: \"重试\",\n text_fetch_error: \"无法连接到\",\n};\n\n// Traditional Chinese\nconst LANG_ZH_TW: Localization = {\n text_init: \"正在初始化……\",\n\n text_ready: \"反機器人驗證\",\n button_start: \"點擊開始驗證\",\n\n text_fetching: \"載入中\",\n\n text_solving: \"反機器人驗證中……\",\n text_completed: \"我不是機器人\",\n text_completed_sr: \"驗證完成\",\n\n text_expired: \"驗證超時\",\n button_restart: \"重新開始\",\n\n text_error: \"驗證失敗\",\n button_retry: \"重試\",\n text_fetch_error: \"無法連線到\",\n};\n\n// Vietnamese\nconst LANG_VI: Localization = {\n text_init: \"Đang khởi tạo...\",\n\n text_ready: \"Xác minh chống Robot\",\n button_start: \"Bấm vào đây để xác minh\",\n\n text_fetching: \"Tìm nạp và xử lý thử thách\",\n\n text_solving: \"Xác minh bạn là người...\",\n text_completed: \"Bạn là con người\",\n text_completed_sr: \"Xác minh hoàn tất\",\n\n text_expired: \"Xác minh đã hết hạn\",\n button_restart: \"Khởi động lại\",\n\n text_error: \"Xác minh thất bại\",\n button_retry: \"Thử lại\",\n text_fetch_error: \"Không kết nối được\",\n};\n\n// Hebrew\nconst LANG_HE: Localization = {\n text_init: \"בביצוע...\",\n\n text_ready: \"אימות אנוש\",\n button_start: \"צריך ללחוץ להתחלת האימות\",\n\n text_fetching: \"אתגר המענה בהכנה\",\n\n text_solving: \"מתבצע אימות אנוש...\",\n text_completed: \"אני לא רובוט\",\n text_completed_sr: \"בדיקת הספאם האוטומטית הסתיימה\",\n\n text_expired: \"פג תוקף אימות האנוש\",\n button_restart: \"להתחיל שוב\",\n\n text_error: \"אימות האנוש נכשל\",\n button_retry: \"לנסות שוב\",\n text_fetch_error: \"נכשל החיבור אל\",\n\n rtl: true,\n};\n\n// Thai\nconst LANG_TH: Localization = {\n text_init: \"การเริ่มต้น...\",\n\n text_ready: \" การตรวจสอบต่อต้านหุ่นยนต์\",\n button_start: \"คลิกเพื่อเริ่มการตรวจสอบ\",\n\n text_fetching: \"การดึงความท้าทาย\",\n\n text_solving: \"ยืนยันว่าคุณเป็นมนุษย์...\",\n text_completed: \"ฉันเป็นมนุษย์\",\n text_completed_sr: \"การตรวจสอบสแปมอัตโนมัติเสร็จสมบูรณ์\",\n\n text_expired: \"การตรวจสอบ ต่อต้านหุ่นยนต์ หมดอายุ\",\n button_restart: \"รีสตาร์ท\",\n\n text_error: \"การยืนยันล้มเหลว\",\n button_retry: \"ลองใหม่\",\n text_fetch_error: \"ไม่สามารถเชื่อมต่อได้\"\n};\n\n\nexport const localizations = {\n en: LANG_EN,\n de: LANG_DE,\n nl: LANG_NL,\n fr: LANG_FR,\n it: LANG_IT,\n pt: LANG_PT,\n es: LANG_ES,\n ca: LANG_CA,\n ja: LANG_JA,\n da: LANG_DA,\n ru: LANG_RU,\n sv: LANG_SV,\n tr: LANG_TR,\n el: LANG_EL,\n uk: LANG_UK,\n bg: LANG_BG,\n cs: LANG_CS,\n sk: LANG_SK,\n no: LANG_NO,\n fi: LANG_FI,\n lv: LANG_LV,\n lt: LANG_LT,\n pl: LANG_PL,\n et: LANG_ET,\n hr: LANG_HR,\n sr: LANG_SR,\n sl: LANG_SL,\n hu: LANG_HU,\n ro: LANG_RO,\n zh: LANG_ZH,\n zh_tw: LANG_ZH_TW,\n vi: LANG_VI,\n he: LANG_HE,\n th: LANG_TH,\n\n // alternative language codes\n nb: LANG_NO,\n};\n","export function createDiagnosticsBuffer(solverID, timeToSolved) {\n const arr = new Uint8Array(3);\n const view = new DataView(arr.buffer);\n view.setUint8(0, solverID);\n view.setUint16(1, timeToSolved);\n return arr;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGlhZ25vc3RpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFFBQWUsRUFBRSxZQUFvQjtJQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFaEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpYWdub3N0aWNzQnVmZmVyKHNvbHZlcklEOiAxIHwgMiwgdGltZVRvU29sdmVkOiBudW1iZXIpIHtcbiAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyLmJ1ZmZlcik7XG4gIHZpZXcuc2V0VWludDgoMCwgc29sdmVySUQpO1xuICB2aWV3LnNldFVpbnQxNigxLCB0aW1lVG9Tb2x2ZWQpO1xuXG4gIHJldHVybiBhcnI7XG59XG4iXX0=","import { Puzzle } from \"./puzzle\";\nimport { getPuzzleSolverInputs } from \"friendly-pow/puzzle\";\nimport { createDiagnosticsBuffer } from \"friendly-pow/diagnostics\";\nimport { DoneMessage, ProgressMessage, MessageFromWorker, SolverMessage, StartMessage } from \"./types\";\n// @ts-ignore\nimport workerString from \"../dist/worker.min.js\";\n\n// Defensive init to make it easier to integrate with Gatsby and friends.\nlet URL: any;\nif (typeof window !== \"undefined\") {\n URL = window.URL || window.webkitURL;\n}\n\nexport class WorkerGroup {\n private workers: Worker[] = [];\n\n private puzzleNumber = 0;\n\n private numPuzzles = 0;\n private threshold = 0;\n private startTime = 0;\n private progress = 0;\n private totalHashes = 0;\n private puzzleSolverInputs: Uint8Array[] = [];\n // The index of the next puzzle\n private puzzleIndex = 0;\n private solutionBuffer: Uint8Array = new Uint8Array(0);\n // initialize some value, so ts is happy\n private solverType: 1 | 2 = 1;\n\n private readyCount = 0;\n private startCount = 0;\n\n public progressCallback: (p: ProgressMessage) => any = () => 0;\n public readyCallback: () => any = () => 0;\n public startedCallback: () => any = () => 0;\n public doneCallback: (d: DoneMessage) => any = () => 0;\n public errorCallback: (e: any) => any = () => 0;\n\n public init() {\n this.terminateWorkers();\n\n this.progress = 0;\n this.totalHashes = 0;\n\n this.readyCount = 0;\n this.startCount = 0;\n\n // Setup four workers for now - later we could calculate this depending on the device\n this.workers = new Array(4);\n const workerBlob = new Blob([workerString] as any, { type: \"text/javascript\" });\n\n for (let i = 0; i < this.workers.length; i++) {\n this.workers[i] = new Worker(URL.createObjectURL(workerBlob));\n this.workers[i].onerror = (e: ErrorEvent) => this.errorCallback(e);\n\n this.workers[i].onmessage = (e: any) => {\n const data: MessageFromWorker = e.data;\n if (!data) return;\n if (data.type === \"ready\") {\n this.readyCount++;\n this.solverType = data.solver;\n // We are ready, when all workers are ready\n if (this.readyCount == this.workers.length) {\n this.readyCallback();\n }\n } else if (data.type === \"started\") {\n this.startCount++;\n // We started, when the first worker starts working\n if (this.startCount == 1) {\n this.startTime = Date.now();\n this.startedCallback();\n }\n } else if (data.type === \"done\") {\n if (data.puzzleNumber !== this.puzzleNumber) return; // solution belongs to a previous puzzle\n\n if (this.puzzleIndex < this.puzzleSolverInputs.length) {\n this.workers[i].postMessage({\n type: \"start\",\n puzzleSolverInput: this.puzzleSolverInputs[this.puzzleIndex],\n threshold: this.threshold,\n puzzleIndex: this.puzzleIndex,\n puzzleNumber: this.puzzleNumber,\n } as StartMessage);\n this.puzzleIndex++;\n }\n\n this.progress++;\n this.totalHashes += data.h;\n\n this.progressCallback({\n n: this.numPuzzles,\n h: this.totalHashes,\n t: (Date.now() - this.startTime) / 1000,\n i: this.progress,\n });\n\n this.solutionBuffer.set(data.solution, data.puzzleIndex * 8);\n // We are done, when all puzzles have been solved\n if (this.progress == this.numPuzzles) {\n const totalTime = (Date.now() - this.startTime) / 1000;\n this.doneCallback({\n solution: this.solutionBuffer,\n h: this.totalHashes,\n t: totalTime,\n diagnostics: createDiagnosticsBuffer(this.solverType, totalTime),\n solver: this.solverType,\n });\n }\n } else if (data.type === \"error\") {\n this.errorCallback(data);\n }\n };\n }\n }\n\n public setupSolver(forceJS = false) {\n const msg: SolverMessage = { type: \"solver\", forceJS: forceJS };\n for (let i = 0; i < this.workers.length; i++) {\n this.workers[i].postMessage(msg);\n }\n }\n\n start(puzzle: Puzzle) {\n this.puzzleSolverInputs = getPuzzleSolverInputs(puzzle.buffer, puzzle.n);\n this.solutionBuffer = new Uint8Array(8 * puzzle.n);\n this.numPuzzles = puzzle.n;\n this.threshold = puzzle.threshold;\n this.puzzleIndex = 0;\n this.puzzleNumber++;\n\n for (let i = 0; i < this.workers.length; i++) {\n if (this.puzzleIndex === this.puzzleSolverInputs.length) break;\n\n this.workers[i].postMessage({\n type: \"start\",\n puzzleSolverInput: this.puzzleSolverInputs[i],\n threshold: this.threshold,\n puzzleIndex: this.puzzleIndex,\n puzzleNumber: this.puzzleNumber,\n } as StartMessage);\n this.puzzleIndex++;\n }\n }\n\n public terminateWorkers() {\n if (this.workers.length == 0) return;\n for (let i = 0; i < this.workers.length; i++) {\n this.workers[i].terminate();\n }\n this.workers = [];\n }\n}\n","import { encode } from \"friendly-pow/base64\";\nimport {\n getRunningHTML,\n getReadyHTML,\n getDoneHTML,\n updateProgressBar,\n findParentFormElement,\n executeOnceOnFocusInEvent,\n getErrorHTML,\n getFetchingHTML,\n injectStyle,\n getExpiredHTML,\n} from \"./dom\";\nimport { isHeadless } from \"./headless\";\nimport { DoneMessage } from \"./types\";\nimport { Puzzle, decodeBase64Puzzle, getPuzzle } from \"./puzzle\";\nimport { Localization, localizations } from \"./localization\";\nimport { WorkerGroup } from \"./workergroup\";\n\nconst PUZZLE_ENDPOINT_URL = \"https://api.friendlycaptcha.com/api/v1/puzzle\";\n\nexport interface WidgetInstanceOptions {\n /**\n * Don't set this to true unless you want to see what the experience is like for people using very old browsers.\n * This does not increase security.\n */\n forceJSFallback: boolean;\n skipStyleInjection: boolean;\n startMode: \"auto\" | \"focus\" | \"none\";\n puzzleEndpoint: string;\n language: keyof typeof localizations | Localization;\n solutionFieldName: string;\n\n sitekey: string;\n\n readyCallback: () => any;\n startedCallback: () => any;\n doneCallback: (solution: string) => any;\n errorCallback: (error: any) => any;\n}\n\nexport class WidgetInstance {\n private puzzle?: Puzzle;\n\n private workerGroup: WorkerGroup = new WorkerGroup();\n\n /**\n * The root element of this widget instance.\n * Warning: it is undefined after `destroy()` has been called.\n */\n private e!: HTMLElement & { friendlyChallengeWidget?: WidgetInstance };\n\n /**\n * The captcha has been succesfully solved.\n */\n public valid = false;\n private opts: WidgetInstanceOptions;\n\n /**\n * Some errors may cause a need for the (worker) to be reinitialized. If this is\n * true `init` will be called again when start is called.\n */\n private needsReInit = false;\n\n /**\n * Start() has been called at least once ever.\n */\n private hasBeenStarted = false;\n\n private hasBeenDestroyed = false;\n\n private lang!: Localization;\n\n private expiryTimeout: ReturnType | undefined;\n\n constructor(element: HTMLElement, options: Partial = {}) {\n this.opts = Object.assign(\n {\n forceJSFallback: false,\n skipStyleInjection: false,\n startMode: \"focus\",\n puzzleEndpoint: element.dataset[\"puzzleEndpoint\"] || PUZZLE_ENDPOINT_URL,\n startedCallback: () => 0,\n readyCallback: () => 0,\n doneCallback: () => 0,\n errorCallback: () => 0,\n sitekey: element.dataset[\"sitekey\"] || \"\",\n language: element.dataset[\"lang\"] || \"en\",\n solutionFieldName: element.dataset[\"solutionFieldName\"] || \"frc-captcha-solution\",\n },\n options\n );\n this.e = element;\n this.e.friendlyChallengeWidget = this;\n\n this.loadLanguage();\n // @ts-ignore Ignore is required as TS thinks that `this.lang` is not assigned yet, but it happens in `this.loadLanguage()` above.\n element.innerText = this.lang.text_init;\n if (!this.opts.skipStyleInjection) {\n injectStyle();\n }\n this.init(this.opts.startMode === \"auto\" || this.e.dataset[\"start\"] === \"auto\");\n }\n\n public init(forceStart?: boolean) {\n if (this.hasBeenDestroyed) {\n console.error(\"FriendlyCaptcha widget has been destroyed using destroy(), it can not be used anymore.\");\n return;\n }\n this.initWorkerGroup();\n\n if (forceStart) {\n this.start();\n } else if (\n this.e.dataset[\"start\"] !== \"none\" &&\n (this.opts.startMode === \"focus\" || this.e.dataset[\"start\"] === \"focus\")\n ) {\n const form = findParentFormElement(this.e);\n if (form) {\n executeOnceOnFocusInEvent(form, () => this.start());\n } else {\n console.log(\"FriendlyCaptcha div seems not to be contained in a form, autostart will not work\");\n }\n }\n }\n\n /**\n * Loads the configured language, or a language passed to this function.\n * Note that only the next update will be in the new language, consider calling `reset()` after switching languages.\n */\n public loadLanguage(lang?: keyof typeof localizations | Localization) {\n if (lang !== undefined) {\n this.opts.language = lang;\n } else if (this.e.dataset[\"lang\"]) {\n this.opts.language = this.e.dataset[\"lang\"] as keyof typeof localizations;\n }\n\n if (typeof this.opts.language === \"string\") {\n let l = (localizations as any)[this.opts.language.toLowerCase()];\n if (l === undefined) {\n console.error('FriendlyCaptcha: language \"' + this.opts.language + '\" not found.');\n // Fall back to English\n l = localizations.en;\n }\n this.lang = l;\n } else {\n // We assign to a copy of the English language localization, so that any missing values will be English\n this.lang = Object.assign(Object.assign({}, localizations.en), this.opts.language);\n }\n }\n\n /**\n * Add a listener to the button that calls `this.start` on click.\n */\n private makeButtonStart() {\n const b = this.e.querySelector(\"button\");\n if (b) {\n b.addEventListener(\"click\", (e) => this.start(), { once: true, passive: true });\n b.addEventListener(\"touchstart\", (e) => this.start(), { once: true, passive: true });\n }\n }\n\n private onWorkerError(e: any) {\n this.hasBeenStarted = false;\n this.needsReInit = true;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n console.error(\"[FRC]\", e);\n this.e.innerHTML = getErrorHTML(this.opts.solutionFieldName, this.lang, \"Background worker error \" + e.message);\n this.makeButtonStart();\n\n // Just out of precaution\n this.opts.forceJSFallback = true;\n }\n\n private initWorkerGroup() {\n this.workerGroup.progressCallback = (progress) => {\n updateProgressBar(this.e, progress);\n };\n this.workerGroup.readyCallback = () => {\n this.e.innerHTML = getReadyHTML(this.opts.solutionFieldName, this.lang);\n this.makeButtonStart();\n this.opts.readyCallback();\n };\n this.workerGroup.startedCallback = () => {\n this.e.innerHTML = getRunningHTML(this.opts.solutionFieldName, this.lang);\n this.opts.startedCallback();\n };\n this.workerGroup.doneCallback = (data) => {\n const solutionPayload = this.handleDone(data);\n this.opts.doneCallback(solutionPayload);\n const callback = this.e.dataset[\"callback\"];\n if (callback) {\n (window as any)[callback](solutionPayload);\n }\n };\n this.workerGroup.errorCallback = (e) => {\n this.onWorkerError(e);\n };\n\n this.workerGroup.init();\n this.workerGroup.setupSolver(this.opts.forceJSFallback);\n }\n\n private expire() {\n this.hasBeenStarted = false;\n // Node.isConnected will be undefined in older browsers\n if (this.e.isConnected !== false) {\n this.e.innerHTML = getExpiredHTML(this.opts.solutionFieldName, this.lang);\n this.makeButtonStart();\n }\n }\n\n public async start() {\n if (this.hasBeenDestroyed) {\n console.error(\"Can not start FriendlyCaptcha widget which has been destroyed\");\n return;\n }\n\n if (this.hasBeenStarted) {\n console.warn(\"Can not start FriendlyCaptcha widget which has already been started\");\n return;\n }\n\n const sitekey = this.opts.sitekey || this.e.dataset[\"sitekey\"];\n if (!sitekey) {\n console.error(\"FriendlyCaptcha: sitekey not set on frc-captcha element\");\n this.e.innerHTML = getErrorHTML(\n this.opts.solutionFieldName,\n this.lang,\n \"Website problem: sitekey not set\",\n false\n );\n return;\n }\n\n if (isHeadless()) {\n this.e.innerHTML = getErrorHTML(\n this.opts.solutionFieldName,\n this.lang,\n \"Browser check failed, try a different browser\",\n false,\n true\n );\n return;\n }\n\n if (this.needsReInit) {\n this.needsReInit = false;\n this.init(true);\n return;\n }\n\n this.hasBeenStarted = true;\n\n try {\n this.e.innerHTML = getFetchingHTML(this.opts.solutionFieldName, this.lang);\n this.puzzle = decodeBase64Puzzle(await getPuzzle(this.opts.puzzleEndpoint, sitekey, this.lang));\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n this.expiryTimeout = setTimeout(() => this.expire(), this.puzzle.expiry - 30000); // 30s grace\n } catch (e: any) {\n console.error(\"[FRC]\", e);\n this.hasBeenStarted = false;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n this.e.innerHTML = getErrorHTML(this.opts.solutionFieldName, this.lang, e.message);\n this.makeButtonStart();\n const code = \"error_getting_puzzle\";\n\n this.opts.errorCallback({ code, description: e.toString(), error: e });\n const callback = this.e.dataset[\"callback-error\"];\n if (callback) {\n (window as any)[callback](this);\n }\n return;\n }\n\n this.workerGroup.start(this.puzzle);\n }\n\n /**\n * This is to be called when the puzzle has been succesfully completed.\n * Here the hidden field gets updated with the solution.\n * @param data message from the webworker\n */\n private handleDone(data: DoneMessage) {\n this.valid = true;\n const puzzleSolutionMessage = `${this.puzzle!.signature}.${this.puzzle!.base64}.${encode(data.solution)}.${encode(\n data.diagnostics\n )}`;\n this.e.innerHTML = getDoneHTML(this.opts.solutionFieldName, this.lang, puzzleSolutionMessage, data);\n // this.worker = null; // This literally crashes very old browsers..\n this.needsReInit = true;\n\n return puzzleSolutionMessage;\n }\n\n /**\n * Cleans up the widget entirely, removing any DOM elements and terminating any background workers.\n * After it is destroyed it can no longer be used for any purpose.\n */\n public destroy() {\n this.workerGroup.terminateWorkers();\n this.needsReInit = false;\n this.hasBeenStarted = false;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n if (this.e) {\n this.e.remove();\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n delete this.e;\n }\n this.hasBeenDestroyed = true;\n }\n\n /**\n * Resets the widget to the initial state.\n * This is useful in situations where the page does not refresh when you submit and the form may be re-submitted again\n */\n public reset() {\n if (this.hasBeenDestroyed) {\n console.error(\"FriendlyCaptcha widget has been destroyed, it can not be used anymore\");\n return;\n }\n\n this.workerGroup.terminateWorkers();\n this.needsReInit = false;\n this.hasBeenStarted = false;\n if (this.expiryTimeout) clearTimeout(this.expiryTimeout);\n this.init(this.opts.startMode === \"auto\" || this.e.dataset[\"start\"] === \"auto\");\n }\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/view/frontend/web/js/vendor/friendly-challenge/custom-localization.html b/view/frontend/web/js/vendor/friendly-challenge/custom-localization.html deleted file mode 100644 index 64a441d..0000000 --- a/view/frontend/web/js/vendor/friendly-challenge/custom-localization.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - FriendlyCaptcha - -
- - - - - - - - - diff --git a/view/frontend/web/js/vendor/friendly-challenge/friendly-captcha.d.ts b/view/frontend/web/js/vendor/friendly-challenge/friendly-captcha.d.ts deleted file mode 100644 index 43f148c..0000000 --- a/view/frontend/web/js/vendor/friendly-challenge/friendly-captcha.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -interface Localization { - text_init: string; - text_ready: string; - button_start: string; - text_fetching: string; - text_solving: string; - text_completed: string; - text_expired: string; - button_restart: string; - text_error: string; - button_retry: string; -} - -interface WidgetInstanceOptions { - forceJSFallback: boolean; - startMode: "auto" | "focus" | "none"; - puzzleEndpoint: string; - language: "en" | "de" | "nl" | "fr" | "it" | Localization; - solutionFieldName: "frc-captcha-solution"; - sitekey: string; - readyCallback: () => any; - startedCallback: () => any; - doneCallback: (solution: string) => any; - errorCallback: (error: any) => any; -} -declare class WidgetInstance { - private worker; - private puzzle?; - /** - * The root element of this widget instance. - * Warning: it is undefined after `destroy()` has been called. - */ - private e; - /** - * The captcha has been succesfully solved. - */ - valid: boolean; - private opts; - /** - * Some errors may cause a need for the (worker) to be reinitialized. If this is - * true `init` will be called again when start is called. - */ - private needsReInit; - /** - * Start() has been called at least once ever. - */ - private hasBeenStarted; - private hasBeenDestroyed; - private lang; - constructor(element: HTMLElement, options?: Partial); - init(forceStart?: boolean): void; - /** - * Compile the WASM and send the compiled module to the webworker. - * If WASM support is not present, it tells the webworker to initialize the JS solver instead. - */ - private setupSolver; - /** - * Add a listener to the button that calls `this.start` on click. - */ - private makeButtonStart; - private onWorkerError; - private initWorker; - private expire; - start(): Promise; - /** - * This is to be called when the puzzle has been succesfully completed. - * Here the hidden field gets updated with the solution. - * @param data message from the webworker - */ - private handleDone; - /** - * Cleans up the widget entirely, removing any DOM elements and terminating any background workers. - * After it is destroyed it can no longer be used for any purpose. - */ - destroy(): void; - /** - * Resets the widget to the initial state. - * This is useful in situations where the page does not refresh when you submit and the form may be re-submitted again - */ - reset(): void; -} - -export { WidgetInstance }; diff --git a/view/frontend/web/js/vendor/friendly-challenge/friendly-challenge.d.ts b/view/frontend/web/js/vendor/friendly-challenge/friendly-challenge.d.ts index 36ba924..343156f 100644 --- a/view/frontend/web/js/vendor/friendly-challenge/friendly-challenge.d.ts +++ b/view/frontend/web/js/vendor/friendly-challenge/friendly-challenge.d.ts @@ -11,6 +11,7 @@ interface Localization { text_error: string; button_retry: string; text_fetch_error: string; + rtl?: boolean; } declare const localizations: { en: Localization; @@ -43,8 +44,10 @@ declare const localizations: { hu: Localization; ro: Localization; zh: Localization; - zh_TW: Localization; + zh_tw: Localization; vi: Localization; + he: Localization; + th: Localization; nb: Localization; }; @@ -92,6 +95,11 @@ declare class WidgetInstance { private expiryTimeout; constructor(element: HTMLElement, options?: Partial); init(forceStart?: boolean): void; + /** + * Loads the configured language, or a language passed to this function. + * Note that only the next update will be in the new language, consider calling `reset()` after switching languages. + */ + loadLanguage(lang?: keyof typeof localizations | Localization): void; /** * Add a listener to the button that calls `this.start` on click. */ diff --git a/view/frontend/web/js/vendor/friendly-challenge/index.html b/view/frontend/web/js/vendor/friendly-challenge/index.html index 0833337..4c1e553 100644 --- a/view/frontend/web/js/vendor/friendly-challenge/index.html +++ b/view/frontend/web/js/vendor/friendly-challenge/index.html @@ -8,6 +8,16 @@ + + @@ -16,11 +26,15 @@

Localization tests

+

This one has an invalid data-lang, it should fall back to English.

Custom field name

+

No hidden form field

+
+

Invalid sitekey

@@ -46,6 +60,7 @@

With fallback endpoint

+