{ "version": 3, "sources": ["../node_modules/qrcode-svg/lib/qrcode.js", "../src/game.js", "../src/include/crypto.js", "../src/include/event.js", "../src/include/language.js", "../src/include/modals.js", "../src/include/ui.js"], "sourcesContent": ["/**\n * @fileoverview\n * - modified davidshimjs/qrcodejs library for use in node.js\n * - Using the 'QRCode for Javascript library'\n * - Fixed dataset of 'QRCode for Javascript library' for support full-spec.\n * - this library has no dependencies.\n *\n * @version 0.9.1 (2016-02-12)\n * @author davidshimjs, papnkukn\n * @see http://www.d-project.com/\n * @see http://jeromeetienne.github.com/jquery-qrcode/\n * @see https://github.com/davidshimjs/qrcodejs\n */\n\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of \n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\nfunction QR8bitByte(data) {\n this.mode = QRMode.MODE_8BIT_BYTE;\n this.data = data;\n this.parsedData = [];\n\n // Added to support UTF-8 Characters\n for (var i = 0, l = this.data.length; i < l; i++) {\n var byteArray = [];\n var code = this.data.charCodeAt(i);\n\n if (code > 0x10000) {\n byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);\n byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);\n byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);\n byteArray[3] = 0x80 | (code & 0x3F);\n } else if (code > 0x800) {\n byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);\n byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);\n byteArray[2] = 0x80 | (code & 0x3F);\n } else if (code > 0x80) {\n byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);\n byteArray[1] = 0x80 | (code & 0x3F);\n } else {\n byteArray[0] = code;\n }\n\n this.parsedData.push(byteArray);\n }\n\n this.parsedData = Array.prototype.concat.apply([], this.parsedData);\n\n if (this.parsedData.length != this.data.length) {\n this.parsedData.unshift(191);\n this.parsedData.unshift(187);\n this.parsedData.unshift(239);\n }\n}\n\nQR8bitByte.prototype = {\n getLength: function (buffer) {\n return this.parsedData.length;\n },\n write: function (buffer) {\n for (var i = 0, l = this.parsedData.length; i < l; i++) {\n buffer.put(this.parsedData[i], 8);\n }\n }\n};\n\nfunction QRCodeModel(typeNumber, errorCorrectLevel) {\n this.typeNumber = typeNumber;\n this.errorCorrectLevel = errorCorrectLevel;\n this.modules = null;\n this.moduleCount = 0;\n this.dataCache = null;\n this.dataList = [];\n}\n\nQRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+\",\"+col);}\nreturn this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);}\nif(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}\nthis.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}\nreturn pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}\nfor(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}\nfor(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}\nthis.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);}\nvar mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}\nthis.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}\nrow+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error(\"code length overflow. (\"\n+buffer.getLengthInBits()\n+\">\"\n+totalDataCount*8\n+\")\");}\nif(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}\nwhile(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}\nwhile(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}\nbuffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}\nbuffer.put(QRCodeModel.PAD1,8);}\nreturn QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}}\nvar totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}\nreturn((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}\nreturn(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}\nreturn digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error(\"bad maskPattern:\"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}}\nfor(var row=0;row=256){n-=255;}\nreturn QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}\nif(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}\nthis.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];\n\n\n/** Constructor */\nfunction QRCode(options) {\n var instance = this;\n \n //Default options\n this.options = {\n padding: 4,\n width: 256, \n height: 256,\n typeNumber: 4,\n color: \"#000000\",\n background: \"#ffffff\",\n ecl: \"M\"\n };\n \n //In case the options is string\n if (typeof options === 'string') {\n options = {\n content: options\n };\n }\n \n //Merge options\n if (options) {\n for (var i in options) {\n this.options[i] = options[i];\n }\n }\n \n if (typeof this.options.content !== 'string') {\n throw new Error(\"Expected 'content' as string!\");\n }\n \n if (this.options.content.length === 0 /* || this.options.content.length > 7089 */) {\n throw new Error(\"Expected 'content' to be non-empty!\");\n }\n \n if (!(this.options.padding >= 0)) {\n throw new Error(\"Expected 'padding' value to be non-negative!\");\n }\n \n if (!(this.options.width > 0) || !(this.options.height > 0)) {\n throw new Error(\"Expected 'width' or 'height' value to be higher than zero!\");\n }\n \n //Gets the error correction level\n function _getErrorCorrectLevel(ecl) {\n switch (ecl) {\n case \"L\":\n return QRErrorCorrectLevel.L;\n \n case \"M\":\n return QRErrorCorrectLevel.M;\n \n case \"Q\":\n return QRErrorCorrectLevel.Q;\n \n case \"H\":\n return QRErrorCorrectLevel.H;\n \n default:\n throw new Error(\"Unknwon error correction level: \" + ecl);\n }\n }\n \n //Get type number\n function _getTypeNumber(content, ecl) { \n var length = _getUTF8Length(content);\n \n var type = 1;\n var limit = 0;\n for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {\n var table = QRCodeLimitLength[i];\n if (!table) {\n throw new Error(\"Content too long: expected \" + limit + \" but got \" + length);\n }\n \n switch (ecl) {\n case \"L\":\n limit = table[0];\n break;\n \n case \"M\":\n limit = table[1];\n break;\n \n case \"Q\":\n limit = table[2];\n break;\n \n case \"H\":\n limit = table[3];\n break;\n \n default:\n throw new Error(\"Unknwon error correction level: \" + ecl);\n }\n \n if (length <= limit) {\n break;\n }\n \n type++;\n }\n \n if (type > QRCodeLimitLength.length) {\n throw new Error(\"Content too long\");\n }\n \n return type;\n }\n\n //Gets text length\n function _getUTF8Length(content) {\n var result = encodeURI(content).toString().replace(/\\%[0-9a-fA-F]{2}/g, 'a');\n return result.length + (result.length != content ? 3 : 0);\n }\n \n //Generate QR Code matrix\n var content = this.options.content;\n var type = _getTypeNumber(content, this.options.ecl);\n var ecl = _getErrorCorrectLevel(this.options.ecl);\n this.qrcode = new QRCodeModel(type, ecl);\n this.qrcode.addData(content);\n this.qrcode.make();\n}\n\n/** Generates QR Code as SVG image */\nQRCode.prototype.svg = function(opt) {\n var options = this.options || { };\n var modules = this.qrcode.modules;\n \n if (typeof opt == \"undefined\") {\n opt = { container: options.container || \"svg\" };\n }\n \n //Apply new lines and indents in SVG?\n var pretty = typeof options.pretty != \"undefined\" ? !!options.pretty : true;\n \n var indent = pretty ? ' ' : '';\n var EOL = pretty ? '\\r\\n' : '';\n var width = options.width;\n var height = options.height;\n var length = modules.length;\n var xsize = width / (length + 2 * options.padding);\n var ysize = height / (length + 2 * options.padding);\n \n //Join (union, merge) rectangles into one shape?\n var join = typeof options.join != \"undefined\" ? !!options.join : false;\n \n //Swap the X and Y modules, pull request #2\n var swap = typeof options.swap != \"undefined\" ? !!options.swap : false;\n \n //Apply declaration in SVG?\n var xmlDeclaration = typeof options.xmlDeclaration != \"undefined\" ? !!options.xmlDeclaration : true;\n \n //Populate with predefined shape instead of \"rect\" elements, thanks to @kkocdko\n var predefined = typeof options.predefined != \"undefined\" ? !!options.predefined : false;\n var defs = predefined ? indent + '' + EOL : '';\n \n //Background rectangle\n var bgrect = indent + '' + EOL;\n \n //Rectangles representing modules\n var modrect = '';\n var pathdata = '';\n\n for (var y = 0; y < length; y++) {\n for (var x = 0; x < length; x++) {\n var module = modules[x][y];\n if (module) {\n \n var px = (x * xsize + options.padding * xsize);\n var py = (y * ysize + options.padding * ysize);\n \n //Some users have had issues with the QR Code, thanks to @danioso for the solution\n if (swap) {\n var t = px;\n px = py;\n py = t;\n }\n \n if (join) {\n //Module as a part of svg path data, thanks to @danioso\n var w = xsize + px\n var h = ysize + py\n\n px = (Number.isInteger(px))? Number(px): px.toFixed(2);\n py = (Number.isInteger(py))? Number(py): py.toFixed(2);\n w = (Number.isInteger(w))? Number(w): w.toFixed(2);\n h = (Number.isInteger(h))? Number(h): h.toFixed(2);\n\n pathdata += ('M' + px + ',' + py + ' V' + h + ' H' + w + ' V' + py + ' H' + px + ' Z ');\n }\n else if (predefined) {\n //Module as a predefined shape, thanks to @kkocdko\n modrect += indent + '' + EOL;\n }\n else {\n //Module as rectangle element\n modrect += indent + '' + EOL;\n }\n }\n }\n }\n \n if (join) {\n modrect = indent + '';\n }\n\n var svg = \"\";\n switch (opt.container) {\n //Wrapped in SVG document\n case \"svg\":\n if (xmlDeclaration) {\n svg += '' + EOL;\n }\n svg += '' + EOL;\n svg += defs + bgrect + modrect;\n svg += '';\n break;\n \n //Viewbox for responsive use in a browser, thanks to @danioso\n case \"svg-viewbox\":\n if (xmlDeclaration) {\n svg += '' + EOL;\n }\n svg += '' + EOL;\n svg += defs + bgrect + modrect;\n svg += '';\n break;\n \n \n //Wrapped in group element \n case \"g\":\n svg += '' + EOL;\n svg += defs + bgrect + modrect;\n svg += '';\n break;\n \n //Without a container\n default:\n svg += (defs + bgrect + modrect).replace(/^\\s+/, \"\"); //Clear indents on each line\n break;\n }\n \n return svg;\n};\n\n/** Writes QR Code image to a file */\nQRCode.prototype.save = function(file, callback) {\n var data = this.svg();\n if (typeof callback != \"function\") {\n callback = function(error, result) { };\n }\n try {\n //Package 'fs' is available in node.js but not in a web browser\n var fs = require('fs');\n fs.writeFile(file, data, callback);\n }\n catch (e) {\n //Sorry, 'fs' is not available\n callback(e);\n }\n};\n\nif (typeof module != \"undefined\") {\n module.exports = QRCode;\n}\n", "import QRCode from \"qrcode-svg\";\nimport { aesGcmDecrypt, aesGcmEncrypt } from \"./include/crypto\";\nimport { pushEvent } from \"./include/event\";\nimport { getDuration, keyboardLayouts, LANG, _ } from \"./include/language\";\nimport {\n closeModal,\n getModalName,\n isModalOpen,\n openModal,\n} from \"./include/modals\";\nimport { isHardMode } from \"./include/ui\";\n\n(async () => {\n const $ = (id) => document.getElementById(id);\n\n let settings = {\n slug: null,\n puzzle_name: \"word.rodeo\",\n puzzle: null,\n use_timer: true,\n result_minimal: false,\n award_failed: false,\n share_url: null,\n emoji: null,\n countdown: null,\n dict: null,\n dict_exclusive: false,\n stats: null,\n save_progress: true,\n };\n if ($(\"settings\")) {\n settings = Object.assign(settings, JSON.parse($(\"settings\").innerText));\n }\n\n const SITE_TITLE = document.title;\n\n const STATUS_UNSOLVED = \"unsolved\";\n const STATUS_SOLVED = \"solved\";\n const STATUS_FAILED = \"failed\";\n\n window.gameLoaded = false;\n let solution = null;\n let status = STATUS_UNSOLVED;\n let extraLife = false;\n let awardText = \"\";\n\n // How many guesses are allowed?\n let guessCount = 6;\n // How many letters in the solution?\n let solutionLength = 0;\n // How many times each letter is in the solution\n let solutionLetters = {};\n // collect statistics to show the player for sharing\n let stats = {\n start: null,\n end: null,\n deleted: 0,\n invalid: 0,\n };\n const tileStatus = {};\n\n let keyboardLayout = \"default\";\n let dictionary = null;\n let dictionaryPromise = null;\n\n let currentGameId = null;\n\n const loadGame = (options) => {\n window.gameLoaded = true;\n solution = options.word;\n solutionLength = solution.length;\n solutionLetters = countLetters(solution);\n guessCount = options.guesses;\n keyboardLayout = options.kbd;\n awardText = options.award;\n\n const language = keyboardLayouts[keyboardLayout];\n\n if (options.dict && language.hasDictionary) {\n dictionaryPromise = loadDictionary(keyboardLayout, solutionLength);\n } else {\n dictionary = null;\n }\n\n const hintEl = $(\"hint\");\n if (!hintEl.innerText) {\n hintEl.innerText = options.hint;\n }\n if (options.hint) {\n hintEl.classList.remove(\"hidden\");\n } else {\n hintEl.classList.add(\"hidden\");\n }\n\n buildBoard();\n buildKeyboard(language.layout);\n\n if (!navigator.userAgent.includes(\"Firefox\")) {\n console.info(\"Applying center safe workaround.\");\n const boardEl = $(\"board\");\n const boardParent = boardEl.parentNode;\n boardParent.classList.remove(\"items-center-safe\");\n // Only firefox supports align-items: safe center;\n // And we can't test for actual support because Chrome lies to us\n // with CSS.supports('align-items', 'safe center')\n if (boardEl.scrollHeight > boardParent.clientHeight) {\n boardParent.classList.remove(\"items-center\");\n boardParent.classList.add(\"items-start\");\n } else {\n boardParent.classList.remove(\"items-start\");\n boardParent.classList.add(\"items-center\");\n }\n }\n\n document.querySelectorAll(\"[data-loaded]\").forEach((el) => {\n if (el.dataset.loaded === \"hide\") {\n el.style.display = \"none\";\n }\n if (el.dataset.loaded === \"show\") {\n el.style.display = \"\";\n }\n });\n document.querySelectorAll(\"a[data-setlang]\").forEach((el) => {\n if (settings.puzzle) {\n return;\n }\n let url = `#${currentGameId}`;\n if (el.dataset.setlang === \"en\") {\n el.href = `/${url}`;\n } else {\n el.href = `/${el.dataset.setlang}/${url}`;\n }\n });\n };\n\n const keyboardEl = $(\"keyboard\");\n\n /**\n * Generate the DOM required for the keyboard.\n */\n const buildKeyboard = (layout) => {\n keyboardEl.innerHTML = \"\";\n layout.forEach((row) => {\n const rowEl = document.createElement(\"div\");\n rowEl.classList.add(\"key-row\");\n row.forEach((key) => {\n if (key === \"\" || key === \" \") {\n const spaceEl = document.createElement(\"div\");\n spaceEl.tabIndex = -1;\n spaceEl.classList.add(key === \"\" ? \"key-spacer\" : \"key-blank\");\n rowEl.appendChild(spaceEl);\n return;\n }\n const keyEl = document.createElement(\"button\");\n keyEl.classList.add(\"key\");\n if (key === \"enter\" || key === \"delete\") {\n keyEl.classList.add(\"key-button\");\n }\n if (key === \"\u00DF\") {\n keyEl.classList.add(\"!lowercase\");\n }\n if (key === \"delete\") {\n keyEl.title = \"Delete\";\n keyEl.innerHTML =\n '';\n } else {\n keyEl.textContent = key;\n }\n keyEl.dataset.key = key;\n rowEl.appendChild(keyEl);\n });\n keyboardEl.appendChild(rowEl);\n });\n };\n\n /**\n * Generate the board DOM.\n *\n * @param {Boolean} extra Add a new row of guesses.\n */\n const buildBoard = (extra) => {\n const boardEl = $(\"board\");\n const addRow = () => {\n for (let j = 0; j < solutionLength; j++) {\n const tileEl = document.createElement(\"div\");\n tileEl.classList.add(\"tile\", \"empty\");\n tileEl.style.setProperty(\"--letter\", j);\n boardEl.appendChild(tileEl);\n }\n };\n if (extra) {\n addRow();\n return;\n }\n\n boardEl.innerHTML = \"\";\n boardEl.style.setProperty(\"--wordlength\", solutionLength);\n boardEl.style.setProperty(\"--guesscount\", guessCount);\n boardEl.style.width = `${solutionLength * 72}px`;\n boardEl.style.gridTemplateRows = `repeat(${guessCount}, 1fr)`;\n boardEl.style.gridTemplateColumns = `repeat(${solutionLength}, 1fr)`;\n\n for (let i = 0; i < guessCount; i++) {\n addRow();\n }\n };\n\n let currentRow = 0;\n let currentLetter = 0;\n\n const getTile = (row, letter) => {\n const tileIndex = row * solutionLength + letter + 1;\n return document.querySelector(`#board .tile:nth-child(${tileIndex})`);\n };\n const getKey = (letter) => {\n return keyboardEl.querySelector(`[data-key=\"${letter}\"]`);\n };\n const countLetters = (word) => {\n const counter = {};\n for (let i = 0; i < word.length; i++) {\n const letter = word[i];\n if (counter[letter]) {\n counter[letter] += 1;\n } else {\n counter[letter] = 1;\n }\n }\n return counter;\n };\n\n const saveState = () => {\n if (!stats.start) {\n // Record puzzle start time\n stats.start = Math.round(new Date().getTime() / 100) / 10;\n postStats({ type: \"attempt\" });\n pushEvent(\"First Letter\");\n }\n\n if (currentGameId === null || settings.save_progress === false) {\n // Don't save any progress\n // But only after setting the start time\n return;\n }\n\n const tiles = [...document.querySelectorAll(\"#board .tile\")].map(\n (tileEl) => ({\n letter: tileEl.textContent,\n status: tileEl.className,\n })\n );\n\n const keys = [...document.querySelectorAll(\"#keyboard [data-key]\")]\n .filter((keyEl) => keyEl.dataset.key.length === 1)\n .map((keyEl) => ({\n letter: keyEl.dataset.key,\n status: keyEl.className,\n }));\n\n const state = {\n game: settings.slug,\n status,\n currentRow,\n currentLetter,\n tiles,\n keys,\n extraLife,\n stats,\n };\n\n if (settings.highscore) {\n state.previousStatID = previousStatID;\n state.highscoreSubmitted = highscoreSubmitted;\n }\n\n localStorage.setItem(currentGameId, JSON.stringify(state));\n };\n const loadState = () => {\n const data = localStorage.getItem(currentGameId);\n if (data) {\n const state = JSON.parse(data);\n status = state.status;\n currentRow = state.currentRow;\n currentLetter = state.currentLetter;\n extraLife = !!state.extraLife;\n stats = state.stats || {};\n if (extraLife) {\n buildBoard(true);\n }\n\n if (settings.highscore) {\n previousStatID = state.previousStatID || null;\n highscoreSubmitted = !!state.highscoreSubmitted;\n if (highscoreSubmitted) {\n $(\"highscore-submit\").classList.add(\"hidden\");\n $(\"highscore-done\").classList.remove(\"hidden\");\n }\n }\n\n // Restore tiles and keyboard state\n [...document.querySelectorAll(\"#board .tile\")].forEach((tileEl, i) => {\n if (!state.tiles[i]) return;\n tileEl.innerText = state.tiles[i].letter;\n tileEl.className = state.tiles[i].status;\n\n const status = state.tiles[i].status;\n if (status.includes(\"correct\") || status.includes(\"present\")) {\n tileStatus[state.tiles[i].letter] = {\n correct: status.includes(\"correct\"),\n present: status.includes(\"present\"),\n position: i % solutionLength,\n };\n }\n });\n [...document.querySelectorAll(\"#keyboard [data-key]\")]\n .filter((keyEl) => keyEl.dataset.key.length === 1)\n .forEach((keyEl, i) => {\n keyEl.innerText = state.keys[i].letter;\n keyEl.className = state.keys[i].status;\n });\n\n if (status !== STATUS_UNSOLVED) {\n setTimeout(() => {\n showResults();\n }, 1500);\n }\n } else {\n // Not played before, make sure to reset state\n status = STATUS_UNSOLVED;\n currentRow = 0;\n currentLetter = 0;\n extraLife = false;\n stats = {\n start: null,\n end: null,\n deleted: 0,\n invalid: 0,\n };\n }\n if (settings.highscore) {\n const form = $(\"highscore-submit\");\n form.name.value = localStorage.getItem(\"highscore_name\") || \"\";\n if (form.email) {\n form.email.value = localStorage.getItem(\"highscore_email\") || \"\";\n }\n }\n };\n\n /**\n * Add a letter to the current row\n */\n const addLetter = (letter) => {\n if (status === STATUS_UNSOLVED && currentLetter < solutionLength) {\n const currentTile = getTile(currentRow, currentLetter);\n currentTile.classList.remove(\"empty\");\n currentTile.classList.add(\"tbd\");\n // toUpperCase turns it into \"SS\"\n if (letter === \"\u00DF\") {\n currentTile.classList.add(\"!lowercase\");\n }\n currentTile.textContent = letter;\n currentLetter++;\n saveState();\n }\n };\n\n /**\n * Remove the last letter from the current row\n */\n const deleteLetter = () => {\n if (status === STATUS_UNSOLVED && currentLetter !== 0) {\n const currentTile = getTile(currentRow, currentLetter - 1);\n currentTile.classList.add(\"empty\");\n currentTile.classList.remove(\"tbd\", \"!lowercase\");\n currentTile.textContent = \"\";\n currentLetter--;\n stats.deleted++;\n saveState();\n }\n };\n\n /**\n * Load the dictionary into memory\n *\n * Only loads words with the same length as the solution.\n */\n const loadDictionary = async (code, length, asArray = false) => {\n console.time(\"Load dictionary\");\n dictionary = new Set();\n\n const requests = [];\n\n if (settings.dict) {\n requests.push(fetch(settings.dict));\n }\n\n if (!settings.dict_exclusive) {\n const url = `/dict/${\n code === \"default\" ? \"english\" : code\n }/${length}.txt`;\n requests.push(fetch(url));\n }\n\n const responses = await Promise.all(requests);\n let words = [];\n\n for (let response of responses) {\n if (!response.ok) {\n console.error(`Failed downloading dictionary: ${code}`);\n // Fallback, do not check for dictionary entries.\n // Could happen when the client is offline.\n dictionary = null;\n return;\n }\n const data = await response.text();\n words = words.concat(data.split(\"\\n\"));\n }\n\n if (asArray) {\n console.timeEnd(\"Load dictionary\");\n return words;\n }\n\n dictionary = new Set(words);\n console.timeEnd(\"Load dictionary\");\n };\n\n let previousStatID = null;\n let highscoreSubmitted = false;\n\n const postStats = async (data) => {\n if (!settings.stats) {\n return;\n }\n const body = new URLSearchParams();\n for (let key in data) {\n body.append(key, data[key]);\n }\n const response = await fetch(settings.stats, {\n method: \"POST\",\n body,\n });\n if (!response.ok) {\n console.error(\"Failed to post stats\");\n }\n previousStatID = await response.text();\n saveState();\n };\n\n $(\"highscore-submit\")?.addEventListener(\"submit\", async (event) => {\n event.preventDefault();\n if (!settings.highscore || !previousStatID) {\n return;\n }\n const form = event.target;\n\n const body = new URLSearchParams();\n body.append(\"statistic\", previousStatID);\n body.append(\"name\", form.name.value);\n if (form.email) {\n body.append(\"email\", form.email.value);\n }\n // Game as a multiline string\n const game = [...document.querySelectorAll(\"#board .tile\")].reduce(\n (text, tileEl, i) =>\n text +\n tileEl.textContent +\n ((i + 1) % solutionLength === 0 ? \"\\n\" : \"\"),\n \"\"\n );\n body.append(\"game\", game.trim());\n\n const response = await fetch(settings.highscore, {\n method: \"POST\",\n body,\n });\n if (!response.ok) {\n const text = await response.text();\n showToast(text || _(\"err_highscore\"));\n } else {\n highscoreSubmitted = true;\n saveState();\n localStorage.setItem(\"highscore_name\", form.name.value);\n if (form.email) {\n localStorage.setItem(\"highscore_email\", form.email.value);\n }\n form.classList.add(\"hidden\");\n $(\"highscore-done\").classList.remove(\"hidden\");\n }\n });\n\n const shakeLine = (currentGuess) => {\n currentGuess.forEach(({ tile }) => {\n tile.classList.add(\"placed\", \"invalid\");\n });\n setTimeout(() => {\n currentGuess.forEach(({ tile }) => {\n tile.classList.remove(\"invalid\");\n });\n }, 1000);\n };\n\n /**\n * Check the current row for matches\n *\n * Does nothing if the row isn't complete\n */\n const checkWord = () => {\n const currentGuess = [];\n // Copy solution letters\n const guessLetters = Object.assign({}, solutionLetters);\n\n for (let i = 0; i < solutionLength; i++) {\n const tile = getTile(currentRow, i);\n const letter = tile.textContent.trim().toLowerCase();\n currentGuess.push({ tile, letter, status: \"tbd\" });\n }\n const guessedWord = currentGuess.map(({ letter }) => letter).join(\"\");\n\n if (status === STATUS_UNSOLVED && currentLetter === solutionLength) {\n if (isHardMode()) {\n for (let [letter, { correct, present, position }] of Object.entries(\n tileStatus\n )) {\n if (correct && guessedWord[position] !== letter) {\n // This position should be a different letter\n showToast(_(\"hardmore_err_correct\"));\n shakeLine(currentGuess);\n return;\n } else if (present && !guessedWord.includes(letter)) {\n // The solution must contains this letter\n showToast(_(\"hardmore_err_present\", letter.toUpperCase()));\n shakeLine(currentGuess);\n return;\n }\n }\n }\n\n if (\n dictionary !== null &&\n guessedWord !== solution &&\n !dictionary.has(guessedWord)\n ) {\n // Check against dictionary\n if (dictionary.size === 0) {\n // Only show loading messages if a player\n // tries to check a word when we're not ready yet.\n showToast(_(\"dict_loading\"));\n if (dictionaryPromise) {\n dictionaryPromise.then(() => {\n showToast(_(\"dict_ready\"));\n });\n }\n return;\n }\n showToast(_(\"dict_error\"));\n stats.invalid++; // only persisted with the next delete\n shakeLine(currentGuess);\n return;\n }\n\n // Check for exact matches\n currentGuess.forEach(({ tile, letter }, i) => {\n if (letter === solution[i]) {\n guessLetters[letter]--;\n currentGuess[i].status = \"correct\";\n tile.classList.remove(\"tbd\");\n tile.classList.add(\"correct\");\n const keyEl = getKey(letter);\n keyEl.classList.remove(\"absent\", \"present\");\n keyEl.classList.add(\"correct\");\n }\n });\n\n // Check partial matches\n currentGuess.forEach(({ tile, letter, status }, i) => {\n if (status === \"tbd\" && guessLetters[letter] > 0) {\n currentGuess[i].status = \"present\";\n guessLetters[letter]--;\n tile.classList.remove(\"tbd\");\n tile.classList.add(\"present\");\n const keyEl = getKey(letter);\n keyEl.classList.remove(\"absent\");\n if (!keyEl.classList.contains(\"correct\")) {\n keyEl.classList.add(\"present\");\n }\n }\n });\n\n // Mark remaining letters as absent\n currentGuess.forEach(({ tile, letter, status }) => {\n if (status === \"tbd\") {\n tile.classList.remove(\"tbd\");\n tile.classList.add(\"absent\");\n const keyEl = getKey(letter);\n keyEl.classList.remove(\"absent\");\n if (\n !keyEl.classList.contains(\"correct\") &&\n !keyEl.classList.contains(\"present\")\n ) {\n keyEl.classList.add(\"absent\");\n }\n }\n });\n\n if (currentRow == 0) {\n pushEvent(\"First Guess\");\n }\n currentLetter = 0;\n currentRow++;\n\n if (guessedWord === solution) {\n status = STATUS_SOLVED;\n stats.end = Math.round(new Date().getTime() / 100) / 10;\n postStats({\n type: \"solved\",\n guesses: currentRow,\n time_taken: stats.end - stats.start,\n word: solution,\n previous: previousStatID,\n });\n pushEvent(\"Solved\", {\n wordlength: solutionLength,\n guessCount: currentRow,\n });\n setTimeout(() => {\n showToast(_(\"toast_solved\"));\n currentGuess.forEach(({ tile }) => {\n tile.classList.add(\"winner\");\n });\n setTimeout(() => {\n showResults();\n }, 1500);\n }, 80 * solutionLength + 500);\n } else if (\n currentRow === guessCount ||\n (extraLife && currentRow === guessCount + 1)\n ) {\n status = STATUS_FAILED;\n stats.end = Math.round(new Date().getTime() / 100) / 10;\n postStats({\n type: \"failed\",\n time_taken: stats.end - stats.start,\n previous: previousStatID,\n });\n pushEvent(\"Failed\", { wordlength: solutionLength });\n setTimeout(() => {\n if (extraLife) {\n showToast(_(\"toast_failed_again\"));\n } else {\n showToast(_(\"toast_failed\"));\n }\n setTimeout(() => {\n showResults();\n }, 1500);\n }, 80 * solutionLength + 500);\n }\n saveState();\n } else if (status === STATUS_UNSOLVED) {\n showToast(_(\"toast_too_short\"));\n shakeLine(currentGuess);\n }\n };\n\n const oneupEl = $(\"oneup\");\n oneupEl?.addEventListener(\"click\", () => {\n if (!!solution && status === STATUS_FAILED && !extraLife) {\n // Unlocked an extra life!\n pushEvent(\"Extra Life\");\n showToast(_(\"toast_extralife\"));\n\n status = STATUS_UNSOLVED;\n extraLife = true;\n saveState();\n loadState();\n\n closeModal();\n }\n });\n\n const startCountdown = () => {\n const countdown = $(\"countdown\");\n if (!countdown) return;\n const target = new Date(settings.countdown);\n const tick = () => {\n const now = new Date();\n const remaining = Math.round((target - now) / 1000);\n countdown.innerText = getDuration(remaining, true);\n setTimeout(tick, 1000);\n };\n tick();\n };\n\n const decryptPrize = async (solved) => {\n const awardEl = $(\"award\");\n const encrypted =\n solved || !awardEl.dataset.consolation\n ? awardEl.dataset.award\n : awardEl.dataset.consolation;\n const data = await aesGcmDecrypt(encrypted);\n awardEl.innerHTML = data;\n };\n\n const showResults = () => {\n const resultData = $(\"modal-result\");\n resultData.classList.add(\n status === STATUS_SOLVED ? \"result-solved\" : \"result-failed\"\n );\n resultData.classList.remove(\n status === STATUS_FAILED ? \"result-solved\" : \"result-failed\"\n );\n if (extraLife || oneupEl === null) {\n resultData.classList.add(\"used-extralife\");\n if (status === STATUS_FAILED && $(\"result-solution\")) {\n $(\"result-solution\").textContent = solution.toUpperCase();\n }\n } else {\n resultData.classList.remove(\"used-extralife\");\n }\n\n $(\"result-attempts\").innerText = extraLife\n ? `${currentRow - 1}+1`\n : currentRow;\n\n if (settings.countdown) {\n startCountdown();\n }\n if ($(\"result-duration\")) {\n $(\"result-duration\").innerText = getDuration(stats.end - stats.start);\n }\n\n const awardEl = $(\"award\");\n const hasConsolation = !!awardEl.dataset.consolation;\n if (\n ((status === STATUS_SOLVED || settings.award_failed) && awardText) ||\n (hasConsolation && status === STATUS_FAILED)\n ) {\n awardEl.classList.remove(\"hidden\");\n if (awardEl.dataset.award || awardEl.dataset.consolation) {\n decryptPrize(status === STATUS_SOLVED);\n } else {\n awardEl.innerText = awardText;\n }\n } else {\n awardEl.classList.add(\"hidden\");\n awardEl.innerText = \"\";\n }\n\n let content = \"\";\n if (stats.deleted === 0) {\n content =\n status === STATUS_SOLVED ? _(\"deleted0_solved\") : _(\"deleted0_failed\");\n } else {\n content = _(\"deleted_letters\", stats.deleted);\n }\n if (dictionary) {\n if (stats.invalid === 0 && stats.deleted === 0) {\n content += _(\"deleted0_invalid0\");\n } else {\n content += _(\"invalid_words\", stats.invalid);\n }\n } else if (stats.deleted !== 0) {\n content += \".\";\n }\n\n $(\"result-stats\").innerHTML = content;\n if (!settings.save_progress) {\n $(\"board\").classList.add(\"hidden\");\n $(\"modal-panel\")\n .querySelector(\"[data-modal-close]\")\n .classList.add(\"hidden\");\n }\n openModal(\"result\");\n if (settings.highscore) {\n $(\"highscore-submit\").name.focus();\n }\n };\n\n const getSeason = () => {\n const month = new Date().getMonth();\n const day = new Date().getDate();\n let season;\n if (month === 1 && day == 14) {\n // hearts for valentine's day\n season = {\n name: \"hearts\",\n icon: \"\uD83D\uDC9B\",\n };\n }\n if (month === 6 && day === 4) {\n // us independence day\n season = {\n name: \"eagles\",\n icon: \"\uD83C\uDDFA\uD83C\uDDF8\",\n };\n }\n if (month === 7 && day === 1) {\n // swiss national day\n season = {\n name: \"cheese\",\n icon: \"\uD83C\uDDE8\uD83C\uDDED\",\n };\n }\n if (month === 9 && day == 31) {\n // halloween\n season = {\n name: \"spooky\",\n icon: \"\uD83C\uDF83\",\n };\n }\n if ((month === 11 && day == 25) || (month === 11 && day == 26)) {\n // xmas\n season = {\n name: \"xmas\",\n icon: \"\uD83C\uDF85\",\n };\n }\n return season;\n };\n\n /**\n * Compose a shareable text to copy\n */\n const getResultText = (emojiType) => {\n let text = ``;\n let attempts = `${currentRow}`;\n if (extraLife) {\n attempts = `${currentRow - 1}+1`;\n }\n if (settings.result_minimal) {\n text += settings.puzzle_name;\n if (status === STATUS_SOLVED) {\n text += ` ${attempts}/${guessCount}`;\n } else {\n text += ` X/${attempts}`;\n }\n if (settings.use_timer) {\n text += ` - ${getDuration(stats.end - stats.start)}`;\n }\n } else {\n if (status === STATUS_SOLVED) {\n text += _(\"puzzle_solved\", `${attempts}/${guessCount}`);\n if (settings.use_timer) {\n text += _(\"puzzle_duration\", getDuration(stats.end - stats.start));\n }\n } else {\n text += _(\"puzzle_failed\", attempts);\n }\n text = text.replace(\"PUZZLE_NAME\", settings.puzzle_name);\n }\n text += \"\\n\";\n\n const isDark = document.documentElement.classList.contains(\"dark\");\n const emojiMap = {\n default: {\n correct: \"\uD83D\uDFE9\",\n present: \"\uD83D\uDFE8\",\n absent: isDark ? \"\u2B1B\" : \"\u2B1C\",\n },\n hearts: {\n correct: \"\uD83D\uDC9A\",\n present: \"\uD83D\uDC9B\",\n absent: isDark ? \"\uD83D\uDDA4\" : \"\uD83E\uDD0D\",\n },\n eagles: {\n correct: \"\uD83C\uDDFA\uD83C\uDDF8\",\n present: \"\uD83D\uDDFD\",\n absent: \"\uD83E\uDD85\",\n },\n cheese: {\n correct: \"\uD83C\uDDE8\uD83C\uDDED\",\n present: \"\uD83E\uDDC0\",\n absent: \"\uD83C\uDF6B\",\n },\n spooky: {\n correct: \"\uD83C\uDF83\",\n present: \"\uD83D\uDD6F\uFE0F\",\n absent: \"\uD83D\uDC7B\",\n },\n xmas: {\n correct: \"\uD83C\uDF85\",\n present: \"\uD83C\uDF84\",\n absent: \"\uD83E\uDD8C\",\n },\n };\n if (settings.emoji) {\n emojiMap.default = Object.assign(emojiMap.default, settings.emoji);\n }\n let emojis = emojiMap[emojiType];\n if (!emojis) emojis = emojiMap.default;\n\n [...document.querySelectorAll(\"#board .tile\")].forEach((tileEl, i) => {\n if (tileEl.classList.contains(\"correct\")) {\n text += emojis.correct;\n } else if (tileEl.classList.contains(\"present\")) {\n text += emojis.present;\n } else if (tileEl.classList.contains(\"absent\")) {\n text += emojis.absent;\n }\n\n if ((i + 1) % solutionLength === 0) {\n text += \"\\n\";\n }\n });\n return text.trim();\n };\n\n keyboardEl.addEventListener(\"click\", (event) => {\n let key = event.target.dataset.key;\n if (!key) {\n const closest = event.target.closest(\"[data-key]\");\n if (!closest) {\n return;\n }\n key = closest.dataset.key;\n }\n if (key && key !== \" \") {\n if (key === \"delete\") {\n deleteLetter();\n } else if (key === \"enter\") {\n checkWord();\n } else {\n addLetter(event.target.dataset.key);\n }\n event.target.blur();\n }\n });\n\n window.addEventListener(\"keydown\", (event) => {\n if (!solution || event.repeat || event.ctrlKey) {\n return;\n }\n if (isModalOpen()) {\n if (event.key === \"Escape\") {\n if (getModalName() !== \"result\" || settings.save_progress) {\n closeModal();\n }\n }\n return;\n }\n const key = event.key;\n if (key === \" \") {\n return;\n } else if (key === \"Backspace\") {\n deleteLetter();\n } else if (key === \"Enter\") {\n checkWord();\n } else {\n const keyEl = getKey(key);\n if (keyEl) {\n addLetter(key);\n }\n }\n });\n\n $(\"create-form\")?.addEventListener(\"submit\", async (event) => {\n event.preventDefault();\n const form = event.target;\n\n const shareLinkEl = $(\"share-link\");\n const copyLinkEl = $(\"copy-link\");\n\n const options = {\n word: form.solution.value.trim().toLowerCase(),\n };\n\n // Only add non-default options to the object\n // to keep the generated JSON and thus the URL small\n const guessValue = parseInt(form.guesscount.value, 10);\n if (guessValue !== 6) {\n options.guesses = guessValue;\n }\n if (form.keyboard.value !== \"default\") {\n options.kbd = form.keyboard.value;\n }\n const hintValue = form.hint.value.trim().substring(0, 140);\n if (hintValue) {\n options.hint = hintValue;\n }\n const awardValue = form.award.value.trim().substring(0, 140);\n if (awardValue) {\n options.award = awardValue;\n }\n if (form.dictionary.checked) {\n options.dict = true;\n }\n\n const selectedLayout = keyboardLayouts[options.kbd || \"default\"];\n if (options.dict && !selectedLayout.hasDictionary) {\n showToast(_(\"toast_nodict\"));\n return;\n }\n\n pushEvent(\"Created\", {\n wordlength: options.word.length,\n guessCount: options.guesses || 6,\n keyboard: options.kbd || \"default\",\n dictionary: !!options.dict,\n hasHint: !!options.hint,\n hasAward: !!options.award,\n });\n\n const encrypted = await aesGcmEncrypt(JSON.stringify(options));\n const shareLink = `${location.protocol}//${location.host}${location.pathname}?utm_source=share#${encrypted}`;\n const qrLink = `${location.protocol}//${location.host}${location.pathname}?utm_source=qrcode#${encrypted}`;\n\n const qrData = new QRCode({\n content: qrLink,\n padding: 1,\n ecl: \"M\",\n background: \"#f1f5f9\",\n }).svg();\n $(\"qrcode-image\").src = `data:image/svg+xml;base64,${btoa(qrData)}`;\n\n form.classList.add(\"hidden\");\n shareLinkEl.href = shareLink;\n copyLinkEl.href = shareLink;\n $(\"created-share\").classList.remove(\"hidden\");\n });\n\n $(\"create-random\")?.addEventListener(\"click\", async () => {\n const lang = LANG === \"de\" ? \"german\" : \"english\";\n const dict = await loadDictionary(lang, \"5easy\", true);\n const word = dict[Math.floor(Math.random() * dict.length)];\n const options = {\n dict: true,\n word,\n };\n if (LANG === \"de\") {\n options.kbd = \"german\";\n }\n\n pushEvent(\"Play Random\");\n\n const encrypted = await aesGcmEncrypt(JSON.stringify(options));\n const link = `${location.protocol}//${location.host}${location.pathname}?utm_source=share#${encrypted}`;\n\n window.location = link;\n });\n\n const resetForm = () => {\n const form = $(\"create-form\");\n form.solution.value = \"\";\n form.hint.value = \"\";\n form.award.value = \"\";\n form.classList.remove(\"hidden\");\n $(\"created-share\").classList.add(\"hidden\");\n $(\"created-share-qr\").classList.add(\"hidden\");\n };\n $(\"create-more\")?.addEventListener(\"click\", () => resetForm());\n\n $(\"qrcode-image\")?.addEventListener(\"click\", (event) => {\n if (event.target.src) {\n const newWindow = window.open();\n const data =\n `QR Code` +\n ``;\n newWindow.document.body.innerHTML = data;\n }\n });\n\n // Validate the solution input\n const formHelp = $(\"solution-help\");\n $(\"form-solution\")?.addEventListener(\"blur\", (event) => {\n event.target.classList.add(\n \"invalid:text-red-900\",\n \"invalid:focus:ring-red-500\",\n \"invalid:border-red-500\",\n \"invalid:focus:border-red-500\"\n );\n });\n\n $(\"form-solution\")?.addEventListener(\"input\", (event) => {\n const input = event.target;\n\n const wordLetters = countLetters(input.value);\n\n if (input.validity.patternMismatch) {\n if (input.value.includes(\" \")) {\n formHelp.innerText = _(\"err_nospaces\");\n } else {\n formHelp.innerText = _(\"err_pattern\");\n }\n } else if (input.validity.tooShort) {\n formHelp.innerText = _(\"err_short\");\n } else if (input.value.length > 10) {\n formHelp.innerText = _(\"err_long\");\n } else if (input.validity.valid) {\n formHelp.classList.remove(\"text-red-600\");\n formHelp.innerText = _(\"good_puzzle\");\n const dupes = Object.values(wordLetters).filter((count) => count > 1);\n if (dupes.length > 1) {\n formHelp.innerText = _(\"err_dupe\");\n }\n Object.entries(wordLetters).forEach(([letter, count]) => {\n if (count >= input.value.length * 0.8) {\n formHelp.innerText = letter.toUpperCase().repeat(20) + \"!\";\n } else if (count > 3) {\n formHelp.innerText = _(\"err_rand\");\n }\n });\n }\n if (!input.validity.valid) {\n formHelp.classList.add(\"text-red-600\");\n }\n });\n $(\"form-guesscount\")?.addEventListener(\"input\", (event) => {\n const help = $(\"guesscount-help\");\n const input = event.target;\n if (input.value > 9) {\n help.innerText = _(\"guess_many\");\n } else if (input.value < 5) {\n help.innerText = _(\"guess_few\");\n } else {\n help.innerText = _(\"guess_help\");\n }\n });\n\n const showToast = (text, time) => {\n const container = $(\"toast-container\");\n const toast = document.createElement(\"div\");\n toast.classList.add(\n \"toast\",\n \"ease-out\",\n \"duration-300\",\n \"transition\",\n \"translate-y-2\",\n \"opacity-0\"\n );\n toast.innerText = text;\n container.appendChild(toast);\n setTimeout(() => {\n toast.classList.remove(\"translate-y-2\", \"opacity-0\");\n toast.classList.add(\"translate-y-0\", \"opacity-100\");\n }, 10);\n setTimeout(() => {\n toast.classList.remove(\"ease-out\", \"duration-300\", \"translate-y-0\");\n toast.classList.add(\"ease-in\", \"duration-100\");\n setTimeout(() => {\n toast.classList.remove(\"opacity-100\");\n toast.classList.add(\"opacity-0\");\n }, 10);\n setTimeout(() => {\n container.removeChild(toast);\n }, 110);\n }, time || 3500);\n };\n window.showToast = showToast;\n\n $(\"form-keyboard\")?.addEventListener(\"change\", (event) => {\n const layout = keyboardLayouts[event.target.value];\n if (layout) {\n $(\"form-solution\").pattern = layout.pattern;\n }\n });\n\n if (navigator.share) {\n $(\"share-link\")?.classList.remove(\"!hidden\");\n $(\"share-result\")?.classList.remove(\"!hidden\");\n $(\"share-link\")?.addEventListener(\"click\", (event) => {\n event.preventDefault();\n const anchor = event.target.closest(\"a\");\n pushEvent(\"Share\", { method: \"Navigator\" });\n navigator.share({\n title: SITE_TITLE,\n text: _(\"share_text\"),\n url: anchor.href,\n });\n });\n\n $(\"share-result\")?.addEventListener(\"click\", () => {\n pushEvent(\"Share Result\", { method: \"Navigator\" });\n const currentLink = `${location.protocol}//${location.host}${location.pathname}?utm_source=result${location.hash}`;\n let text = getResultText();\n let url = settings.share_url || currentLink;\n if (!url.match(/^https?:\\/\\//)) {\n text += \"\\n\" + url;\n url = undefined;\n }\n navigator.share({\n title: SITE_TITLE,\n text,\n url,\n });\n });\n }\n\n $(\"copy-link\")?.addEventListener(\"click\", (event) => {\n event.preventDefault();\n const anchor = event.target.closest(\"a\");\n pushEvent(\"Share\", { method: \"Clipboard\" });\n navigator.clipboard.writeText(settings.share_url || anchor.href);\n\n const textNode = anchor.querySelector(\"span\");\n textNode.innerText = _(\"share_copied\");\n setTimeout(() => {\n textNode.innerText = _(\"share_copy\");\n }, 750);\n });\n\n const copyResult = (isSeasonal = false) => {\n return (event) => {\n const button = event.target.closest(\"button\");\n pushEvent(\"Share Result\", { method: \"Clipboard\", seasonal: isSeasonal });\n\n const currentLink =\n settings.share_url ||\n `${location.protocol}//${location.host}${location.pathname}?utm_source=result${location.hash}`;\n\n let season = \"default\";\n if (isSeasonal) {\n const seasonData = getSeason();\n if (seasonData) {\n season = seasonData.name;\n }\n }\n\n const text = getResultText(season) + `\\n\\n${currentLink}\\n`;\n navigator.clipboard.writeText(text);\n\n if (isSeasonal) {\n showToast(_(\"toast_share_copied\"));\n } else {\n const textNode = button.querySelector(\"span\");\n textNode.innerText = _(\"share_copied\");\n setTimeout(() => {\n textNode.innerHTML = _(\"copy_result\");\n }, 750);\n }\n };\n };\n\n $(\"copy-result\")?.addEventListener(\"click\", copyResult());\n const seasonButton = $(\"copy-result-season\");\n seasonButton?.addEventListener(\"click\", copyResult(true));\n if (seasonButton) {\n const seasonData = getSeason();\n if (seasonData) {\n seasonButton.classList.remove(\"!hidden\");\n seasonButton.innerText = seasonData.icon;\n }\n }\n\n $(\"show-qrcode\")?.addEventListener(\"click\", () => {\n $(\"created-share-qr\").classList.remove(\"hidden\");\n });\n\n $(\"hint-unblur\")?.addEventListener(\"click\", (e) => {\n e.target.parentNode.remove();\n const hintEl = $(\"hint\");\n hintEl.classList.remove(\"blur\");\n });\n\n document.querySelectorAll(\"[data-setlang]\").forEach((el) => {\n el.addEventListener(\"click\", () => {\n localStorage.language = el.dataset.setlang;\n });\n });\n\n const loadHash = async () => {\n let hash;\n if (settings.puzzle && !location.search.includes(\"?preview\")) {\n if (currentGameId) {\n // Skip reloading pre-defined game\n return;\n }\n hash = settings.puzzle;\n } else if (window.location.hash) {\n hash = window.location.hash.slice(1);\n }\n if (!hash) {\n return false;\n }\n\n let options = {};\n try {\n options = JSON.parse(atob(hash));\n } catch (e) {\n // Encrypted hash found\n const decrypted = await aesGcmDecrypt(hash);\n options = JSON.parse(decrypted);\n }\n if (options.word) {\n currentGameId = hash;\n loadGame({\n word: options.word,\n guesses: options.guesses || 6,\n kbd: options.kbd || \"default\",\n hint: options.hint || \"\",\n award: options.award || \"\",\n dict: !!options.dict,\n });\n loadState();\n return true;\n }\n\n return false;\n };\n\n window.addEventListener(\"hashchange\", async () => {\n try {\n if (await loadHash()) {\n closeModal();\n }\n } catch (e) {}\n });\n\n try {\n let loaded;\n try {\n loaded = await loadHash();\n } catch (e) {\n console.error(\"Failed to load puzzle. Invalid URL?\", e);\n document.querySelector(\"#board .js-error\")?.classList.remove(\"hidden\");\n }\n if ($(\"modal-language\")) {\n if (\n !localStorage.language &&\n !navigator.language.match(LANG) &&\n /(de|fr|en|es)/i.test(navigator.language)\n ) {\n // We think you may prefer a translated version of the interface\n openModal(\"language\");\n return;\n }\n }\n if (loaded === true) {\n if (localStorage[\"iknowhowtoplay\"] !== \"yes\") {\n openModal(\"help\");\n }\n return;\n } else if (loaded === false && $(\"modal-create\")) {\n // Language seems to match\n // No hash, or invalid hash, so show the form.\n openModal(\"create\");\n }\n } catch (e) {}\n})();\n", "// We encrypt the URL with this key. If you really want to cheat you can do it with this. :)\nconst CRYPTO_KEY = \"T7MSZsmiUrENC4Dk23koFA28\";\n\n// Source for encrypt/decrypt functions:\n// https://gist.github.com/chrisveness/43bcda93af9f646d083fad678071b90a\n\nexport const aesGcmEncrypt = async (plaintext) => {\n const pwUtf8 = new TextEncoder().encode(CRYPTO_KEY); // encode password as UTF-8\n const pwHash = await crypto.subtle.digest(\"SHA-256\", pwUtf8); // hash the password\n\n const iv = crypto.getRandomValues(new Uint8Array(12)); // get 96-bit random iv\n const ivStr = Array.from(iv)\n .map((b) => String.fromCharCode(b))\n .join(\"\"); // iv as utf-8 string\n\n const alg = { name: \"AES-GCM\", iv: iv }; // specify algorithm to use\n\n const key = await crypto.subtle.importKey(\"raw\", pwHash, alg, false, [\n \"encrypt\",\n ]); // generate key from pw\n\n const ptUint8 = new TextEncoder().encode(plaintext); // encode plaintext as UTF-8\n const ctBuffer = await crypto.subtle.encrypt(alg, key, ptUint8); // encrypt plaintext using key\n\n const ctArray = Array.from(new Uint8Array(ctBuffer)); // ciphertext as byte array\n const ctStr = ctArray.map((byte) => String.fromCharCode(byte)).join(\"\"); // ciphertext as string\n\n return btoa(ivStr + ctStr); // iv+ciphertext base64-encoded\n};\nexport const aesGcmDecrypt = async (ciphertext) => {\n const pwUtf8 = new TextEncoder().encode(CRYPTO_KEY); // encode password as UTF-8\n const pwHash = await crypto.subtle.digest(\"SHA-256\", pwUtf8); // hash the password\n\n const ivStr = atob(ciphertext).slice(0, 12); // decode base64 iv\n const iv = new Uint8Array(Array.from(ivStr).map((ch) => ch.charCodeAt(0))); // iv as Uint8Array\n\n const alg = { name: \"AES-GCM\", iv: iv }; // specify algorithm to use\n\n const key = await crypto.subtle.importKey(\"raw\", pwHash, alg, false, [\n \"decrypt\",\n ]); // generate key from pw\n\n const ctStr = atob(ciphertext).slice(12); // decode base64 ciphertext\n const ctUint8 = new Uint8Array(\n Array.from(ctStr).map((ch) => ch.charCodeAt(0))\n ); // ciphertext as Uint8Array\n // note: why doesn't ctUint8 = new TextEncoder().encode(ctStr) work?\n\n try {\n const plainBuffer = await crypto.subtle.decrypt(alg, key, ctUint8); // decrypt ciphertext using key\n const plaintext = new TextDecoder().decode(plainBuffer); // plaintext from ArrayBuffer\n return plaintext; // return the plaintext\n } catch (e) {\n throw new Error(\"Decrypt failed\");\n }\n};\n", "export const pushEvent = (eventName, eventProps = {}) => {\n if (window.gtag) {\n window.gtag(\"event\", eventName, eventProps);\n }\n};\n", "const qwerty = [\n [\"q\", \"w\", \"e\", \"r\", \"t\", \"y\", \"u\", \"i\", \"o\", \"p\"],\n [\"\", \"a\", \"s\", \"d\", \"f\", \"g\", \"h\", \"j\", \"k\", \"l\", \"\"],\n [\"enter\", \"z\", \"x\", \"c\", \"v\", \"b\", \"n\", \"m\", \"delete\"],\n];\n\nexport const keyboardLayouts = {\n default: {\n pattern: \"^[a-zA-Z]*$\",\n layout: qwerty,\n hasDictionary: true,\n },\n numbers: {\n pattern: \"^[a-zA-Z0-9]*$\",\n layout: [[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\"], ...qwerty],\n },\n german: {\n pattern: \"^[a-zA-Z\u00C4\u00E4\u00D6\u00F6\u00DC\u00FC\u00DF]*$\",\n layout: [\n [\"q\", \"w\", \"e\", \"r\", \"t\", \"z\", \"u\", \"i\", \"o\", \"p\", \"\u00FC\", \"\u00DF\"],\n [...qwerty[1].slice(0, 10), \"\u00F6\", \"\u00E4\"],\n [\"enter\", \"y\", ...qwerty[2].slice(2)],\n ],\n hasDictionary: true,\n },\n french: {\n pattern: \"^[a-zA-Z\u00C9\u00E9\u00CA\u00EA\u00C8\u00E8\u00C7\u00E7\u00C0\u00E0\u00C2\u00E2\u00D9\u00F9\u0152\u0153]*$\",\n layout: [\n [\" \", \"\u00E9\", \"\u00EA\", \" \", \" \", \" \", \"\u00E8\", \"\u0153\", \"\u00E7\", \"\u00E0\"],\n [\"a\", \"z\", \"e\", \"r\", \"t\", \"y\", \"u\", \"i\", \"o\", \"p\", \"\u00E2\"],\n [\"\", \"q\", \"s\", \"d\", \"f\", \"g\", \"h\", \"j\", \"k\", \"l\", \"m\", \"\u00F9\"],\n [\"enter\", \"\", \"w\", \"x\", \"c\", \"v\", \"b\", \"n\", \"\", \"delete\"],\n ],\n hasDictionary: true,\n },\n italian: {\n pattern: \"^[a-zA-Z\u00D2\u00F2\u00C7\u00E7\u00C0\u00E0\u00C8\u00E8\u00C9\u00E9\u00D9\u00F9]*$\",\n layout: [[\"\", \" \", \" \", \" \", \"\u00F2\", \"\u00E7\", \"\u00E0\", \"\u00E8\", \"\u00E9\", \"\u00F9\", \"\"], ...qwerty],\n hasDictionary: true,\n },\n polish: {\n pattern: \"^[a-zA-Z\u0104\u0106\u0118\u0141\u0143\u00D3\u015A\u0179\u017B\u0105\u0107\u0119\u0142\u0144\u00F3\u015B\u017A\u017C]*$\",\n layout: [[\"\", \"\u0105\", \"\u0107\", \"\u0119\", \"\u0142\", \"\u0144\", \"\u00F3\", \"\u015B\", \"\u017C\", \"\u017A\", \"\"], ...qwerty],\n hasDictionary: true,\n },\n dutch: {\n pattern: \"^[a-zA-Z]*$\",\n layout: [[\"\", \" \", \"\u00E9\", \"\u00EB\", \" \", \" \", \"\u00FC\", \"\u00EF\", \"\u00F3\", \"\u00F6\", \"\"], ...qwerty],\n },\n spanish: {\n pattern: \"^[a-zA-Z\u00C1\u00E1\u00C9\u00E9\u00D3\u00F3\u00DA\u00FA\u00DC\u00FC\u00CD\u00ED\u00D1\u00F1]*$\",\n layout: [\n [\"\", \" \", \"\u00E1\", \"\u00E9\", \" \", \"\u00FC\", \"\u00FA\", \"\u00ED\", \"\u00F3\", \" \", \" \"],\n [...qwerty[0], \"\"],\n [...qwerty[1].slice(0, 10), \"\u00F1\"],\n qwerty[2],\n ],\n hasDictionary: true,\n },\n lakota: {\n pattern: \"^[A\u00C1B\u010CE\u00C9G\u01E6H\u021EI\u00CDKLMN\u014AO\u00D3PS\u0160TU\u00DAWYZ\u017Da\u00E1b\u010De\u00E9g\u01E7h\u021Fi\u00EDklmn\u014Bo\u00F3ps\u0161tu\u00FAwyz\u017E]*$\",\n layout: [\n [\"\", \" \", \" \", \"\u00E1\", \"\u00E9\", \"\u00ED\", \"\u00F3\", \"\u00FA\", \" \", \" \", \"\"],\n [\"\u01E7\", \"w\", \"e\", \"\u0161\", \"t\", \"y\", \"u\", \"i\", \"o\", \"p\"],\n [\"\", \"a\", \"s\", \"d\", \"\u014B\", \"g\", \"h\", \"\u021F\", \"k\", \"l\", \"\"],\n [\"enter\", \"z\", \"\u017E\", \"\u010D\", \"v\", \"b\", \"n\", \"m\", \"delete\"],\n ],\n },\n};\n\n// Aliases for old links\nkeyboardLayouts.qwerty = keyboardLayouts.default;\nkeyboardLayouts.qwertynum = keyboardLayouts.numbers;\nkeyboardLayouts.qwertz = keyboardLayouts.german;\nkeyboardLayouts.azerty = keyboardLayouts.french;\n\nconst i18n = {\n en: {\n // Create form\n err_nospaces: \"Sorry, no spaces.\",\n err_pattern:\n \"You can't enter this on the keyboard, try changing the language?\",\n err_short: \"Your word should at least have 3 characters.\",\n err_long: \"That's a long puzzle, it won't be very fun.\",\n err_dupe: \"Try to keep duplicate letters to a minimum.\",\n err_rand: \"You're just mashing your keyboard aren't you?\",\n good_puzzle: \"That looks like a good puzzle!\",\n guess_help: \"How many tries will you allow?\",\n guess_many: \"Oh, feeling generous today.\",\n guess_few: \"Extra hard, I like it.\",\n // Dictionary\n dict_loading: \"Dictionary is loading... \u231B\",\n dict_ready: \"Dictionary is ready. \uD83D\uDCD6\",\n dict_error: \"I don't know that word. \uD83E\uDD13\",\n // Toast popups\n toast_solved: \"Yes! You got it! \uD83E\uDD73\",\n toast_failed: \"You didn't find the solution \uD83D\uDE22\",\n toast_failed_again: \"That wasn't the solution either \uD83D\uDE2D\",\n toast_nodict:\n \"\u274C No dictionary for this language (yet), please disable the checkbox.\",\n toast_extralife: \"Unlocked an extra life! \uD83C\uDF44\",\n toast_share_copied: \"Copied result to clipboard! \uD83D\uDCCB\",\n toast_too_short: \"That's too short, try again. \uD83E\uDDD0\",\n // Hardmode\n hardmore_err_correct: \"You must use all correct letters \uD83D\uDE36\",\n hardmore_err_present: \"Your guess must include VAR \uD83D\uDE36\",\n // Results\n seconds: [\"one second\", \"NUM seconds\"],\n minutes: \"minutes\",\n hours: \"hours\",\n deleted0_solved:\n \"You went straight for the answer and never once deleted a letter!\",\n deleted0_failed:\n \"You entered some random words and never corrected a letter!\",\n deleted_letters: [\n \"While puzzling, you only fixed one single typo.\",\n \"While puzzling, you changed your mind NUM times by changing a letter\",\n ],\n deleted0_invalid0: \" And you never even tried to enter an invalid word.\",\n invalid_words: [\n \" and tried to enter 1 word that doesn't really exist.\",\n \" and tried to enter NUM words that don't really exist.\",\n ],\n puzzle_solved: \"I solved this PUZZLE_NAME with VAR attempts \",\n puzzle_duration: \"in VAR. Can you do better?\",\n puzzle_failed: \"I couldn't solve this PUZZLE_NAME in VAR guesses. Can you?\",\n share_text: \"Can you guess my word?\",\n share_copy: \"Copy Link\",\n share_copied: \"Copied!\",\n copy_result: 'Copy Result',\n err_highscore: \"Error submitting highscore. \uD83D\uDE36\",\n },\n fr: {\n // Cr\u00E9er un formulaire\n err_nospaces: \"D\u00E9sol\u00E9, pas d'espaces\",\n err_pattern:\n \"Tu ne peux pas saisir ce mot au clavier, essaie de changer de langue?\",\n err_short: \"Ton mot doit comporter au moins 3 caract\u00E8res.\",\n err_long: \"C'est une longue \u00E9nigme, ce ne sera pas tr\u00E8s amusant.\",\n err_dupe: \"Essaie de limiter au maximum les lettres en double.\",\n err_rand: \"Tu es en train de taper sur ton clavier, n'est-ce pas?\",\n good_puzzle: \"Cela ressemble \u00E0 un bon puzzle!\",\n guess_help: \"Combien d'essais vas-tu autoriser?\",\n guess_many: \"Oh, je me sens g\u00E9n\u00E9reux aujourd'hui.\",\n guess_few: \"Tr\u00E8s difficile, j'aime \u00E7a.\",\n // Dictionnaire\n dict_loading: \"Le dictionnaire est en train de se charger... \u231B\",\n dict_ready: \"Le dictionnaire est pr\u00EAt. \uD83D\uDCD6\",\n dict_error: \"Je ne connais pas ce mot. \uD83E\uDD13\",\n // Popups de toast\n toast_solved: \"Oui! Tu l'as trouv\u00E9! \uD83E\uDD73\",\n toast_failed: \"Tu n'as pas trouv\u00E9 la solution \uD83D\uDE22\",\n toast_failed_again: \"Ce n'\u00E9tait pas non plus la solution \uD83D\uDE2D\",\n toast_nodict:\n \"\u274C Pas de dictionnaire pour cette langue, d\u00E9sactive la case \u00E0 cocher.\",\n toast_extralife: \"Tu as d\u00E9bloqu\u00E9 une vie suppl\u00E9mentaire! \uD83C\uDF44\",\n toast_share_copied: \"Copie le r\u00E9sultat dans le presse-papiers! \uD83D\uDC96\",\n toast_too_short: \"C'est trop court, essaye encore. \uD83E\uDDD0\",\n // Hardmode\n hardmore_err_correct: \"Tu dois utiliser toutes les lettres correctes \uD83D\uDE36\",\n hardmore_err_present: \"Ton essai doit contenir VAR \uD83D\uDE36\",\n // R\u00E9sultats\n seconds: [\"une seconde\", \"NUM secondes\"],\n minutes: \"minutes\",\n hours: \"heures\",\n deleted0_solved:\n \"Tu es all\u00E9 directement \u00E0 la r\u00E9ponse et tu n'as jamais supprim\u00E9 une seule lettre!\",\n deleted0_failed:\n \"Tu as saisi des mots au hasard et tu n'as jamais corrig\u00E9 une lettre!\",\n deleted_letters: [\n \"En faisant une \u00E9nigme, tu n'as corrig\u00E9 qu'une seule faute de frappe\",\n \"Pendant le puzzle, tu as chang\u00E9 d'avis NUM fois en modifiant une lettre\",\n ],\n deleted0_invalid0: \" Et tu n'as m\u00EAme pas essay\u00E9 de saisir un mot invalide.\",\n invalid_words: [\n \" et a essay\u00E9 d'entrer 1 mot qui n'existe pas vraiment.\",\n \" et a essay\u00E9 de saisir NUM mots qui n'existent pas vraiment.\",\n ],\n puzzle_solved: \"J'ai r\u00E9solu ce PUZZLE_NAME avec des VAR tentatives \",\n puzzle_duration: \"en VAR. Peux-tu faire mieux?\",\n puzzle_failed:\n \"Je n'ai pas r\u00E9ussi \u00E0 r\u00E9soudre ce PUZZLE_NAME avec des VAR tentatives. Le peux-tu?\",\n share_text: \"Peux-tu deviner mon mot?\",\n share_copy: \"Copier le lien\",\n share_copied: \"Copi\u00E9!\",\n copy_result: 'Copier R\u00E9sultat',\n err_highscore: \"Erreur de soumission de highscore. \uD83D\uDE36\",\n },\n de: {\n // Create form\n err_nospaces: \"Ups, keine Leerschl\u00E4ge erlaubt.\",\n err_pattern:\n \"Das kann nicht auf der Tastatur eingegeben werden. M\u00F6chtest du die Sprache wechseln?\",\n err_short: \"Dein Wort sollte mindestens 3 Buchstaben lang sein.\",\n err_long: \"Das Puzzle macht weniger Spass wenn's zu lang wird.\",\n err_dupe: \"Versuche weniger doppelte Buchstaben zu benutzen.\",\n err_rand: \"L\u00E4uft deine Katze \u00FCber die Tastatur?\",\n good_puzzle: \"Das sieht nach einem guten R\u00E4tsel aus!\",\n guess_help: \"Wie viele Versuche l\u00E4sst du zu?\",\n guess_many: \"Soso, heute sind wir grossz\u00FCgig.\",\n guess_few: \"Extra schwer, so mag ich es.\",\n // Dictionary\n dict_loading: \"W\u00F6rterbuch l\u00E4dt noch... \u231B\",\n dict_ready: \"W\u00F6rterbuch ist bereit. \uD83D\uDCD6\",\n dict_error: \"Das Wort kenne ich nicht. \uD83E\uDD13\",\n // Toast popups\n toast_solved: \"Jup! Das ist die L\u00F6sung! \uD83E\uDD73\",\n toast_failed: \"Du hast das Wort nicht herausgefunden \uD83D\uDE22\",\n toast_failed_again: \"Das war auch nicht die L\u00F6sung \uD83D\uDE2D\",\n toast_nodict:\n \"\u274C Kein W\u00F6rterbuch f\u00FCr diese Sprache, bitte Checkbox abw\u00E4hlen.\",\n toast_extralife: \"Extra Leben freigeschaltet! \uD83C\uDF44\",\n toast_share_copied: \"Resultat in die Zwischenablage kopiert! \uD83D\uDC96\",\n toast_too_short: \"Das ist zu kurz, versuche es nochmal. \uD83E\uDDD0\",\n // Hardmode\n hardmore_err_correct: \"Du musst alle richtigen Buchstaben verwenden \uD83D\uDE36\",\n hardmore_err_present: \"Dein Versuch muss VAR enthalten \uD83D\uDE36\",\n // Results\n seconds: [\"eine Sekunde\", \"NUM Sekunden\"],\n minutes: \"Minuten\",\n hours: \"Stunden\",\n deleted0_solved:\n \"Du hast direkt deine Antwort eingegeben und nie einen Buchstaben korrigiert!\",\n deleted0_failed:\n \"Du hast einfach drauf los getippt und nicht mal einen Buchstaben gel\u00F6scht!\",\n deleted_letters: [\n \"Beim L\u00F6sen hast du ein einziges Mal einen Tippfehler korrigiert\",\n \"Beim L\u00F6sen hast du NUM Mal einige Buchstaben gel\u00F6scht\",\n ],\n deleted0_invalid0:\n \" Und du hast nie versucht ein ung\u00FCltiges Wort einzugeben.\",\n invalid_words: [\n \" und 1 Wort versucht, das es gar nicht gibt.\",\n \" und NUM W\u00F6rter eingetippt, die es gar nicht gibt.\",\n ],\n puzzle_solved: \"Ich habe dieses PUZZLE_NAME mit VAR Versuchen gel\u00F6st \",\n puzzle_duration: \"und VAR gebraucht. Kannst du's besser?\",\n puzzle_failed:\n \"Ich konnte dieses PUZZLE_NAME in VAR Versuchen nicht l\u00F6sen. Kannst du es?\",\n share_text: \"Findest du mein Wort heraus?\",\n share_copy: \"Link kopieren\",\n share_copied: \"Kopiert!\",\n copy_result: 'Resultat kopieren',\n err_highscore: \"Fehler beim \u00DCbertragen der Highscore. \uD83D\uDE36\",\n },\n es: {\n // Create form\n err_nospaces: \"Lo siento, no hay espacios.\",\n err_pattern:\n \"No puedes introducir esto en el teclado, prueba a cambiar el idioma...\",\n err_short: \"Su palabra debe tener al menos 3 caracteres.\",\n err_long: \"Es un rompecabezas muy largo, no ser\u00E1 muy divertido.\",\n err_dupe: \"Intente reducir al m\u00EDnimo la duplicaci\u00F3n de cartas.\",\n err_rand: \"S\u00F3lo est\u00E1s machacando el teclado, \u00BFno?\",\n good_puzzle: \"\u00A1Parece un buen puzzle!\",\n guess_help: \"\u00BFCu\u00E1ntos intentos permitir\u00E1?\",\n guess_many: \"Oh, hoy me siento generoso.\",\n guess_few: \"Extra duro, me gusta.\",\n // Dictionary\n dict_loading: \"El diccionario se carga... \u231B\",\n dict_ready: \"El diccionario est\u00E1 preparado. \uD83D\uDCD6\",\n dict_error: \"No conozco esa palabra. \uD83E\uDD13\",\n // Toast popups\n toast_solved: \"\u00A1S\u00ED, lo tienes! \uD83E\uDD73\",\n toast_failed: \"No has encontrado la soluci\u00F3n \uD83D\uDE22\",\n toast_failed_again: \"Esa tampoco era la soluci\u00F3n \uD83D\uDE2D\",\n toast_nodict:\n \"\u274C No hay diccionario para este idioma (todav\u00EDa), por favor desactive la casilla.\",\n toast_extralife: \"\u00A1Desbloqueado una vida extra! \uD83C\uDF44\",\n toast_share_copied: \"Resultado copiado en el portapapeles. \uD83D\uDC96\",\n toast_too_short: \"\u00A1Esa es demasiado corta, intenta otra vez! \uD83E\uDDD0\",\n // Hardmode\n hardmore_err_correct: \"Debes utilizar todas las letras correctas \uD83D\uDE36\",\n hardmore_err_present: \"Tu intento debe contener VAR \uD83D\uDE36\",\n // Results\n seconds: [\"un segundo\", \"NUM segundos\"],\n minutes: \"minutos\",\n hours: \"horas\",\n deleted0_solved:\n \"Has ido directamente a por la respuesta y no has borrado ni una sola letra.\",\n deleted0_failed:\n \"Has introducido algunas palabras al azar y no has corregido ninguna letra.\",\n deleted_letters: [\n \"Aunque es desconcertante, s\u00F3lo ha corregido una \u00FAnica errata.\",\n \"Mientras se desconcierta, se cambia de opini\u00F3n NUM veces cambiando una letra\",\n ],\n deleted0_invalid0:\n \" Y ni siquiera intentaste introducir una palabra inv\u00E1lida.\",\n invalid_words: [\n \" y trat\u00F3 de introducir 1 palabra que realmente no existe.\",\n \" y trat\u00F3 de introducir NUM palabras que realmente no existen.\",\n ],\n puzzle_solved: \"He resuelto esta PUZZLE_NAME con VAR intentos \",\n puzzle_duration: \"en VAR. \u00BFPuedes hacerlo mejor?\",\n puzzle_failed:\n \"No he podido resolver esta PUZZLE_NAME en VAR intentos. \u00BFPuede usted?\",\n share_text: \"\u00BFPuedes adivinar mi palabra?\",\n share_copy: \"Copiar enlace\",\n share_copied: \"\u00A1Copiado!\",\n copy_result: 'Copiar Resultado',\n err_highscore: \"Error al enviar la puntuaci\u00F3n m\u00E1xima. \uD83D\uDE36\",\n },\n};\n\nexport const LANG = document.documentElement.lang;\n\n// Translate text\nexport const _ = (textId, num) => {\n const catalog = i18n[LANG];\n const message = catalog[textId];\n if (!message) {\n console.warn(`invalid i18n: ${textId}`);\n return textId;\n }\n if (num !== undefined && message.length === 2) {\n return message[num === 1 ? 0 : 1].replace(\"NUM\", num);\n } else if (num !== undefined) {\n return message.replace(\"VAR\", num);\n }\n return message;\n};\n\n/**\n * Get duration as text from elapsed seconds\n */\nexport const getDuration = (seconds, minimal = false) => {\n if (seconds < 60) {\n return minimal ? seconds.toFixed(1) : _(\"seconds\", seconds.toFixed(1));\n }\n let minutes = Math.floor(seconds / 60);\n seconds = Math.round(seconds % (minutes * 60))\n .toString()\n .padStart(2, \"0\");\n if (minutes < 60) {\n return `${minutes}:${seconds} ${minimal ? \"\" : _(\"minutes\")}`;\n }\n let hours = Math.floor(minutes / 60);\n minutes = (minutes % (hours * 60)).toString().padStart(2, \"0\");\n if (minimal) {\n hours = hours.toString().padStart(2, \"0\");\n }\n return `${hours}:${minutes}:${seconds} ${minimal ? \"\" : _(\"hours\")}`;\n};\n", "import { pushEvent } from \"./event\";\nimport { getDuration } from \"./language\";\n\n// Modals and UI related code\n\nconst $ = (id) => document.getElementById(id);\nconst sleep = (ms) => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\nlet isOpen = false;\nlet currentModal = null;\n\nexport const isModalOpen = () => isOpen;\nexport const getModalName = () => currentModal;\n\nconst modalBackground = $(\"modal-bg\");\nconst modalContainer = $(\"modal-container\");\nconst modalPanel = $(\"modal-panel\");\n\nlet modalContent;\n\nexport const openModal = async (modalName) => {\n if (isOpen || currentModal) {\n await closeModal();\n }\n\n if (modalName === \"statistics\") {\n createStatistics();\n }\n\n modalContent = $(`modal-${modalName}`);\n\n isOpen = true;\n currentModal = modalName;\n\n // Make the container and content visible\n modalContainer.style.display = \"block\";\n modalContent.style.display = \"block\";\n\n // Fade in the background overlay\n modalBackground.classList.add(\"ease-out\", \"duration-300\", \"opacity-0\");\n setTimeout(() => {\n modalBackground.classList.add(\"opacity-100\");\n modalBackground.classList.remove(\"opacity-0\");\n });\n\n // Animate in the modal itself\n modalPanel.classList.add(\n \"ease-in\",\n \"duration-300\",\n \"opacity-0\",\n \"translate-y-4\",\n \"sm:translate-y-0\",\n \"sm:scale-95\"\n );\n setTimeout(() => {\n modalPanel.classList.add(\"opacity-100\", \"translate-y-0\", \"sm:scale-100\");\n modalPanel.classList.remove(\n \"opacity-0\",\n \"translate-y-4\",\n \"sm:translate-y-0\",\n \"sm:scale-95\"\n );\n });\n};\n\ndocument.querySelectorAll(\"[data-open-modal]\").forEach((el) => {\n el.addEventListener(\"click\", async () => {\n if (isOpen) {\n await closeModal();\n }\n const modalName = el.dataset.openModal;\n if (modalName === \"help\") {\n pushEvent(\"Help\");\n }\n if (modalName === \"statistics\") {\n pushEvent(\"Statistics\");\n }\n openModal(modalName);\n el.blur();\n });\n});\n\nexport const closeModal = async () => {\n if (!window.gameLoaded) {\n document.querySelector(\"#board .js-info\")?.classList.remove(\"hidden\");\n document.querySelector(\"#board .js-error\")?.classList.add(\"hidden\");\n }\n\n if (currentModal === \"help\") {\n localStorage[\"iknowhowtoplay\"] = \"yes\";\n }\n\n // Fade out the background\n modalBackground.classList.add(\"ease-in\", \"duration-200\", \"opacity-100\");\n setTimeout(() => {\n modalBackground.classList.add(\"opacity-0\");\n modalBackground.classList.remove(\"opacity-100\");\n });\n\n modalPanel.classList.add(\n \"ease-in\",\n \"duration-200\",\n \"opacity-100\",\n \"translate-y-0\",\n \"sm:scale-100\"\n );\n setTimeout(() => {\n modalPanel.classList.add(\n \"opacity-0\",\n \"translate-y-4\",\n \"sm:translate-y-0\",\n \"sm:scale-95\"\n );\n modalPanel.classList.remove(\"opacity-100\", \"translate-y-0\", \"sm:scale-100\");\n });\n\n await sleep(200);\n\n modalContainer.style.display = \"none\";\n if (modalContent) {\n modalContent.style.display = \"none\";\n }\n isOpen = false;\n currentModal = null;\n};\n\nconst collectStatistics = () => {\n const statistics = {\n total: 0,\n solved: 0,\n time: 0,\n dist: [],\n };\n const distributions = {};\n\n let gameSlug = null;\n if ($(\"settings\")) {\n const settings = JSON.parse($(\"settings\").innerText);\n if (settings.slug) {\n gameSlug = settings.slug;\n }\n }\n\n // Iterate over all localStorage keys\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n try {\n const game = JSON.parse(localStorage[key]);\n if (gameSlug && gameSlug !== game.game) {\n continue;\n }\n statistics.total++;\n\n if (game.status === \"solved\") {\n statistics.solved++;\n\n // Calculate time running average\n const time = game.stats.end - game.stats.start;\n statistics.time =\n (statistics.time * (statistics.solved - 1) + time) /\n statistics.solved;\n\n // Add to distribution\n if (!distributions[game.currentRow]) {\n distributions[game.currentRow] = 0;\n }\n distributions[game.currentRow]++;\n }\n } catch (e) {}\n }\n\n for (let i = 1; i <= Math.max(...Object.keys(distributions)); i++) {\n statistics.dist.push(distributions[i] || 0);\n }\n\n return statistics;\n};\n\nconst createStatistics = () => {\n const data = collectStatistics();\n\n $(\"stats-total\").innerText = data.total;\n $(\"stats-solved\").innerText = data.solved;\n $(\"stats-solved-percent\").innerText = data.total\n ? `(${Math.round((data.solved / data.total) * 100)}%)`\n : \"\";\n\n let duration = getDuration(data.time, true).trimEnd();\n const durationUnit = duration.split(\":\").length;\n if (durationUnit === 1) {\n duration += \"s\";\n } else if (durationUnit === 2) {\n duration += \"m\";\n } else {\n duration += \"h\";\n }\n $(\"stats-time\").innerText = duration;\n\n const distributionEl = $(\"stats-dist\");\n const distributionMax = Math.max(...data.dist);\n distributionEl.innerHTML = \"\";\n\n data.dist.forEach((count, i) => {\n const el = document.createElement(\"div\");\n const absolutePercent = Math.round((count / data.solved) * 100);\n const relativePercentage = Math.round((count / distributionMax) * 100);\n el.classList.add(\"flex\", \"items-center\");\n el.innerHTML = `\n
${i + 1}
\n `;\n if (count === 0) {\n el.innerHTML += `\n
0
\n `;\n } else {\n el.innerHTML += `\n
5 ? \"justify-between\" : \"justify-end\"\n } items-center p-1 px-2 min-w-min\"\n style=\"width: ${relativePercentage}%;\">\n ${absolutePercent > 5 ? `${absolutePercent}%` : \"\"}\n ${count}\n
\n `;\n }\n distributionEl.appendChild(el);\n });\n};\n\nsetTimeout(async () => {\n // Check if hide sidebar cookie is set\n if (!document.cookie.includes(\"aside=hidden\")) {\n $(\"sidebar\")?.classList.add(\"opacity-100\");\n $(\"sidebar\")?.classList.remove(\"pointer-events-none\");\n $(\"sidebar-close\")?.addEventListener(\"click\", () => {\n // Remember hiding the sidebar for a week in a cookie\n const now = new Date();\n now.setDate(now.getDate() + 7);\n document.cookie = `aside=hidden; expires=${now.toUTCString()}`;\n $(\"sidebar\").classList.remove(\"duration-700\", \"opacity-100\");\n $(\"sidebar\")?.classList.add(\"pointer-events-none\");\n });\n await sleep(3500);\n $(\"sidebar-close\")?.classList.add(\"opacity-100\");\n } else {\n console.info(\"not showing sidebar\");\n }\n}, 10000);\n\ndocument.querySelectorAll(\"[data-modal-close]\").forEach((el) => {\n el.addEventListener(\"click\", () => {\n closeModal();\n });\n});\n", "const $ = (id) => document.getElementById(id);\n\nconst themeButton = $(\"toggle-theme\");\nconst setTheme = (theme) => {\n if (!theme) {\n // Toggle\n theme = document.documentElement.classList.contains(\"dark\")\n ? \"light\"\n : \"dark\";\n }\n if (theme === \"light\") {\n localStorage.theme = \"light\";\n document.documentElement.classList.remove(\"dark\");\n document.querySelector('meta[name=\"theme-color\"]').content = \"#f1f5f9\";\n } else {\n localStorage.theme = \"dark\";\n document.documentElement.classList.add(\"dark\");\n document.querySelector('meta[name=\"theme-color\"]').content = \"#1e293b\";\n }\n};\n\nif (themeButton) {\n if (\n localStorage.theme === \"dark\" ||\n (!(\"theme\" in localStorage) &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches)\n ) {\n setTheme(\"dark\");\n } else {\n setTheme(\"light\");\n }\n themeButton.addEventListener(\"click\", () => setTheme());\n}\n\nconst handleToggle = (buttonEl, identifier, callback) => {\n const toggle = () => {\n // Toggle the value\n const enabled = localStorage[identifier] !== \"true\";\n localStorage[identifier] = enabled ? \"true\" : \"false\";\n\n if (enabled) {\n buttonEl.classList.add(\"!bg-green-600\");\n buttonEl.children[0].classList.add(\"!translate-x-5\");\n } else {\n buttonEl.classList.remove(\"!bg-green-600\");\n buttonEl.children[0].classList.remove(\"!translate-x-5\");\n }\n callback(enabled);\n };\n\n if (localStorage[identifier] === \"true\") {\n callback(true);\n buttonEl.classList.add(\"!bg-green-600\");\n buttonEl.children[0].classList.add(\"!translate-x-5\");\n } else {\n callback(false);\n }\n buttonEl.addEventListener(\"click\", () => toggle());\n};\n\nconst colorblindButton = $(\"toggle-colorblind\");\nhandleToggle(colorblindButton, \"colorblind\", (enabled) => {\n if (enabled) {\n document.documentElement.classList.add(\"colorblind\");\n } else {\n document.documentElement.classList.remove(\"colorblind\");\n }\n});\n\nlet hardmode = false;\nexport const isHardMode = () => hardmode;\n\nconst hardmodeButton = $(\"toggle-hardmode\");\nhandleToggle(hardmodeButton, \"hardmode\", (enabled) => {\n hardmode = enabled;\n});\n"], "mappings": "84BAAA,oBA6BA,YAAoB,EAAM,CACxB,KAAK,KAAO,EAAO,eACnB,KAAK,KAAO,EACZ,KAAK,WAAa,GAGlB,OAAS,GAAI,EAAG,EAAI,KAAK,KAAK,OAAQ,EAAI,EAAG,IAAK,CAChD,GAAI,GAAY,GACZ,EAAO,KAAK,KAAK,WAAW,GAEhC,AAAI,EAAO,MACT,GAAU,GAAK,IAAS,GAAO,WAAc,GAC7C,EAAU,GAAK,IAAS,GAAO,UAAa,GAC5C,EAAU,GAAK,IAAS,GAAO,QAAW,EAC1C,EAAU,GAAK,IAAQ,EAAO,IACzB,AAAI,EAAO,KAChB,GAAU,GAAK,IAAS,GAAO,SAAY,GAC3C,EAAU,GAAK,IAAS,GAAO,QAAW,EAC1C,EAAU,GAAK,IAAQ,EAAO,IACzB,AAAI,EAAO,IAChB,GAAU,GAAK,IAAS,GAAO,QAAW,EAC1C,EAAU,GAAK,IAAQ,EAAO,IAE9B,EAAU,GAAK,EAGjB,KAAK,WAAW,KAAK,GAGvB,KAAK,WAAa,MAAM,UAAU,OAAO,MAAM,GAAI,KAAK,YAEpD,KAAK,WAAW,QAAU,KAAK,KAAK,QACtC,MAAK,WAAW,QAAQ,KACxB,KAAK,WAAW,QAAQ,KACxB,KAAK,WAAW,QAAQ,MAI5B,GAAW,UAAY,CACrB,UAAW,SAAU,EAAQ,CAC3B,MAAO,MAAK,WAAW,QAEzB,MAAO,SAAU,EAAQ,CACvB,OAAS,GAAI,EAAG,EAAI,KAAK,WAAW,OAAQ,EAAI,EAAG,IACjD,EAAO,IAAI,KAAK,WAAW,GAAI,KAKrC,WAAqB,EAAY,EAAmB,CAClD,KAAK,WAAa,EAClB,KAAK,kBAAoB,EACzB,KAAK,QAAU,KACf,KAAK,YAAc,EACnB,KAAK,UAAY,KACjB,KAAK,SAAW,GAGlB,EAAY,UAAU,CAAC,QAAQ,SAAS,EAAK,CAAC,GAAI,GAAQ,GAAI,IAAW,GAAM,KAAK,SAAS,KAAK,GAAS,KAAK,UAAU,MAAO,OAAO,SAAS,EAAI,EAAI,CAAC,GAAG,EAAI,GAAG,KAAK,aAAa,GAAK,EAAI,GAAG,KAAK,aAAa,EAAK,KAAM,IAAI,OAAM,EAAI,IAAI,GACjP,MAAO,MAAK,QAAQ,GAAK,IAAO,eAAe,UAAU,CAAC,MAAO,MAAK,aAAc,KAAK,UAAU,CAAC,KAAK,SAAS,GAAM,KAAK,uBAAwB,SAAS,SAAS,EAAK,EAAY,CAAC,KAAK,YAAY,KAAK,WAAW,EAAE,GAAG,KAAK,QAAQ,GAAI,OAAM,KAAK,aAAa,OAAQ,GAAI,EAAE,EAAI,KAAK,YAAY,IAAM,CAAC,KAAK,QAAQ,GAAK,GAAI,OAAM,KAAK,aAAa,OAAQ,GAAI,EAAE,EAAI,KAAK,YAAY,IAAO,KAAK,QAAQ,GAAK,GAAK,KACja,KAAK,0BAA0B,EAAE,GAAG,KAAK,0BAA0B,KAAK,YAAY,EAAE,GAAG,KAAK,0BAA0B,EAAE,KAAK,YAAY,GAAG,KAAK,6BAA6B,KAAK,qBAAqB,KAAK,cAAc,EAAK,GAAgB,KAAK,YAAY,GAAG,KAAK,gBAAgB,GACxR,KAAK,WAAW,MAAM,MAAK,UAAU,EAAY,WAAW,KAAK,WAAW,KAAK,kBAAkB,KAAK,WAC3G,KAAK,QAAQ,KAAK,UAAU,IAAe,0BAA0B,SAAS,EAAI,EAAI,CAAC,OAAQ,GAAE,GAAG,GAAG,EAAE,IAAK,GAAG,IAAI,GAAG,IAAI,KAAK,aAAa,EAAI,GAAW,OAAQ,GAAE,GAAG,GAAG,EAAE,IAAK,AAAG,EAAI,GAAG,IAAI,KAAK,aAAa,EAAI,GAAW,CAAI,GAAG,GAAG,GAAG,GAAI,IAAG,GAAG,GAAG,IAAM,GAAG,GAAG,GAAG,GAAI,IAAG,GAAG,GAAG,IAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAI,KAAK,QAAQ,EAAI,GAAG,EAAI,GAAG,GAAW,KAAK,QAAQ,EAAI,GAAG,EAAI,GAAG,KAAW,mBAAmB,UAAU,CAAkC,OAA7B,GAAa,EAAM,EAAQ,EAAU,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,SAAS,GAAK,GAAG,GAAI,GAAU,EAAO,aAAa,MAAM,AAAG,IAAG,GAAG,EAAa,IAAW,GAAa,EAAU,EAAQ,GACtlB,MAAO,IAAU,gBAAgB,SAAS,EAAU,EAAc,EAAM,CAAC,GAAI,GAAM,EAAU,qBAAqB,EAAc,GAAW,EAAG,EAAE,KAAK,OAAO,OAAQ,GAAI,EAAE,EAAI,KAAK,QAAQ,OAAO,IAAoB,OAAT,GAAE,EAAI,EAAW,EAAI,EAAE,EAAI,KAAK,QAAQ,GAAK,OAAO,IAAM,CAAC,GAAI,GAAE,EAAI,EAAO,EAAK,KAAK,QAAQ,GAAK,GAAK,AAAG,GAAM,GAAM,UAAU,EAAE,KAAK,EAAM,OAAO,EAAE,GAAG,EAAM,OAAO,EAAE,EAAG,GAAG,EAAM,OAAO,EAAE,EAAG,EAAE,GAAI,EAAM,OAAO,EAAE,EAAE,GAAI,EAAM,WAC/a,MAAO,IAAQ,mBAAmB,UAAU,CAAC,OAAQ,GAAE,EAAE,EAAE,KAAK,YAAY,EAAE,IAAK,AAAG,KAAK,QAAQ,GAAG,IAAI,MAC1G,MAAK,QAAQ,GAAG,GAAI,EAAE,GAAG,GACzB,OAAQ,GAAE,EAAE,EAAE,KAAK,YAAY,EAAE,IAAK,AAAG,KAAK,QAAQ,GAAG,IAAI,MAC7D,MAAK,QAAQ,GAAG,GAAI,EAAE,GAAG,IAAM,2BAA2B,UAAU,CAAoD,OAA/C,GAAI,EAAO,mBAAmB,KAAK,YAAoB,EAAE,EAAE,EAAE,EAAI,OAAO,IAAK,OAAQ,GAAE,EAAE,EAAE,EAAI,OAAO,IAAI,CAAC,GAAI,GAAI,EAAI,GAAO,EAAI,EAAI,GAAG,GAAG,KAAK,QAAQ,GAAK,IAAM,KAC7O,OAAQ,GAAE,GAAG,GAAG,EAAE,IAAK,OAAQ,GAAE,GAAG,GAAG,EAAE,IAAK,AAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAI,GAAG,GAAG,GAAG,EAAI,KAAK,QAAQ,EAAI,GAAG,EAAI,GAAG,GAAW,KAAK,QAAQ,EAAI,GAAG,EAAI,GAAG,KAAa,gBAAgB,SAAS,EAAK,CAAmD,OAA9C,GAAK,EAAO,iBAAiB,KAAK,YAAoB,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,GAAI,GAAK,CAAC,GAAQ,IAAM,EAAG,IAAI,EAAG,KAAK,QAAQ,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,YAAY,EAAE,GAAG,EACxW,OAAQ,GAAE,EAAE,EAAE,GAAG,IAAI,CAAC,GAAI,GAAK,CAAC,GAAQ,IAAM,EAAG,IAAI,EAAG,KAAK,QAAQ,EAAE,EAAE,KAAK,YAAY,EAAE,GAAG,KAAK,MAAM,EAAE,IAAI,IAAO,cAAc,SAAS,EAAK,EAAY,CAAuF,OAAlF,GAAM,KAAK,mBAAmB,EAAG,EAAgB,EAAK,EAAO,eAAe,GAAc,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,GAAI,GAAK,CAAC,GAAQ,IAAM,EAAG,IAAI,EAAG,AAAG,EAAE,EAAG,KAAK,QAAQ,GAAG,GAAG,EAAU,AAAG,EAAE,EAAG,KAAK,QAAQ,EAAE,GAAG,GAAG,EAAU,KAAK,QAAQ,KAAK,YAAY,GAAG,GAAG,GAAG,EACja,OAAQ,GAAE,EAAE,EAAE,GAAG,IAAI,CAAC,GAAI,GAAK,CAAC,GAAQ,IAAM,EAAG,IAAI,EAAG,AAAG,EAAE,EAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,EAAE,GAAG,EAAU,AAAG,EAAE,EAAG,KAAK,QAAQ,GAAG,GAAG,EAAE,EAAE,GAAG,EAAU,KAAK,QAAQ,GAAG,GAAG,EAAE,GAAG,EACpL,KAAK,QAAQ,KAAK,YAAY,GAAG,GAAI,CAAC,GAAQ,QAAQ,SAAS,EAAK,EAAY,CAAsE,OAAjE,GAAI,GAAO,EAAI,KAAK,YAAY,EAAM,EAAS,EAAM,EAAU,EAAU,EAAI,KAAK,YAAY,EAAE,EAAI,EAAE,GAAK,EAAmB,IAAb,GAAK,GAAE,MAAiB,CAAC,OAAQ,GAAE,EAAE,EAAE,EAAE,IAAK,GAAG,KAAK,QAAQ,GAAK,EAAI,IAAI,KAAK,CAAC,GAAI,GAAK,GAAM,AAAG,EAAU,EAAK,QAAQ,GAAQ,GAAK,KAAa,EAAU,IAAI,GACxW,GAAI,GAAK,EAAO,QAAQ,EAAY,EAAI,EAAI,GAAG,AAAG,GAAM,GAAK,CAAC,GAC9D,KAAK,QAAQ,GAAK,EAAI,GAAG,EAAK,IAAc,GAAU,IAAI,KAAY,EAAS,GACtE,GAAT,GAAK,EAAO,EAAI,GAAG,KAAK,aAAa,EAAI,CAAC,GAAK,EAAI,EAAI,CAAC,EAAI,UAAY,EAAY,KAAK,IAAK,EAAY,KAAK,GAAK,EAAY,WAAW,SAAS,EAAW,EAAkB,EAAS,CAA+F,OAA1F,GAAS,EAAU,YAAY,EAAW,GAAuB,EAAO,GAAI,IAAsB,EAAE,EAAE,EAAE,EAAS,OAAO,IAAI,CAAC,GAAI,GAAK,EAAS,GAAG,EAAO,IAAI,EAAK,KAAK,GAAG,EAAO,IAAI,EAAK,YAAY,EAAO,gBAAgB,EAAK,KAAK,IAAa,EAAK,MAAM,GACza,OAAjB,GAAe,EAAU,EAAE,EAAE,EAAE,EAAS,OAAO,IAAK,GAAgB,EAAS,GAAG,UACpF,GAAG,EAAO,kBAAkB,EAAe,EAAG,KAAM,IAAI,OAAM,0BAC7D,EAAO,kBACP,IACA,EAAe,EACf,KAED,IADG,EAAO,kBAAkB,GAAG,EAAe,GAAG,EAAO,IAAI,EAAE,GACxD,EAAO,kBAAkB,GAAG,GAAG,EAAO,OAAO,IACnD,KAAe,IAAO,mBAAmB,EAAe,GACxD,GAAO,IAAI,EAAY,KAAK,GAAM,EAAO,mBAAmB,EAAe,KAC3E,EAAO,IAAI,EAAY,KAAK,GAC5B,MAAO,GAAY,YAAY,EAAO,IAAY,EAAY,YAAY,SAAS,EAAO,EAAS,CAA4H,OAAvH,GAAO,EAAM,EAAW,EAAM,EAAW,EAAM,EAAO,GAAI,OAAM,EAAS,QAAY,EAAO,GAAI,OAAM,EAAS,QAAgB,EAAE,EAAE,EAAE,EAAS,OAAO,IAAI,CAAC,GAAI,GAAQ,EAAS,GAAG,UAAc,EAAQ,EAAS,GAAG,WAAW,EAAQ,EAAW,KAAK,IAAI,EAAW,GAAS,EAAW,KAAK,IAAI,EAAW,GAAS,EAAO,GAAG,GAAI,OAAM,GAAS,OAAQ,GAAE,EAAE,EAAE,EAAO,GAAG,OAAO,IAAK,EAAO,GAAG,GAAG,IAAK,EAAO,OAAO,EAAE,GAClgB,GAAQ,EAAQ,GAAI,GAAO,EAAO,0BAA0B,GAAa,EAAQ,GAAI,IAAa,EAAO,GAAG,EAAO,YAAY,GAAO,EAAQ,EAAQ,IAAI,GAAQ,EAAO,GAAG,GAAI,OAAM,EAAO,YAAY,GAAG,OAAQ,GAAE,EAAE,EAAE,EAAO,GAAG,OAAO,IAAI,CAAC,GAAI,GAAS,EAAE,EAAQ,YAAY,EAAO,GAAG,OAAO,EAAO,GAAG,GAAI,GAAU,EAAG,EAAQ,IAAI,GAAU,GAChU,OAAjB,GAAe,EAAU,EAAE,EAAE,EAAE,EAAS,OAAO,IAAK,GAAgB,EAAS,GAAG,WACrC,OAA3C,GAAK,GAAI,OAAM,GAAoB,EAAM,EAAU,EAAE,EAAE,EAAE,EAAW,IAAK,OAAQ,GAAE,EAAE,EAAE,EAAS,OAAO,IAAK,AAAG,EAAE,EAAO,GAAG,QAAQ,GAAK,KAAS,EAAO,GAAG,IAC/J,OAAQ,GAAE,EAAE,EAAE,EAAW,IAAK,OAAQ,GAAE,EAAE,EAAE,EAAS,OAAO,IAAK,AAAG,EAAE,EAAO,GAAG,QAAQ,GAAK,KAAS,EAAO,GAAG,IAChH,MAAO,IAAO,GAAI,GAAO,CAAC,YAAY,GAAG,EAAE,eAAe,GAAG,EAAE,eAAe,GAAG,EAAE,WAAW,GAAG,GAAO,EAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAO,EAAc,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAAO,EAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,MAAM,IAAK,GAAG,GAAK,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAG,IAAK,GAAG,GAAK,GAAG,GAAK,GAAG,GAAK,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAG,SAAU,GAAG,GAAK,GAAG,GAAK,GAAG,GAAK,GAAG,EAAI,GAAG,EAAG,eAAe,SAAS,EAAK,CAAgB,OAAX,GAAE,GAAM,GAAS,EAAO,YAAY,GAAG,EAAO,YAAY,EAAO,MAAM,GAAG,GAAI,EAAO,KAAM,EAAO,YAAY,GAAG,EAAO,YAAY,EAAO,KACpuC,MAAQ,IAAM,GAAI,GAAG,EAAO,UAAW,iBAAiB,SAAS,EAAK,CAAgB,OAAX,GAAE,GAAM,GAAS,EAAO,YAAY,GAAG,EAAO,YAAY,EAAO,MAAM,GAAG,GAAI,EAAO,KAAM,EAAO,YAAY,GAAG,EAAO,YAAY,EAAO,KACtN,MAAO,IAAM,GAAI,GAAI,YAAY,SAAS,EAAK,CAAa,OAAR,GAAM,EAAQ,GAAM,GAAG,IAAQ,KAAQ,EAC3F,MAAO,IAAQ,mBAAmB,SAAS,EAAW,CAAC,MAAO,GAAO,uBAAuB,EAAW,IAAK,QAAQ,SAAS,EAAY,EAAE,EAAE,CAAC,OAAO,OAAkB,GAAc,WAAW,MAAO,GAAE,GAAG,GAAG,MAAO,GAAc,WAAW,MAAO,GAAE,GAAG,MAAO,GAAc,WAAW,MAAO,GAAE,GAAG,MAAO,GAAc,WAAW,MAAO,GAAE,GAAG,GAAG,MAAO,GAAc,WAAW,MAAO,MAAK,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,IAAI,GAAG,MAAO,GAAc,WAAW,MAAO,GAAE,EAAG,EAAG,EAAE,EAAG,GAAG,MAAO,GAAc,WAAW,MAAQ,GAAE,EAAG,EAAG,EAAE,EAAG,GAAG,GAAG,MAAO,GAAc,WAAW,MAAQ,GAAE,EAAG,EAAG,GAAE,GAAG,GAAG,GAAG,UAAU,KAAM,IAAI,OAAM,mBAAmB,KAAgB,0BAA0B,SAAS,EAAmB,CAA+B,OAA1B,GAAE,GAAI,IAAa,CAAC,GAAG,GAAW,EAAE,EAAE,EAAE,EAAmB,IAAK,EAAE,EAAE,SAAS,GAAI,IAAa,CAAC,EAAE,EAAO,KAAK,IAAI,IACvzB,MAAO,IAAI,gBAAgB,SAAS,EAAK,EAAK,CAAC,GAAG,GAAG,GAAM,EAAK,GAAI,OAAO,OAAW,GAAO,YAAY,MAAO,QAAQ,GAAO,eAAe,MAAO,OAAO,GAAO,eAAe,MAAO,OAAO,GAAO,WAAW,MAAO,WAAU,KAAM,IAAI,OAAM,QAAQ,WAAgB,EAAK,GAAI,OAAO,OAAW,GAAO,YAAY,MAAO,QAAQ,GAAO,eAAe,MAAO,QAAQ,GAAO,eAAe,MAAO,QAAQ,GAAO,WAAW,MAAO,YAAW,KAAM,IAAI,OAAM,QAAQ,WAAgB,EAAK,GAAI,OAAO,OAAW,GAAO,YAAY,MAAO,QAAQ,GAAO,eAAe,MAAO,QAAQ,GAAO,eAAe,MAAO,QAAQ,GAAO,WAAW,MAAO,YAAW,KAAM,IAAI,OAAM,QAAQ,OAAa,MAAM,IAAI,OAAM,QAAQ,IAAS,aAAa,SAAS,EAAO,CAAyD,OAApD,GAAY,EAAO,iBAAqB,EAAU,EAAU,EAAI,EAAE,EAAI,EAAY,IAAO,OAAQ,GAAI,EAAE,EAAI,EAAY,IAAM,CAAiD,OAA5C,GAAU,EAAM,EAAK,EAAO,OAAO,EAAI,GAAa,EAAE,GAAG,GAAG,EAAE,IAAK,GAAG,IAAI,EAAE,GAAG,GAAa,EAAI,GACn9B,OAAQ,GAAE,GAAG,GAAG,EAAE,IAAK,AAAG,EAAI,EAAE,GAAG,GAAa,EAAI,GACjD,GAAG,GAAG,GAAG,GACT,GAAM,EAAO,OAAO,EAAI,EAAE,EAAI,IAAI,IACrC,AAAG,EAAU,GAAG,IAAY,EAAE,EAAU,GACxC,OAAQ,GAAI,EAAE,EAAI,EAAY,EAAE,IAAO,OAAQ,GAAI,EAAE,EAAI,EAAY,EAAE,IAAM,CAAC,GAAI,GAAM,EAAE,AAAG,EAAO,OAAO,EAAI,IAAK,IAAW,EAAO,OAAO,EAAI,EAAE,IAAK,IAAW,EAAO,OAAO,EAAI,EAAI,IAAG,IAAW,EAAO,OAAO,EAAI,EAAE,EAAI,IAAG,IAAW,IAAO,GAAG,GAAO,IAAG,IAAW,GAC5Q,OAAQ,GAAI,EAAE,EAAI,EAAY,IAAO,OAAQ,GAAI,EAAE,EAAI,EAAY,EAAE,IAAO,AAAG,EAAO,OAAO,EAAI,IAAM,CAAC,EAAO,OAAO,EAAI,EAAI,IAAI,EAAO,OAAO,EAAI,EAAI,IAAI,EAAO,OAAO,EAAI,EAAI,IAAI,EAAO,OAAO,EAAI,EAAI,IAAI,CAAC,EAAO,OAAO,EAAI,EAAI,IAAI,EAAO,OAAO,EAAI,EAAI,IAAI,IAAW,IAChR,OAAQ,GAAI,EAAE,EAAI,EAAY,IAAO,OAAQ,GAAI,EAAE,EAAI,EAAY,EAAE,IAAO,AAAG,EAAO,OAAO,EAAI,IAAM,CAAC,EAAO,OAAO,EAAI,EAAE,IAAM,EAAO,OAAO,EAAI,EAAE,IAAM,EAAO,OAAO,EAAI,EAAE,IAAM,EAAO,OAAO,EAAI,EAAE,IAAM,CAAC,EAAO,OAAO,EAAI,EAAE,IAAM,EAAO,OAAO,EAAI,EAAE,IAAM,IAAW,IAChQ,OAAZ,GAAU,EAAU,EAAI,EAAE,EAAI,EAAY,IAAO,OAAQ,GAAI,EAAE,EAAI,EAAY,IAAO,AAAG,EAAO,OAAO,EAAI,IAAM,IACrH,GAAI,GAAM,KAAK,IAAI,IAAI,EAAU,EAAY,EAAY,IAAI,EAAE,UAAW,EAAM,GAAU,IAAiB,EAAO,CAAC,KAAK,SAAS,EAAE,CAAC,GAAG,EAAE,EAAG,KAAM,IAAI,OAAM,QAAQ,EAAE,KACtK,MAAO,GAAO,UAAU,IAAK,KAAK,SAAS,EAAE,CAAC,KAAM,EAAE,GAAG,GAAG,IAC5D,KAAM,GAAG,KAAK,GAAG,IACjB,MAAO,GAAO,UAAU,IAAK,UAAU,GAAI,OAAM,KAAK,UAAU,GAAI,OAAM,MAAM,IAAQ,EAAE,EAAE,EAAE,EAAE,IAAK,EAAO,UAAU,GAAG,GAAG,EAApC,MACxF,IAAQ,EAAE,EAAE,EAAE,IAAI,IAAK,EAAO,UAAU,GAAG,EAAO,UAAU,EAAE,GAAG,EAAO,UAAU,EAAE,GAAG,EAAO,UAAU,EAAE,GAAG,EAAO,UAAU,EAAE,GAAxH,MACR,IAAQ,EAAE,EAAE,EAAE,IAAI,IAAK,EAAO,UAAU,EAAO,UAAU,IAAI,EAArD,MACR,YAAsB,EAAI,EAAM,CAAC,GAAG,EAAI,QAAQ,KAAW,KAAM,IAAI,OAAM,EAAI,OAAO,IAAI,GAC7E,OAAT,GAAO,EAAQ,EAAO,EAAI,QAAQ,EAAI,IAAS,GAAG,IACtD,KAAK,IAAI,GAAI,OAAM,EAAI,OAAO,EAAO,GAAO,OAAQ,GAAE,EAAE,EAAE,EAAI,OAAO,EAAO,IAAK,KAAK,IAAI,GAAG,EAAI,EAAE,GACnG,GAAa,UAAU,CAAC,IAAI,SAAS,EAAM,CAAC,MAAO,MAAK,IAAI,IAAS,UAAU,UAAU,CAAC,MAAO,MAAK,IAAI,QAAS,SAAS,SAAS,EAAE,CAAqD,OAAhD,GAAI,GAAI,OAAM,KAAK,YAAY,EAAE,YAAY,GAAW,EAAE,EAAE,EAAE,KAAK,YAAY,IAAK,OAAQ,GAAE,EAAE,EAAE,EAAE,YAAY,IAAK,EAAI,EAAE,IAAI,EAAO,KAAK,EAAO,KAAK,KAAK,IAAI,IAAI,EAAO,KAAK,EAAE,IAAI,KAClU,MAAO,IAAI,IAAa,EAAI,IAAK,IAAI,SAAS,EAAE,CAAC,GAAG,KAAK,YAAY,EAAE,YAAY,EAAG,MAAO,MACA,OAAzF,GAAM,EAAO,KAAK,KAAK,IAAI,IAAI,EAAO,KAAK,EAAE,IAAI,IAAQ,EAAI,GAAI,OAAM,KAAK,aAAqB,EAAE,EAAE,EAAE,KAAK,YAAY,IAAK,EAAI,GAAG,KAAK,IAAI,GACjJ,OAAQ,GAAE,EAAE,EAAE,EAAE,YAAY,IAAK,EAAI,IAAI,EAAO,KAAK,EAAO,KAAK,EAAE,IAAI,IAAI,GAC3E,MAAO,IAAI,IAAa,EAAI,GAAG,IAAI,KAAM,WAAmB,EAAW,EAAU,CAAC,KAAK,WAAW,EAAW,KAAK,UAAU,EAC5H,EAAU,eAAe,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,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", "names": [] }