{"version":3,"file":"grokkoli/static/js/build/common.js","mappings":"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","sources":["webpack:///./js/src/monitors/base.ts","webpack:///./js/src/question/answer/getPerformance.ts","webpack:///./js/src/question/request/request.ts","webpack:///./js/src/question/tools/addGrid.ts","webpack:///./js/src/question/tools/alignElementToElement.ts","webpack:///./js/src/question/tools/getAnswerInput.ts","webpack:///./js/src/question/tools/getElements.ts","webpack:///./js/src/question/tools/joinObjects.ts","webpack:///./js/src/question/tools/math.ts","webpack:///./js/src/question/tools/passwordCheck.tsx","webpack:///./js/src/question/tools/pulse.ts","webpack:///./js/src/question/tools/time.ts","webpack:///./js/src/review/tools.tsx","webpack:///./js/src/session_summary/hideTile.tsx","webpack:///./js/src/session_summary/learnerName.tsx","webpack:///./js/src/session_summary/learningModeTitles.ts","webpack:///./js/src/session_summary/makeDiv.ts","webpack:///./js/src/session_summary/makeTitleLabelDiv.ts","webpack:///./js/src/session_summary/showTile.tsx","webpack:///./js/src/snapshots/verbose.tsx","webpack:///./js/src/snapshots/snapshots.tsx","webpack:///./js/src/snapshots/summary.tsx","webpack:///./js/src/tools/browser_id.ts","webpack:///./js/src/tools/filters.tsx","webpack:///./js/src/tools/inlineSpeech.ts","webpack:///./js/src/tools/misc.tsx","webpack:///./js/src/tools/pointerType.ts","webpack:///./js/src/tools/speech_token.ts"],"sourcesContent":["import request from '../question/request/request';\n/**\n * Base class for all monitors.\n * Monitors detect specific user behaviors and report them to the server.\n */\nvar Monitor = /** @class */ (function () {\n    function Monitor(monitorName, minTripInterval) {\n        if (minTripInterval === void 0) { minTripInterval = 0; }\n        this.lastTripTime = 0;\n        this.monitorName = monitorName;\n        this.minTripInterval = minTripInterval;\n        this.start();\n    }\n    /**\n     * Called when the monitor trips (detects the behavior it's monitoring for).\n     * Sends data to the server endpoint.\n     * Only trips if enough time has passed since the last trip.\n     * @param stats - Statistics about the trip event\n     */\n    Monitor.prototype.trip = function (stats) {\n        var _this = this;\n        var now = Date.now();\n        // Check if enough time has passed since last trip\n        if (now - this.lastTripTime < this.minTripInterval) {\n            return; // Skip this trip\n        }\n        this.lastTripTime = now;\n        var message = \"Monitor tripped: \".concat(this.monitorName, \", \").concat(JSON.stringify(stats));\n        if (window._grokkoli_silent_log) {\n            {\n                window._grokkoli_silent_log(message);\n            }\n        }\n        else {\n            {\n                // eslint-disable-next-line no-console\n                console.log(message);\n            }\n        }\n        if (!window._grokkoli_monitor_records) {\n            window._grokkoli_monitor_records = [];\n        }\n        stats['time'] = performance.now();\n        window._grokkoli_monitor_records.push({\n            name: this.monitorName,\n            data: stats,\n        });\n        request('POST', 'monitor/', {\n            name: this.monitorName,\n            data: stats,\n        }, function (response) {\n            if (response.status !== 'ok') {\n                // eslint-disable-next-line no-console\n                console.error(\"Failed to record \".concat(_this.monitorName, \" trip:\"), response);\n            }\n        });\n    };\n    return Monitor;\n}());\nexport default Monitor;\n","// ---------------------------------------------------------------------------\n// Lightweight production memory-leak signals\n//\n// These metrics are sent with every answer submission to help detect memory\n// leaks and performance degradation over long sessions.\n//\n// - domNodes: total DOM element count at submit time. Steady growth across\n//   questions indicates leaked DOM elements.\n// - longTasks: count and total duration (ms) of main-thread tasks exceeding\n//   50ms (the browser's jank threshold — at 60fps each frame is ~16ms, so\n//   a 50ms task blocks at least 3 frames). Increasing frequency over a\n//   session suggests growing GC pressure from leaked objects.\n// - questionsSinceLoad: how many questions deep into the session. Lets us\n//   correlate the other metrics against session depth.\n// ---------------------------------------------------------------------------\nvar longTaskCount = 0;\nvar longTaskTotalDuration = 0;\nvar questionsSinceLoad = 1;\nvar lastTeardownMs = 0;\nvar lastBringupMs = 0;\nvar baselineUsedJSHeapSize = null;\nvar baselineTeardownHeapSize = null;\nvar postTeardownHeapSize = null;\nfunction toKB(bytes) {\n    return Math.round(bytes / 1024);\n}\nfunction getUsedHeap() {\n    // @ts-expect-error TS2339\n    var memory = performance.memory;\n    if (memory != null && memory.usedJSHeapSize != null) {\n        return memory.usedJSHeapSize;\n    }\n    return null;\n}\nexport function incrementQuestionsSinceLoad() {\n    questionsSinceLoad += 1;\n}\nexport function setTeardownTime(ms) {\n    lastTeardownMs = ms;\n    var heap = getUsedHeap();\n    if (heap != null) {\n        if (baselineTeardownHeapSize === null) {\n            baselineTeardownHeapSize = heap;\n        }\n        postTeardownHeapSize = heap;\n    }\n}\nexport function setBringupTime(ms) {\n    lastBringupMs = ms;\n}\nif (typeof PerformanceObserver !== 'undefined') {\n    try {\n        var obs = new PerformanceObserver(function (list) {\n            for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {\n                var entry = _a[_i];\n                longTaskCount += 1;\n                longTaskTotalDuration += entry.duration;\n            }\n        });\n        obs.observe({ type: 'longtask', buffered: true });\n    }\n    catch (_e) {\n        // Browser doesn't support longtask entries — metrics stay at 0.\n    }\n}\nexport function getMemoryMetrics() {\n    // @ts-expect-error TS2339\n    var memory = performance.memory;\n    var out = {\n        jsHeapSizeLimit_KB: null,\n        totalJSHeapSize_KB: null,\n        usedJSHeapSize_KB: null,\n        heapDelta_KB: null,\n        teardownHeapDelta_KB: null,\n        teardownHeapBaseline_KB: baselineTeardownHeapSize != null ? toKB(baselineTeardownHeapSize) : null,\n        questionsSinceLoad: questionsSinceLoad,\n    };\n    if (memory != null) {\n        if (memory.jsHeapSizeLimit != null)\n            out.jsHeapSizeLimit_KB = toKB(memory.jsHeapSizeLimit);\n        if (memory.totalJSHeapSize != null)\n            out.totalJSHeapSize_KB = toKB(memory.totalJSHeapSize);\n        if (memory.usedJSHeapSize != null) {\n            out.usedJSHeapSize_KB = toKB(memory.usedJSHeapSize);\n            if (baselineUsedJSHeapSize != null) {\n                out.heapDelta_KB = toKB(memory.usedJSHeapSize - baselineUsedJSHeapSize);\n            }\n        }\n        if (postTeardownHeapSize != null && baselineTeardownHeapSize != null) {\n            out.teardownHeapDelta_KB = toKB(postTeardownHeapSize - baselineTeardownHeapSize);\n        }\n    }\n    return out;\n}\nexport default function getPerformance() {\n    var memoryKeys = [\n        ['jsHeapSizeLimit', 'jsHeapSizeLimit_KB'],\n        ['totalJSHeapSize', 'totalJSHeapSize_KB'],\n        ['usedJSHeapSize', 'usedJSHeapSize_KB'],\n    ];\n    var out = {};\n    var timeOrigin = null;\n    if (performance.timeOrigin != null) {\n        out.timeOrigin = performance.timeOrigin;\n        timeOrigin = performance.timeOrigin;\n    }\n    function getTime(time, origin) {\n        if (origin != null && time > origin) {\n            return Math.floor(time - origin);\n        }\n        return time;\n    }\n    // @ts-expect-error TS2339\n    var memory = performance.memory;\n    if (memory != null) {\n        out.memory = {};\n        for (var i = 0; i < memoryKeys.length; i += 1) {\n            var _a = memoryKeys[i], apiKey = _a[0], outKey = _a[1];\n            if (memory[apiKey] != null) {\n                out.memory[outKey] = toKB(memory[apiKey]);\n            }\n        }\n        var currentUsed = memory.usedJSHeapSize;\n        if (currentUsed != null) {\n            if (baselineUsedJSHeapSize === null) {\n                baselineUsedJSHeapSize = currentUsed;\n            }\n            out.heapDelta_KB = toKB(currentUsed - baselineUsedJSHeapSize);\n            if (postTeardownHeapSize != null && baselineTeardownHeapSize != null) {\n                out.teardownHeapDelta_KB = toKB(postTeardownHeapSize - baselineTeardownHeapSize);\n            }\n        }\n    }\n    out.send = new Date().getTime();\n    if (performance.timeOrigin != null) {\n        out.timeOrigin = performance.timeOrigin;\n        if (typeof (figure) !== 'undefined') {\n            if (figure.loadTime != null) {\n                out.answer_start = figure.loadTime + out.timeOrigin;\n            }\n        }\n    }\n    if (window.__load_1 != null) {\n        out.load_1 = getTime(window.__load_1, timeOrigin);\n    }\n    if (window.__load_2 != null) {\n        out.load_2 = getTime(window.__load_2, timeOrigin);\n    }\n    if (window.__load_3 != null) {\n        out.load_3 = getTime(window.__load_3, timeOrigin);\n    }\n    if (window.__load_pre_figure != null) {\n        out.load_pre_figure = getTime(window.__load_pre_figure, timeOrigin);\n    }\n    if (window.__figure_ready != null) {\n        out.figure_ready = getTime(window.__figure_ready, timeOrigin);\n    }\n    // Production memory-leak signals\n    out.domNodes = document.getElementsByTagName('*').length;\n    out.longTasks = { count: longTaskCount, totalDuration: Math.round(longTaskTotalDuration) };\n    out.questionsSinceLoad = questionsSinceLoad;\n    out.teardownMs = lastTeardownMs;\n    out.bringupMs = lastBringupMs;\n    return out;\n}\n","var __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nimport { getMemoryMetrics } from '../answer/getPerformance';\nimport { getSceneZoomTelemetry } from '../tools/sceneZoomTelemetry';\nimport getBrowserId from '../../tools/browser_id';\nimport { getPointerType } from '../../tools/pointerType';\nimport { withSpeechToken } from '../../tools/speech_token';\nimport { stampInlineSpeechResponse } from '../../tools/inlineSpeech';\nfunction processJSONResponse(response, requestID, url) {\n    var contentType = response.headers.get('content-type');\n    if (contentType && contentType.includes('application/json')) {\n        if (window._grokkoli_silent_log) {\n            window._grokkoli_silent_log(\"JSON OK (ID: \".concat(requestID, \")\"), url);\n        }\n        else {\n            // // eslint-disable-next-line no-console\n            // console.log(`JSON OK (ID: ${requestID})`, url);\n        }\n        return response.json().then(stampInlineSpeechResponse);\n    }\n    else {\n        var headers_1 = [];\n        response.headers.forEach(function (value, name) {\n            headers_1.push(\"\".concat(name, \": \").concat(value));\n        });\n        // eslint-disable-next-line no-console\n        console.info(\"Response (ID: \".concat(requestID, \"):\"), \"  Type: \".concat(response.type), \"  Url: \".concat(response.url), \"  Redirected: \".concat(response.redirected), \"  Status: \".concat(response.status), \"  Ok: \".concat(response.ok), \"  StatusText: \".concat(response.statusText), 'Headers:', headers_1);\n        if (response.statusText.startsWith('Internal Server Error')) {\n            throw new Error('G Internal Server Error');\n        }\n        throw new Error('Response is not JSON');\n    }\n    if (window._grokkoli_silent_log) {\n        window._grokkoli_silent_log(\"JSON OK (ID: \".concat(requestID, \")\"), url);\n    }\n    else {\n        // // eslint-disable-next-line no-console\n        // console.log(`JSON OK (ID: ${requestID})`, url);\n    }\n    return response.json();\n}\nfunction createConnectionTimeoutDiv() {\n    var exists = document.getElementById('connection_timeout_overlay');\n    if (exists) {\n        return;\n    }\n    // Create main overlay div\n    var overlayDiv = document.createElement('div');\n    overlayDiv.id = 'connection_timeout_overlay';\n    overlayDiv.style.position = 'fixed';\n    overlayDiv.style.top = '0';\n    overlayDiv.style.left = '0';\n    overlayDiv.style.width = '100%';\n    overlayDiv.style.height = '100%';\n    overlayDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n    overlayDiv.style.display = 'flex';\n    overlayDiv.style.flexDirection = 'column';\n    overlayDiv.style.justifyContent = 'center';\n    overlayDiv.style.alignItems = 'center';\n    overlayDiv.style.zIndex = '9999';\n    overlayDiv.style.opacity = '0';\n    overlayDiv.style.transition = 'opacity 0.5s ease-in-out';\n    // Create message div\n    var messageDiv = document.createElement('div');\n    messageDiv.textContent = 'Connection timed out';\n    messageDiv.style.color = '#FFF';\n    messageDiv.style.fontSize = '2em';\n    messageDiv.style.fontWeight = 'bold';\n    messageDiv.style.margin = '0 0 20px 0';\n    // Create reload button\n    var reloadButton = document.createElement('button');\n    reloadButton.textContent = 'Reload';\n    reloadButton.style.backgroundColor = '#3498db';\n    reloadButton.style.color = '#FFF';\n    reloadButton.style.padding = '10px 20px';\n    reloadButton.style.fontSize = '1.2em';\n    reloadButton.style.fontWeight = 'bold';\n    reloadButton.style.border = 'none';\n    reloadButton.style.borderRadius = '5px';\n    reloadButton.style.cursor = 'pointer';\n    reloadButton.style.boxShadow = '0 4px 6px rgba(0, 0, 0, 0.1)';\n    reloadButton.style.transition = 'background-color 0.3s ease';\n    // Add hover effect\n    reloadButton.addEventListener('mouseover', function () {\n        reloadButton.style.backgroundColor = '#2980b9';\n    });\n    reloadButton.addEventListener('mouseout', function () {\n        reloadButton.style.backgroundColor = '#3498db';\n    });\n    // Add click event to reload the page\n    reloadButton.addEventListener('click', function () {\n        window.location.reload();\n    });\n    // Assemble the overlay\n    overlayDiv.appendChild(messageDiv);\n    overlayDiv.appendChild(reloadButton);\n    document.body.appendChild(overlayDiv);\n}\nfunction showConnectionTimeoutScreen() {\n    // Create the timeout div if it doesn't exist yet\n    createConnectionTimeoutDiv();\n    hideLoadingScreen();\n    // Get the overlay div and fade it in\n    var overlayDiv = document.getElementById('connection_timeout_overlay');\n    if (overlayDiv) {\n        // Force a reflow to ensure the transition works properly\n        overlayDiv.offsetHeight;\n        overlayDiv.style.opacity = '1';\n    }\n}\nfunction hideConnectionTimeoutScreen() {\n    // Get the overlay div\n    var overlayDiv = document.getElementById('connection_timeout_overlay');\n    if (!overlayDiv)\n        return;\n    // Fade it out\n    overlayDiv.style.opacity = '0';\n    // Remove it from the DOM after the transition completes\n    setTimeout(function () {\n        if (overlayDiv.parentNode) {\n            overlayDiv.parentNode.removeChild(overlayDiv);\n        }\n    }, 500); // Match the transition duration (0.5s)\n}\nfunction createLoadingDiv() {\n    var exists = document.getElementById('general_connection_loading');\n    if (exists) {\n        return;\n    }\n    // Create main loading overlay div\n    var loadingDiv = document.createElement('div');\n    loadingDiv.id = 'general_connection_loading';\n    loadingDiv.style.position = 'fixed';\n    loadingDiv.style.top = '0';\n    loadingDiv.style.left = '0';\n    loadingDiv.style.width = '100%';\n    loadingDiv.style.height = '100%';\n    loadingDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';\n    loadingDiv.style.display = 'flex';\n    loadingDiv.style.flexDirection = 'column';\n    loadingDiv.style.justifyContent = 'center';\n    loadingDiv.style.alignItems = 'center';\n    loadingDiv.style.zIndex = '9999';\n    loadingDiv.style.opacity = '0';\n    loadingDiv.style.transition = 'opacity 0.5s ease-in-out';\n    // Create message div\n    var messageDiv = document.createElement('div');\n    messageDiv.textContent = 'Connecting...';\n    messageDiv.style.color = '#FFF';\n    messageDiv.style.fontSize = '2em';\n    messageDiv.style.fontWeight = 'bold';\n    messageDiv.style.margin = '0 0 10px 0';\n    messageDiv.style.userSelect = 'none';\n    // Create spinner div\n    var spinner = document.createElement('div');\n    spinner.className = 'loading-spinner';\n    spinner.style.border = '4px solid #f3f3f3';\n    spinner.style.borderTop = '4px solid rgb(66, 67, 67)';\n    spinner.style.borderRadius = '50%';\n    spinner.style.width = '40px';\n    spinner.style.height = '40px';\n    spinner.style.animation = 'spin 2s linear infinite';\n    // Add keyframes for spinner animation (reuse existing if present)\n    if (!document.getElementById('loading-spinner-style')) {\n        var styleSheet = document.createElement('style');\n        styleSheet.id = 'loading-spinner-style';\n        styleSheet.textContent = \"\\n      @keyframes spin {\\n        0% { transform: rotate(0deg); }\\n        100% { transform: rotate(360deg); }\\n      }\\n    \";\n        document.head.appendChild(styleSheet);\n    }\n    // Assemble the loading div with message first, then spinner\n    loadingDiv.appendChild(messageDiv);\n    loadingDiv.appendChild(spinner);\n    document.body.appendChild(loadingDiv);\n}\nfunction showLoadingScreen() {\n    // Create the loading div if it doesn't exist yet\n    createLoadingDiv();\n    // Get the loading div and fade it in\n    var loadingDiv = document.getElementById('general_connection_loading');\n    if (loadingDiv) {\n        // Force a reflow to ensure the transition works properly\n        loadingDiv.offsetHeight;\n        loadingDiv.style.opacity = '1';\n    }\n}\nfunction hideLoadingScreen() {\n    // Get the loading div\n    var loadingDiv = document.getElementById('general_connection_loading');\n    if (!loadingDiv)\n        return;\n    // Fade it out\n    loadingDiv.style.opacity = '0';\n    // Remove it from the DOM after the transition completes\n    setTimeout(function () {\n        if (loadingDiv.parentNode) {\n            loadingDiv.parentNode.removeChild(loadingDiv);\n        }\n    }, 500); // Match the transition duration (0.5s)\n}\n// eslint-disable-next-line\n// eslint-disable-next-line\nfunction request(type, endPoint, data, \n// eslint-disable-next-line @typescript-eslint/ban-types\ncallback, isRetry, disable, noReloadOn400) {\n    if (isRetry === void 0) { isRetry = 0; }\n    if (disable === void 0) { disable = false; }\n    if (noReloadOn400 === void 0) { noReloadOn400 = false; }\n    var url = \"\".concat(window.location.origin, \"/\").concat(endPoint\n        .replace(/\\/$/, '')\n        .replace(/^\\//, ''), \"/\");\n    var requestID = performance.now();\n    // Response guides must use the same resolved settings as speech_urls, even\n    // when processing an answer advances to a different question/engine.\n    if (type === 'POST' && ['answer', 'alpha/decision', 'alpha/action', 'goto_slide'].includes(endPoint.replace(/^\\//, '').replace(/\\/$/, ''))) {\n        data = withSpeechToken(__assign({}, data));\n    }\n    // Calculate retry delay based on attempt number\n    var getRetryDelay = function (retryCount) {\n        return retryCount < 5 ? 100 : 1000; // 100ms for first 5, then 1000ms\n    };\n    if (endPoint != 'js_error_report') {\n        if (window._grokkoli_silent_log) {\n            window._grokkoli_silent_log(\"Request (ID: \".concat(requestID, \")\"), url, data);\n        }\n        else {\n            // // eslint-disable-next-line no-console\n            // console.log(`Request (ID: ${requestID})`, url, data)\n        }\n    }\n    if (type === 'POST') {\n        var csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;\n        fetch(url, {\n            method: 'POST',\n            body: JSON.stringify(data),\n            headers: { 'X-CSRFToken': csrftoken, 'X-Browser-Id': getBrowserId(), 'X-Pointer': getPointerType() },\n        })\n            .then(function (response) {\n            if (response.redirected) {\n                if (response.url.endsWith(\"/offline/\") && isRetry < 20) {\n                    var delay = getRetryDelay(isRetry);\n                    if (window._grokkoli_silent_log) {\n                        window._grokkoli_silent_log(\"Offline detected (ID: \".concat(requestID, \"), retry \").concat(isRetry + 1, \"/20 in \").concat(delay, \"ms\"), url);\n                    }\n                    // Retry with appropriate delay based on retry count\n                    setTimeout(function () {\n                        request(type, endPoint, data, callback, isRetry + 1, disable, noReloadOn400);\n                    }, delay);\n                    if (disable) {\n                        for (var i = 0; i < window.figureOneFigures.length; i++) {\n                            var f = window.figureOneFigures[i];\n                            f.elements.hasTouchableElements = false;\n                        }\n                    }\n                    return { retry: isRetry + 1 };\n                }\n                window.location.href = response.url;\n                return {};\n            }\n            if (response.status === 400) {\n                if (noReloadOn400) {\n                    return response.json();\n                }\n                setTimeout(function () {\n                    window.location.reload();\n                }, 200);\n                return {};\n            }\n            return processJSONResponse(response, requestID, url);\n        })\n            .catch(function (err) {\n            // eslint-disable-next-line no-console\n            console.info(\"Fetch POST error (ID: \".concat(requestID, \"):\"), err.message, 'Error name:', err.name, 'Stack trace:', err.stack);\n            // Add retry logic for connection failures\n            if (isRetry < 20 && err.message !== 'G Internal Server Error') {\n                var delay = getRetryDelay(isRetry);\n                if (window._grokkoli_silent_log) {\n                    window._grokkoli_silent_log(\"Connection failed (ID: \".concat(requestID, \"), retry \").concat(isRetry + 1, \"/20 in \").concat(delay, \"ms\"), url);\n                }\n                // Retry with appropriate delay based on retry count\n                setTimeout(function () {\n                    request(type, endPoint, data, callback, isRetry + 1, disable, noReloadOn400);\n                }, delay);\n                if (disable) {\n                    for (var i = 0; i < window.figureOneFigures.length; i++) {\n                        var f = window.figureOneFigures[i];\n                        f.elements.hasTouchableElements = false;\n                    }\n                }\n                return { retry: isRetry + 1 };\n            }\n            // logError will post a isRetry of 1000 - we don't want to retry it\n            if (isRetry != 1000 && err.message !== 'G Internal Server Error') {\n                showConnectionTimeoutScreen();\n            }\n        })\n            .then(function (response) {\n            if (response != null && response.retry != null && response.retry >= 10) {\n                showLoadingScreen();\n                return;\n            }\n            else {\n                hideLoadingScreen();\n            }\n            if (response != null && response.retry == null) {\n                if (disable) {\n                    for (var i = 0; i < window.figureOneFigures.length; i++) {\n                        var f = window.figureOneFigures[i];\n                        f.elements.hasTouchableElements = true;\n                    }\n                }\n            }\n            if (response != null && response.retry == null) {\n                callback(response);\n            }\n        });\n    }\n    else {\n        fetch(url, {\n            method: 'GET',\n            headers: { 'X-Browser-Id': getBrowserId() },\n        })\n            .then(function (response) {\n            return processJSONResponse(response, requestID, url);\n            // return response.json()\n        })\n            .catch(function (err) {\n            // eslint-disable-next-line no-console\n            console.info(\"Fetch GET error (ID: \".concat(requestID, \"):\"), err.message, 'Error name:', err.name, 'Stack trace:', err.stack);\n            // Add retry logic for connection failures\n            if (isRetry < 20 && err.message !== 'G Internal Server Error') {\n                var delay = getRetryDelay(isRetry);\n                if (window._grokkoli_silent_log) {\n                    window._grokkoli_silent_log(\"Connection failed (ID: \".concat(requestID, \"), retry \").concat(isRetry + 1, \"/20 in \").concat(delay, \"ms\"), url);\n                }\n                // Retry with appropriate delay based on retry count\n                setTimeout(function () {\n                    request(type, endPoint, data, callback, isRetry + 1);\n                }, delay);\n                return { retry: isRetry + 1 };\n            }\n            // logError will post a isRetry of 1000 - we don't want to retry it\n            if (isRetry != 1000 && err.message !== 'G Internal Server Error') {\n                showConnectionTimeoutScreen();\n            }\n        })\n            .then(function (response) {\n            if (response != null && response.retry != null && response.retry >= 10) {\n                showLoadingScreen();\n                return;\n            }\n            else {\n                hideLoadingScreen();\n            }\n            if (response != null && response.retry == null) {\n                callback(response);\n            }\n        });\n    }\n}\nfunction processConsole(console_log) {\n    var out = '';\n    for (var i = 0; i < console_log.length; i++) {\n        var log = console_log[i];\n        var time = log[0];\n        var method = log[1];\n        var callPoint = log[2];\n        var args = JSON.stringify(log.slice(3), null, 2);\n        out += \">>\".concat(time, \" \").concat(method, \" \").concat(callPoint, \"\\n \").concat(args, \"\\n\\n\");\n    }\n    return out;\n}\nfunction doFullPageReload() {\n    if (window.figureOneFigures && window.figureOneFigures.length > 0) {\n        var f = window.figureOneFigures[0];\n        if (f.custom.reload) {\n            f.custom.reload();\n        }\n    }\n    window.location.reload();\n}\nfunction postJSError(err, at, data) {\n    var _a;\n    if (at === void 0) { at = ''; }\n    if (data === void 0) { data = null; }\n    // Set below if the figure is hidden while this report is in flight.\n    var hidden = false;\n    request('POST', 'js_error_report', {\n        error: JSON.stringify(err, Object.getOwnPropertyNames(err)),\n        uid: window._guid,\n        data: data,\n        at: at,\n        load_1: window.__load_1,\n        question_id: window.grokkoli_question_id,\n        client_time: new Date().toISOString().replace('T', ' ').replace('Z', '').slice(0, -1),\n        load_start_time: window.__load_1 != null ? window.__load_1 : null,\n        // @ts-expect-error TS2339\n        console: processConsole(window._grokkoli_log ? window._grokkoli_log : []),\n        browser_focused: typeof document.hasFocus === 'function' ? document.hasFocus() : null,\n        webgl_contexts: window.grokkoliWebGLContextTracker\n            ? {\n                figures: window.grokkoliWebGLContextTracker.figures,\n                events: window.grokkoliWebGLContextTracker.events,\n            }\n            : null,\n        canvas_info: (function () {\n            try {\n                var canvases = document.querySelectorAll('canvas');\n                var canvasSizes_1 = [];\n                canvases.forEach(function (c) {\n                    canvasSizes_1.push(\"\".concat(c.width, \"x\").concat(c.height));\n                });\n                var atlasIDs = [];\n                if (window.figureOneFigures) {\n                    for (var _i = 0, _a = window.figureOneFigures; _i < _a.length; _i++) {\n                        var f = _a[_i];\n                        var fig = f;\n                        var webgl = fig.webglLow || fig.webgl;\n                        if (webgl && webgl.atlases) {\n                            atlasIDs.push.apply(atlasIDs, Object.keys(webgl.atlases));\n                        }\n                    }\n                }\n                return {\n                    dom_canvases: canvases.length,\n                    canvas_sizes: canvasSizes_1,\n                    atlas_count: atlasIDs.length,\n                    atlas_ids: atlasIDs,\n                };\n            }\n            catch (_b) {\n                return null;\n            }\n        })(),\n        memory_metrics: getMemoryMetrics(),\n        zoom: getSceneZoomTelemetry(),\n        gpu_device: window.__grokkoliGPUDeviceInfo || null,\n    }, function (response) {\n        // eslint-disable-next-line no-console\n        console.log(\"js_error_report response\", response);\n        if (response != null && response.reload) {\n            setTimeout(doFullPageReload, 1);\n        }\n        else if (hidden) {\n            // The server kept the learner on this question (e.g. a pre-guide or\n            // speech report it treats as telemetry), so the question has to be\n            // visible again - otherwise the learner is left on a blank screen\n            // with no way forward but a manual reload.\n            var container = document.getElementById('figureOneContainer');\n            if (container)\n                container.style.visibility = '';\n        }\n    }, 1000);\n    // While the report is in flight, hide the figure for errors that may have\n    // left the question broken, so the learner can't keep interacting with it\n    // before the server decides whether to reload. Errors the client has\n    // already recovered from (`err.recovered`) never hide it.\n    if (window._grokkoli_catch_js_errors\n        && window._grokkoli_in_honing !== true\n        && err.recovered !== true) {\n        var msg = String((_a = err.msg) !== null && _a !== void 0 ? _a : '');\n        var where = String(at !== null && at !== void 0 ? at : '');\n        if (!msg.includes('calculating intersect1')\n            && !where.includes('Speech decode')\n            && !where.includes('Speech stall')\n            && !where.includes('fetch hung')) {\n            var container = document.getElementById('figureOneContainer');\n            if (container) {\n                container.style.visibility = 'hidden';\n                hidden = true;\n            }\n        }\n    }\n}\nfunction addToCodeTrace(err, at, data, line, numStackLines, codeLines) {\n    if (line === void 0) { line = 1; }\n    if (numStackLines === void 0) { numStackLines = 1; }\n    if (codeLines === void 0) { codeLines = 10; }\n    // If already shown max lines, then post the error\n    if (line > numStackLines) {\n        return postJSError(err, at, data);\n    }\n    // Get the stack trace\n    var stackTrace = err.stack;\n    if (stackTrace) {\n        var stackLines = stackTrace.split('\\n');\n        // If the stack trace isn't long enough, then post the error\n        if (stackLines.length <= line) {\n            return postJSError(err, at, data);\n        }\n        var stackLine = stackLines[line]; // Get the second line of the stack trace\n        var match = stackLine.match(/(https?:\\/\\/.*):(\\d+):(\\d+)/);\n        if (match) {\n            var url_1 = match[1];\n            var lineNumber_1 = parseInt(match[2], 10);\n            var charNumber_1 = parseInt(match[3], 10);\n            fetch(url_1)\n                // eslint-disable-next-line arrow-parens\n                .then(function (response) { return response.text(); })\n                .then(function (sourceCode) {\n                var preCodeLines = [];\n                var codeLine = '';\n                var postCodeLines = [];\n                var lines = sourceCode.split('\\n');\n                if (lineNumber_1 === 1 && charNumber_1 > 200) {\n                    preCodeLines = [\n                        lines[0].slice(charNumber_1 - 200, charNumber_1 - 1),\n                        '\\n',\n                    ];\n                    codeLine = lines[0].slice(charNumber_1 - 1, charNumber_1 + 200);\n                    postCodeLines = [\n                        '\\n',\n                        lines[0].slice(charNumber_1 + 200, charNumber_1 + 400),\n                    ];\n                }\n                else {\n                    preCodeLines = lines.slice(Math.max(0, lineNumber_1 - codeLines), lineNumber_1 - 1);\n                    codeLine = lines[lineNumber_1 - 1];\n                    postCodeLines = lines.slice(Math.min(lines.length - 1, lineNumber_1), Math.min(lines.length, lineNumber_1 + codeLines));\n                }\n                if (err.code == null) {\n                    err.code = '';\n                }\n                err.code += \"\\n\\n\".concat(url_1, \":\").concat(lineNumber_1, \":\").concat(charNumber_1);\n                err.code +=\n                    '\\n  ' +\n                        preCodeLines.join('\\n   ') +\n                        '\\n>> ' +\n                        codeLine +\n                        '\\n   ' +\n                        postCodeLines.join('\\n  ');\n                return addToCodeTrace(err, at, data, line + 1, numStackLines, codeLines);\n            })\n                .catch(function (error) {\n                // console.log(error)\n                err.code = \"Error fetching source file?: \".concat(url_1, \" (actual: \").concat(error, \")\");\n                return postJSError(err, at, data);\n            });\n        }\n        else {\n            // err.code = `Error parsing stack trace line: ${stackLine} Trace: ${stackTrace}`;\n            err.code += '\\n   ' + '\\n** ' + stackLine + '\\n   ';\n            return addToCodeTrace(err, at, data, line + 1, numStackLines, codeLines);\n            // return postJSError(err, at, data);\n        }\n    }\n    else {\n        return postJSError(err, at, data);\n    }\n}\nfunction logError(err, at, data) {\n    if (at === void 0) { at = ''; }\n    if (data === void 0) { data = null; }\n    if (window._grokkoli_direct_console_log) {\n        window._grokkoli_direct_console_log('JS Error caught', at, data, err);\n    }\n    if (err.timestamp == null) {\n        err.timestamp = performance.now();\n    }\n    var stackTrace = err.stack;\n    var startLine = 1;\n    if (stackTrace) {\n        var stackLines = stackTrace.split('\\n');\n        if (stackLines[0].match(/(https?:\\/\\/.*):(\\d+):(\\d+)/)) {\n            startLine = 0;\n        }\n    }\n    addToCodeTrace(err, at, data, startLine, 20, 10);\n}\nexport default request;\nexport { logError, showLoadingScreen, hideLoadingScreen, showConnectionTimeoutScreen, hideConnectionTimeoutScreen };\n","export default function addGrid(options, fig) {\n    if (options === void 0) { options = {}; }\n    if (fig === void 0) { fig = figure; }\n    // console.log(fig)\n    var o = Fig.joinObjects({}, {\n        name: '__grid__',\n        x: {\n            step: [0.5, 0.1],\n            start: -1.5,\n            stop: 1.5,\n        },\n        y: {\n            step: [0.5, 0.1],\n            start: -1,\n            stop: 1,\n        },\n        color: [0.8, 0.8, 0.8, 1],\n        color1: [0.8, 0.8, 0.8, 1],\n        font: {\n            size: 0.05,\n        },\n        lineWidth: 0.002,\n    }, options);\n    var grid = fig.add({\n        make: 'collections.plot',\n        styleTheme: 'numberLine',\n        position: [o.x.start, o.y.start],\n        font: o.font,\n        width: o.x.stop - o.x.start,\n        height: o.y.stop - o.y.start,\n        x: {\n            start: o.x.start,\n            stop: o.x.stop,\n            step: o.x.step,\n            grid: [\n                { width: o.lineWidth, color: o.color },\n                { width: o.lineWidth / 2, color: o.color1 },\n            ]\n        },\n        y: {\n            start: o.y.start,\n            stop: o.y.stop,\n            step: o.y.step,\n            grid: [\n                { width: o.lineWidth, color: o.color },\n                { width: o.lineWidth / 2, color: o.color1 },\n            ],\n        },\n    });\n    fig.elements.toBack(grid);\n    return grid;\n}\n","import Fig from 'figureone';\nfunction alignElementToElement(element, toElement, options) {\n    if (options === void 0) { options = {}; }\n    var o = Fig.joinObjects({}, {\n        xPosition: 'center',\n        yPosition: 'top',\n        xAlign: 'center',\n        yAlign: 'bottom',\n        offset: [0, 0],\n    }, options);\n    var xPosition = o.xPosition, yPosition = o.yPosition, xAlign = o.xAlign, yAlign = o.yAlign, offset = o.offset;\n    var rect = element.getBoundingRect('figure');\n    var toElementRect = toElement.getBoundingRect('figure');\n    var position = element.getPosition('figure');\n    var toPosition = [\n        toElementRect.left + toElementRect.width / 2,\n        toElementRect.bottom + toElementRect.height / 2,\n    ];\n    if (xPosition === 'left') {\n        toPosition[0] = toElementRect.left;\n        if (typeof offset == 'number') {\n            offset = [-offset, 0];\n        }\n    }\n    else if (xPosition === 'right') {\n        toPosition[0] = toElementRect.right;\n        if (typeof offset == 'number') {\n            offset = [offset, 0];\n        }\n    }\n    else if (xPosition === 'center') {\n        toPosition[0] = toElementRect.left + toElementRect.width / 2;\n    }\n    else if (typeof xPosition === 'number') {\n        toPosition[0] = toElementRect.left + toElementRect.width * xPosition;\n    }\n    if (yPosition === 'bottom') {\n        toPosition[1] = toElementRect.bottom;\n        if (typeof offset == 'number') {\n            offset = [0, -offset];\n        }\n    }\n    else if (yPosition === 'top') {\n        toPosition[1] = toElementRect.top;\n        if (typeof offset == 'number') {\n            offset = [0, offset];\n        }\n    }\n    else if (yPosition === 'middle') {\n        toPosition[1] = toElementRect.bottom + toElementRect.height / 2;\n    }\n    else if (typeof yPosition === 'number') {\n        toPosition[1] = toElementRect.bottom + toElementRect.height * yPosition;\n    }\n    var alignOffset = [0, 0];\n    if (xAlign === 'right') {\n        alignOffset[0] = position.x - rect.right;\n    }\n    else if (xAlign == 'left') {\n        alignOffset[0] = position.x - rect.left;\n    }\n    else if (xAlign == 'center') {\n        alignOffset[0] = position.x - (rect.left + rect.width / 2);\n    }\n    else if (typeof xAlign === 'number') {\n        alignOffset[0] = position.x - (rect.left + rect.width / 2) * xAlign;\n    }\n    if (yAlign === 'top') {\n        alignOffset[1] = position.y - rect.top;\n    }\n    else if (yAlign == 'bottom') {\n        alignOffset[1] = position.y - rect.bottom;\n    }\n    else if (yAlign == 'middle') {\n        alignOffset[1] = position.y - (rect.bottom + rect.height / 2);\n    }\n    else if (typeof yAlign === 'number') {\n        alignOffset[0] = position.y - (rect.bottom + rect.height / 2) * yAlign;\n    }\n    var figurePosition = [\n        toPosition[0] + alignOffset[0] + offset[0],\n        toPosition[1] + alignOffset[1] + offset[1],\n    ];\n    var localPosition = element.pointFromSpaceToSpace(figurePosition, 'figure', 'local');\n    element.setPosition(localPosition);\n}\nexport default alignElementToElement;\n","function getAnswerInput() {\n    var possible = [\n        'INLINE',\n        'answer_input_mc',\n        'expression.INLINE',\n        'answer_input_arrange',\n        'answer_input_selector',\n        'workPad',\n        'answer_input_manipulative',\n    ];\n    for (var i = 0; i < possible.length; i += 1) {\n        var element = figure.elements.get(possible[i]);\n        if (element != null && element.isShown) {\n            return element;\n        }\n    }\n    return null;\n}\nfunction getAnyAnswerInput() {\n    var possible = [\n        'INLINE',\n        'answer_input_mc',\n        'expression.INLINE',\n        'answer_input_arrange',\n        'answer_input_selector',\n        'answer_input_manipulative',\n    ];\n    for (var i = 0; i < possible.length; i += 1) {\n        var element = figure.elements.get(possible[i]);\n        if (element != null && element.custom._answer_input != null) {\n            return element;\n        }\n    }\n    return null;\n}\n// Re-show the answer input using the same animation the transition uses:\n// answer_input_mc fades in via opacity; others use dissolveIn.  No-op if the\n// input is already shown.  Caller is responsible for finding the input (via\n// getAnyAnswerInput) so this doesn't pick up a stale reference.\nfunction showAnswerInput(ai) {\n    if (ai.isShown)\n        return;\n    if (ai.name === 'answer_input_mc') {\n        ai.show();\n        ai.animations.new().opacity({ start: 0.001, target: 1, duration: 0.8 }).start();\n    }\n    else {\n        ai.animations.new().dissolveIn().start();\n    }\n}\nexport { getAnswerInput, getAnyAnswerInput, showAnswerInput };\n","function getElement(element) {\n    if (typeof element !== 'string') {\n        return element;\n    }\n    var elem = figure.get(element);\n    if (elem == null) {\n        elem = figure.get(\"expression.\".concat(element));\n    }\n    return elem;\n}\nfunction getElements(elements) {\n    if (!Array.isArray(elements)) {\n        // @ts-ignore\n        return getElement(elements);\n    }\n    var elems = figure.get(elements);\n    if (elems == null || elems.length < elements.length) {\n        var expression_elements = [];\n        for (var i = 0; i < elements.length; i += 1) {\n            var elem = elements[i];\n            if (typeof elem === 'string') {\n                if (!elem.startsWith('expression') && !elem.startsWith('instruction')) {\n                    expression_elements.push(\"expression.\".concat(elem));\n                }\n                else {\n                    expression_elements.push(elem);\n                }\n            }\n            else {\n                expression_elements.push(elem);\n            }\n        }\n        elems = figure.get(expression_elements);\n    }\n    return elems;\n}\nexport default getElements;\nexport { getElement };\n","var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nimport { roundNum } from './math';\nfunction duplicate(value, precision) {\n    if (precision === void 0) { precision = null; }\n    if (typeof value === 'number' && precision != null) {\n        return roundNum(value, precision);\n    }\n    if (typeof value === 'number' ||\n        typeof value === 'boolean' ||\n        typeof value === 'string' ||\n        value == null ||\n        // @ts-expect-error TS2749\n        value === NaN ||\n        typeof value === 'function') {\n        return value;\n    }\n    if (value instanceof Date) {\n        return new Date(value.getTime());\n    }\n    if (typeof value._dup === 'function') {\n        return value._dup();\n    }\n    if (Array.isArray(value)) {\n        var arrayDup_1 = [];\n        value.forEach(function (arrayElement) {\n            return arrayDup_1.push(duplicate(arrayElement, precision));\n        });\n        return arrayDup_1;\n    }\n    // if (typeof value === 'object') {\n    var objectDup = {};\n    Object.keys(value).forEach(function (key) {\n        var v = duplicate(value[key], precision);\n        objectDup[key] = v;\n    });\n    return objectDup;\n    // }\n    // return value;\n}\nfunction assignObjectFromTo(fromObject, toObject, exceptIn, duplicateValues, parentPath) {\n    if (exceptIn === void 0) { exceptIn = []; }\n    if (duplicateValues === void 0) { duplicateValues = false; }\n    if (parentPath === void 0) { parentPath = ''; }\n    var except = typeof exceptIn === 'string' ? [exceptIn] : exceptIn;\n    Object.keys(fromObject).forEach(function (key) {\n        // debugger;\n        var keyPath = parentPath !== '' ? \"\".concat(parentPath, \".\").concat(key) : key;\n        if (except.indexOf(keyPath) !== -1) {\n            return;\n        }\n        var value = fromObject[key];\n        if (typeof value === 'object' && value != null && value._assignAsLinkOnly) {\n            // eslint-disable-next-line no-param-reassign\n            toObject[key] = fromObject[key];\n            return;\n        }\n        if (typeof value === 'number' ||\n            typeof value === 'boolean' ||\n            typeof value === 'string' ||\n            value == null ||\n            typeof value === 'function' ||\n            typeof value._dup === 'function' ||\n            value instanceof Date ||\n            Array.isArray(value)) {\n            // Only assign the value if:\n            //    * Value is not undefined OR\n            //    * Value is undefined and toObject[key] is undefined\n            if (value !== undefined || toObject[key] === undefined) {\n                if (duplicateValues) {\n                    // eslint-disable-next-line no-param-reassign\n                    toObject[key] = duplicate(value);\n                }\n                else {\n                    // eslint-disable-next-line no-param-reassign\n                    toObject[key] = value;\n                }\n            }\n        }\n        else {\n            // If the fromObject[key] value is an object, but the toObject[key] value\n            // is not an object, but then make toObject[key] an empty object\n            var toValue = toObject[key];\n            if (typeof toValue === 'number' ||\n                typeof toValue === 'boolean' ||\n                typeof toValue === 'string' ||\n                toValue == null ||\n                typeof toValue === 'function' ||\n                Array.isArray(toValue)) {\n                // eslint-disable-next-line no-param-reassign\n                toObject[key] = {};\n            }\n            assignObjectFromTo(value, toObject[key], except, duplicateValues, keyPath);\n        }\n    });\n}\nfunction joinObjectsWithOptions(options) {\n    var objects = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        objects[_i - 1] = arguments[_i];\n    }\n    var except = options.except;\n    var dup = options.duplicate;\n    if (except == null) {\n        except = [];\n    }\n    if (dup == null) {\n        dup = false;\n    }\n    var num = objects.length;\n    var out = objects[0];\n    for (var i = 1; i < num; i += 1) {\n        var o = objects[i];\n        if (o != null) {\n            assignObjectFromTo(o, out, except, dup, '');\n        }\n    }\n    return out;\n}\n// joins objects like object.assign but goes as many levels deep as the object\n// is. Objects later in the arrawy overwrite objects earlier.\nfunction joinObjects() {\n    var objects = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        objects[_i] = arguments[_i];\n    }\n    return joinObjectsWithOptions.apply(void 0, __spreadArray([{}], objects, false));\n}\nfunction duplicateFromTo(fromObject, toObject, exceptKeys) {\n    if (exceptKeys === void 0) { exceptKeys = []; }\n    joinObjectsWithOptions({ except: exceptKeys, duplicate: true }, toObject, fromObject);\n}\nexport { joinObjects, duplicate, duplicateFromTo };\n","var roundNum = function (value, precision) {\n    if (precision === void 0) { precision = 5; }\n    var multiplier = Math.pow(10, precision);\n    var result = Math.round(value * multiplier) / multiplier;\n    // if (Object.is(result, -0)) {\n    // if (result === -0) {\n    //   result = 0;\n    // }\n    var objectIsPolyfill = function (x, y) {\n        if (x === y) {\n            // 0 === -0, but they are not identical\n            return x !== 0 || 1 / x === 1 / y;\n        }\n        // NaN !== NaN, but they are identical.\n        // NaNs are the only non-reflexive value, i.e., if x !== x,\n        // then x is a NaN.\n        // isNaN is broken: it converts its argument to number, so\n        // isNaN(\"foo\") => true\n        // eslint-disable-next-line no-self-compare\n        return x !== x && y !== y;\n    };\n    if (objectIsPolyfill(result, -0)) {\n        result = 0;\n    }\n    // if (result === -0) {\n    //   // 0 === -0, but they are not identical\n    //   return result !== 0 || 1 / x === 1 / y;\n    // }\n    return result;\n};\nexport { roundNum };\n","import React, { useState, useEffect, useRef } from 'react';\nimport request from '../request/request';\nfunction PasswordCheck(_a) {\n    var onClose = _a.onClose, label = _a.label, title = _a.title, url = _a.url, endpoint = _a.endpoint, callback = _a.callback;\n    var _b = useState(''), pwd = _b[0], setPwd = _b[1];\n    var _c = useState(false), submitting = _c[0], setSubmitting = _c[1];\n    var _d = useState(false), showPwd = _d[0], setShowPwd = _d[1];\n    var _e = useState(false), shake = _e[0], setShake = _e[1]; // added\n    var _f = useState(false), focused = _f[0], setFocused = _f[1];\n    var inputRef = useRef(null);\n    useEffect(function () {\n        var onKeyDown = function (e) {\n            if (e.key === 'Escape')\n                onClose();\n        };\n        window.addEventListener('keydown', onKeyDown);\n        return function () { return window.removeEventListener('keydown', onKeyDown); };\n    }, [onClose]);\n    var submit = function () {\n        if (!pwd || submitting)\n            return; // guard (fixed)\n        setSubmitting(true);\n        request('POST', url, { password: pwd, endpoint: endpoint }, function (response) {\n            setSubmitting(false);\n            if ((response === null || response === void 0 ? void 0 : response.status) === 'error' && (response === null || response === void 0 ? void 0 : response.message) === 'Password Incorrect') {\n                setShake(true);\n                requestAnimationFrame(function () { var _a; return (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });\n                return;\n            }\n            if ((response === null || response === void 0 ? void 0 : response.status) === 'authorized' && callback != null) {\n                onClose();\n                callback();\n            }\n            // handle successful response as needed\n        });\n    };\n    return (React.createElement(\"div\", { className: \"password_check__overlay\", onMouseDown: onClose },\n        React.createElement(\"div\", { className: \"password_check__overlay_panel\".concat(shake ? ' password_check__overlay_panel--shake' : ''), role: \"dialog\", \"aria-modal\": \"true\", onMouseDown: function (e) { return e.stopPropagation(); }, onAnimationEnd: function (e) {\n                if (e.animationName === 'password-shake')\n                    setShake(false);\n            } },\n            React.createElement(\"button\", { type: \"button\", className: \"password_check__overlay_close\", \"aria-label\": \"Close\", onClick: onClose }, \"\\u00D7\"),\n            React.createElement(\"div\", { className: \"password_check__overlay_title\" }, title),\n            React.createElement(\"div\", { className: \"password_check__overlay_label\" }, label),\n            React.createElement(\"div\", { className: \"password_check__overlay_input_wrapper\" },\n                React.createElement(\"input\", { ref: inputRef, type: showPwd ? 'text' : 'password', className: \"password_check__overlay_input\", placeholder: \" \", \"aria-label\": \"Account password\", autoComplete: \"current-password\", value: pwd, onChange: function (e) { return setPwd(e.target.value); }, onFocus: function () { return setFocused(true); }, onBlur: function () { return setFocused(false); }, onKeyDown: function (e) {\n                        if (e.key === 'Enter')\n                            submit();\n                    }, autoFocus: true }),\n                React.createElement(\"span\", { className: \"password_check__overlay_password_overlay\", style: { opacity: focused || pwd.length > 0 ? 0 : 1 } }, \"Password\"),\n                React.createElement(\"button\", { type: \"button\", className: \"password_check__overlay_password_toggle\", \"aria-label\": showPwd ? 'Hide password' : 'Show password', onMouseDown: function (e) { return e.preventDefault(); }, onClick: function () {\n                        setShowPwd(!showPwd);\n                        requestAnimationFrame(function () { var _a; return (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });\n                    } })),\n            React.createElement(\"button\", { type: \"button\", className: \"password_check__overlay_submit\", onClick: submit, disabled: !pwd || submitting }, submitting ? 'Submitting…' : 'Submit'))));\n}\nexport { PasswordCheck };\n","import getElements from './getElements';\nfunction pulseElement(elements, options) {\n    if (options === void 0) { options = {}; }\n    // Pulse delay\n    var delay = 0;\n    if (options.delay != null) {\n        delay = options.delay;\n    }\n    // Pulse duration\n    var duration = 1;\n    if (options.duration != null) {\n        duration = options.duration;\n    }\n    // Determine pulse type\n    var pulseType = 's';\n    if (options.type != null) {\n        pulseType = options.type;\n    }\n    if (options.type == 's') {\n        pulseType = 'scale';\n    }\n    // Determine pulse mag\n    var mag = {\n        v: 0.03,\n        h: 0.03,\n        s: 1.5,\n    }[pulseType];\n    if (options.mag != null) {\n        mag = options.mag;\n    }\n    // Determine pulse frequency\n    var frequency = {\n        v: (1 / duration) * 2.5,\n        h: (1 / duration) * 2.5,\n        s: 1 / duration,\n    }[pulseType];\n    if (options.frequency != null) {\n        frequency = options.frequency;\n    }\n    var elems = getElements(elements);\n    if (!Array.isArray(elems)) {\n        elems = [elems];\n    }\n    if (elems.length == 0) {\n        return;\n    }\n    for (var i = 0; i < elems.length; i += 1) {\n        elems[i].stop();\n        if (pulseType == 'scale' || pulseType == 's') {\n            elems[i].animations\n                .new()\n                .pulse({ delay: delay, duration: duration, scale: mag, frequency: frequency })\n                .start();\n        }\n        else if (pulseType == 'v') {\n            var p1 = elems[i].pointFromSpaceToSpace([0, 0], 'figure', 'draw');\n            var p2 = elems[i].pointFromSpaceToSpace([0, mag], 'figure', 'draw');\n            var delta = p2.y - p1.y;\n            elems[i].animations\n                .new()\n                .pulse({\n                delay: delay,\n                duration: duration,\n                translation: delta,\n                min: -delta,\n                angle: Math.PI / 2,\n                frequency: frequency,\n            })\n                .start();\n        }\n        else if (pulseType == 'h') {\n            elems[i].animations\n                .new()\n                .pulse({\n                delay: delay,\n                duration: duration,\n                translation: mag,\n                min: -mag,\n                angle: 0,\n                frequency: frequency,\n            })\n                .start();\n        }\n    }\n}\nexport default pulseElement;\n","function getDurationString(seconds) {\n    var speedFinal = seconds;\n    if (speedFinal < 1) {\n        speedFinal = \"<1\";\n        return \"1 s\";\n    }\n    if (speedFinal < 60) {\n        speedFinal = Math.round(speedFinal);\n        return \"\".concat(speedFinal, \" s\");\n    }\n    if (speedFinal >= 60 && speedFinal < 3600) {\n        speedFinal = Math.round(speedFinal / 60);\n        return \"\".concat(speedFinal, \" min\");\n    }\n    var hours = Math.floor(speedFinal / 3600);\n    var minutes = Math.floor((speedFinal % 3600) / 60);\n    return \"\".concat(hours, \" h  \").concat(minutes, \" min\");\n}\nexport { getDurationString, };\n","// type TypeSnapshotRecord = {\n//   date: string,\n//   id: number,\n//   question_record: number,\n//   question: string,\n//   math_step: string,\n//   result: string,\n//   speed: string,\n//   session_id: number;\n//   answer_time: number,\n//   expected_speed: number,\n//   lsr: number\n//   mode: string,\n//   stack_len: number\n//   profile: string,\n//   submitted_answer: string,\n//   extra: string,\n//   speech_played: number,\n//   speech_completed: number,\n//   speech_duration: number,\n//   separate_workpad: boolean,\n//   created_for: string | null,\n//   variation_id: string | null,\n//   from_pool: string | null,\n//   q_definition_id: string,\n//   q_definition_version: string,\n//   m_definition_id: string,\n//   m_definition_version: string,\n//   first_name: string,\n//   math_step_id: number,\n//   index: string,\n// }\nfunction getSnapshotId(record, wp) {\n    if (wp === void 0) { wp = false; }\n    var id = \"\".concat(record.profile__id, \"__\").concat(String(record.question_record).padStart(8, '0'));\n    // A record with no answer (a question served but never answered) gets the\n    // PROFILE__LSR form, which the snap server renders straight from the state\n    // record instead of replaying an answer into it.\n    if (record.id != null) {\n        id += \"_\".concat(String(record.id).padStart(7, '0'));\n    }\n    if (wp) {\n        id += '_wp';\n    }\n    return id;\n}\nexport { getSnapshotId, };\n","function hideTile(tile) {\n    var expand = tile.getElementsByClassName('day_summary_tile_expand')[0];\n    var hide = tile.getElementsByClassName('day_summary_tile_hide')[0];\n    expand.classList.add('tile_hide');\n    hide.classList.remove('tile_hide');\n}\nexport default hideTile;\n","import React from \"react\";\nexport var LearnerName = function (_a) {\n    var name = _a.name;\n    return React.createElement(\"h2\", null, name);\n};\n","// Drill labels, keyed by LearnerState.method_thread. The DRILL_* modes are\n// shared by every drill, so a title is (activity kind, method thread) rather\n// than one enum entry per drill - see drillModeTitle below.\nexport var drillLabels = {\n    quantity_to_symbolic: 'Seeing Quantities',\n};\nvar drillVerbs = {\n    DRILL_TRIAGE: 'Check',\n    GENERALIZE_DRILL_TRIAGE: 'Check',\n    DRILL_PRACTICE: 'Practice',\n    GENERALIZE_DRILL_PRACTICE: 'Practice',\n    DRILL_FOCUS: 'Focus on',\n    GENERALIZE_DRILL_FOCUS: 'Focus on',\n    DRILL_REINFORCING: 'Reinforce',\n    GENERALIZE_DRILL_REINFORCING: 'Reinforce',\n};\n/** Title for a drill activity, or null if `mode` is not one. */\nexport var drillModeTitle = function (mode, methodThread) {\n    var verb = drillVerbs[mode];\n    if (verb == null) {\n        return null;\n    }\n    var label = (methodThread != null && drillLabels[methodThread]) || 'Skills';\n    return \"\".concat(verb, \" \").concat(label);\n};\nexport var learningModeTitles = {\n    NONE: 'None',\n    NEW_LEARNING: 'Introduce',\n    GENERALIZING: 'Practice',\n    TROUBLESHOOTING: 'Troubleshoot',\n    REMEDIATION: 'Remediate Gap',\n    CONFIRM_CONFUSION: 'Check Gap',\n    REASK_QUESTION: 'Reask Question',\n    REMEDIATION_COMPREHENSION_1: 'Gap Comprehension 1',\n    REMEDIATION_COMPREHENSION_2: 'Gap Comprehension 2',\n    REASK_QUESTION_ANSWER_SHOWN: 'Answer Shown',\n    REINFORCING: 'Reinforce',\n    READY: 'Ready',\n    HONING_INTRO: 'Initial Assessment',\n    HONING: 'Initial Assessment',\n    HONING_SUMMARY: 'Initial Assessment',\n    TARGET_HONE: 'Target Skill Check',\n    PRACTICE: 'Practice',\n    GENERALIZE_REINFORCEMENT_CHECK: 'Reinforce',\n    QUESTION_REASKED_ANSWER_SHOWN: 'Reask Question',\n    TAKE_A_BREAK_QUESTION_ASKED: 'Take A Break?',\n    ASK_TAKE_A_BREAK_QUESTION: 'Take a Break?',\n    ACTIVITY_MATH_FACT_INTRO: 'Math Fact Reminder',\n    GENERALIZE_ACTIVITY_MATH_FACT_INTRO: 'Math Fact Reminder',\n    ACTIVITY_MATH_FACT_TRIAGE: 'Check Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_TRIAGE: 'Check Math Facts',\n    ACTIVITY_MATH_FACT_PRACTICE: 'Practice Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE: 'Practice Math Facts',\n    ACTIVITY_MATH_FACT_FOCUS: 'Math Fact Focus',\n    GENERALIZE_ACTIVITY_MATH_FACT_FOCUS: 'Math Fact Focus',\n    ACTIVITY: 'Activity',\n    GENERALIZE_ACTIVITY: 'Activity',\n    RECENT_REVIEW: 'Review',\n    ACTIVITY_MATH_FACT_PRACTICE_2: 'Practice Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE_2: 'Practice Math Facts',\n    ACTIVITY_MATH_FACT_REINFORCING_2: 'Reinforce Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_REINFORCING_2: 'Reinforce Math Facts',\n    LEARNING_POOL: 'Check Gap',\n    BLOCKED_REVIEW: 'Review',\n    QUEUED_REVIEW: 'Review',\n    DEMO_WALKTHROUGH: 'System Walkthrough',\n    PRECURSOR_CHECK: 'Precursor Skill Check',\n    // The callers index this map directly and interpolate the result into a\n    // template string, so a missing mode renders as the literal text\n    // \"undefined:\" rather than failing - which is what these entries fix.\n    //\n    // The noun is 'Skills', not the drill's own label: `method_thread` is not\n    // sent to the client, so there is nothing here to look one up with. These\n    // are `drillModeTitle(mode)` with no thread, written out - keep the verbs in\n    // step with `drillVerbs` above. Plumbing the thread through to these views\n    // is what would let them say 'Practice Seeing Quantities' instead.\n    DRILL_TRIAGE: 'Check Skills',\n    GENERALIZE_DRILL_TRIAGE: 'Check Skills',\n    DRILL_PRACTICE: 'Practice Skills',\n    GENERALIZE_DRILL_PRACTICE: 'Practice Skills',\n    DRILL_FOCUS: 'Focus on Skills',\n    GENERALIZE_DRILL_FOCUS: 'Focus on Skills',\n    DRILL_REINFORCING: 'Reinforce Skills',\n    GENERALIZE_DRILL_REINFORCING: 'Reinforce Skills',\n};\n","function makeDiv(classes, parent, text, id, label, link) {\n    if (classes === void 0) { classes = null; }\n    if (parent === void 0) { parent = null; }\n    if (text === void 0) { text = null; }\n    if (id === void 0) { id = null; }\n    if (label === void 0) { label = null; }\n    if (link === void 0) { link = null; }\n    var div = document.createElement('div');\n    if (id) {\n        div.id = id;\n    }\n    if (classes) {\n        if (typeof classes === 'string') {\n            div.classList.add(classes);\n        }\n        if (Array.isArray(classes)) {\n            for (var i = 0; i < classes.length; i += 1) {\n                div.classList.add(classes[i]);\n            }\n        }\n    }\n    if (text) {\n        var node = document.createTextNode(text);\n        div.appendChild(node);\n    }\n    if (link) {\n        var learnerStateIdLink = document.createElement('a');\n        learnerStateIdLink.setAttribute('href', link);\n        learnerStateIdLink.innerHTML = label;\n        learnerStateIdLink.classList.add('day_summary_verbose_label', 'day_summary_verbose_label_link');\n        div.appendChild(learnerStateIdLink);\n    }\n    if (parent) {\n        parent.appendChild(div);\n    }\n    return div;\n}\nexport default makeDiv;\n","import makeDiv from './makeDiv';\nfunction makeTitleLabelDiv(classes, parent, title, label, link, id) {\n    if (classes === void 0) { classes = null; }\n    if (parent === void 0) { parent = null; }\n    if (title === void 0) { title = ''; }\n    if (label === void 0) { label = ''; }\n    if (link === void 0) { link = null; }\n    if (id === void 0) { id = ''; }\n    var container = makeDiv(classes, parent, '', id);\n    makeDiv(['day_summary_verbose_title'], container, title);\n    if (link != null) {\n        var learnerStateIdLink = document.createElement('a');\n        learnerStateIdLink.setAttribute('href', link);\n        learnerStateIdLink.setAttribute('target', '_blank');\n        learnerStateIdLink.innerHTML = label;\n        learnerStateIdLink.classList.add('day_summary_verbose_label', 'day_summary_verbose_label_link');\n        container.appendChild(learnerStateIdLink);\n    }\n    else {\n        makeDiv(['day_summary_verbose_label'], container, label);\n    }\n}\nexport default makeTitleLabelDiv;\n","function showTile(tile) {\n    var expand = tile.getElementsByClassName('day_summary_tile_expand')[0];\n    var hide = tile.getElementsByClassName('day_summary_tile_hide')[0];\n    expand.classList.remove('tile_hide');\n    hide.classList.add('tile_hide');\n}\nexport default showTile;\n","var __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nimport React from 'react';\nimport { roundNum } from '../question/tools/math';\nimport { getSnapshotId, } from '../review/tools';\nimport request from '../question/request/request';\nvar ORIGIN = window.location.origin;\n// function goToSession(record: TypeSnapshotRecord) {\n//   if (record.session_link) {\n//     window.open(`${window.location.origin}/${record.session_link}`, '_blank');\n//   }\n// }\nfunction goToEndpoint(endpoint, origin) {\n    if (origin === void 0) { origin = window.location.origin; }\n    window.open(\"\".concat(origin, \"/\").concat(endpoint), '_blank');\n}\nfunction toClipBoard(text) {\n    navigator.clipboard.writeText(text);\n}\nfunction Label(_a) {\n    var label = _a.label, _b = _a.value, value = _b === void 0 ? \"\" : _b, valueClass = _a.valueClass, _c = _a.origin, origin = _c === void 0 ? ORIGIN : _c;\n    var labelElement = React.createElement(React.Fragment, null);\n    if (Array.isArray(label)) {\n        var labelLink_1 = label[1];\n        if (typeof labelLink_1 === 'string') {\n            labelElement = (React.createElement(\"div\", { className: \"snapshot_tile__label snapshot_tile__sub_label_label_link\", onClick: function () { return goToEndpoint(labelLink_1); } }, label[0]));\n        }\n        else if (typeof labelLink_1 === 'function') {\n            labelElement = (React.createElement(\"div\", { className: \"snapshot_tile__label snapshot_tile__sub_label_label_link\", onClick: labelLink_1 }, label[0]));\n        }\n    }\n    else {\n        labelElement = React.createElement(\"div\", { className: \"snapshot_tile__label\" }, label);\n    }\n    // A field with nothing in it -- the submitted answer of a question that was\n    // never answered -- arrives as null, not undefined, so the default above does\n    // not catch it. It has to be normalised before the check below, because\n    // typeof null is 'object' and Object.keys(null) throws.\n    if (value == null) {\n        value = '';\n    }\n    if (typeof value === 'object') {\n        var sub_labels_1 = [];\n        Object.keys(value).map(function (key) {\n            // @ts-expect-error TS7053\n            var v = value[key];\n            var lab = v;\n            var link = null;\n            if (Array.isArray(v)) {\n                lab = v[0], link = v[1];\n            }\n            var subLabelElement = (React.createElement(\"div\", { className: \"snapshot_tile__sub_label_label\", onClick: function () { return toClipBoard(lab); } }, lab));\n            if (link && typeof link === 'string') {\n                subLabelElement = (React.createElement(\"div\", { className: \"snapshot_tile__sub_label_label snapshot_tile__sub_label_label_link\", onClick: function () { return goToEndpoint(link, origin); } }, lab));\n            }\n            else if (link && typeof link === 'function') {\n                subLabelElement = (React.createElement(\"div\", { className: \"snapshot_tile__sub_label_label snapshot_tile__sub_label_label_link\", onClick: link }, lab));\n            }\n            sub_labels_1.push(React.createElement(\"div\", { className: \"snapshot_tile__sub_label\", key: key },\n                React.createElement(\"div\", { className: \"snapshot_tile__sub_label_title\" },\n                    key,\n                    \": \"),\n                subLabelElement));\n        });\n        return (React.createElement(\"div\", { className: \"snapshot_tile__label_container\" },\n            labelElement,\n            React.createElement(\"div\", { className: \"\".concat('snapshot_tile__label_cell', \" \").concat(valueClass) }, sub_labels_1)));\n    }\n    var lab = value;\n    var link = null;\n    if (Array.isArray(value)) {\n        lab = value[0], link = value[1];\n    }\n    var valueElement = (React.createElement(\"div\", { className: \"\".concat('snapshot_tile__label_cell snapshot_tile__label_cell_single', \" \").concat(valueClass), onClick: function () { return toClipBoard(lab); } }, value));\n    if (link) {\n        valueElement = (React.createElement(\"div\", { className: \"\".concat('snapshot_tile__label_cell snapshot_tile__label_cell_link', \" \").concat(valueClass), onClick: function () { return goToEndpoint(link); } }, lab));\n    }\n    return (React.createElement(\"div\", { className: \"snapshot_tile__label_container\" },\n        labelElement,\n        valueElement));\n}\nfunction getIds(record, options) {\n    if (options === void 0) { options = {}; }\n    var ids = React.createElement(React.Fragment, null);\n    if (options.ids) {\n        ids = (React.createElement(Label, { label: \"IDs\", valueClass: \"snapshot_tile__v_ids\", value: {\n                LSR: record.question_record,\n                ANS: record.id,\n                MS: record.question_record__math_step,\n                Q: record.question_record__question,\n            } }));\n    }\n    return ids;\n}\nfunction getModeStack(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.modeStack) {\n        elem = (React.createElement(Label, { label: \"State\", valueClass: \"snapshot_tile__v_mode_stack\", value: {\n                Mode: record.question_record__mode.name,\n                Stack: record.question_record__stack_len,\n            } }));\n    }\n    return elem;\n}\nfunction getSubmittedAnswer(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.submittedAnswer) {\n        elem = (React.createElement(Label, { label: \"Submitted\", valueClass: \"snapshot_tile__v_submitted_answer\", value: record.submitted_answer }));\n    }\n    return elem;\n}\nfunction getSpeech(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.speech) {\n        var className = 'snapshot_tile__v';\n        if (record.speech_played === 0) {\n            className = 'snapshot_tile__v snapshot_tile__dim';\n        }\n        elem = (React.createElement(Label, { label: \"Speech\", valueClass: className, value: {\n                Played: record.speech_played,\n                Completed: record.speech_completed,\n                Duration: record.speech_duration,\n            } }));\n    }\n    return elem;\n}\nfunction getGuides(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = [];\n    if (options.guides) {\n        var className = 'snapshot_trigger_id';\n        var c = void 0;\n        if (record.triggerrecord__trigger_id == null) {\n            className = 'snapshot_trigger_id snapshot_dim';\n            c = '-';\n        }\n        else {\n            c = \"\".concat(record.triggerrecord__trigger_id);\n        }\n        elem.push([React.createElement(Label, { label: \"Guide\", valueClass: className, value: c })]);\n        className = 'snapshot_trigger_helpfulness';\n        if (record.triggerrecord__trigger_id == null) {\n            className = 'snapshot_trigger_helpfulness snapshot_dim';\n            c = '-';\n        }\n        else {\n            c = \"\".concat(record.triggerrecord__helpfulness.name, \" (\").concat(record.triggerrecord__helpfulness.value, \")\");\n        }\n        elem.push([React.createElement(Label, { label: \"Helpfulness\", valueClass: className, value: c })]);\n    }\n    return elem;\n}\nfunction getResponseSpeech(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.responseSpeech) {\n        var className = 'snapshot__tile__v_response_speech';\n        var c = void 0;\n        if (record.response_speech == null) {\n            className = 'snapshot__tile__v_response_speech snapshot_dim';\n            c = '-';\n        }\n        else {\n            c = \"\".concat(record.response_speech_str);\n        }\n        elem = React.createElement(Label, { label: \"Guide Speech\", valueClass: className, value: c });\n    }\n    return elem;\n}\nfunction getScores(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = [React.createElement(React.Fragment, null)];\n    if (options.scores && record.skill_record) {\n        elem = [React.createElement(Label, { label: \"Scores\", valueClass: \"snapshot_tile__v_scores\" })];\n        for (var i = 0; i < record.skill_record.length; i++) {\n            var r = record.skill_record[i];\n            elem.push(React.createElement(Label, { label: [\"(\".concat(r.degree, \") \").concat(r.score), \"skill_timeline/?id=\".concat(record.profile__id, \"&skill=\").concat(r.skill___definition)], valueClass: \"snapshot_tile__v_mathstep_id\", value: r.skill_file_path }));\n        }\n    }\n    return elem;\n}\nfunction getMathStepPath(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.mathStepPath) {\n        elem = (React.createElement(Label, { label: \"Math step\", valueClass: \"snapshot_tile__v_math_step_path\", value: record.question_record__math_step__path }));\n    }\n    return elem;\n}\nfunction getQuestionPath(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    // record.question_path = 'question/path/is/here';\n    if (options.questionPath) {\n        elem = (React.createElement(Label, { label: \"Question\", valueClass: \"snapshot_tile__v_math_step_path\", value: record.question_record__question_file_path }));\n    }\n    return elem;\n}\nfunction getSpeed(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.speed) {\n        // A question that was never answered has no answer time; without this it\n        // reads as '0s', i.e. answered instantly.\n        var answer_time = record.answer_time == null\n            ? '-'\n            : \"\".concat(roundNum(record.answer_time / 1000, 1), \"s\");\n        var expected_speed = '';\n        if (record.expected_speed > 0) {\n            expected_speed = \" (\".concat(roundNum(record.expected_speed / 1000, 1), \"s)\");\n        }\n        var className = \"snapshot_tile__v_answer_time snapshot_tile__speed_\".concat(record.speed.name);\n        elem = (React.createElement(Label, { label: \"Speed\", valueClass: className, value: \"\".concat(answer_time).concat(expected_speed, \" \").concat(record.speed.name) }));\n    }\n    return elem;\n}\nfunction getMathStepIds(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    // record.m_definition_id = 'asdf'\n    // record.m_definition_version = 'asdf'\n    if (options.mathStepIds) {\n        elem = (React.createElement(Label, { label: \"\", valueClass: \"snapshot_tile__v_mathstep_id\", value: {\n                DEF: record.question_record__math_step___definition_id,\n                VER: record.question_record__math_step___definition_version,\n            } }));\n    }\n    return elem;\n}\nfunction getQuestionIds(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    // record.q_definition_id = 'asdf'\n    // record.q_definition_version = 'asdf'\n    if (options.questionIds) {\n        elem = (React.createElement(Label, { label: \"\", valueClass: \"snapshot_tile__v_question_id\", value: {\n                DEF: record.question_record__question__definition_id,\n                VER: record.question_record__question__definition_version,\n            } }));\n    }\n    return elem;\n}\nfunction getSessionId(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.session_id && record.question_record__session_link) {\n        elem = (React.createElement(Label, { label: \"Session\", valueClass: \"snapshot_tile__v_session_id\", value: {\n                session: record.question_record__session_id,\n            }, origin: origin }));\n    }\n    return elem;\n}\nfunction getLinks(record, options, origin) {\n    if (options === void 0) { options = {}; }\n    if (origin === void 0) { origin = ORIGIN; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.links) {\n        var values = [];\n        if (record.question_record__session_link) {\n            values.push(['Session', record.question_record__session_link_legacy]);\n        }\n        if (record.question_record__session_link) {\n            values.push(['Review', record.question_record__session_link]);\n        }\n        if (record.question_record) {\n            values.push(['Question', \"debug_learner_state_record/?\".concat(record.question_record)]);\n        }\n        if (record.question_record) {\n            // With no answer record there is nothing to replay into the question, so\n            // the snapshot is taken from the state record itself.\n            values.push(record.id != null\n                ? ['Answer', \"debug_learner_state_record_snapshot/?answer=\".concat(record.id)]\n                : ['Question shown', \"debug_learner_state_record_snapshot/?\".concat(record.question_record)]);\n        }\n        if (record.question_record) {\n            values.push(['LSR', \"debug_get_lsr/?lsr=\".concat(record.question_record)]);\n        }\n        if (record.question_record__question__definition_id) {\n            [record.question_record__question__definition_id, \"question_timeline/?question=\".concat(record.question_record__question__definition_id)];\n            values.push(['Same Questions', \"question_timeline/?question=\".concat(record.question_record__question__definition_id, \"&num=50\")]);\n            values.push(['Same Questions For ID', \"question_timeline/?question=\".concat(record.question_record__question__definition_id, \"&num=50&profile=\").concat(record.profile__id)]);\n        }\n        elem = (React.createElement(Label, { label: \"Links\", valueClass: \"snapshot_tile__v_session_id\", \n            // @ts-expect-error TS2322\n            value: values, origin: origin }));\n    }\n    return elem;\n}\nfunction getIndex(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.index) {\n        elem = (React.createElement(Label, { label: \"Index\", valueClass: \"snapshot_index\", value: \"\".concat(record.question_record__question_index, \"_\").concat(record.question_record__group_index, \"_\").concat(record.question_record__slide_index) }));\n    }\n    return elem;\n}\nfunction getProfile(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.profile) {\n        // console.log(record)\n        elem = (React.createElement(Label, { label: 'Profile', valueClass: \"snapshot_profile_id\", value: \"\".concat(record.profile__id, \" - \").concat(record.profile__first_name) }));\n    }\n    return elem;\n}\nfunction getPool(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.fromPool) {\n        var p = record.question_record__question_from_pool;\n        var className = 'snapshot_from_pool';\n        if (record.question_record__question_from_pool == null) {\n            className = 'snapshot_from_pool snapshot_dim';\n            p = '-';\n        }\n        elem = React.createElement(Label, { label: \"Pool\", valueClass: className, value: p });\n    }\n    return elem;\n}\nfunction getCreatedFor(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.createdFor) {\n        // const c = record.created_for == null ? '-' : record.created_for;\n        var className = 'snapshot_created_for';\n        var c = void 0;\n        if (record.question_record__question_created_for == null) {\n            className = 'snapshot_created_for snapshot_dim';\n            c = '-';\n        }\n        else {\n            c = \"\".concat(record.question_record__question_created_for.name);\n        }\n        elem = React.createElement(Label, { label: \"Created For\", valueClass: className, value: c });\n    }\n    return elem;\n}\nfunction getVariation(record, options) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.variation) {\n        var v = record.question_record__question_variation_id;\n        var className = 'snapshot_variation';\n        if (record.question_record__question_variation_id == null) {\n            className = 'snapshot_variation snapshot_dim';\n            v = '-';\n        }\n        elem = React.createElement(Label, { label: \"Variation\", valueClass: className, value: v });\n    }\n    return elem;\n}\nfunction getDeleteSnapshot(record, options, snapshots, setSnapshots, checkSnapshots) {\n    if (options === void 0) { options = {}; }\n    var elem = React.createElement(React.Fragment, null);\n    if (options.deleteSnapshot) {\n        var fullSnapshotId_1 = getSnapshotId(record);\n        var snapshotId = fullSnapshotId_1.split('__')[1];\n        var profileId = record.profile__id;\n        elem = React.createElement(Label, { label: \"Delete Snapshot\", valueClass: \"snapshot_delete_snapshot\", value: [[\n                    \"ENV: \".concat(record.snapshot_environment, \", LOCATION: \").concat(record.snapshot_location, \"-\").concat(profileId, \"/\").concat(snapshotId),\n                    //@ts-expect-error TS2322\n                    function () {\n                        request('POST', 'delete_snapshots/', {\n                            records: [fullSnapshotId_1],\n                            snapshot_location: record.snapshot_location,\n                            snapshot_environment: record.snapshot_environment,\n                        }, function (response) {\n                            if (response.status === 'ok') {\n                                var newSnaps = __assign({}, snapshots);\n                                newSnaps[fullSnapshotId_1] = 'toLoad';\n                                setSnapshots(newSnaps);\n                                checkSnapshots(newSnaps, record.snapshot_environment, record.snapshot_location, function (status, snaps) {\n                                    if (status === 'ok') {\n                                        setSnapshots(snaps);\n                                    }\n                                });\n                            }\n                            else {\n                                console.error('Error deleting snapshot', response);\n                            }\n                        });\n                    }\n                ]] });\n    }\n    return elem;\n}\nfunction getVerbose(record, options, origin, snapshots, setSnapshots, checkSnapshots) {\n    if (options === void 0) { options = {}; }\n    return [\n        getProfile(record, options),\n        getSpeed(record, options),\n        getSubmittedAnswer(record, options),\n        getMathStepPath(record, options),\n        getMathStepIds(record, options),\n        getQuestionPath(record, options),\n        getQuestionIds(record, options),\n        getIds(record, options),\n        getSessionId(record, options),\n        getModeStack(record, options),\n        getSpeech(record, options),\n        getIndex(record, options),\n        getPool(record, options),\n        getCreatedFor(record, options),\n        getVariation(record, options),\n        getLinks(record, options, origin),\n        getGuides(record, options),\n        getResponseSpeech(record, options),\n        getScores(record, options),\n        getDeleteSnapshot(record, options, snapshots, setSnapshots, checkSnapshots),\n    ];\n}\nexport { getVerbose, Label };\n","import React from 'react';\nimport { useState, useContext } from 'react';\nimport request from '../question/request/request';\nimport { joinObjects } from '../question/tools/joinObjects';\nimport { getDateTime, getAnswerTime, getResult, getCalculator, formatDate, MODES, SnapshotTimezone } from './summary';\nimport { getVerbose } from './verbose';\nvar QAStatus = {\n    NONE: 0,\n    PENDING: 1,\n    FIXED: 2,\n    FIXING: 3,\n    NO_FIX: 4,\n};\nvar EXTENSION = 'jpg';\n/*\n..######...########.##....##\n.##....##..##.......###...##\n.##........##.......####..##\n.##...####.######...##.##.##\n.##....##..##.......##..####\n.##....##..##.......##...###\n..######...########.##....##\n*/\n/**\n *\n * data: {\n *     'records': [\n *         PROFILE_ID__LSR,\n *         PROFILE_ID__LSR_ANSWER,\n *         PROFILE_ID__LSR_ANSWER_WP,\n *         ...\n *     ],\n *     'env': prod/test/local      # From where the records come\n *     'save_to': local/S3         # Where to save the snapshots to\n * }\n */\nfunction generateSnapshots(snapshots, environment, saveTo, callback) {\n    var toGenerate = [];\n    Object.keys(snapshots).forEach(function (id) {\n        if (snapshots[id] === 'toLoad') {\n            toGenerate.push(id);\n            snapshots[id] = 'loading';\n        }\n    });\n    if (toGenerate.length > 0) {\n        // console.log('requesting to generate', toGenerate)\n        request('POST', 'snap__generate_snapshots/', { records: toGenerate, env: environment, save_to: saveTo }, function (response) {\n            callback(response.status);\n        });\n    }\n}\n/*\n..######..##.....##.########..######..##....##\n.##....##.##.....##.##.......##....##.##...##.\n.##.......##.....##.##.......##.......##..##..\n.##.......#########.######...##.......#####...\n.##.......##.....##.##.......##.......##..##..\n.##....##.##.....##.##.......##....##.##...##.\n..######..##.....##.########..######..##....##\n*/\n/**\n * This function will\n * - Generate snapshots that are in the 'toLoad' state\n * - Check snapshots that are in a user defined state (like 'loading')\n * - Start check snapshots polling\n * - Callback with the updated snapshots state\n *\n * snapshotsToCheck\n * Send to snap__check_snapshots/\n *    data: {\n *        'records': [\n *            PROFILE_ID__LSR,\n *            PROFILE_ID__LSR_ANSWER,\n *            PROFILE_ID__LSR_ANSWER_WP,\n *            ...\n *        ],\n *        'env': prod/test/local      # From where the records come\n *        'save_to': local/S3         # Where the snapshots are saved\n *    }\n *\n * Receive from snap__check_snapshots/\n *   response: {\n *     'status': 'error'/'ok',\n *     'existing': {\n *          PROFILE__LSR: url,\n *          PROFILE__LSR_ANS: url,\n *          PROFILE__LSR_ANS_WP: url,\n *      }\n *\n * Snapshot State:\n *  'init': Not checked\n *  'initChecked': Init and checked\n *  'toLoad': To generate and check again\n *  'loading': Generated, to check again\n *  'timeout': Generated, checks always fail\n *  url: URL to get image from\n *\n */\nfunction checkSnapshots(snapshotsIn, environment, saveTo, callback, options) {\n    if (callback === void 0) { callback = function () { }; }\n    if (options === void 0) { options = {}; }\n    // console.log('environment', environment);\n    if (options.maxCount == null) {\n        var snapshotIds = Object.keys(snapshotsIn);\n        for (var i = 0; i < snapshotIds.length; i += 1) {\n            if (snapshotsIn[snapshotIds[i]] === 'loading' ||\n                snapshotsIn[snapshotIds[i]] === 'toLoad') {\n                options.maxCount = 20;\n                break;\n            }\n            if (snapshotsIn[snapshotIds[i]] === 'init') {\n                options.maxCount = 1;\n                break;\n            }\n        }\n    }\n    if (options.maxCount == null) {\n        return;\n    }\n    // console.log('start check snapshots', options.currentCount)\n    var snapshots = joinObjects({}, snapshotsIn);\n    // First go through the snapshots and generate any that are in the 'toLoad' state\n    var toGenerate = false;\n    Object.keys(snapshots).forEach(function (id) {\n        if (snapshots[id] === 'toLoad') {\n            // snapshots[id] = 'loading';\n            toGenerate = true;\n        }\n    });\n    if (toGenerate) {\n        generateSnapshots(snapshots, environment, saveTo, function () { });\n    }\n    // If checking is already in progress, then do not check again. If snapshots\n    // were generated, then callback with the latest snapshots state\n    if (window.grokkoliTimeoutId != null) {\n        if (toGenerate) {\n            callback('generating', snapshots);\n        }\n        return;\n    }\n    var toCheck = [];\n    var o = joinObjects({\n        maxCount: 20,\n        currentCount: 0,\n        pollSeconds: 1,\n        restartCount: false,\n        toCheck: ['loading', 'init'],\n    }, options);\n    if (o.restartCount) {\n        o.currentCount = 0;\n    }\n    Object.keys(snapshots).forEach(function (id) {\n        if (o.toCheck === 'all' ||\n            (Array.isArray(o.toCheck) && o.toCheck.indexOf(snapshots[id]) > -1) ||\n            snapshots[id] === o.toCheck) {\n            if (snapshots[id] === 'init') {\n                snapshots[id] = 'initChecked';\n            }\n            toCheck.push(id);\n        }\n    });\n    // console.log('To Check Length', toCheck.length)\n    if (toCheck.length === 0) {\n        if (toGenerate) {\n            callback('checking', snapshots);\n        }\n        return;\n    }\n    window.grokkoliTimeoutId = window.setTimeout(function () {\n        request('POST', 'snap__check_snapshots/', { records: toCheck, env: environment, save_to: saveTo }, function (response) {\n            window.grokkoliTimeoutId = null;\n            if (response.status === 'error') {\n                callback('error', {});\n                return;\n            }\n            o.currentCount += 1;\n            var numExist = Object.keys(response.existing).length;\n            var numTimeout = 0;\n            // Update snapshot stats with newly existing\n            Object.keys(response.existing).forEach(function (key) {\n                snapshots[key] = response.existing[key];\n            });\n            // Get the remaining loading snapshots\n            var numLoading = 0;\n            Object.keys(snapshots).forEach(function (key) {\n                if (snapshots[key] === 'loading') {\n                    numLoading += 1;\n                }\n            });\n            // If there are still loading snapshots, then check again\n            if (numLoading > 0) {\n                // console.log('Check again?', o.maxCount, o.currentCount)\n                // If we can check again, then do so\n                if (o.maxCount > o.currentCount) {\n                    checkSnapshots(snapshots, environment, saveTo, callback, o);\n                    // Otherwise set the snapshots state to timeout\n                }\n                else {\n                    Object.keys(snapshots).forEach(function (key) {\n                        if (snapshots[key] === 'loading') {\n                            snapshots[key] = 'timeout';\n                            numTimeout += 1;\n                        }\n                    });\n                    window.grokkoliTimeoutId = null;\n                }\n            }\n            else {\n                window.grokkoliTimeoutId = null;\n            }\n            // If the snapshot states got updated, then callback\n            if (numExist > 0 || numTimeout > 0) {\n                var status_1 = response.status;\n                if (numTimeout > 0) {\n                    status_1 = 'timeout';\n                }\n                callback(status_1, snapshots);\n            }\n        });\n    }, 1000);\n    // If the snapshot states got updated because a generated message was\n    // send, then callback (do this at the end after starting the check snapshots timeout)\n    if (toGenerate || toCheck.length > 0) {\n        callback('checking', snapshots);\n    }\n}\nfunction isCheckingSnapshots() {\n    if (window.grokkoliTimeoutId != null) {\n        return true;\n    }\n    return false;\n}\n/*\n.####.##.....##....###.....######...########\n..##..###...###...##.##...##....##..##......\n..##..####.####..##...##..##........##......\n..##..##.###.##.##.....##.##...####.######..\n..##..##.....##.#########.##....##..##......\n..##..##.....##.##.....##.##....##..##......\n.####.##.....##.##.....##..######...########\n*/\nfunction SnapshotImage(_a) {\n    var snapshotId = _a.snapshotId, snapshots = _a.snapshots, loadFrom = _a.loadFrom;\n    var state = snapshots[snapshotId];\n    if (state === 'toLoad' ||\n        state === 'initChecked' ||\n        state === 'loading' ||\n        state === 'init') {\n        return (React.createElement(\"div\", { className: \"snapshot_image_load_container\" },\n            React.createElement(\"div\", { className: \"snapshot_image_load_wait\" },\n                React.createElement(\"div\", { className: \"wait_loader\" }))));\n    }\n    if (state === 'timeout') {\n        return (React.createElement(\"div\", { className: \"snapshot_image_load_container\" },\n            React.createElement(\"div\", { className: \"snapshot_image_status\" }, \"Timed out\")));\n    }\n    var url = state;\n    if (url.startsWith('/')) {\n        // Absolute static path (used by pre-baked demo snapshots) — use as-is.\n    }\n    else if (loadFrom === 'local' || !url.startsWith('http')) {\n        url = \"\".concat(window.location.origin, \"/static/local_snapshots/\").concat(url, \".\").concat(EXTENSION);\n    }\n    return (React.createElement(\"div\", null,\n        React.createElement(\"img\", { src: url, className: \"snapshot_image_container\" })));\n}\n/*\n.########.####.##.......########\n....##.....##..##.......##......\n....##.....##..##.......##......\n....##.....##..##.......######..\n....##.....##..##.......##......\n....##.....##..##.......##......\n....##....####.########.########\n*/\nfunction SnapshotTile(_a) {\n    var snapshotId = _a.snapshotId, snapshots = _a.snapshots, record = _a.record, loadFrom = _a.loadFrom, verbose = _a.verbose, origin = _a.origin, updateRecord = _a.updateRecord, recordIndex = _a.recordIndex, qa_review = _a.qa_review, qa_status = _a.qa_status, setSnapshots = _a.setSnapshots, _b = _a.verboseEnabled, verboseEnabled = _b === void 0 ? true : _b, _c = _a.markFinal, markFinal = _c === void 0 ? false : _c, anchorId = _a.anchorId, beforeSnapshot = _a.beforeSnapshot;\n    var timeZone = useContext(SnapshotTimezone);\n    // console.log(record)\n    var details = [];\n    var qa = React.createElement(React.Fragment, null);\n    var modeElement = React.createElement(React.Fragment, null);\n    var qa_notes = null;\n    if (record.qa_review) {\n        if (record.qa_review.notes) {\n            qa_notes = record.qa_review.notes;\n        }\n    }\n    var _d = useState(qa_notes), notes = _d[0], setNotes = _d[1];\n    if (verboseEnabled && verbose) {\n        var date_time = getDateTime(record, false, timeZone);\n        var answer_time = getAnswerTime(record, true);\n        var result = getResult(record);\n        details = [\n            date_time,\n            React.createElement(\"div\", { className: \"snapshot_tile__summary_result_time\" },\n                result,\n                answer_time),\n        ];\n        details.push.apply(details, getVerbose(record, {\n            ids: true,\n            profile: true,\n            session_id: true,\n            mathStepPath: true,\n            mathStepIds: true,\n            questionPath: true,\n            questionIds: true,\n            speed: true,\n            speech: true,\n            modeStack: true,\n            index: true,\n            submittedAnswer: true,\n            createdFor: true,\n            fromPool: true,\n            variation: true,\n            links: true,\n            guides: true,\n            responseSpeech: true,\n            scores: true,\n            deleteSnapshot: true,\n        }, origin, snapshots, setSnapshots, checkSnapshots));\n    }\n    else {\n        var date_time = getDateTime(record, true, timeZone);\n        var answer_time = getAnswerTime(record, false);\n        var result = getResult(record);\n        details = [\n            date_time,\n            React.createElement(\"div\", { className: \"snapshot_tile__summary_result_time\" },\n                result,\n                answer_time),\n        ];\n    }\n    var calculator = getCalculator(record);\n    var guideSpeech = React.createElement(React.Fragment, null);\n    if (record.response_speech_str) {\n        guideSpeech = React.createElement(\"div\", { className: \"snapshot_tile__guide_speech\" },\n            React.createElement(\"div\", { className: \"snapshot_tile__guide_speech__text\" }, record.response_speech_str));\n    }\n    if (verboseEnabled && qa_review) {\n        var onStatusClick = function () {\n            // Toggle between PENDING and NONE\n            if (record.qa_review.status === QAStatus.NONE || record.qa_review.status == null) {\n                record.qa_review.status = QAStatus.PENDING;\n            }\n            else if (record.qa_review.status === QAStatus.PENDING) {\n                record.qa_review.status = QAStatus.NONE;\n            }\n            updateRecord(recordIndex, record, true);\n        };\n        var modeName = MODES[record.question_record__mode.name];\n        var modeClass = \"snapshot_tile__mode snapshot_tile__mode__\".concat(modeName);\n        var modeNameSpaced = modeName.replace(/_/g, ' ');\n        var qaClass = 'snapshot_tile__qa_none';\n        var speechPlayedClass = '';\n        var notesClass = 'hide';\n        var saveClass = 'hide';\n        var pendingClass = 'hide';\n        var fixingClass = 'hide';\n        var fixedClass = 'hide';\n        var nofixClass = 'hide';\n        if (record.speech_played) {\n            speechPlayedClass = 'snapshot_tile__qa_speech_played';\n        }\n        if (record.qa_review && record.qa_review.status != QAStatus.NONE) {\n            if (qa_status === true) {\n                qaClass = 'hide';\n            }\n            notesClass = 'snapshot_tile__qa_notes';\n            if (record.qa_review.notes !== notes) {\n                saveClass = 'snapshot_tile__qa_notes_save';\n            }\n            pendingClass = 'snapshot_tile__qa_status_pending';\n            fixingClass = 'snapshot_tile__qa_status_fixing';\n            fixedClass = 'snapshot_tile__qa_status_fixed';\n            nofixClass = 'snapshot_tile__qa_status_nofix';\n            if (record.qa_review.status == QAStatus.PENDING) {\n                pendingClass += ' snapshot_tile__qa_status_active';\n                notesClass += ' snapshot_tile__qa_notes_pending';\n            }\n            if (record.qa_review.status == QAStatus.FIXING) {\n                fixingClass += ' snapshot_tile__qa_status_active';\n                notesClass += ' snapshot_tile__qa_notes_fixing';\n            }\n            if (record.qa_review.status == QAStatus.FIXED) {\n                fixedClass += ' snapshot_tile__qa_status_active';\n                notesClass += ' snapshot_tile__qa_notes_fixed';\n            }\n            if (record.qa_review.status == QAStatus.NO_FIX) {\n                nofixClass += ' snapshot_tile__qa_status_active';\n                notesClass += ' snapshot_tile__qa_notes_nofix';\n            }\n        }\n        var saveNotes_1 = function () {\n            record.qa_review.notes = notes;\n            updateRecord(recordIndex, record, true);\n        };\n        var saveFixed = function () {\n            record.qa_review.status = QAStatus.FIXED;\n            updateRecord(recordIndex, record, true);\n        };\n        var saveFixing = function () {\n            record.qa_review.status = QAStatus.FIXING;\n            updateRecord(recordIndex, record, true);\n        };\n        var saveNoFix = function () {\n            record.qa_review.status = QAStatus.NO_FIX;\n            updateRecord(recordIndex, record, true);\n        };\n        var savePending = function () {\n            record.qa_review.status = QAStatus.PENDING;\n            updateRecord(recordIndex, record, true);\n        };\n        var status_2 = React.createElement(React.Fragment, null);\n        if (qa_status) {\n            status_2 = React.createElement(\"div\", { className: \"snapshot_tile__qa_status\" },\n                React.createElement(\"div\", { className: pendingClass, onClick: savePending }, \"Pending Review\"),\n                React.createElement(\"div\", { className: fixingClass, onClick: saveFixing }, \"Fixing\"),\n                React.createElement(\"div\", { className: fixedClass, onClick: saveFixed }, \"Fixed\"),\n                React.createElement(\"div\", { className: nofixClass, onClick: saveNoFix }, \"No Fix\"));\n        }\n        // const notes = record.qa_review.notes\n        qa = React.createElement(\"div\", { className: \"snapshot_tile__qa_container\" },\n            React.createElement(\"div\", { className: \"snapshot_tile__qa_header\" },\n                React.createElement(\"div\", { className: speechPlayedClass }),\n                React.createElement(\"div\", { className: modeClass }, modeNameSpaced),\n                React.createElement(\"div\", { className: qaClass, onClick: onStatusClick })),\n            React.createElement(\"textarea\", { className: notesClass, value: notes || '', onChange: function (e) {\n                    setNotes(e.target.value);\n                }, onKeyDown: function (e) {\n                    if ((e.key === 'Enter' && e.ctrlKey) || (e.key === 'Enter' && e.metaKey)) {\n                        e.preventDefault(); // Prevent default newline insertion\n                        saveNotes_1();\n                    }\n                } }),\n            React.createElement(\"div\", { className: saveClass, onClick: saveNotes_1 }, \"Save\"),\n            status_2);\n    }\n    // Not gated on qa_review: a record with nothing to review -- a question that\n    // was served and never answered -- still has a math step, a question, ids and\n    // links worth opening. Every caller that wants the toggle passes updateRecord.\n    var toggleVerbose = function () {\n        if (updateRecord == null) {\n            return;\n        }\n        record.verbose = !verbose;\n        updateRecord(recordIndex, record, false);\n    };\n    var title = React.createElement(React.Fragment, null);\n    if (record.title) {\n        title = React.createElement(\"div\", { className: \"snapshot_tile__title\" }, record.title);\n    }\n    var markFinalDiv = React.createElement(React.Fragment, null);\n    if (markFinal) {\n        if (record.final_answer\n            || record.mark.name === 'ANSWER_SHOWN'\n            || record.result.name === 'MESSAGE'\n            || record.result.name === 'DECISION') {\n            markFinalDiv = React.createElement(\"div\", { className: \"mark_final_question\" });\n        }\n    }\n    var snapshotTileClass = 'snapshot_tile';\n    if (beforeSnapshot) {\n        snapshotTileClass += ' snapshot_tile--with-status';\n    }\n    // if (markFinal) {\n    //   if (\n    //     record.final_answer\n    //     || record.mark.name === 'ANSWER_SHOWN'\n    //     || record.result.name === 'MESSAGE'\n    //     || record.result.name === 'DECISION'\n    //   ) {\n    //     snapshotTileClass += ' snapshot_tile__mark_final';\n    //     snapshotTileClass += ` snapshot_tile__result_border_${record.result.name.toUpperCase()}`\n    //   }\n    // }\n    return (React.createElement(\"div\", { className: snapshotTileClass, id: anchorId },\n        markFinalDiv,\n        React.createElement(\"div\", { className: \"snapshot_tile__vertical_container\" },\n            title,\n            React.createElement(\"div\", null,\n                qa,\n                details),\n            calculator,\n            guideSpeech,\n            beforeSnapshot,\n            React.createElement(\"div\", { onClick: toggleVerbose },\n                React.createElement(SnapshotImage, { snapshotId: snapshotId, snapshots: snapshots, loadFrom: loadFrom })))));\n}\nfunction ActionTile(_a) {\n    var actions = _a.actions, _b = _a.showSkill, showSkill = _b === void 0 ? true : _b;\n    var timeZone = useContext(SnapshotTimezone);\n    if (actions.length > 0) {\n        var actionLabels = [];\n        for (var j = 0; j < actions.length; j += 1) {\n            var action = actions[j];\n            var _c = formatDate(new Date(action.date_time * 1000), timeZone), date = _c[0], time = _c[1];\n            var details = '';\n            if (action.mode) {\n                details = action.mode;\n            }\n            else if (action.pool) {\n                details = action.pool;\n            }\n            else if (action.review_from) {\n                details = action.review_from;\n            }\n            if (action.action == \"MANUAL_ACTION\") {\n                details = action.data;\n            }\n            if (action.details) {\n                details = action.details;\n            }\n            var a = [];\n            if (action.is_skill) {\n                a = [React.createElement(\"div\", { className: \"action_skill\" }, action.action)];\n            }\n            else if (action.is_skill === false) {\n                a = [React.createElement(\"div\", { className: \"action\" }, action.action)];\n            }\n            else if (action.monitor) {\n                a = [React.createElement(\"div\", { className: \"action_monitor\" }, action.monitor)];\n                details = action.data;\n            }\n            else if (action.status) {\n                a = [React.createElement(\"div\", { className: \"action_learning_status\" }, action.status)];\n                details = action.value;\n            }\n            // const a = [<div className={action.is_skill ? 'action_skill' : 'action' }>{action.action}</div>];\n            a.push(React.createElement(\"div\", { className: \"details\" }, details));\n            if (showSkill && action.action !== \"MANUAL_ACTION\") {\n                a.push(React.createElement(\"div\", { className: \"skill_path\" }, action.skill_path));\n            }\n            actionLabels.push(React.createElement(\"div\", { className: \"snapshot_tile__action_container\" },\n                React.createElement(\"div\", { className: \"snapshot_tile__action_action\" },\n                    React.createElement(\"div\", { className: \"snapshot_tile__action_label\" },\n                        date,\n                        \" \",\n                        time),\n                    React.createElement(\"div\", { className: \"snapshot_tile__action_cell\" }, a))));\n        }\n        return (React.createElement(\"div\", { className: \"snapshot_tile\" },\n            React.createElement(\"div\", { className: \"snapshot_tile__actions\" }, actionLabels)));\n    }\n    return React.createElement(React.Fragment, null);\n}\nexport { ActionTile, generateSnapshots, checkSnapshots, SnapshotImage, SnapshotTile, isCheckingSnapshots, };\n","import React from 'react';\nimport { roundNum } from '../question/tools/math';\nimport { getDurationString } from '../question/tools/time';\n// Other snapshot pages retain the browser's timezone unless a summary supplies one.\nexport var SnapshotTimezone = React.createContext(undefined);\nfunction formatDate(dateTime, timeZone) {\n    return [\n        \"\".concat(dateTime.toLocaleDateString('en-US', {\n            timeZone: timeZone,\n            month: 'short',\n            day: 'numeric',\n            year: 'numeric',\n        })),\n        \"\".concat(dateTime.toLocaleTimeString('en-US', {\n            timeZone: timeZone,\n            hour: 'numeric',\n            minute: '2-digit',\n            second: '2-digit',\n            hour12: true,\n        })).replace('AM', 'a.m.').replace('PM', 'p.m.'),\n    ];\n}\nfunction getAnswerTime(record, verbose) {\n    if (record.answer_time_delta) {\n        var speedUnits = ' s';\n        var speedFinal = record.answer_time_delta / 1000;\n        if (speedFinal < 1) {\n            speedFinal = \"1\";\n        }\n        else if (speedFinal >= 60) {\n            speedUnits = ' min';\n            speedFinal = Math.round(speedFinal / 60);\n        }\n        else {\n            speedFinal = Math.round(speedFinal);\n        }\n        return (React.createElement(\"div\", { className: \"snapshot_tile__s_speed\" }, \"\".concat(speedFinal, \" \").concat(speedUnits)));\n    }\n    else if (record.answer_time) {\n        var answer_time = \"\".concat(roundNum(record.answer_time / 1000, 1), \"s\");\n        var expected_speed = '';\n        if (record.expected_speed > 0) {\n            expected_speed = \" \".concat(roundNum(record.expected_speed / 1000, 1), \"s\");\n        }\n        var className = \"snapshot_tile__v_answer_time snapshot_tile__speed_\".concat(record.speed.name);\n        if (verbose) {\n            return (React.createElement(\"div\", { className: className }, \"\".concat(answer_time),\n                React.createElement(\"span\", { className: \"snapshot_tile__expected_speed\" }, \"\".concat(expected_speed))));\n        }\n        return React.createElement(\"div\", { className: \"snapshot_tile__v_answer_time\" }, getDurationString(record.answer_time / 1000));\n    }\n    return React.createElement(React.Fragment, null);\n}\nvar MODES = {\n    NONE: 'NONE',\n    NEW_LEARNING: 'NEW_LEARNING',\n    GENERALIZING: 'GENERALIZING',\n    TROUBLESHOOTING: 'TROUBLESHOOTING',\n    REMEDIATION: 'REMEDIATION',\n    CONFIRM_CONFUSION: 'CONFIRM_CONFUSION',\n    REASK_QUESTION: 'REASK_QUESTION',\n    REMEDIATION_COMPREHENSION_1: 'REMEDIATION_COMPREHENSION',\n    REMEDIATION_COMPREHENSION_2: 'REMEDIATION_COMPREHENSION',\n    REASK_QUESTION_ANSWER_SHOWN: 'REASK_QUESTION_ANSWER_SHOWN',\n    REINFORCING: 'REINFORCING',\n    READY: 'READY',\n    HONING_INTRO: 'HONING',\n    HONING: 'HONING',\n    HONING_SUMMARY: 'HONING',\n    TARGET_HONE: 'TARGET_HONE',\n    PRACTICE: 'PRACTICE',\n    GENERALIZE_REINFORCEMENT_CHECK: 'GENERALIZE_REINFORCEMENT_CHECK',\n    QUESTION_REASKED_ANSWER_SHOWN: 'QUESTION_REASKED_ANSWER_SHOWN',\n    ASK_TAKE_A_BREAK_QUESTION: 'ASK_TAKE_A_BREAK_QUESTION',\n    TAKE_A_BREAK_QUESTION_ASKED: 'TAKE_A_BREAK_QUESTION_ASKED',\n    GENERALIZE_ACTIVITY: 'GENERALIZE_ACTIVITY',\n    ACTIVITY: 'ACTIVITY',\n    RECENT_REVIEW: 'RECENT_REVIEW',\n    EXPLANATION: 'EXPLANATION',\n    MONITOR_MESSAGE: 'MONITOR_MESSAGE',\n    LEARNING_POOL: 'LEARNING_POOL',\n    BLOCKED_REVIEW: 'BLOCKED_REVIEW',\n    QUEUED_REVIEW: 'QUEUED_REVIEW',\n    ACTIVITY_MATH_FACT_INTRO: 'MATH_FACT_INTRO',\n    ACTIVITY_MATH_FACT_TRIAGE: 'MATH_FACT_TRIAGE',\n    ACTIVITY_MATH_FACT_PRACTICE: 'MATH_FACT_PRACTICE',\n    ACTIVITY_MATH_FACT_FOCUS: 'MATH_FACT_FOCUS',\n    ACTIVITY_MATH_FACT_PRACTICE_2: 'MATH_FACT_PRACTICE',\n    ACTIVITY_MATH_FACT_REINFORCING_2: 'MATH_FACT_REINFORCING',\n    GENERALIZE_ACTIVITY_MATH_FACT_INTRO: 'MATH_FACT_INTRO',\n    GENERALIZE_ACTIVITY_MATH_FACT_TRIAGE: 'MATH_FACT_TRIAGE',\n    GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE: 'MATH_FACT_PRACTICE',\n    GENERALIZE_ACTIVITY_MATH_FACT_FOCUS: 'MATH_FACT_FOCUS',\n    GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE_2: 'MATH_FACT_PRACTICE',\n    GENERALIZE_ACTIVITY_MATH_FACT_REINFORCING_2: 'MATH_FACT_REINFORCING',\n    // The DRILL_* modes are shared by every drill - which one ran is on\n    // `method_thread`, which a snapshot record does not carry - so these\n    // classify by activity kind only.\n    DRILL_TRIAGE: 'DRILL_TRIAGE',\n    GENERALIZE_DRILL_TRIAGE: 'DRILL_TRIAGE',\n    DRILL_PRACTICE: 'DRILL_PRACTICE',\n    GENERALIZE_DRILL_PRACTICE: 'DRILL_PRACTICE',\n    DRILL_FOCUS: 'DRILL_FOCUS',\n    GENERALIZE_DRILL_FOCUS: 'DRILL_FOCUS',\n    DRILL_REINFORCING: 'DRILL_REINFORCING',\n    GENERALIZE_DRILL_REINFORCING: 'DRILL_REINFORCING',\n    FOLLOW_UP_QUESTION: 'FOLLOW_UP_QUESTION',\n    PRECURSOR_CHECK: 'PRECURSOR_CHECK',\n    RESTART_SESSION_MSG: 'RESTART_SESSION_MSG',\n    MANUAL: 'MANUAL',\n    DEMO: 'DEMO',\n    TEST: 'TEST',\n    DEMO_WALKTHROUGH: 'DEMO_WALKTHROUGH',\n};\nvar MODES_SIMPLE = {\n    NONE: 'NONE',\n    NEW_LEARNING: 'Introduce',\n    GENERALIZING: 'Practice',\n    TROUBLESHOOTING: 'Troubleshoot',\n    REMEDIATION: 'Remediate Gap',\n    CONFIRM_CONFUSION: 'Check Gap',\n    REASK_QUESTION: 'Reask Question',\n    REMEDIATION_COMPREHENSION_1: 'Check Gap',\n    REMEDIATION_COMPREHENSION_2: 'Check Gap',\n    REASK_QUESTION_ANSWER_SHOWN: 'Answer Shown',\n    REINFORCING: 'Spaced Repetition',\n    READY: 'Ready',\n    HONING_INTRO: 'Initial Assessment',\n    HONING: 'Initial Assessment',\n    HONING_SUMMARY: 'Initial Assessment',\n    TARGET_HONE: 'Target Skill Check',\n    PRACTICE: 'Practice',\n    GENERALIZE_REINFORCEMENT_CHECK: '',\n    QUESTION_REASKED_ANSWER_SHOWN: 'Answer Shown',\n    ASK_TAKE_A_BREAK_QUESTION: '',\n    TAKE_A_BREAK_QUESTION_ASKED: '',\n    GENERALIZE_ACTIVITY: '',\n    ACTIVITY: '',\n    RECENT_REVIEW: 'Review Recent',\n    EXPLANATION: '',\n    MONITOR_MESSAGE: '',\n    LEARNING_POOL: '',\n    BLOCKED_REVIEW: 'Remediate Gap',\n    QUEUED_REVIEW: 'Introduce',\n    ACTIVITY_MATH_FACT_INTRO: 'Math Fact Intro',\n    ACTIVITY_MATH_FACT_TRIAGE: 'Check Math Facts',\n    ACTIVITY_MATH_FACT_PRACTICE: 'Practice Math Facts',\n    ACTIVITY_MATH_FACT_FOCUS: 'Math Fact Focus',\n    ACTIVITY_MATH_FACT_PRACTICE_2: 'Practice Math Facts',\n    ACTIVITY_MATH_FACT_REINFORCING_2: 'Reinforce Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_INTRO: 'Math Fact Intro',\n    GENERALIZE_ACTIVITY_MATH_FACT_TRIAGE: 'Check Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE: 'Practice Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_FOCUS: 'Math Fact Focus',\n    GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE_2: 'Practice Math Facts',\n    GENERALIZE_ACTIVITY_MATH_FACT_REINFORCING_2: 'Reinforce Math Facts',\n    // Verbs match `drillVerbs` in session_summary/learningModeTitles.ts. The\n    // noun is 'Skills' rather than the drill's own label because a snapshot\n    // record has no `method_thread` to look one up with - the same fallback\n    // `drillModeTitle` uses when it is called without one.\n    DRILL_TRIAGE: 'Check Skills',\n    GENERALIZE_DRILL_TRIAGE: 'Check Skills',\n    DRILL_PRACTICE: 'Practice Skills',\n    GENERALIZE_DRILL_PRACTICE: 'Practice Skills',\n    DRILL_FOCUS: 'Focus on Skills',\n    GENERALIZE_DRILL_FOCUS: 'Focus on Skills',\n    DRILL_REINFORCING: 'Reinforce Skills',\n    GENERALIZE_DRILL_REINFORCING: 'Reinforce Skills',\n    FOLLOW_UP_QUESTION: 'Follow Up Question',\n    PRECURSOR_CHECK: 'Precursor Check',\n    RESTART_SESSION_MSG: '',\n    MANUAL: '',\n    DEMO: '',\n    TEST: '',\n    DEMO_WALKTHROUGH: '',\n};\nfunction getDateTime(record, includeMode, timeZone) {\n    if (includeMode === void 0) { includeMode = false; }\n    var _a = formatDate(new Date(record.date_time * 1000), timeZone), d = _a[0], t = _a[1];\n    if (includeMode) {\n        var modeName = MODES_SIMPLE[record.question_record__mode.name] || '';\n        var modeClass = \"snapshot_tile__s_mode snapshot_tile__mode__\".concat(modeName);\n        var modeNameSpaced = modeName.replace(/_/g, ' ');\n        return (React.createElement(\"div\", { className: \"snapshot_tile__s_date_time_mode\" },\n            React.createElement(\"div\", { className: modeClass }, modeNameSpaced),\n            React.createElement(\"div\", { className: \"snapshot_tile__s_date_time_col\" },\n                React.createElement(\"div\", { className: \"snapshot_tile__s_time\" }, t),\n                React.createElement(\"div\", { className: \"snapshot_tile__s_date\" }, d))));\n    }\n    return (React.createElement(\"div\", { className: \"snapshot_tile__s_date_time\" },\n        React.createElement(\"div\", { className: \"snapshot_tile__s_date\" }, d),\n        React.createElement(\"div\", { className: \"snapshot_tile__s_time\" }, t)));\n}\n// What the learner worked out on the calculator during this attempt: a line per\n// operation they completed with '='. Half-typed or cleared-away sums are not\n// reported, so an untouched or idly-tapped calculator shows nothing at all.\nfunction getCalculator(record) {\n    if (!record.calculator_used) {\n        return React.createElement(React.Fragment, null);\n    }\n    var working = record.calculator_working || [];\n    return (React.createElement(\"div\", { className: \"snapshot_tile__calculator\" },\n        React.createElement(\"div\", { className: \"snapshot_tile__calculator_label\" }, \"Calculator\"),\n        working.map(function (line, index) { return (React.createElement(\"div\", { className: \"snapshot_tile__calculator_line\", key: index }, line)); })));\n}\nfunction getResult(record) {\n    var _a;\n    var result = React.createElement(\"div\", null);\n    var finalAnswer = (_a = record.final) !== null && _a !== void 0 ? _a : record.final_answer;\n    if (record.question_record__question_type === 'd') {\n        try {\n            var submittedAnswer = JSON.parse(record.submitted_answer);\n            if (submittedAnswer.label) {\n                return React.createElement(\"div\", { className: \"snapshot_tile__result_decision\" },\n                    React.createElement(\"span\", { className: \"snapshot_tile__result_decision_label\" }, \"Selected:\"),\n                    \" \",\n                    submittedAnswer.label);\n            }\n            return React.createElement(\"div\", null);\n        }\n        catch (_b) {\n            return React.createElement(\"div\", null);\n        }\n    }\n    switch (record.result.name) {\n        case 'CORRECT':\n            result = React.createElement(\"div\", { className: \"snapshot_tile__result_CORRECT\" }, \"Correct\");\n            break;\n        case 'INCORRECT':\n            if (finalAnswer != null && finalAnswer !== true) {\n                result = (React.createElement(\"div\", { className: \"snapshot_tile__result_INCORRECT_FIRST_ATTEMPT\" }, \"Incorrect Attempt\"));\n            }\n            else {\n                result = (React.createElement(\"div\", { className: \"snapshot_tile__result_INCORRECT\" }, \"Incorrect\"));\n            }\n            break;\n        case 'INCORRECT_FIRST_ATTEMPT':\n            result = (React.createElement(\"div\", { className: \"snapshot_tile__result_INCORRECT_FIRST_ATTEMPT\" }, \"Incorrect Attempt\"));\n            break;\n        case 'NEEDS_HELP':\n            result = (React.createElement(\"div\", { className: \"snapshot_tile__result_NEEDS_HELP\" }, \"Asked for Help\"));\n            break;\n        case 'TECHNICALLY_CORRECT':\n            result = (React.createElement(\"div\", { className: \"snapshot_tile__result_TECHNICALLY_CORRECT\" }, \"Technically Correct\"));\n            break;\n        case 'DONT_KNOW':\n            result = (React.createElement(\"div\", { className: \"snapshot_tile__result_DONT_NOW\" }, \"Don't Know\"));\n            break;\n        case 'NEUTRAL':\n            if (record.mark.name === 'ANSWER_SHOWN') {\n                result = (React.createElement(\"div\", { className: \"snapshot_tile__result_SHOW\" }, \"Answer Shown\"));\n            }\n            break;\n        default:\n            // console.log(record)\n            if (record.result.name.startsWith('INVALID')) {\n                result = (React.createElement(\"div\", { className: \"snapshot_tile__result_INVALID\" }, \"Invalid Entry\"));\n            }\n    }\n    return result;\n}\nexport { getAnswerTime, getCalculator, getDateTime, getResult, formatDate, MODES, MODES_SIMPLE, };\n","/**\n * A stable per-browser-profile id, sent with every request as X-Browser-Id.\n *\n * Two learners can end up inside one account - a shared Chromebook left\n * authenticated to ClassLink lets the next student launch straight into the\n * previous student's session. Server side that looks like one learner with two\n * concurrent Django sessions, and nothing else in a request says whether that\n * is one browser with two tabs or two separate browsers. This tells them apart.\n *\n * It is NOT a device id, and the logs must not be read as one:\n *   - two browsers, or two Chrome profiles, on one machine -> two ids\n *   - two tabs or windows in the same profile -> one id\n *   - clearing site data, or a private window -> a new id\n *   - grokkoli.com and heliomath.com -> separate ids (localStorage is\n *     per-origin), which is also why the key is branded\n *\n * So two ids at once means two independent clients. It does not by itself mean\n * two machines, and it can never identify who is using them.\n */\nvar cached = null;\nfunction storageKey() {\n    // Branded so a learner on heliomath.com doesn't find a grokkoli_* key in\n    // devtools. `__brandKey` is set by alpha_base.html, which every page that\n    // loads this bundle extends. localStorage is per-origin and each origin\n    // serves one brand, so the key is constant wherever it matters; the neutral\n    // fallback only covers stray pages that don't set the brand.\n    var brand = window.__brandKey || 'app'; // eslint-disable-line @typescript-eslint/no-explicit-any\n    return \"\".concat(brand, \"_browser_id\");\n}\nfunction newId() {\n    // Not crypto.randomUUID - that needs Safari 15.4, above our floor of 14.1.\n    // Collisions only matter between two clients on one account at one moment,\n    // so 96 bits of Math.random plus a timestamp is ample.\n    var rand = function () { return Math.random().toString(36).slice(2, 10); };\n    return \"b_\".concat(Date.now().toString(36)).concat(rand()).concat(rand());\n}\nexport default function getBrowserId() {\n    if (cached != null) {\n        return cached;\n    }\n    // localStorage throws when storage is disabled or full (private browsing,\n    // locked-down managed profiles). Fall back to an in-memory id so requests\n    // still carry something usable for the life of the page.\n    try {\n        var key = storageKey();\n        var stored = window.localStorage.getItem(key);\n        if (stored) {\n            cached = stored;\n            return cached;\n        }\n        var id = newId();\n        window.localStorage.setItem(key, id);\n        cached = id;\n        return cached;\n    }\n    catch (_a) {\n        cached = \"\".concat(newId(), \"_nostore\");\n        return cached;\n    }\n}\n","import React from 'react';\nfunction Filter(_a) {\n    var title = _a.title, state = _a.state, update = _a.update;\n    function onClick() {\n        update(!state);\n    }\n    var className = \"filter\";\n    if (state) {\n        className += \" filter_active\";\n    }\n    if (state == null) {\n        className += \" filter_button\";\n    }\n    return (React.createElement(\"div\", { className: className, onClick: onClick },\n        React.createElement(\"div\", { className: \"filter_title\" }, title)));\n}\nfunction SortIcon(_a) {\n    var direction = _a.direction;\n    return (React.createElement(\"div\", { className: \"sort-icon-container\" },\n        React.createElement(\"div\", { className: \"sort-icon\" },\n            React.createElement(\"div\", { className: \"sort-icon-triangle sort-icon-up \".concat(direction === 1 ? 'sort-icon-up-active' : '') }),\n            React.createElement(\"div\", { className: \"sort-icon-triangle sort-icon-down \".concat(direction === -1 ? 'sort-icon-down-active' : '') }))));\n}\nexport { Filter, SortIcon, };\n","/** Stamp relative URL lifetimes on receipt, never when playback starts later. */\nexport function stampInlineSpeechChunks(chunks, receivedAt) {\n    if (receivedAt === void 0) { receivedAt = Date.now(); }\n    var encoded = typeof chunks === 'string';\n    if (encoded && !chunks.includes('\"cached_speech\"'))\n        return chunks;\n    try {\n        var parsed = encoded ? JSON.parse(chunks) : chunks;\n        if (!Array.isArray(parsed))\n            return chunks;\n        var changed_1 = false;\n        parsed.forEach(function (chunk) {\n            var cached = chunk === null || chunk === void 0 ? void 0 : chunk.cached_speech;\n            if (cached && Number.isFinite(cached.expires_in) && cached.expires_in > 0\n                && !Number.isFinite(cached._expiresAt)) {\n                cached._expiresAt = receivedAt + Math.min(cached.expires_in, 3540) * 1000;\n                changed_1 = true;\n            }\n        });\n        return encoded && changed_1 ? JSON.stringify(parsed) : chunks;\n    }\n    catch (_a) {\n        // A malformed optional hint must not break response processing.\n        return chunks;\n    }\n}\nexport function stampInlineSpeechConfig(config, receivedAt) {\n    var _a;\n    if (receivedAt === void 0) { receivedAt = Date.now(); }\n    if (!config)\n        return;\n    var speech = config.speech;\n    if (speech && typeof speech === 'object') {\n        ['chunkedSpeech', 'chunkedAutoSpeech', 'chunkedManualSpeech'].forEach(function (key) {\n            if (speech[key] != null)\n                speech[key] = stampInlineSpeechChunks(speech[key], receivedAt);\n        });\n    }\n    Object.values((_a = config.preGuides) !== null && _a !== void 0 ? _a : {}).forEach(function (guide) {\n        if (guide && typeof guide === 'object') {\n            guide.chunked = stampInlineSpeechChunks(guide.chunked, receivedAt);\n        }\n    });\n    if (Array.isArray(config.slidesData)) {\n        config.slidesData.forEach(function (slide) {\n            var _a;\n            stampInlineSpeechChunks((_a = slide === null || slide === void 0 ? void 0 : slide.speech) === null || _a === void 0 ? void 0 : _a.chunkedSpeech, receivedAt);\n        });\n    }\n}\n/** Called as soon as JSON arrives, before progress animations or SPA rebuilds. */\nexport function stampInlineSpeechResponse(response) {\n    var _a;\n    var receivedAt = Date.now();\n    if ((_a = response === null || response === void 0 ? void 0 : response.speech) === null || _a === void 0 ? void 0 : _a.chunked) {\n        response.speech.chunked = stampInlineSpeechChunks(response.speech.chunked, receivedAt);\n    }\n    stampInlineSpeechConfig(response === null || response === void 0 ? void 0 : response.question_config, receivedAt);\n    return response;\n}\n","import React from 'react';\nimport { roundNum } from '../question/tools/math';\nfunction getDataFromId(id) {\n    return JSON.parse(document.getElementById(id).textContent);\n}\nfunction getGrade(grade) {\n    if (grade == null) {\n        return '-';\n    }\n    var grades = {\n        '-1': 'Pre-K',\n        '0': 'Kinder',\n        '1': '1st',\n        '2': '2nd',\n        '3': '3rd',\n        '4': '4th',\n        '5': '5th',\n        '6': '6th',\n    };\n    return grades[\"\".concat(grade)];\n}\nfunction formatDate(date) {\n    var options = { month: 'short', day: 'numeric', year: 'numeric' };\n    // @ts-expect-error TS2769\n    return new Intl.DateTimeFormat('en-US', options).format(date);\n}\nfunction formatTime(date) {\n    var pad = function (num) { return String(num).padStart(2, '0'); };\n    var hours = pad(date.getHours());\n    var minutes = pad(date.getMinutes());\n    var seconds = pad(date.getSeconds());\n    return \"\".concat(hours, \":\").concat(minutes, \":\").concat(seconds);\n}\nfunction formatDateTime(date, showSeconds) {\n    if (showSeconds === void 0) { showSeconds = true; }\n    var pad = function (num) { return String(num).padStart(2, '0'); };\n    var year = date.getFullYear();\n    var month = pad(date.getMonth() + 1); // Months are 0-based\n    var day = pad(date.getDate());\n    var hours = pad(date.getHours());\n    var minutes = pad(date.getMinutes());\n    var seconds = pad(date.getSeconds());\n    if (showSeconds) {\n        return \"\".concat(year).concat(month).concat(day, \" \").concat(hours, \":\").concat(minutes, \":\").concat(seconds);\n    }\n    return \"\".concat(year).concat(month).concat(day, \" \").concat(hours, \":\").concat(minutes);\n}\nfunction isCurriculumComplete(grade, completion) {\n    return grade >= 6 && completion >= 97;\n}\nfunction ProfileInformation(_a) {\n    var profile = _a.profile, verbose = _a.verbose, session = _a.session;\n    // console.log(\"Session\", session)\n    // console.log(profile)\n    if (profile == null) {\n        return React.createElement(React.Fragment, null);\n    }\n    if (verbose === false) {\n        return React.createElement(\"div\", { className: \"profile_information_short\" },\n            React.createElement(\"div\", { className: \"profile_information_name\" },\n                React.createElement(\"h2\", null, profile.first_name)));\n    }\n    var challenges = [];\n    if (profile.has_ADHD) {\n        challenges.push('ADHD');\n    }\n    if (profile.has_dyscalculia) {\n        challenges.push('Discalculia');\n    }\n    if (profile.has_dyslexia) {\n        challenges.push('Dyslexia');\n    }\n    if (profile.has_autism) {\n        challenges.push('Autism');\n    }\n    if (profile.has_math_anxiety) {\n        challenges.push('Math Anxiety');\n    }\n    if (profile.has_cognitive_impairment) {\n        challenges.push('Cognitive Impairment');\n    }\n    if (profile.has_other_learning_disability) {\n        challenges.push('Other');\n    }\n    challenges.sort();\n    var duration;\n    if (profile.duration < 3600) {\n        duration = \"\".concat(roundNum(profile.duration / 60, 0), \" min\");\n    }\n    else {\n        duration = \"\".concat(roundNum(profile.duration / 3600, 1), \" h\");\n    }\n    var blockedSkills = [];\n    for (var i = 0; i < profile.blocked_skills.length; i += 1) {\n        blockedSkills.push(React.createElement(\"div\", null,\n            React.createElement(\"a\", { className: \"profile_information_blocked_a\", href: \"\".concat(window.location.origin, \"/skill_timeline/?id=\").concat(profile.id, \"&skill=\").concat(profile.blocked_skill_hashes[i]) }, profile.blocked_skill_file_paths[i])));\n    }\n    var sessionDetails = React.createElement(React.Fragment, null);\n    if (session != null) {\n        var speedUnits = ' s';\n        var speedFinal = session.duration;\n        if (speedFinal < 1) {\n            speedFinal = \"<1\";\n        }\n        else if (speedFinal >= 60) {\n            speedUnits = ' min';\n            speedFinal = Math.round(speedFinal / 60);\n        }\n        else {\n            speedFinal = Math.round(speedFinal);\n        }\n        sessionDetails = React.createElement(\"div\", { className: \"profile_session_summary\" },\n            React.createElement(\"table\", { className: \"profile_session_summary_table\" },\n                React.createElement(\"tr\", null,\n                    React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Questions:\"),\n                    React.createElement(\"td\", null, session.questions)),\n                React.createElement(\"tr\", null,\n                    React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"First attempt:\"),\n                    React.createElement(\"td\", null, session.correct_first_attempt)),\n                React.createElement(\"tr\", null,\n                    React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Correct:\"),\n                    React.createElement(\"td\", null, session.correct)),\n                React.createElement(\"tr\", null,\n                    React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Duration:\"),\n                    React.createElement(\"td\", null,\n                        speedFinal,\n                        \" \",\n                        speedUnits)),\n                React.createElement(\"tr\", null,\n                    React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Start:\"),\n                    React.createElement(\"td\", null, \"\".concat(formatDate(new Date(session.start * 1000)))))));\n    }\n    var onClickProfile = function () {\n        window.location.href = \"\".concat(window.location.origin, \"/debug_timeline/?id=\").concat(profile.id);\n    };\n    return React.createElement(\"div\", { className: \"profile_information\" },\n        React.createElement(\"div\", { className: \"profile_information_name\", onClick: onClickProfile }, \"\".concat(profile.id, \" - \").concat(profile.first_name)),\n        React.createElement(\"div\", { className: \"profile_information_email\" }, profile.email),\n        sessionDetails,\n        React.createElement(\"table\", { className: \"profile_information_table\" },\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Grade on Signup:\"),\n                React.createElement(\"td\", null, profile.math_grade_level_on_signup)),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Initial \".concat(window.__brandName || 'Grokkoli', \" Grade:\")),\n                React.createElement(\"td\", null, \"\".concat(profile.initial_grade, \" (\").concat(profile.initial_grade_completion, \"%)\"))),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Current \".concat(window.__brandName || 'Grokkoli', \" Grade:\")),\n                React.createElement(\"td\", null, \"\".concat(profile.current_grade, \" (\").concat(profile.current_grade_completion, \"%)\"))),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Challenges:\"),\n                React.createElement(\"td\", null, challenges.join(', '))),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Total Sessions:\"),\n                React.createElement(\"td\", null, profile.sessions)),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Total Duration:\"),\n                React.createElement(\"td\", null, duration)),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Total Questions:\"),\n                React.createElement(\"td\", null, profile.questions)),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Timeline:\"),\n                React.createElement(\"td\", { className: \"profile_information_subtitle_a\" },\n                    React.createElement(\"a\", { href: \"\".concat(window.location.origin, \"/debug_timeline/?id=\").concat(profile.id) }, \"\".concat(window.location.origin, \"/debug_timeline/?id=\").concat(profile.id)))),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Skills Timeline:\"),\n                React.createElement(\"td\", { className: \"profile_information_subtitle_a\" },\n                    React.createElement(\"a\", { href: \"\".concat(window.location.origin, \"/skills_timeline/?id=\").concat(profile.id) }, \"\".concat(window.location.origin, \"/skills_timeline/?id=\").concat(profile.id)))),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle\" }, \"Graph:\"),\n                React.createElement(\"td\", { className: \"profile_information_subtitle_a\" },\n                    React.createElement(\"a\", { href: \"\".concat(window.location.origin, \"/graph/?id=\").concat(profile.id) }, \"\".concat(window.location.origin, \"/graph/?id=\").concat(profile.id)))),\n            React.createElement(\"tr\", null,\n                React.createElement(\"td\", { className: \"profile_information_subtitle profile_information_align\" }, \"Blocked Skills:\"),\n                React.createElement(\"td\", null, blockedSkills))));\n    // return <div className=\"profile_information\">\n    //   <div className=\"profile_information_name\">\n    //     {profile.id} {profile.first_name}\n    //   </div>\n    // </div>\n}\nvar Timer = /** @class */ (function () {\n    function Timer() {\n        this.startTime = performance.now();\n        this.lastTime = this.startTime;\n    }\n    Timer.prototype.log = function (label) {\n        var now = performance.now();\n        console.log(label, now - this.lastTime);\n        this.lastTime = now;\n    };\n    Timer.prototype.total = function (label) {\n        var now = performance.now();\n        console.log(label, now - this.startTime);\n    };\n    return Timer;\n}());\nexport { getDataFromId, getGrade, formatDate, formatTime, formatDateTime, isCurriculumComplete, ProfileInformation, Timer, };\n","/**\n * How the learner is pointing - 'touch' or 'mouse' - reported to the server\n * as the X-Pointer header on question requests (see request.ts and\n * loadQuestion's question_config fetch). The server keeps the first report of\n * each session and every change in the session (LearnerState.record_pointer)\n * so tutorials can demonstrate with a hand or a mouse pointer.\n *\n * Until the learner presses something it is a guess from the device's primary\n * pointer; after that it is whatever they last pressed with. A pen counts as\n * touch, as it taps like a finger.\n *\n * Debug override, from the browser console (stored in localStorage, so it\n * survives question transitions and reloads):\n *   set_pointer('mouse')   always report a mouse\n *   set_pointer('touch')   always report touch\n *   set_pointer(null)      clear the override, back to detection\n *   set_pointer()          report the current setting (no change)\n * It is sent with the next request, so reload or go on to the next question\n * to see guides and trainings use it.\n */\nvar OVERRIDE_KEY = '_grokkoli_debug_pointer';\nfunction guess() {\n    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n        return 'touch';\n    }\n    return window.matchMedia('(pointer: coarse)').matches ? 'touch' : 'mouse';\n}\nfunction isPointerType(value) {\n    return value === 'touch' || value === 'mouse';\n}\nfunction readOverride() {\n    try {\n        var value = localStorage.getItem(OVERRIDE_KEY);\n        return isPointerType(value) ? value : null;\n    }\n    catch (_a) {\n        return null;\n    }\n}\nvar current = guess();\nvar override = readOverride();\nif (typeof document !== 'undefined' && typeof document.addEventListener === 'function') {\n    // Capture, so a handler that stops propagation can't hide a press.\n    document.addEventListener('pointerdown', function (event) {\n        current = event.pointerType === 'mouse' ? 'mouse' : 'touch';\n    }, { capture: true, passive: true });\n}\nfunction getPointerType() {\n    return override || current;\n}\nfunction setPointerOverride(value) {\n    /* eslint-disable no-console */\n    if (value === undefined) {\n        console.log(override\n            ? \"pointer forced to '\".concat(override, \"' (set_pointer(null) to clear)\")\n            : \"pointer detected as '\".concat(current, \"' (no override)\"));\n        return override;\n    }\n    if (value !== null && !isPointerType(value)) {\n        console.log(\"set_pointer takes 'mouse', 'touch' or null\");\n        return override;\n    }\n    override = value;\n    try {\n        if (value === null) {\n            localStorage.removeItem(OVERRIDE_KEY);\n        }\n        else {\n            localStorage.setItem(OVERRIDE_KEY, value);\n        }\n    }\n    catch (_a) {\n        console.log('localStorage unavailable - override applies to this page only');\n    }\n    console.log(value\n        ? \"pointer forced to '\".concat(value, \"' - reload or go to the next question to see it\")\n        : \"pointer override cleared, detected as '\".concat(current, \"'\"));\n    return override;\n    /* eslint-enable no-console */\n}\nif (typeof window !== 'undefined') {\n    window.set_pointer = setPointerOverride;\n}\nexport { getPointerType, setPointerOverride };\n","var __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\n/**\n * The signed speech token the server issues with each question config.\n *\n * It carries the learner's profile id and resolved speech settings, signed, so\n * `speech_urls/` and `frontend_timing/` can serve a request without loading the\n * session, the user, the profile or the learner. Those two are the busiest\n * endpoints on the site — 73,922 and 71,367 requests on 2026-09-21 against\n * `answer`'s 19,999 — so the saving is three database reads on each (the fourth,\n * the session, is still loaded by Django's CSRF middleware in production).\n *\n * Opaque here: the browser must not read or edit it. Editing invalidates the\n * signature and the server falls back to the slow path, which is the point —\n * the payload picks the speech engine, and the engine is billable.\n *\n * **Held on `window`, deliberately, not in a module variable.** `question.js` and\n * `speech.js` are separate Webpack entries and there is no `runtimeChunk: 'single'`\n * in webpack.config.js, so each has its own module registry — a module in the\n * shared `common` chunk is instantiated once per runtime. Both bundles load on the\n * question page (alpha.html), so a module-local variable set by loadQuestion (the\n * `question` runtime) is invisible to speech.ts (the `speech` runtime). That failed\n * silently: withSpeechToken returned the body unchanged, the server saw no token\n * and fell back to the four-query path, and everything kept working at the old\n * cost. `window` is the one namespace both runtimes share, which is why\n * `window.grokkoli_question_id` already works this way.\n *\n * Absent until the first question config arrives (and on pages that never load\n * one), so every caller must tolerate undefined rather than wait for it.\n *\n * **Refreshed from two places, and it needs both.** loadQuestion() handles the full\n * page render; _rebuildQuestion() handles every SPA transition, which does NOT go\n * through loadQuestion. Wiring only the first meant a token minted when the tab\n * loaded was never replaced: a voice changed in another tab went unheard for the\n * rest of the session, because each new question reused the stale token rather than\n * the fresh one its own config carried.\n */\nvar KEY = '__grokkoli_speech_token';\nfunction store() {\n    return typeof window === 'undefined' ? undefined : window;\n}\n/** Store the token from a question config. Ignores a missing one. */\nexport function setSpeechToken(value) {\n    var w = store();\n    if (w !== undefined && typeof value === 'string' && value.length > 0) {\n        w[KEY] = value;\n    }\n}\n/** The current token, or undefined. Exported for tests and diagnostics. */\nexport function getSpeechToken() {\n    var _a;\n    return (_a = store()) === null || _a === void 0 ? void 0 : _a[KEY];\n}\n/**\n * Merge the token into a request body. Returns the body unchanged when there is\n * no token, so the server takes its authenticated fallback path instead.\n */\nexport function withSpeechToken(body) {\n    var token = getSpeechToken();\n    return token === undefined ? body : __assign(__assign({}, body), { speech_token: token });\n}\n/** Test seam. */\nexport function clearSpeechToken() {\n    var w = store();\n    if (w !== undefined) {\n        delete w[KEY];\n    }\n}\n"],"names":["Monitor","monitorName","minTripInterval","this","lastTripTime","start","prototype","trip","stats","_this","now","Date","message","concat","JSON","stringify","window","_grokkoli_silent_log","console","log","_grokkoli_monitor_records","performance","push","name","data","response","status","error","longTaskCount","longTaskTotalDuration","questionsSinceLoad","lastTeardownMs","lastBringupMs","baselineUsedJSHeapSize","baselineTeardownHeapSize","postTeardownHeapSize","toKB","bytes","Math","round","incrementQuestionsSinceLoad","setTeardownTime","ms","memory","heap","usedJSHeapSize","setBringupTime","PerformanceObserver","list","_i","_a","getEntries","length","entry","duration","observe","type","buffered","_e","getMemoryMetrics","out","jsHeapSizeLimit_KB","totalJSHeapSize_KB","usedJSHeapSize_KB","heapDelta_KB","teardownHeapDelta_KB","teardownHeapBaseline_KB","jsHeapSizeLimit","totalJSHeapSize","getPerformance","memoryKeys","timeOrigin","getTime","time","origin","floor","i","apiKey","outKey","currentUsed","send","figure","loadTime","answer_start","__load_1","load_1","__load_2","load_2","__load_3","load_3","__load_pre_figure","load_pre_figure","__figure_ready","figure_ready","domNodes","document","getElementsByTagName","longTasks","count","totalDuration","teardownMs","bringupMs","__assign","Object","assign","t","s","n","arguments","p","hasOwnProperty","call","apply","processJSONResponse","requestID","url","contentType","headers","get","includes","json","then","headers_1","forEach","value","info","redirected","ok","statusText","startsWith","Error","showConnectionTimeoutScreen","getElementById","overlayDiv","createElement","id","style","position","top","left","width","height","backgroundColor","display","flexDirection","justifyContent","alignItems","zIndex","opacity","transition","messageDiv","textContent","color","fontSize","fontWeight","margin","reloadButton","padding","border","borderRadius","cursor","boxShadow","addEventListener","location","reload","appendChild","body","createConnectionTimeoutDiv","hideLoadingScreen","offsetHeight","hideConnectionTimeoutScreen","setTimeout","parentNode","removeChild","showLoadingScreen","loadingDiv","userSelect","spinner","className","borderTop","animation","styleSheet","head","createLoadingDiv","request","endPoint","callback","isRetry","disable","noReloadOn400","replace","getRetryDelay","retryCount","csrftoken","querySelector","fetch","method","endsWith","delay","figureOneFigures","elements","hasTouchableElements","retry","href","catch","err","stack","processConsole","console_log","callPoint","args","slice","doFullPageReload","f","custom","postJSError","at","hidden","getOwnPropertyNames","uid","_guid","question_id","grokkoli_question_id","client_time","toISOString","load_start_time","_grokkoli_log","browser_focused","hasFocus","webgl_contexts","grokkoliWebGLContextTracker","figures","events","canvas_info","canvases","querySelectorAll","canvasSizes_1","c","atlasIDs","fig","webgl","webglLow","atlases","keys","dom_canvases","canvas_sizes","atlas_count","atlas_ids","_b","memory_metrics","zoom","gpu_device","__grokkoliGPUDeviceInfo","container","visibility","_grokkoli_catch_js_errors","_grokkoli_in_honing","recovered","msg","String","where","addToCodeTrace","line","numStackLines","codeLines","stackTrace","stackLines","split","stackLine","match","code","url_1","lineNumber_1","parseInt","charNumber_1","text","sourceCode","preCodeLines","codeLine","postCodeLines","lines","max","min","join","logError","_grokkoli_direct_console_log","timestamp","startLine","addGrid","options","o","Fig","joinObjects","x","step","stop","y","color1","font","size","lineWidth","grid","add","make","styleTheme","toBack","element","toElement","xPosition","yPosition","xAlign","yAlign","offset","rect","getBoundingRect","toElementRect","getPosition","toPosition","bottom","right","alignOffset","figurePosition","localPosition","pointFromSpaceToSpace","setPosition","getAnswerInput","possible","isShown","getAnyAnswerInput","_answer_input","showAnswerInput","ai","show","animations","new","target","dissolveIn","getElement","elem","Array","isArray","elems","expression_elements","duplicate","precision","NaN","_dup","arrayDup_1","arrayElement","objectDup","key","v","assignObjectFromTo","fromObject","toObject","exceptIn","duplicateValues","parentPath","except","keyPath","indexOf","_assignAsLinkOnly","undefined","toValue","joinObjectsWithOptions","objects","dup","num","to","from","pack","ar","l","__spreadArray","roundNum","multiplier","pow","result","PasswordCheck","onClose","label","title","endpoint","useState","pwd","setPwd","_c","submitting","setSubmitting","_d","showPwd","setShowPwd","shake","setShake","_f","focused","setFocused","inputRef","useRef","useEffect","onKeyDown","e","removeEventListener","submit","password","requestAnimationFrame","current","focus","onMouseDown","role","stopPropagation","onAnimationEnd","animationName","onClick","ref","placeholder","autoComplete","onChange","onFocus","onBlur","autoFocus","preventDefault","disabled","pulseType","mag","h","frequency","pulse","scale","p1","delta","translation","angle","PI","getDurationString","seconds","speedFinal","hours","minutes","getSnapshotId","record","wp","profile__id","question_record","padStart","tile","expand","getElementsByClassName","hide","classList","remove","LearnerName","learningModeTitles","NONE","NEW_LEARNING","GENERALIZING","TROUBLESHOOTING","REMEDIATION","CONFIRM_CONFUSION","REASK_QUESTION","REMEDIATION_COMPREHENSION_1","REMEDIATION_COMPREHENSION_2","REASK_QUESTION_ANSWER_SHOWN","REINFORCING","READY","HONING_INTRO","HONING","HONING_SUMMARY","TARGET_HONE","PRACTICE","GENERALIZE_REINFORCEMENT_CHECK","QUESTION_REASKED_ANSWER_SHOWN","TAKE_A_BREAK_QUESTION_ASKED","ASK_TAKE_A_BREAK_QUESTION","ACTIVITY_MATH_FACT_INTRO","GENERALIZE_ACTIVITY_MATH_FACT_INTRO","ACTIVITY_MATH_FACT_TRIAGE","GENERALIZE_ACTIVITY_MATH_FACT_TRIAGE","ACTIVITY_MATH_FACT_PRACTICE","GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE","ACTIVITY_MATH_FACT_FOCUS","GENERALIZE_ACTIVITY_MATH_FACT_FOCUS","ACTIVITY","GENERALIZE_ACTIVITY","RECENT_REVIEW","ACTIVITY_MATH_FACT_PRACTICE_2","GENERALIZE_ACTIVITY_MATH_FACT_PRACTICE_2","ACTIVITY_MATH_FACT_REINFORCING_2","GENERALIZE_ACTIVITY_MATH_FACT_REINFORCING_2","LEARNING_POOL","BLOCKED_REVIEW","QUEUED_REVIEW","DEMO_WALKTHROUGH","PRECURSOR_CHECK","DRILL_TRIAGE","GENERALIZE_DRILL_TRIAGE","DRILL_PRACTICE","GENERALIZE_DRILL_PRACTICE","DRILL_FOCUS","GENERALIZE_DRILL_FOCUS","DRILL_REINFORCING","GENERALIZE_DRILL_REINFORCING","classes","parent","link","div","node","createTextNode","learnerStateIdLink","setAttribute","innerHTML","ORIGIN","goToEndpoint","open","toClipBoard","navigator","clipboard","writeText","Label","valueClass","labelElement","labelLink_1","sub_labels_1","map","lab","subLabelElement","valueElement","getIds","ids","LSR","ANS","MS","question_record__math_step","Q","question_record__question","getModeStack","modeStack","Mode","question_record__mode","Stack","question_record__stack_len","getSubmittedAnswer","submittedAnswer","submitted_answer","getSpeech","speech","speech_played","Played","Completed","speech_completed","Duration","speech_duration","getGuides","guides","triggerrecord__trigger_id","triggerrecord__helpfulness","getResponseSpeech","responseSpeech","response_speech","response_speech_str","getScores","scores","skill_record","r","degree","score","skill___definition","skill_file_path","getMathStepPath","mathStepPath","question_record__math_step__path","getQuestionPath","questionPath","question_record__question_file_path","getSpeed","speed","answer_time","expected_speed","getMathStepIds","mathStepIds","DEF","question_record__math_step___definition_id","VER","question_record__math_step___definition_version","getQuestionIds","questionIds","question_record__question__definition_id","question_record__question__definition_version","getSessionId","session_id","question_record__session_link","session","question_record__session_id","getLinks","links","values","question_record__session_link_legacy","getIndex","index","question_record__question_index","question_record__group_index","question_record__slide_index","getProfile","profile","profile__first_name","getPool","fromPool","question_record__question_from_pool","getCreatedFor","createdFor","question_record__question_created_for","getVariation","variation","question_record__question_variation_id","getDeleteSnapshot","snapshots","setSnapshots","checkSnapshots","deleteSnapshot","fullSnapshotId_1","snapshotId","profileId","snapshot_environment","snapshot_location","records","newSnaps","snaps","snapshotsIn","environment","saveTo","maxCount","snapshotIds","toGenerate","env","save_to","generateSnapshots","grokkoliTimeoutId","toCheck","currentCount","pollSeconds","restartCount","numExist","existing","numTimeout","numLoading","status_1","SnapshotImage","loadFrom","state","src","SnapshotTile","verbose","updateRecord","recordIndex","qa_review","qa_status","verboseEnabled","markFinal","anchorId","beforeSnapshot","timeZone","useContext","details","qa","qa_notes","notes","setNotes","date_time","getVerbose","calculator","guideSpeech","modeName","modeClass","modeNameSpaced","qaClass","speechPlayedClass","notesClass","saveClass","pendingClass","fixingClass","fixedClass","nofixClass","saveNotes_1","status_2","ctrlKey","metaKey","markFinalDiv","final_answer","mark","snapshotTileClass","ActionTile","actions","showSkill","actionLabels","j","action","date","mode","pool","review_from","a","is_skill","monitor","skill_path","SnapshotTimezone","formatDate","dateTime","toLocaleDateString","month","day","year","toLocaleTimeString","hour","minute","second","hour12","getAnswerTime","answer_time_delta","speedUnits","MODES","EXPLANATION","MONITOR_MESSAGE","FOLLOW_UP_QUESTION","RESTART_SESSION_MSG","MANUAL","DEMO","TEST","MODES_SIMPLE","getDateTime","includeMode","d","getCalculator","calculator_used","working","calculator_working","getResult","finalAnswer","final","question_record__question_type","parse","cached","newId","rand","random","toString","getBrowserId","brand","__brandKey","stored","localStorage","getItem","setItem","Filter","update","SortIcon","direction","stampInlineSpeechChunks","chunks","receivedAt","encoded","parsed","changed_1","chunk","cached_speech","Number","isFinite","expires_in","_expiresAt","stampInlineSpeechConfig","config","preGuides","guide","chunked","slidesData","slide","chunkedSpeech","stampInlineSpeechResponse","question_config","getDataFromId","getGrade","grade","Intl","DateTimeFormat","format","formatTime","pad","getHours","getMinutes","getSeconds","formatDateTime","showSeconds","getFullYear","getMonth","getDate","isCurriculumComplete","completion","ProfileInformation","first_name","challenges","has_ADHD","has_dyscalculia","has_dyslexia","has_autism","has_math_anxiety","has_cognitive_impairment","has_other_learning_disability","sort","blockedSkills","blocked_skills","blocked_skill_hashes","blocked_skill_file_paths","sessionDetails","questions","correct_first_attempt","correct","email","math_grade_level_on_signup","__brandName","initial_grade","initial_grade_completion","current_grade","current_grade_completion","sessions","Timer","startTime","lastTime","total","OVERRIDE_KEY","isPointerType","matchMedia","matches","override","readOverride","getPointerType","event","pointerType","capture","passive","set_pointer","removeItem","KEY","store","setSpeechToken","w","withSpeechToken","token","speech_token"],"sourceRoot":""}