{"componentChunkName":"component---node-modules-narative-gatsby-theme-novela-src-templates-article-template-tsx","path":"/sudo-en-linux-con-touch-id-(sin-morir-en-el-intento)","result":{"pageContext":{"article":{"id":"e0b3a7ee-0bcc-52bb-9ef9-3b9497852ea0","slug":"/sudo-en-linux-con-touch-id-(sin-morir-en-el-intento)","secret":false,"title":"sudo en Linux con Touch ID (sin morir en el intento)","author":"Javier Zapata","date":"May 1st, 2026","dateForSEO":"2026-05-01T00:00:00.000Z","timeToRead":4,"excerpt":"Configura el agente SSH de 1Password para usar Touch ID en tu servidor Linux.","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"sudo en Linux con Touch ID (sin morir en el intento)\",\n  \"slug\": \"sudo en Linux con Touch ID (sin morir en el intento)\",\n  \"author\": \"Javier Zapata\",\n  \"date\": \"2026-05-01T00:00:00.000Z\",\n  \"hero\": \"./images/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png\",\n  \"excerpt\": \"Configura el agente SSH de 1Password para usar Touch ID en tu servidor Linux.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"TL;DR\"), \": Con el agente SSH de 1Password, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ForwardAgent yes\"), \" en el Mac y \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"pam_rssh\"), \" en Linux puedes usar Touch ID para autenticarte en servidores remotos, incluyendo \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sudo\"), \".\"), mdx(\"hr\", null), mdx(\"p\", null, \"Desde que cambi\\xE9 Windows por Linux en mi PC principal, me he dado cuenta de que, aunque es una estaci\\xF3n de trabajo y juegos sorprendentemente capaz, cada vez la uso m\\xE1s como servidor que como ordenador al uso; me \\u201Cconecto\\u201D a ella m\\xE1s de lo que me \\u201Csiento\\u201D frente a ella.\"), mdx(\"p\", null, \"De momento ya he conseguido migrar todo mi stack de IA Generativa (\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://comfy.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"ComfyUI\"), \" y \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://vllm.ai/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"vLLM\"), \"), desarrollo ag\\xE9ntico (\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://claude.com/product/claude-code\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Claude Code\"), \") y desarrollo m\\xE1s tradicional a esta m\\xE1quina, aunque tengo la sensaci\\xF3n de que apenas he rascado la superficie de lo que es posible con esta configuraci\\xF3n.\"), mdx(\"p\", null, \"La experiencia ha sido tremendamente \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"gratificante\"), \" y \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"constructiva\"), \". Me ha obligado a desempolvar conocimientos de \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"sysadmin\"), \" de mis tiempos gestionando servidores \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"bare metal\"), \" y VPS primigenios, aprender nuevas t\\xE9cnicas \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"DevOps\"), \" y descubrir un mont\\xF3n de herramientas que hacen que trabajar en la terminal sea, en muchas ocasiones, hasta m\\xE1s eficiente que hacerlo con aplicaciones de escritorio.\"), mdx(\"p\", null, \"Uno de los aspectos en los que m\\xE1s he puesto el foco es en \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"reducir la fricci\\xF3n\"), \" al interactuar con el servidor \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"sin sacrificar la seguridad\"), \". Hasta hace unos a\\xF1os, esto se limitaba a sustituir la autenticaci\\xF3n por contrase\\xF1a con llaves p\\xFAblicas. Eso ayudaba, aunque no me libraba de escribir la contrase\\xF1a de turno. La aparici\\xF3n de los gestores de contrase\\xF1as lo hicieron algo m\\xE1s llevadero, pero no fue hasta la llegada de la autenticaci\\xF3n biom\\xE9trica (\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Touch ID\"), \") cuando realmente empec\\xE9 a ver la luz.\"), mdx(\"p\", null, \"Una de las funciones que m\\xE1s me gusta de \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://1password.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"mi gestor de contrase\\xF1as\"), \" es el agente SSH integrado, que simplifica enormemente el uso de pares de claves de forma segura. Hasta hoy solo lo usaba para autenticarme ante servidores SSH, pero hoy algo en mi cabeza hizo clic (\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://imgur.com/gallery/pacman-syu-H7sK5nq\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"supongo que de tanto actualizar\"), \") y me pregunt\\xE9:\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"\\xBFpodr\\xE9 usar el Touch ID de mi Mac para autenticarme como root en Linux? \")), mdx(\"p\", null, \"Se lo pregunt\\xE9 a Gemini y \\xA1resulta que s\\xED! As\\xED que nos pusimos manos a la obra y, con un poco de ayuda de Claude para resolver el \\xFAltimo escollo, lo conseguimos. Como incluso con ayuda de IA no fue exactamente trivial, he decidido documentar el proceso para quien se encuentre en la misma situaci\\xF3n.\"), mdx(\"h2\", {\n    \"id\": \"objetivo\"\n  }, \"Objetivo\"), mdx(\"p\", null, \"Que al hacer \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ssh\"), \" a mi Linux box (Arch, btw) desde el Mac:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Touch ID solicite confirmaci\\xF3n en el Mac al conectar\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"El agente quede \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"reenviado\"), \" al servidor remoto\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sudo\"), \" en el servidor tambi\\xE9n use Touch ID (v\\xEDa el agente reenviado)\")), mdx(\"h2\", {\n    \"id\": \"el-stack-completo\"\n  }, \"El stack completo\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"2816px\"\n    }\n  }), \"\\n      \", mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"54.559999999999995%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACE0lEQVQozz1RzW7TQBD2i6SkiR2vd73eH++u12u7jhPbSdymNKWVoEVtpQouPYGAEwcuHJF4AO48CK/BwzDuAenTav6+2Zn5vNTV+Xo7ot3pem1Xm6IbXLfLVn3Rn+pqlTUduHbV26ZXZTOmmg5cYUsPxZxKTaWJpUFUxFwnqQWXCsO0ozKjqRkjwsRiLGPKJjJjqSVMecc+CjHFVCCSzBdREMaI8BfTYOYjQgV+hh+SydFsehxABEC5AoQ48eYh5sqWy84UdYAIwgmhfBagydQ/DhBLtbFFEMVgQ1PrlsqUMVM4lphKbxZEQBvOL/O6jWSpyi5b7nlWX93c2apJM3d9+6DziqdGZHl9eWq3rSzLcr9NdOYFKJ4H0WRy5DPLult3+724/6GHp+H8wLXbX715+vRV5RUiTDhXfX7pHnfN4ezdry/2uoedw6xqP3z7WXTnseuRapHepuWmaTewDVdZf3qx7AZpHOYyP+vS1Ylr1hcf74ubwZtMZ8Ort7///N2/fpz7QRDiEOEwIphyP8TKFmXdwNh3759MfkKZJkkKxnB2YDzzZguME7HdH2CrBU5wIiEdUcGkkSaXOqdCESbr9UbnJ0LllGtowWQGZUCOTF62m91y3cNVgQ/KA4S2xlXwM6I8kbppe1vWcOf/GK8NAiyi5Bl0ZBIWxQIMP4znCwJvEFGQFF6ohFQ0Ki/BgBn/AcLtjfQoOlK1AAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n        \", mdx(\"source\", _extends({\n    parentName: \"picture\"\n  }, {\n    \"srcSet\": [\"/static/43396d1f77cf057230f83dd91902c81c/a3bc4/flow-diagram.webp 2500w\", \"/static/43396d1f77cf057230f83dd91902c81c/c1e2d/flow-diagram.webp 2816w\"],\n    \"sizes\": \"(max-width: 2816px) 100vw, 2816px\",\n    \"type\": \"image/webp\"\n  })), \"\\n        \", mdx(\"source\", _extends({\n    parentName: \"picture\"\n  }, {\n    \"srcSet\": [\"/static/43396d1f77cf057230f83dd91902c81c/412e4/flow-diagram.png 2500w\", \"/static/43396d1f77cf057230f83dd91902c81c/ad592/flow-diagram.png 2816w\"],\n    \"sizes\": \"(max-width: 2816px) 100vw, 2816px\",\n    \"type\": \"image/png\"\n  })), \"\\n        \", mdx(\"img\", _extends({\n    parentName: \"picture\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/43396d1f77cf057230f83dd91902c81c/ad592/flow-diagram.png\",\n    \"alt\": \"Diagrama de flujo\",\n    \"title\": \"Diagrama de flujo\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  })), \"\\n      \"), \"\\n    \")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"1-habilitar-el-agente-ssh-en-1password\"\n  }, \"1. Habilitar el agente SSH en 1Password\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1784px\"\n    }\n  }), \"\\n      \", mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"88.78923766816143%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsSAAALEgHS3X78AAADiElEQVQ4y6VUzW4bVRh1QcQKiQxkkdDEKYntmfHY8z9z53/GY8d2G7EAIVWiGxQQVGJRKWpVUWDDK7CoF30BJJ6HJdQsarHgEeJ7P77v+geyxtLRvR77Hp/znXNdA4Ba0dZV81yPAyNg+lmXte6es/ZxiyknbabdUyW6H2msu9mvV+3f91HrwzPt159/qdXequ8epKb9m2d6EDj+jd2zlj1VX/a1/lJXukvlXEF0lsrZGuu9is/Vlkq4UVsK9LXe77VabQ9Ra4bVgz8/+eYFpEkoXM8D13XB9VywLAuyPIOyLKGqKnAcB3Rdh36/D91uFxRVAVVVhaIoEATBX/v7+4eScFKOX19/eQ3VqFpmWSbwoEBSYZqmYIyJOI5FmicijEIRBEyEYSgMwxCdTofIlrhC4Adv9vb2VoSXVTz/8fFnkJcVj8JQKiGVlmVCEsfAEh+yTy3oWRooHZVUgaZpUiWC0973/cVWYTnJ5ldPP4c8K7i3sew6YNk+hPEA8jyBQVUCYwHa7YFlmmDbthwJrpxGcIswGw7mjx5/hTNMOJHRl23bAtPywPYLcLwIPJaCGyRg2Ax6hg3tdgvRJnBabxFOLqfz6x+ewfhizAsMIElSSNMUTNNAYgfyYgCeH4Bh4g85rnyGM8TPTQKnfRRFi52dnRVhcVHNH317Bfen9/lwOAIMBpHLAx5aL4oCwpCBs7ZJFolkDWkZg1rU6/UV4SDJ5188vEJrHqf5UChyRqgkSQuIoxBVJzjLHK15G6sSmDCnlG9Zri4fzL9+8T2UecEjTJUskTLD8nF2A6iGQ2oArhfYy3IbCAF7KQmxh4ttbZLRx/OHT36CQZFhyv66Np5M1MRDFIiHgXgMEcTQ6/W2tcEK3Vb4bv3tpuMF87gYAVaGbzq4sX0xGsF0OoYh1mYyHkE1KOVs6XYQKYJTL7cK33v/gyam+dq25OyoNtubgkqEYTmiqCYiH4xFOZyKJB8KnK1AuxLUQ7KON2qxu7uLhI1GEx/8QRaR6AaJ+JqYAuJJHPGAhbyjqBKKqvH2KgiOKgk3pBbdvZGEjUbjBAkXq9vxHzg4eIdBnI2xQimEUSwRxwkwvJ6kiojILgH3f2MeMpT9ZrP5/PT09BXiJWK2wfHJ6exeS5/ppj/r2+HMcKKZ6SazjqrPjo/vzo6OjggvEa8ODw+/2/x90esO4p3/iTsHBwe1fwAoI9Fq3f+0FgAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n        \", mdx(\"source\", _extends({\n    parentName: \"picture\"\n  }, {\n    \"srcSet\": [\"/static/c7c0410eadfd0ac2641f60aac1d51326/67080/1password-agent.webp 1784w\"],\n    \"sizes\": \"(max-width: 1784px) 100vw, 1784px\",\n    \"type\": \"image/webp\"\n  })), \"\\n        \", mdx(\"source\", _extends({\n    parentName: \"picture\"\n  }, {\n    \"srcSet\": [\"/static/c7c0410eadfd0ac2641f60aac1d51326/dcd69/1password-agent.png 1784w\"],\n    \"sizes\": \"(max-width: 1784px) 100vw, 1784px\",\n    \"type\": \"image/png\"\n  })), \"\\n        \", mdx(\"img\", _extends({\n    parentName: \"picture\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/c7c0410eadfd0ac2641f60aac1d51326/dcd69/1password-agent.png\",\n    \"alt\": \"Ajustes de 1Password Agent\",\n    \"title\": \"Ajustes de 1Password Agent\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  })), \"\\n      \"), \"\\n    \")), mdx(\"p\", null, \"En \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"1Password \\u2192 Preferencias \\u2192 Desarrollador\"), \", activar:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"\\u2705 \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"Usar el agente SSH\"))), mdx(\"p\", null, \"El socket del agente queda en:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {}), \"~/.1password/agent.sock\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"2-configurar-sshconfig-en-el-mac\"\n  }, \"2. Configurar \", mdx(\"inlineCode\", {\n    parentName: \"h2\"\n  }, \"~/.ssh/config\"), \" en el Mac\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-sshconfig\"\n  }), \"Host *\\n  IdentityAgent ~/.1password/agent.sock\\n  ServerAliveInterval 30\\n\\nHost linux\\n  HostName 192.168.1.42\\n  User javi\\n  ForwardAgent yes\\n\")), mdx(\"p\", null, \"El bloque \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Host *\"), \" hace que todos los hosts usen el agente de 1Password por defecto. El \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ForwardAgent yes\"), \" en el host espec\\xEDfico es lo que habilita que el agente viaje al servidor remoto.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"F\\xEDjate\"), \" en que \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ForwardAgent yes\"), \" est\\xE1 solo en el bloque del host \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"linux\"), \" y no en el \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"catch-all\"), \" (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"*\"), \"). Esto es as\\xED porque no es recomendable reenviar tu agente SSH a cualquier servidor, ya que si \\xE9ste est\\xE1 comprometido, podr\\xEDan utilizar tus claves para hacerse pasar por t\\xED.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Ojo con ControlMaster:\"), \" si tienes \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ControlMaster auto\"), \" en un bloque m\\xE1s general que tambi\\xE9n haga match con este host, el socket de control se crea con los settings del primer match. Aseg\\xFArate de que \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ForwardAgent yes\"), \" tambi\\xE9n est\\xE9 en ese bloque m\\xE1s general, o el forwarding nunca llegar\\xE1 a activarse (si esto \\xFAltimo te ha sonado a \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://es.wikipedia.org/wiki/Chino_wenzhoun%C3%A9s\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"chino wenzhoun\\xE9s\"), \", puedes obviarlo).\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"3-configurar-el-servidor-linux\"\n  }, \"3. Configurar el servidor Linux\"), mdx(\"h3\", {\n    \"id\": \"etcsshsshd_configd99-customconf\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"/etc/ssh/sshd_config.d/99-custom.conf\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {}), \"KbdInteractiveAuthentication no\\nUsePAM yes\\nPrintMotd no\\nAllowAgentForwarding yes\\nStreamLocalBindUnlink yes\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"AllowAgentForwarding yes\"), \": imprescindible para que el servidor acepte el agente reenviado\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"StreamLocalBindUnlink yes\"), \": elimina sockets Unix obsoletos al reconectar; evita fallos si la sesi\\xF3n anterior no cerr\\xF3 limpiamente\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"KbdInteractiveAuthentication no\"), \": deshabilita los prompts de contrase\\xF1a; si usas s\\xF3lo claves, es buena pr\\xE1ctica de seguridad\")), mdx(\"h3\", {\n    \"id\": \"etcpamdsudo\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"/etc/pam.d/sudo\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {}), \"#%PAM-1.0\\nauth      sufficient  pam_rssh.so\\nauth      include     system-auth\\naccount   include     system-auth\\nsession   include     system-auth\\n\")), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"pam_rssh\"), \" es lo que permite que PAM autentique usando el agente SSH reenviado. Con \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sufficient\"), \", si el agente responde correctamente, lo que en la pr\\xE1ctica significa que Touch ID se confirma en el Mac, no se pide contrase\\xF1a. Est\\xE1 disponible en el AUR:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"paru -S pam_rssh\\n\")), mdx(\"h3\", {\n    \"id\": \"etcsudoers-vía-visudo\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"/etc/sudoers\"), \" (v\\xEDa \", mdx(\"inlineCode\", {\n    parentName: \"h3\"\n  }, \"visudo\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {}), \"Defaults env_keep += \\\"SSH_AUTH_SOCK\\\"\\n\")), mdx(\"p\", null, \"Por defecto \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sudo\"), \" limpia las variables de entorno, as\\xED que \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SSH_AUTH_SOCK\"), \" desaparecer\\xEDa antes de que \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"pam_rssh\"), \" pudiera leerla. Esta l\\xEDnea la preserva.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"4-el-error-tonto\"\n  }, \"4. El error tonto\"), mdx(\"p\", null, \"Despu\\xE9s de configurar todo lo anterior, el \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"agent forwarding\"), \" segu\\xEDa sin funcionar. \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"$SSH_AUTH_SOCK\"), \" en el servidor apuntaba a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/run/user/1000/ssh-agent.socket\"), \" (un socket inexistente) en lugar del socket reenviado real.\"), mdx(\"p\", null, \"Fui descartando causas una a una:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"# \\xBFHay alg\\xFAn servicio de systemd interfiriendo?\\nsystemctl --user status ssh-agent.socket\\n# \\u2192 disabled and dead \\u2713\\n\\n# \\xBFTiene la variable hardcodeada en el entorno de systemd?\\nsystemctl --user show-environment | grep SSH\\n# \\u2192 nada \\u2713\\n\\n# \\xBFEst\\xE1 en la config del shell?\\ngrep -r SSH_AUTH_SOCK ~/.zshrc ~/.zprofile ~/.zlogin ~/.zshenv\\n# \\u2192 /home/javi/.zshenv: export SSH_AUTH_SOCK=\\\"$XDG_RUNTIME_DIR/ssh-agent.socket\\\"\\n\")), mdx(\"p\", null, \"Ah\\xED estaba. Una l\\xEDnea en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".zshenv\"), \" sobreescrib\\xEDa \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SSH_AUTH_SOCK\"), \" \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"siempre\"), \", incluso despu\\xE9s de que SSH lo hubiera configurado correctamente. Como \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".zshenv\"), \" se carga en todos los contextos de zsh (interactivo, no interactivo, login, no login), ganaba siempre y sin avisar.\"), mdx(\"p\", null, mdx(\"img\", _extends({\n    parentName: \"p\"\n  }, {\n    \"src\": \"/0b1051f5e93c9b218daaf57a92eda5e1/facepalm-react.gif\",\n    \"alt\": \"Infinite facepalm\"\n  }))), mdx(\"p\", null, \"La soluci\\xF3n fue simplemente eliminar esa l\\xEDnea. La hab\\xEDa a\\xF1adido en alg\\xFAn momento para un agente systemd que ya no uso y se me hab\\xEDa olvidado por completo. A ti probablemente no te pasar\\xE1 exactamente esto, pero si el forwarding no funciona, lo primero que deber\\xEDas revisar es si algo en tu shell config est\\xE1 pisando esa variable.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"5-verificación\"\n  }, \"5. Verificaci\\xF3n\"), mdx(\"p\", null, \"Despu\\xE9s de reconectar:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"echo $SSH_AUTH_SOCK\\n# /home/javi/.ssh/agent/s.uRkD2K0GuL.sshd.3m8Qqcp00S  \\u2713\\n\\nssh-add -l\\n# 256 SHA256:xxxx... javi@mac (ED25519)  \\u2713\\n\\nsudo ls /root\\n# \\u2192 Touch ID prompt en el Mac \\u2713\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"resumen-de-archivos-modificados\"\n  }, \"Resumen de archivos modificados\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Archivo\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Qu\\xE9 hace\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Mac: \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"~/.ssh/config\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Apunta al socket de 1Password, habilita ForwardAgent\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Linux: \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"sshd_config.d/\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Habilita AllowAgentForwarding\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Linux: \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"/etc/pam.d/sudo\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Usa pam_rssh para autenticar con el agente\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Linux: \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"/etc/sudoers\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Preserva SSH_AUTH_SOCK al invocar sudo\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Linux: \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"~/.zshenv\")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Eliminar\"), \" cualquier export de SSH_AUTH_SOCK\")))), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"conclusión\"\n  }, \"Conclusi\\xF3n\"), mdx(\"p\", null, \"El proceso en s\\xED no es especialmente complicado, pero tiene bastantes puntos donde puede romperse en silencio. La configuraci\\xF3n puede ser correcta al cien por cien y aun as\\xED no funcionar por algo completamente ajeno a ella, como una variable de entorno sobreescrita en el shell. Eso es lo que hace que este tipo de debugging sea tan frustrante y tambi\\xE9n tan satisfactorio cuando finalmente encaja.\"), mdx(\"p\", null, \"Si lo est\\xE1s configurando y no consigues que funcione, empieza por lo b\\xE1sico: comprueba que \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"$SSH_AUTH_SOCK\"), \" en el servidor apunta a algo real y que ning\\xFAn archivo de configuraci\\xF3n del shell lo est\\xE1 pisando. A partir de ah\\xED, el resto suele ser mucho m\\xE1s directo.\"), mdx(\"p\", null, \"Y si llegas al punto en que Touch ID en el Mac desbloquea un \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sudo\"), \" en tu servidor Linux, reconoce un momento el logro \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"porque mola bastante\"), \".\"));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsSAAALEgHS3X78AAAC40lEQVQozyWOa2/SehzH/8xB239vlF4ojMsKFBijlRbW0nbQlsFgwwlu4ATC8BITE0+OtyeL0Zh4PImeJyeLMTkPzoy+An3iU1+Cr8kak09+v++T7wXMeuZi35ruNY/95mTPmvac03779MCbD7vL64PV8bXVZHw2Ob47mx34LsdyFM3gBEVSjKJqQGCobqOyOnBmPcvfqRk1xWnUW6bhWlbbstu24+62A7y2V9d0QUgkkimOF6MMV1U0QDJsUZZvD+x5Rzfag+bJn9bRSt+fa/vzq3u3lM7NqjtR3ZNAZ7VuTioUs+n8ZjabSqtB8/0b7vLQvj+0Fn5tOrtz7/zfuj/ctrulHW/L9J3+WDE9WWttOSOmYFoNfdJt7TmGZ1sd1wd3u+qDg/qLReePI+PR42evLz63+mNvemYdnmjuoDM6zW1rlCgJcgMVcp6hj/wdWRYym0K5kgNPxsb51P7wcPjX0nv3+tX/l5+PThf24cjsH9W9Xnt/mNiUw5BCKRZEiEOrtlvLhCEI4yAmQvD17+WXN8sfl4+/vb09vDbyh9OiZiZyJTFXzha3d+xWuqQgOI2STOC409OejBtIJLS2HhI3WHBxvnz/fPX948svF0/L1Zrp9it1s6wb+aqWzG/FNiSSS2JMHHIpgDKfXiz+ezpeXwuBULhZqwKnEFUztFngmkUBweCvEoIO4zRCxoKpYUivY+QVlLiCUSGUHDhqLsUDACKQVMp58Oy43tGkUSM9MqQoRSAohqIQDS4GUQgjCPabMIIiGBElCYiEIYQ4GcUJEpzslt/MG/+cOTfsSlHKSFI+mcrGkxk+kYnFU6yYJqMshlNUlGX5BMfQaGQ9tLaGYHgsxoKHffnBoDpuFqzKplYpa6pe00xVd6p6a1tvl5SmVFQlWQlIpqQoTRMkhaAwyIpxAlg4WbPAlzZiGzwTBLMMHec5geNZluP44Md5QRSEpJhIiYl0YMZwAsVJGOzhxJ8i7I8Q2WAHIgAAAABJRU5ErkJggg==","aspectRatio":1.5031847133757963,"src":"/static/e0ec9e09ffa4846ce661e56086d5f151/a1946/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png","srcSet":"/static/e0ec9e09ffa4846ce661e56086d5f151/5b37e/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 236w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/49058/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 472w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/a1946/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 944w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/030f1/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 1416w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/e8b3c/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 1536w","srcWebp":"/static/e0ec9e09ffa4846ce661e56086d5f151/99fbb/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp","srcSetWebp":"/static/e0ec9e09ffa4846ce661e56086d5f151/77392/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 236w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/1f177/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 472w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/99fbb/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 944w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/4a492/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 1416w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/7dd62/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 1536w","sizes":"(max-width: 944px) 100vw, 944px"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsSAAALEgHS3X78AAAC40lEQVQozyWOa2/SehzH/8xB239vlF4ojMsKFBijlRbW0nbQlsFgwwlu4ATC8BITE0+OtyeL0Zh4PImeJyeLMTkPzoy+An3iU1+Cr8kak09+v++T7wXMeuZi35ruNY/95mTPmvac03779MCbD7vL64PV8bXVZHw2Ob47mx34LsdyFM3gBEVSjKJqQGCobqOyOnBmPcvfqRk1xWnUW6bhWlbbstu24+62A7y2V9d0QUgkkimOF6MMV1U0QDJsUZZvD+x5Rzfag+bJn9bRSt+fa/vzq3u3lM7NqjtR3ZNAZ7VuTioUs+n8ZjabSqtB8/0b7vLQvj+0Fn5tOrtz7/zfuj/ctrulHW/L9J3+WDE9WWttOSOmYFoNfdJt7TmGZ1sd1wd3u+qDg/qLReePI+PR42evLz63+mNvemYdnmjuoDM6zW1rlCgJcgMVcp6hj/wdWRYym0K5kgNPxsb51P7wcPjX0nv3+tX/l5+PThf24cjsH9W9Xnt/mNiUw5BCKRZEiEOrtlvLhCEI4yAmQvD17+WXN8sfl4+/vb09vDbyh9OiZiZyJTFXzha3d+xWuqQgOI2STOC409OejBtIJLS2HhI3WHBxvnz/fPX948svF0/L1Zrp9it1s6wb+aqWzG/FNiSSS2JMHHIpgDKfXiz+ezpeXwuBULhZqwKnEFUztFngmkUBweCvEoIO4zRCxoKpYUivY+QVlLiCUSGUHDhqLsUDACKQVMp58Oy43tGkUSM9MqQoRSAohqIQDS4GUQgjCPabMIIiGBElCYiEIYQ4GcUJEpzslt/MG/+cOTfsSlHKSFI+mcrGkxk+kYnFU6yYJqMshlNUlGX5BMfQaGQ9tLaGYHgsxoKHffnBoDpuFqzKplYpa6pe00xVd6p6a1tvl5SmVFQlWQlIpqQoTRMkhaAwyIpxAlg4WbPAlzZiGzwTBLMMHec5geNZluP44Md5QRSEpJhIiYl0YMZwAsVJGOzhxJ8i7I8Q2WAHIgAAAABJRU5ErkJggg==","aspectRatio":1.4954128440366972,"src":"/static/e0ec9e09ffa4846ce661e56086d5f151/3ddd4/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png","srcSet":"/static/e0ec9e09ffa4846ce661e56086d5f151/078a8/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 163w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/e56da/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 327w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/3ddd4/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 653w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/c5cc7/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 980w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/eebd2/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 1306w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/e8b3c/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 1536w","srcWebp":"/static/e0ec9e09ffa4846ce661e56086d5f151/0acdf/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp","srcSetWebp":"/static/e0ec9e09ffa4846ce661e56086d5f151/ac59e/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 163w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/7660b/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 327w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/0acdf/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 653w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/75470/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 980w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/68d47/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 1306w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/7dd62/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 1536w","sizes":"(max-width: 653px) 100vw, 653px"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsSAAALEgHS3X78AAAC40lEQVQozyWOa2/SehzH/8xB239vlF4ojMsKFBijlRbW0nbQlsFgwwlu4ATC8BITE0+OtyeL0Zh4PImeJyeLMTkPzoy+An3iU1+Cr8kak09+v++T7wXMeuZi35ruNY/95mTPmvac03779MCbD7vL64PV8bXVZHw2Ob47mx34LsdyFM3gBEVSjKJqQGCobqOyOnBmPcvfqRk1xWnUW6bhWlbbstu24+62A7y2V9d0QUgkkimOF6MMV1U0QDJsUZZvD+x5Rzfag+bJn9bRSt+fa/vzq3u3lM7NqjtR3ZNAZ7VuTioUs+n8ZjabSqtB8/0b7vLQvj+0Fn5tOrtz7/zfuj/ctrulHW/L9J3+WDE9WWttOSOmYFoNfdJt7TmGZ1sd1wd3u+qDg/qLReePI+PR42evLz63+mNvemYdnmjuoDM6zW1rlCgJcgMVcp6hj/wdWRYym0K5kgNPxsb51P7wcPjX0nv3+tX/l5+PThf24cjsH9W9Xnt/mNiUw5BCKRZEiEOrtlvLhCEI4yAmQvD17+WXN8sfl4+/vb09vDbyh9OiZiZyJTFXzha3d+xWuqQgOI2STOC409OejBtIJLS2HhI3WHBxvnz/fPX948svF0/L1Zrp9it1s6wb+aqWzG/FNiSSS2JMHHIpgDKfXiz+ezpeXwuBULhZqwKnEFUztFngmkUBweCvEoIO4zRCxoKpYUivY+QVlLiCUSGUHDhqLsUDACKQVMp58Oy43tGkUSM9MqQoRSAohqIQDS4GUQgjCPabMIIiGBElCYiEIYQ4GcUJEpzslt/MG/+cOTfsSlHKSFI+mcrGkxk+kYnFU6yYJqMshlNUlGX5BMfQaGQ9tLaGYHgsxoKHffnBoDpuFqzKplYpa6pe00xVd6p6a1tvl5SmVFQlWQlIpqQoTRMkhaAwyIpxAlg4WbPAlzZiGzwTBLMMHec5geNZluP44Md5QRSEpJhIiYl0YMZwAsVJGOzhxJ8i7I8Q2WAHIgAAAABJRU5ErkJggg==","aspectRatio":1.5,"src":"/static/e0ec9e09ffa4846ce661e56086d5f151/502b1/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png","srcSet":"/static/e0ec9e09ffa4846ce661e56086d5f151/f2e6d/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 114w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/4ddba/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 229w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/502b1/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 457w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/7ddc2/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 686w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/435bf/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 914w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/e8b3c/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png 1536w","srcWebp":"/static/e0ec9e09ffa4846ce661e56086d5f151/15384/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp","srcSetWebp":"/static/e0ec9e09ffa4846ce661e56086d5f151/31fce/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 114w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/e3e25/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 229w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/15384/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 457w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/0258d/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 686w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/64ea2/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 914w,\n/static/e0ec9e09ffa4846ce661e56086d5f151/7dd62/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.webp 1536w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/e0ec9e09ffa4846ce661e56086d5f151/6050d/0a0a3aa8-69a7-43f9-8dbb-df2ab9e4c8c5.png"}}},"authors":[{"authorsPage":true,"bio":"Soy un desarrollador ‘Full Stack’, diseñador de UX/UI y –aprendiz de– CRO que lleva cerca de 20 años ayudando a marcas a crecer.\n","id":"bccfcc70-b40f-579c-afcd-599f4be2a7df","name":"Javier Zapata","featured":true,"social":[{"url":"https://www.linkedin.com/in/jzfgo"},{"url":"https://github.com/jzfgo"},{"url":"https://twitter.com/jzfgo"},{"url":"https://instagram.com/jzfgo"}],"slug":"/authors/javier-zapata","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQEC/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB16sPSBOMiwHoH//EABsQAAICAwEAAAAAAAAAAAAAAAECAxIAESIk/9oACAEBAAEFAuTk7UX15cFpRsRnaMxDrI06oTX/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAQQDAAAAAAAAAAAAAAAAAQISITFBETNx/9oACAEBAAY/AhUXk8GIlo+EanwdjQmmSr09GT//xAAcEAADAAIDAQAAAAAAAAAAAAAAAREhMUFRYZH/2gAIAQEAAT8h9BkhOxHoSm3+GCRHhKWMM44ZEs/a2M+pp4Go3RpBpMsH/9oADAMBAAIAAwAAABDQxwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAgEAEAAgEEAgMAAAAAAAAAAAABABEhMUFRcZHR4fDx/9oACAEBAAE/ELDA8zLSGeFq9RABnP1cLMHQIVr9muihtwXnogakQFlLw529Sz1KjxXz5gCC5IpGGDRjef/Z","aspectRatio":1,"src":"/static/913b98a304a3d79914e292e2cc68907b/fa1ea/jzfgo.jpg","srcSet":"/static/913b98a304a3d79914e292e2cc68907b/afb2b/jzfgo.jpg 13w,\n/static/913b98a304a3d79914e292e2cc68907b/7c20e/jzfgo.jpg 25w,\n/static/913b98a304a3d79914e292e2cc68907b/fa1ea/jzfgo.jpg 50w,\n/static/913b98a304a3d79914e292e2cc68907b/03612/jzfgo.jpg 75w,\n/static/913b98a304a3d79914e292e2cc68907b/61cdf/jzfgo.jpg 100w,\n/static/913b98a304a3d79914e292e2cc68907b/b1cc5/jzfgo.jpg 960w","srcWebp":"/static/913b98a304a3d79914e292e2cc68907b/e7b2c/jzfgo.webp","srcSetWebp":"/static/913b98a304a3d79914e292e2cc68907b/58718/jzfgo.webp 13w,\n/static/913b98a304a3d79914e292e2cc68907b/74aad/jzfgo.webp 25w,\n/static/913b98a304a3d79914e292e2cc68907b/e7b2c/jzfgo.webp 50w,\n/static/913b98a304a3d79914e292e2cc68907b/ed320/jzfgo.webp 75w,\n/static/913b98a304a3d79914e292e2cc68907b/66016/jzfgo.webp 100w,\n/static/913b98a304a3d79914e292e2cc68907b/fcc10/jzfgo.webp 960w","sizes":"(max-width: 50px) 100vw, 50px"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQEC/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB16sPSBOMiwHoH//EABsQAAICAwEAAAAAAAAAAAAAAAECAxIAESIk/9oACAEBAAEFAuTk7UX15cFpRsRnaMxDrI06oTX/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAQQDAAAAAAAAAAAAAAAAAQISITFBETNx/9oACAEBAAY/AhUXk8GIlo+EanwdjQmmSr09GT//xAAcEAADAAIDAQAAAAAAAAAAAAAAAREhMUFRYZH/2gAIAQEAAT8h9BkhOxHoSm3+GCRHhKWMM44ZEs/a2M+pp4Go3RpBpMsH/9oADAMBAAIAAwAAABDQxwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAgEAEAAgEEAgMAAAAAAAAAAAABABEhMUFRcZHR4fDx/9oACAEBAAE/ELDA8zLSGeFq9RABnP1cLMHQIVr9muihtwXnogakQFlLw529Sz1KjxXz5gCC5IpGGDRjef/Z","aspectRatio":1,"src":"/static/913b98a304a3d79914e292e2cc68907b/61cdf/jzfgo.jpg","srcSet":"/static/913b98a304a3d79914e292e2cc68907b/7c20e/jzfgo.jpg 25w,\n/static/913b98a304a3d79914e292e2cc68907b/fa1ea/jzfgo.jpg 50w,\n/static/913b98a304a3d79914e292e2cc68907b/61cdf/jzfgo.jpg 100w,\n/static/913b98a304a3d79914e292e2cc68907b/59538/jzfgo.jpg 150w,\n/static/913b98a304a3d79914e292e2cc68907b/fd013/jzfgo.jpg 200w,\n/static/913b98a304a3d79914e292e2cc68907b/b1cc5/jzfgo.jpg 960w","srcWebp":"/static/913b98a304a3d79914e292e2cc68907b/66016/jzfgo.webp","srcSetWebp":"/static/913b98a304a3d79914e292e2cc68907b/74aad/jzfgo.webp 25w,\n/static/913b98a304a3d79914e292e2cc68907b/e7b2c/jzfgo.webp 50w,\n/static/913b98a304a3d79914e292e2cc68907b/66016/jzfgo.webp 100w,\n/static/913b98a304a3d79914e292e2cc68907b/d9b14/jzfgo.webp 150w,\n/static/913b98a304a3d79914e292e2cc68907b/6b183/jzfgo.webp 200w,\n/static/913b98a304a3d79914e292e2cc68907b/fcc10/jzfgo.webp 960w","sizes":"(max-width: 100px) 100vw, 100px"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQEC/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB16sPSBOMiwHoH//EABsQAAICAwEAAAAAAAAAAAAAAAECAxIAESIk/9oACAEBAAEFAuTk7UX15cFpRsRnaMxDrI06oTX/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAQQDAAAAAAAAAAAAAAAAAQISITFBETNx/9oACAEBAAY/AhUXk8GIlo+EanwdjQmmSr09GT//xAAcEAADAAIDAQAAAAAAAAAAAAAAAREhMUFRYZH/2gAIAQEAAT8h9BkhOxHoSm3+GCRHhKWMM44ZEs/a2M+pp4Go3RpBpMsH/9oADAMBAAIAAwAAABDQxwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAgEAEAAgEEAgMAAAAAAAAAAAABABEhMUFRcZHR4fDx/9oACAEBAAE/ELDA8zLSGeFq9RABnP1cLMHQIVr9muihtwXnogakQFlLw529Sz1KjxXz5gCC5IpGGDRjef/Z","aspectRatio":1,"src":"/static/913b98a304a3d79914e292e2cc68907b/ec46e/jzfgo.jpg","srcSet":"/static/913b98a304a3d79914e292e2cc68907b/a2637/jzfgo.jpg 82w,\n/static/913b98a304a3d79914e292e2cc68907b/15203/jzfgo.jpg 164w,\n/static/913b98a304a3d79914e292e2cc68907b/ec46e/jzfgo.jpg 328w,\n/static/913b98a304a3d79914e292e2cc68907b/b69a5/jzfgo.jpg 492w,\n/static/913b98a304a3d79914e292e2cc68907b/23a36/jzfgo.jpg 656w,\n/static/913b98a304a3d79914e292e2cc68907b/b1cc5/jzfgo.jpg 960w","srcWebp":"/static/913b98a304a3d79914e292e2cc68907b/5a48e/jzfgo.webp","srcSetWebp":"/static/913b98a304a3d79914e292e2cc68907b/2d087/jzfgo.webp 82w,\n/static/913b98a304a3d79914e292e2cc68907b/29d87/jzfgo.webp 164w,\n/static/913b98a304a3d79914e292e2cc68907b/5a48e/jzfgo.webp 328w,\n/static/913b98a304a3d79914e292e2cc68907b/42f2e/jzfgo.webp 492w,\n/static/913b98a304a3d79914e292e2cc68907b/dec03/jzfgo.webp 656w,\n/static/913b98a304a3d79914e292e2cc68907b/fcc10/jzfgo.webp 960w","sizes":"(max-width: 328px) 100vw, 328px"}}}],"basePath":"/","permalink":"https://javi.io/sudo-en-linux-con-touch-id-(sin-morir-en-el-intento)/","slug":"/sudo-en-linux-con-touch-id-(sin-morir-en-el-intento)","id":"e0b3a7ee-0bcc-52bb-9ef9-3b9497852ea0","title":"sudo en Linux con Touch ID (sin morir en el intento)","canonicalUrl":null,"mailchimp":"","next":[{"id":"5d5ce904-7c1c-531a-b861-277355602f4e","slug":"/my-recap-of-scrimba's-javascriptmas","secret":false,"title":"My recap of Scrimba’s #JavaScriptmas","author":"Javier Zapata","date":"December 20th, 2020","dateForSEO":"2020-12-20T00:00:00.000Z","timeToRead":6,"excerpt":"It was a fun ride!","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"My recap of Scrimba’s #JavaScriptmas\",\n  \"author\": \"Javier Zapata\",\n  \"date\": \"2020-12-20T00:00:00.000Z\",\n  \"hero\": \"./images/michael-hacker-OM5Zy3_7pGU-unsplash.jpg\",\n  \"excerpt\": \"It was a fun ride!\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This year \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://scrimba.com\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"Scrimba\")), \" is holding an \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Advent calendar\"), \" by releasing daily coding challenges from December 1st to the 24th. They are also giving away \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"free yearly subscriptions\"), \" each day and a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"USD 1,000 grand prize\"), \" at the end.\"), mdx(\"p\", null, \"I\\u2019ve been doing them since day one and I have to say that I\\u2019m having a blast! They are fun little challenges that don\\u2019t take more than five minutes and I find them as a perfect way to end my \\u2013coding\\u2013 day. I specially like to check other\\u2019s people solutions afterwards, as some of them are pretty clever and I can always learn something new.\"), mdx(\"p\", null, \"So, if you haven\\u2019t joined yet, what are your waiting for? It\\u2019s a lot of fun and you could end up winning the big prize! \\uD83E\\uDD11\"), mdx(\"h3\", {\n    \"id\": \"what-is-scrimba\"\n  }, \"What is Scrimba?\"), mdx(\"p\", null, \"In case you didn\\u2019t know already, \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Scrimba\"), \" is a learning platform for developers that teaches coding and other related skills through interactive screencasts, called \\u201Cscrims\\u201D (they\\u2019re pretty neat, you can actually pause them at any time, edit and run code directly!). I\\u2019ve been using it since 2018 and it has become one of my favourite learning platforms. By the way, they have a lot of \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://scrimba.com/topic/free\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"free courses\")), \" if you want to check them out!.\"), mdx(\"p\", null, \"Well, without further ado, here are my solutions:\"), mdx(\"h2\", {\n    \"id\": \"day-1-candies\"\n  }, \"Day 1: Candies\"), mdx(\"h3\", {\n    \"id\": \"challenge\"\n  }, \"Challenge\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"n\"), \" children have got \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"m\"), \" pieces of candy. They want to eat as much candy as they can, but each child must eat exactly the same amount of candy as any other child. Determine how many pieces of candy will be eaten by all the children together. Individual pieces of candy cannot be split.\"), mdx(\"h3\", {\n    \"id\": \"my-solution-\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar/note-at-1-04-coe27449cbdbcdfa608f3b2e0\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function candies(children, candy) {\\n  return Math.floor(candy / children) * children;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution-\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar/javascript-challenge-candies-solution-cGmMvmU6?a=613.347.8.L4_36\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function candies(children, candy) {\\n  const candyPerChild = Math.floor(candy / children);\\n\\n  return candyPerChild * children;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-2-deposit-profit\"\n  }, \"Day 2: Deposit Profit\"), mdx(\"h3\", {\n    \"id\": \"challenge-1\"\n  }, \"Challenge\"), mdx(\"p\", null, \"You have deposited a specific amount of dollars into your bank account. Each year your balance increases at the same growth rate. Find out how long it would take for your balance to pass a specific threshold with the assumption that you don\\u2019t make any additional deposits.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--1\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/coe4d49ac871b2d4e4338b2bc\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function depositProfit(deposit, rate, threshold) {\\n  const COMPOUND_RATE = 1 + rate / 100;\\n  let years = 0;\\n  let holdings = deposit;\\n\\n  while (holdings < threshold) {\\n    years++;\\n    holdings *= COMPOUND_RATE;\\n  }\\n\\n  return years;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--1\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co5324b9dacc7bba7b8cd2ebd\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function depositProfit(deposit, rate, threshold) {\\n  let year = 0;\\n  let currentAccountValue = deposit;\\n\\n  while (threshold > currentAccountValue) {\\n    currentAccountValue += currentAccountValue * (rate / 100);\\n    year++;\\n  }\\n\\n  return year;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-3-chunky-monkey\"\n  }, \"Day 3: Chunky Monkey\"), mdx(\"h3\", {\n    \"id\": \"challenge-2\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Write a function that splits an array (first argument) into groups the length of size (second argument) and returns them as a multidimensional array.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--2\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar/note-at-0-50-co8a646d9b9a9108f60356b16\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function chunkyMonkey(values, size) {\\n  let arr = [];\\n  let offset = 0;\\n  for (let i = 0; i < values.length / size; i++) {\\n    offset = size * i;\\n    arr.push(values.slice(offset, offset + size));\\n  }\\n  return arr;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--2\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/codc845fc9d84a45730390a31\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function chunkyMonkey(values, size) {\\n  const nested = [];\\n  let count = 0;\\n\\n  while (count < values.length) {\\n    nested.push(values.slice(count, (count += size)));\\n  }\\n\\n  return nested;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-4-century-from-year\"\n  }, \"Day 4: Century From Year\"), mdx(\"h3\", {\n    \"id\": \"challenge-3\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given a year, return the century it is in. The first century spans from the year 1 up to and including the year 100, the second - from the year 101 up to and including the year 200, etc.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--3\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar/note-at-1-03-co3984e8f8c6d266ad876e22c\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function centuryFromYear(num) {\\n  const rest = num % 100;\\n\\n  let century = Math.floor(num / 100);\\n  century += rest > 0 ? 1 : 0;\\n\\n  return century;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--3\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co0294451a881cd3a2dcbedf6\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function centuryFromYear(year) {\\n  const century = year / 100;\\n\\n  if (year % 100 === 0) {\\n    return century;\\n  }\\n\\n  return Math.floor(century) + 1;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-5-reverse-a-string\"\n  }, \"Day 5: Reverse a string\"), mdx(\"h3\", {\n    \"id\": \"challenge-4\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Reverse the provided string. You may need to turn the string into an array before you can reverse it. Your result must be a string.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--4\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/coab24925bb2d8fe8248d809f\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function reverseAString(str) {\\n  return str\\n    .split('')\\n    .reverse()\\n    .join('');\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--4\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co29e4357b8ef128ad176480c\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function reverseAString(str) {\\n  let reversedStr = '';\\n\\n  for (let i = str.length - 1; i >= 0; i--) {\\n    reversedStr += str[i];\\n  }\\n\\n  return reversedStr;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-6-sort-by-length\"\n  }, \"Day 6: Sort by Length\"), mdx(\"h3\", {\n    \"id\": \"challenge-5\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given an array of strings, sort them in the order of increasing lengths. If two strings have the same length, their relative order must be the same as in the initial array.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--5\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar/note-at-0-44-co8224dac94a7ab3f0b9c1f26\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function sortByLength(strs) {\\n  return strs.sort((a, b) => a.length - b.length);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--5\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co8764ca48d38e57cd814a9cf\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function sortByLength(strs) {\\n  return strs.sort((str1, str2) => str1.length - str2.length);\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-7-count-vowel-consonant\"\n  }, \"Day 7: Count Vowel Consonant\"), mdx(\"h3\", {\n    \"id\": \"challenge-6\"\n  }, \"Challenge\"), mdx(\"p\", null, \"You are given a string s that consists of only lowercase English letters. If vowels (\\u2018a\\u2019, \\u2018e\\u2019, \\u2018i\\u2019, \\u2018o\\u2019, and \\u2018u\\u2019) are given a value of 1 and consonants are given a value of 2, return the sum of all of the letters in the input string.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--6\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/learn/adventcalendar/note-at-1-11-coa0f45b1bde9f4a4d292a5a6\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function countVowelConsonant(str) {\\n  const counter = (count, char) => {\\n    const isVowel = 'aeiou'.indexOf(char) !== -1;\\n    return count + (isVowel ? 1 : 2);\\n  };\\n\\n  return str.split('').reduce(counter, 0);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--6\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co2e747a2b78b050870fcdf87\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function countVowelConsonant(str) {\\n  const vowels = ['a', 'e', 'i', 'o', 'u'];\\n  const chars = str.split('');\\n  const total = chars.reduce((acc, char) => {\\n    if (vowels.includes(char)) {\\n      return acc + 1;\\n    }\\n\\n    return acc + 2;\\n  }, 0);\\n\\n  return total;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-8-rolling-dice\"\n  }, \"Day 8: Rolling Dice\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Note:\"), \" This challenge involves additional HTML and CSS, so I recommend checking the solutions directly at Scrimba.\"), mdx(\"h3\", {\n    \"id\": \"challenge-7\"\n  }, \"Challenge\"), mdx(\"p\", null, \"In this challenge a casino has asked you to make an online dice that works just like\\nit would in real life. Using the pre-made dice face that represents \\u2018one\\u2019, make the\\nfaces for \\u2018two\\u2019, \\u2018three\\u2019, \\u2018four\\u2019, \\u2018five\\u2019 and \\u2018six\\u2019. Now when the users clicks the\\ndice on the screen the dice is expected to show one of the faces randomly.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--7\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co49f43f4b775ebce95adae72\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const dice = document.querySelector('.dice');\\nconst face = dice.querySelector('.face');\\nconst message = document.querySelector('.message');\\n\\nconst roll = () => Math.ceil(Math.random() * 6);\\n\\ndice.addEventListener('click', (e) => {\\n  const number = roll();\\n  face.className = `face dot-${number}`;\\n  message.innerHTML = `You got a ${number}!`;\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--7\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cob2040579afbc1f3f3642272\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const dice = document.querySelector('.dice');\\nconst allDots = Array.from(document.querySelectorAll('.dice div'));\\n\\nfunction rollDice() {\\n  let randomNumber = 1 + Math.floor(Math.random() * 6);\\n  console.log(randomNumber);\\n\\n  allDots.forEach((dot) => dot.classList.remove(...dot.classList));\\n\\n  if (randomNumber === 1) {\\n    allDots[4].classList.add('dot');\\n  }\\n\\n  if (randomNumber === 2) {\\n    allDots[0].classList.add('dot');\\n    allDots[8].classList.add('dot');\\n  }\\n  if (randomNumber === 3) {\\n    allDots[0].classList.add('dot');\\n    allDots[4].classList.add('dot');\\n    allDots[8].classList.add('dot');\\n  }\\n  if (randomNumber === 4) {\\n    allDots[0].classList.add('dot');\\n    allDots[2].classList.add('dot');\\n    allDots[6].classList.add('dot');\\n    allDots[8].classList.add('dot');\\n  }\\n  if (randomNumber === 5) {\\n    allDots[0].classList.add('dot');\\n    allDots[2].classList.add('dot');\\n    allDots[4].classList.add('dot');\\n    allDots[6].classList.add('dot');\\n    allDots[8].classList.add('dot');\\n  }\\n  if (randomNumber === 6) {\\n    allDots[0].classList.add('dot');\\n    allDots[2].classList.add('dot');\\n    allDots[3].classList.add('dot');\\n    allDots[5].classList.add('dot');\\n    allDots[6].classList.add('dot');\\n    allDots[8].classList.add('dot');\\n  }\\n}\\ndice.addEventListener('click', rollDice);\\n\")), mdx(\"h2\", {\n    \"id\": \"day-9-sum-odd-fibonacci-numbers\"\n  }, \"Day 9: Sum Odd Fibonacci Numbers\"), mdx(\"h3\", {\n    \"id\": \"challenge-8\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given a positive integer num, return the sum of all odd Fibonacci numbers that are less than or equal to num. The first two numbers in the Fibonacci sequence are 1 and 1. Every additional number in the sequence is the sum of the two previous numbers. The first six numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8. For example, sumFibs(10) should return 10 because all odd Fibonacci numbers less than or equal to 10 are 1, 1, 3, and 5.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--8\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cof644d16996ae275c88bb200\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function sumOddFibonacciNumbers(num) {\\n  let a = 1,\\n    b = 1,\\n    sum = a,\\n    tmp;\\n  while (sum < num) {\\n    sum += b % 2 === 0 ? 0 : b;\\n    tmp = a;\\n    a = b;\\n    b += tmp;\\n  }\\n  return sum;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--8\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co1c7479ab799481dfd8a3cd4\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function sumOddFibonacciNumbers(num) {\\n  let sum = 0;\\n  let previous = 0;\\n  let current = 1;\\n\\n  while (current <= num) {\\n    if (current % 2 === 1) {\\n      sum += current;\\n    }\\n\\n    const nextValue = current + previous;\\n    previous = current;\\n    current = nextValue;\\n  }\\n\\n  return sum;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-10-adjacent-elements-product\"\n  }, \"Day 10: Adjacent Elements Product\"), mdx(\"h3\", {\n    \"id\": \"challenge-9\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given an array of integers, find the pair of adjacent elements that has the largest product and return that product.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--9\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co060435d87af0c11b4bf4620\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function adjacentElementsProduct(nums) {\\n  const products = nums.map((num, i, nums) => num * (nums[i + 1] ?? 1));\\n  return Math.max(...products);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--9\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co93f4a82bb211a995c761055\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function adjacentElementsProduct(nums) {\\n  let largestProduct = nums[0] * nums[1];\\n\\n  for (let i = 1; i < nums.length - 1; i++) {\\n    const adjacentProduct = nums[i] * nums[i + 1];\\n\\n    if (largestProduct < adjacentProduct) {\\n      largestProduct = adjacentProduct;\\n    }\\n  }\\n\\n  return largestProduct;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-11-avoid-obstacles\"\n  }, \"Day 11: Avoid Obstacles\"), mdx(\"h3\", {\n    \"id\": \"challenge-10\"\n  }, \"Challenge\"), mdx(\"p\", null, \"You are given an array of integers representing coordinates of obstacles situated on a straight line.\"), mdx(\"p\", null, \"Assume that you are jumping from the point with coordinate 0 to the right. You are allowed only to make jumps of the same length represented by some integer.\"), mdx(\"p\", null, \"Find the minimal length of the jump enough to avoid all the obstacles.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--10\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cobf54396b86fe97b55b00046\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function avoidObstacles(nums) {\\n  let min = 1;\\n  while (nums.some((num) => num % min === 0)) {\\n    min++;\\n  }\\n  return min;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--10\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co31c40f387bf0f984dc7a893\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function avoidObstacles(nums) {\\n  const largestNum = nums.sort((a, b) => a - b)[nums.length - 1];\\n\\n  for (let i = 1; i <= largestNum + 1; i++) {\\n    if (nums.every((value) => value % i !== 0)) {\\n      return i;\\n    }\\n  }\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-12-valid-time\"\n  }, \"Day 12: Valid Time\"), mdx(\"h3\", {\n    \"id\": \"challenge-11\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Check if the given string is a correct time representation of the 24-hour clock.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--11\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/codee494c94137c46bb5434e4\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function validTime(str) {\\n  const [hour, minute] = str.split(':').map((x) => parseInt(x, 10));\\n\\n  return hour >= 0 && hour < 24 && minute >= 0 && minute < 60;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--11\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co32941feaed0a92639e65ee3\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function validTime(str) {\\n  const [hours, minutes] = str.split(':');\\n\\n  if (parseInt(hours) > 23 || parseInt(hours) < 0) {\\n    return false;\\n  }\\n\\n  if (parseInt(minutes) > 59 || parseInt(minutes) < 0) {\\n    return false;\\n  }\\n\\n  return true;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-13-extract-each-kth\"\n  }, \"Day 13: Extract Each Kth\"), mdx(\"h3\", {\n    \"id\": \"challenge-12\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given array of integers, remove each K\\u200Bth element from it.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--12\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co55a459fbd4e155596f12dbe\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function extractEachKth(nums, index) {\\n  return nums.filter((num) => num % index !== 0);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--12\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co095422ebfd362d9a8441303\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function extractEachKth(nums, index) {\\n  return nums.filter((value, i) => (i + 1) % index !== 0);\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-14-maximal-adjacent-difference\"\n  }, \"Day 14: Maximal Adjacent Difference\"), mdx(\"h3\", {\n    \"id\": \"challenge-13\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given an array of integers, find the maximal absolute difference between any two of its adjacent elements.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--13\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co44743c890a8038a8bc2242a\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function arrayMaximalAdjacentDifference(nums) {\\n  const diffs = nums.map((num, i, nums) =>\\n    i ? Math.abs(num - nums[i - 1]) : 0\\n  );\\n\\n  return Math.max(...diffs);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--13\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co3fa430188d7c9254d88f38c\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function arrayMaximalAdjacentDifference(nums) {\\n  let maxDifference = 0;\\n\\n  for (let i = 0; i < nums.length - 1; i++) {\\n    const absoluteDifference = Math.abs(nums[i] - nums[i + 1]);\\n\\n    if (maxDifference < absoluteDifference) {\\n      maxDifference = absoluteDifference;\\n    }\\n  }\\n\\n  return maxDifference;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-15-javascript-carousel\"\n  }, \"Day 15: JavaScript Carousel\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Note:\"), \" This challenge involves additional HTML and CSS, so I recommend checking the solutions directly at Scrimba.\"), mdx(\"h3\", {\n    \"id\": \"challenge-14\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Create a carousel with JavaScript.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--14\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co83944a0825c858480e73f09\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const prevButton = document.querySelector('.previous');\\nconst nextButton = document.querySelector('.next');\\nconst gallery = document.querySelector('.gallery');\\nconst cards = document.querySelectorAll('.card');\\n\\nlet currentCard = 0;\\nconst lastCard = cards.length - 1;\\n\\nconst slide = (num) => {\\n  const prevCard = currentCard;\\n  const nextCard = currentCard + num;\\n\\n  currentCard = Math.max(nextCard, 0);\\n  currentCard = Math.min(currentCard, lastCard);\\n\\n  gallery.style = `transform: translateX(-${currentCard * 220}px);`;\\n  cards[prevCard].classList.remove('current');\\n  cards[currentCard].classList.add('current');\\n\\n  prevButton.style = 'opacity: 1';\\n  nextButton.style = 'opacity: 1';\\n  if (currentCard === 0) {\\n    prevButton.style = 'opacity: .3';\\n  } else if (currentCard === lastCard) {\\n    nextButton.style = 'opacity: .3';\\n  }\\n};\\n\\nnextButton.addEventListener('click', () => slide(1));\\nprevButton.addEventListener('click', () => slide(-1));\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--14\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cobad4d3fb2d3f06ef4cf12f3\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const gallery = document.getElementsByClassName('gallery')[0];\\nconst prevBtn = document.getElementsByClassName('previous')[0];\\nconst nextBtn = document.getElementsByClassName('next')[0];\\nconst galleryCardCount = document.getElementsByClassName('card').length;\\n\\nlet currentGalleryXOffset = 0;\\nconst endGalleryXOffset = (galleryCardCount - 1) * -220;\\n\\nprevBtn.addEventListener('click', galleryClickHandler);\\nnextBtn.addEventListener('click', galleryClickHandler);\\n\\nfunction galleryClickHandler(event) {\\n  let targetBtn = event.target.className;\\n  if (targetBtn == 'previous' && currentGalleryXOffset < 0) {\\n    currentGalleryXOffset += 220;\\n  } else if (targetBtn == 'next' && currentGalleryXOffset > endGalleryXOffset) {\\n    currentGalleryXOffset -= 220;\\n  }\\n\\n  if (currentGalleryXOffset == 0) {\\n    prevBtn.style.opacity = 0.3;\\n    prevBtn.style.cursor = 'default';\\n  } else {\\n    prevBtn.style.opacity = 1; //disabled\\n    prevBtn.style.cursor = 'pointer';\\n  }\\n\\n  if (currentGalleryXOffset == endGalleryXOffset) {\\n    nextBtn.style.opacity = 0.3;\\n    nextBtn.style.cursor = 'default';\\n  } else {\\n    nextBtn.style.opacity = 1;\\n    nextBtn.style.cursor = 'pointer';\\n  }\\n\\n  gallery.style.transform = `translateX(${currentGalleryXOffset}px)`;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-16-insert-dashes\"\n  }, \"Day 16: Insert Dashes\"), mdx(\"h3\", {\n    \"id\": \"challenge-15\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Transform a given sentence into a new one with dashes between each two consecutive letters.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--15\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cob9e41f6825a596cde72c2be\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function insertDashes(arr) {\\n  return arr\\n    .split('')\\n    .join('-')\\n    .replace('- -', ' ');\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--15\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co13a435c9bcd067fcb72cce0\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function insertDashes(str) {\\n  const words = str.split(' ');\\n  const dashedWords = words.map((word) => {\\n    const chars = word.split('');\\n\\n    return chars.join('-');\\n  });\\n\\n  return dashedWords.join(' ');\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-17-different-symbols-naive\"\n  }, \"Day 17: Different symbols naive\"), mdx(\"h3\", {\n    \"id\": \"challenge-16\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given a string, find the number of different characters in it.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--16\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co3da4d45bf8193ecddbe85d8\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function differentSymbolsNaive(str) {\\n  return new Set(str.split('')).size;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--16\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co8d44f3ca6dcb38828a7a014\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function differentSymbolsNaive(str) {\\n  const chars = str.split('');\\n\\n  return new Set(chars).size;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-18-array-previous-less\"\n  }, \"Day 18: Array previous less\"), mdx(\"h3\", {\n    \"id\": \"challenge-17\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given array of integers, for each position i, search among the previous positions for the last (from the left) position that contains a smaller value. Store this value at position i in the answer. If no such value can be found, store -1 instead.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--17\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co39143659b16c7e834157219\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function arrayPreviousLess(nums) {\\n  return nums.map((num, i) => {\\n    const prevNum = nums[i - 1] ?? -1;\\n    return prevNum < num ? prevNum : -1;\\n  });\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--17\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cobe04a8a9b7115311ee775cf\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function arrayPreviousLess(nums) {\\n  const previousLess = [];\\n\\n  for (let i = nums.length - 1; i >= 0; i--) {\\n    for (let j = i; j >= 0; j--) {\\n      if (nums[i] > nums[j]) {\\n        previousLess.unshift(nums[j]);\\n        break;\\n      } else if (j === 0) {\\n        previousLess.unshift(-1);\\n      }\\n    }\\n  }\\n\\n  return previousLess;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-19-alphabet-subsequence\"\n  }, \"Day 19: Alphabet Subsequence\"), mdx(\"h3\", {\n    \"id\": \"challenge-18\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Check whether the given string is a subsequence of the plaintext alphabet.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--18\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co04f4940ba8c88e9479175a7\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function alphabetSubsequence(str) {\\n  const expectedStr = [...new Set(str.split(''))].sort().join('');\\n  return str === expectedStr;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--18\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/coa0146cbb5b839828a496942\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function alphabetSubsequence(str) {\\n  const chars = str.split('');\\n  const charCodes = chars.map((char) => char.charCodeAt(0));\\n\\n  if (new Set(charCodes).size !== charCodes.length) {\\n    return false;\\n  }\\n\\n  for (let i = 0; i < charCodes.length - 1; i++) {\\n    if (charCodes[i] > charCodes[i + 1]) {\\n      return false;\\n    }\\n  }\\n\\n  return true;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-20-domain-type\"\n  }, \"Day 20: Domain Type\"), mdx(\"h3\", {\n    \"id\": \"challenge-19\"\n  }, \"Challenge\"), mdx(\"p\", null, \"GoDaddy makes a lot of different top-level domains available to its customers. A top-level domain is one that goes directly after the last dot (\\u2019.\\u2019) in the domain name, for example .com in example.com. To help the users choose from available domains, GoDaddy is introducing a new feature that shows the type of the chosen top-level domain. You have to implement this feature. To begin with, you want to write a function that labels the domains as \\u201Ccommercial\\u201D, \\u201Corganization\\u201D, \\u201Cnetwork\\u201D or \\u201Cinformation\\u201D for .com, .org, .net or .info respectively. For the given list of domains return the list of their labels.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--19\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/cobf9470496535112dfadcae8\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function domainType(domains) {\\n  const types = new Map([\\n    ['org', 'organization'],\\n    ['com', 'commercial'],\\n    ['net', 'network'],\\n    ['info', 'information'],\\n  ]);\\n\\n  return domains.map((domain) => {\\n    const tld = domain\\n      .split('.')\\n      .pop()\\n      .toLowerCase();\\n    return types.has(tld) ? types.get(tld) : 'unknown';\\n  });\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--19\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co4b94f019e17b4f43ea59095\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function domainType(domains) {\\n  const domainTypes = [];\\n\\n  for (let i = 0; i < domains.length; i++) {\\n    const urlPieces = domains[i].split('.');\\n    const domain = urlPieces[urlPieces.length - 1];\\n\\n    if (domain === 'org') {\\n      domainTypes.push('organization');\\n    } else if (domain === 'com') {\\n      domainTypes.push('commercial');\\n    } else if (domain === 'net') {\\n      domainTypes.push('network');\\n    } else if (domain === 'info') {\\n      domainTypes.push('information');\\n    }\\n  }\\n\\n  return domainTypes;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-21-sum-of-two\"\n  }, \"Day 21: Sum of Two\"), mdx(\"h3\", {\n    \"id\": \"challenge-20\"\n  }, \"Challenge\"), mdx(\"p\", null, \"You have two integer arrays, a and b, and an integer target value v. Determine whether there is a pair of numbers, where one number is taken from a and the other from b, that can be added together to get a sum of v. Return true if such a pair exists, otherwise return false.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--20\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/coad04d9e9c250a097f0ba542\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function sumOfTwo(nums1, nums2, value) {\\n  return nums1.some((num1) => nums2.includes(value - num1));\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--20\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co72347e49afa5a04bd990906\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function sumOfTwo(nums1, nums2, value) {\\n  const map = {};\\n\\n  for (let num of nums1) {\\n    const difference = value - num;\\n    map[difference] = difference;\\n  }\\n\\n  for (let num of nums2) {\\n    if (map.hasOwnProperty(num)) {\\n      return true;\\n    }\\n  }\\n\\n  return false;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-22-extract-matrix-column\"\n  }, \"Day 22: Extract Matrix Column\"), mdx(\"h3\", {\n    \"id\": \"challenge-21\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Given a rectangular matrix and an integer column, return an array containing the elements of the columnth column of the given matrix (the leftmost column is the 0th one).\"), mdx(\"h3\", {\n    \"id\": \"my-solution--21\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co2c547abb03b9db3767c6ec0\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function extractMatrixColumn(matrix, column) {\\n  return matrix.map((rect) => rect[column]);\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--21\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co93b44658f476cf0f6f93278\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"function extractMatrixColumn(matrix, column) {\\n  return matrix.map((row) => row[column]);\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"day-23-social-media-input\"\n  }, \"Day 23: Social Media Input\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Note:\"), \" This challenge involves additional HTML and CSS, so I recommend checking the solutions directly at Scrimba.\"), mdx(\"h3\", {\n    \"id\": \"challenge-22\"\n  }, \"Challenge\"), mdx(\"p\", null, \"We are making a Social Media Character Counter! We want to display the available characters LEFT.\\nUsing the Keydown event should help you here. When the characters reach 20 and below, we want them to turn red. So we will use Javascript to add that styling to it. If the characters drop below 0, we want the button to be disabled BUT if there are only 0 characters left, we should still be able to tweet.\"), mdx(\"p\", null, \"Keydown, addEventListeners, add and remove a class\"), mdx(\"h3\", {\n    \"id\": \"my-solution--22\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/coacc463194b0a48086530fe9\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"const string = document.querySelector('#string');\\nconst btn = document.querySelector('#btn');\\nconst counter = document.querySelector('#counterFooter');\\nconst MAX_LENGTH = 140;\\n\\nstring.addEventListener('keyup', (event) => {\\n  const length = event.target.value.length;\\n  const remaining = MAX_LENGTH - length;\\n\\n  counter.innerText = `${remaining}/${MAX_LENGTH}`;\\n  counter.style.color = remaining <= 20 ? 'red' : 'white';\\n\\n  if (remaining < 0) {\\n    btn.setAttribute('disabled', 'disabled');\\n    btn.className = 'buttonDisabled';\\n  } else {\\n    btn.setAttribute('disabled', '');\\n    btn.className = '';\\n  }\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution\"\n  }, \"Official solution\"), mdx(\"p\", null, \"N/A\"), mdx(\"h1\", {\n    \"id\": \"day-24-test-your-agility\"\n  }, \"Day 24: Test your agility\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Note:\"), \" This challenge involves additional HTML and CSS, so I recommend checking the solutions directly at Scrimba.\"), mdx(\"h3\", {\n    \"id\": \"challenge-23\"\n  }, \"Challenge\"), mdx(\"p\", null, \"Make a counter that increments every 75 milliseconds in the spin() function and display whether the player wins or loses in the stop() function.\"), mdx(\"h3\", {\n    \"id\": \"my-solution--23\"\n  }, \"My solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co89c4c789b44186c1a4e08a2\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// Globals\\nlet targetInt; // The target number to stop the wheel on\\nlet pushed = false; // Has the stop button been pushed - false is default\\n\\n// DOM Elements\\nconst spinningElem = document.getElementById('spinning'); // The spinning number\\nconst buttonElem = document.getElementById('buttonPressed');\\nconst targetElem = document.getElementById('targetNum');\\nconst resultElem = document.getElementById('result'); // Display your result message here\\n\\n// Functions\\nconst sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\\n\\nconst buttonPressed = () => (pushed = true);\\n\\nconst setTargetInt = () => {\\n  targetInt = Math.floor(Math.random() * 101);\\n  targetElem.innerText = targetInt;\\n};\\n\\nconst spin = async () => {\\n  let i = 0;\\n  while (!pushed) {\\n    i = i >= 100 ? 0 : i + 1;\\n    spinningElem.innerText = i;\\n    await sleep(75); // Paste this wherever you need to sleep the incrimentor\\n  }\\n\\n  stop(i); // Trigger this function when the STOP button has been pushed\\n};\\n\\nconst stop = (i) => {\\n  const diff = Math.abs(i - targetInt);\\n\\n  if (diff === 0) {\\n    resultElem.innerText = `Yay! You did it!`;\\n  } else {\\n    resultElem.innerText = `Oh no, you lose! Off by ${diff}`;\\n  }\\n};\\n\\n// Event listeners\\nbuttonElem.addEventListener('click', buttonPressed);\\n\\n// Init\\nsetTargetInt();\\nspin();\\n\")), mdx(\"h3\", {\n    \"id\": \"official-solution--22\"\n  }, \"Official solution (\", mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"https://scrimba.com/scrim/co088427fb17f3f8ff74259e2\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"\\uD83D\\uDD17\"), \")\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-js\"\n  }), \"// javascript\\n\\n//globals\\nvar pushed = false; //Has the stop button been pushed - false is default\\nvar targetInt; //The target number to stop the wheel on\\nvar spinningElem = document.getElementById('spinning'); //The spinning number\\n\\n//event listener\\ndocument\\n  .getElementById('buttonPressed')\\n  .addEventListener('click', buttonPressed);\\n\\n//When the stop button is pushed\\nfunction buttonPressed() {\\n  pushed = true;\\n}\\n\\n//set the target Int\\nfunction setTargetInt() {\\n  var targetElem = document.getElementById('targetNum');\\n  targetInt = Math.floor(Math.random() * 101);\\n  targetElem.innerHTML = targetInt;\\n}\\n\\n//sleep const\\nconst sleep = (milliseconds) => {\\n  return new Promise((resolve) => setTimeout(resolve, milliseconds));\\n};\\n\\n//number spinner\\nconst spin = async () => {\\n  for (var i = 0; i < 101; i++) {\\n    if (i == 100) {\\n      i = 0;\\n    }\\n    if (pushed == true) {\\n      stop(i); //Trigger this function when the STOP button has been pushed\\n      break;\\n    } else {\\n      spinningElem.innerHTML = i;\\n      await sleep(75); //Paste this\\n    }\\n  }\\n};\\n\\nfunction stop(i) {\\n  var offBy = Math.abs(targetInt - (i - 1));\\n  var message;\\n\\n  if (offBy == 0) {\\n    message = 'You Win!';\\n  } else {\\n    message = 'Oh no, you lose! Off by ' + offBy.toString();\\n  }\\n  var result = document.getElementById('result');\\n  result.innerHTML = message;\\n}\\n\\nsetTargetInt();\\nspin();\\n\")), mdx(\"p\", null, \"And that\\u2019s it!\"), mdx(\"p\", null, \"I would like to thank \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://scrimba.com\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"Scrimba\")), \" for organizing this (it was a lot of fun!). And congratulations to \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://twitter.com/bhagwan_gb\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"@bhagwan_gb\")), \", who won the big prize!\"), mdx(\"p\", null, \"See you all on \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://twitter.com/hashtag/JavaScriptmas\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"#\", \"JavaScriptmas\")), \" 2021!\"), mdx(\"p\", null, \"Photo by \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://unsplash.com/@michael_hacker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Michael Hacker\"), \" on \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://unsplash.com/photos/OM5Zy3_7pGU\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Unsplash\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAZXrcTGoH//EABkQAAMBAQEAAAAAAAAAAAAAAAABAhIhMf/aAAgBAQABBQKUZ45F6qaMSz//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAACAwEAAAAAAAAAAAAAAAABEQAQIWH/2gAIAQEABj8CjWUeUCp//8QAGhAAAwEAAwAAAAAAAAAAAAAAAAEhETFB0f/aAAgBAQABPyGdiNy9BmxMvXtDgHhgZTR//9oADAMBAAIAAwAAABADD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFRMUGBcf/aAAgBAQABPxAMlQZWFK9zLOW06NX9iWoHUN3LymNSrvtzXcSyoLSmfJ//2Q==","aspectRatio":1.7744360902255638,"src":"/static/a9207d68d55ad9e3db5bc1606afb07e1/58fe7/michael-hacker-OM5Zy3_7pGU-unsplash.jpg","srcSet":"/static/a9207d68d55ad9e3db5bc1606afb07e1/e0f30/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 236w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/86afd/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 472w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/58fe7/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 944w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/02748/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 1416w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/5c241/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 1888w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/2d578/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 3968w","srcWebp":"/static/a9207d68d55ad9e3db5bc1606afb07e1/99fbb/michael-hacker-OM5Zy3_7pGU-unsplash.webp","srcSetWebp":"/static/a9207d68d55ad9e3db5bc1606afb07e1/77392/michael-hacker-OM5Zy3_7pGU-unsplash.webp 236w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/1f177/michael-hacker-OM5Zy3_7pGU-unsplash.webp 472w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/99fbb/michael-hacker-OM5Zy3_7pGU-unsplash.webp 944w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/4a492/michael-hacker-OM5Zy3_7pGU-unsplash.webp 1416w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/b0b8f/michael-hacker-OM5Zy3_7pGU-unsplash.webp 1888w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/9e996/michael-hacker-OM5Zy3_7pGU-unsplash.webp 3968w","sizes":"(max-width: 944px) 100vw, 944px"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAZXrcTGoH//EABkQAAMBAQEAAAAAAAAAAAAAAAABAhIhMf/aAAgBAQABBQKUZ45F6qaMSz//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAACAwEAAAAAAAAAAAAAAAABEQAQIWH/2gAIAQEABj8CjWUeUCp//8QAGhAAAwEAAwAAAAAAAAAAAAAAAAEhETFB0f/aAAgBAQABPyGdiNy9BmxMvXtDgHhgZTR//9oADAMBAAIAAwAAABADD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFRMUGBcf/aAAgBAQABPxAMlQZWFK9zLOW06NX9iWoHUN3LymNSrvtzXcSyoLSmfJ//2Q==","aspectRatio":1.7717391304347827,"src":"/static/a9207d68d55ad9e3db5bc1606afb07e1/1dc0b/michael-hacker-OM5Zy3_7pGU-unsplash.jpg","srcSet":"/static/a9207d68d55ad9e3db5bc1606afb07e1/3a5ce/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 163w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/05730/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 327w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/1dc0b/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 653w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/f72c7/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 980w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/6e4a3/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 1306w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/2d578/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 3968w","srcWebp":"/static/a9207d68d55ad9e3db5bc1606afb07e1/0acdf/michael-hacker-OM5Zy3_7pGU-unsplash.webp","srcSetWebp":"/static/a9207d68d55ad9e3db5bc1606afb07e1/ac59e/michael-hacker-OM5Zy3_7pGU-unsplash.webp 163w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/7660b/michael-hacker-OM5Zy3_7pGU-unsplash.webp 327w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/0acdf/michael-hacker-OM5Zy3_7pGU-unsplash.webp 653w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/75470/michael-hacker-OM5Zy3_7pGU-unsplash.webp 980w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/68d47/michael-hacker-OM5Zy3_7pGU-unsplash.webp 1306w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/9e996/michael-hacker-OM5Zy3_7pGU-unsplash.webp 3968w","sizes":"(max-width: 653px) 100vw, 653px"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAZXrcTGoH//EABkQAAMBAQEAAAAAAAAAAAAAAAABAhIhMf/aAAgBAQABBQKUZ45F6qaMSz//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAZEAACAwEAAAAAAAAAAAAAAAABEQAQIWH/2gAIAQEABj8CjWUeUCp//8QAGhAAAwEAAwAAAAAAAAAAAAAAAAEhETFB0f/aAAgBAQABPyGdiNy9BmxMvXtDgHhgZTR//9oADAMBAAIAAwAAABADD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFRMUGBcf/aAAgBAQABPxAMlQZWFK9zLOW06NX9iWoHUN3LymNSrvtzXcSyoLSmfJ//2Q==","aspectRatio":1.78125,"src":"/static/a9207d68d55ad9e3db5bc1606afb07e1/eaa58/michael-hacker-OM5Zy3_7pGU-unsplash.jpg","srcSet":"/static/a9207d68d55ad9e3db5bc1606afb07e1/5a3ee/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 114w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/41f8f/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 229w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/eaa58/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 457w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/c309b/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 686w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/e3008/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 914w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/2d578/michael-hacker-OM5Zy3_7pGU-unsplash.jpg 3968w","srcWebp":"/static/a9207d68d55ad9e3db5bc1606afb07e1/15384/michael-hacker-OM5Zy3_7pGU-unsplash.webp","srcSetWebp":"/static/a9207d68d55ad9e3db5bc1606afb07e1/31fce/michael-hacker-OM5Zy3_7pGU-unsplash.webp 114w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/e3e25/michael-hacker-OM5Zy3_7pGU-unsplash.webp 229w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/15384/michael-hacker-OM5Zy3_7pGU-unsplash.webp 457w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/0258d/michael-hacker-OM5Zy3_7pGU-unsplash.webp 686w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/64ea2/michael-hacker-OM5Zy3_7pGU-unsplash.webp 914w,\n/static/a9207d68d55ad9e3db5bc1606afb07e1/9e996/michael-hacker-OM5Zy3_7pGU-unsplash.webp 3968w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/a9207d68d55ad9e3db5bc1606afb07e1/0ff54/michael-hacker-OM5Zy3_7pGU-unsplash.jpg"}}},{"id":"4dd4f7f8-8526-532f-99ae-379fa61b9e89","slug":"/servicios-de-pago-ofrecidos-gratuitamente-debido-al-coronavirus-covid-19","secret":false,"title":"Servicios de pago ofrecidos gratuitamente debido al Coronavirus COVID-19","author":"Javier Zapata","date":"March 20th, 2020","dateForSEO":"2020-03-20T00:00:00.000Z","timeToRead":1,"excerpt":"Recursos para sobrellevar el confinamiento.","canonical_url":null,"subscription":true,"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Servicios de pago ofrecidos gratuitamente debido al Coronavirus COVID-19\",\n  \"author\": \"Javier Zapata\",\n  \"date\": \"2020-03-20T00:00:00.000Z\",\n  \"hero\": \"./images/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg\",\n  \"excerpt\": \"Recursos para sobrellevar el confinamiento.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Desde el incio del estado de alarma tanto en Espa\\xF1a como en otros paises muchas empresas (grandes y peque\\xF1as) est\\xE1n facilitando el acceso a sus servicios de pago de forma grauita, con el objetivo de ayudar a otras empresas, aut\\xF3nomos y dem\\xE1s ciudadanos a sobrellevar esta crisis.\"), mdx(\"p\", null, \"Para aportar mi granito de arena, he empezado a recopilar una lista de estos servicios que comparto aqu\\xED. La ir\\xE9 actualizando seg\\xFAn encuentre nuevos y reciba vuestras contribuciones.\"), mdx(\"p\", null, \"Si quieres contribuir a esta lista, puedes escribirme a \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"mailto:javierzapata82@gmail.com?subject=%5BCoronafreemium%5D%20Servicio\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"javierzapata82@gmail.com\"), \" y si quieres ayudarme a difundirlo, puedes hacerlo utilizando el \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"hashtag\"), \" \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://twitter.com/search?q=%23coronafreemium\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"#coronafreemium\"), \".\"), mdx(\"h2\", {\n    \"id\": \"aprendizaje\"\n  }, \"Aprendizaje\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Domestika (acceso indefinido):\"), \" Selecci\\xF3n de cursos creativos. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://www.domestika.org/quedateencasa\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Capaball (2 meses gratis):\"), \" Planes de formaci\\xF3n impulsados por Inteligencia Artificial. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://capaball.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"NeuroK (acceso indefinido):\"), \" Comunidad de aprendizaje basada en la neurodid\\xE1ctica. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://neurok.es/coronavirus-acceso-gratis/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cambridge University Press (acceso hasta final de mayo):\"), \" Editorial de la Universidad de Cambridge \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://www.cambridge.org/about-us/covid-19/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CodelyTV (1 mes gratis):\"), \" Plataforma de aprendizaje para programadores. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://twitter.com/CodelyTV/status/1240272977830305792\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Coursera (75 certificados gratuitos):\"), \" Plataforma de aprendizaje con cursos de universidades y empresas de todo el mundo. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://www.freecodecamp.org/news/coronavirus-coursera-free-certificate/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Google Cloud (1 mes gratis Coursera/Pluralsight/Qwiklabs):\"), \" Proveedor de servicios de computaci\\xF3n en la nube. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://inthecloud.withgoogle.com/training-discount/register.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Execute Program (gratis durante el mes de abril):\"), \" Plataforma de aprendizaje orientada a desarrolladores web. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://twitter.com/exec_prog/status/1245757921922895872\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pluralsight (gratis durante el mes de abril):\"), \" Plataforma de aprendizaje para profesionales tecnol\\xF3gicos. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://www.pluralsight.com/blog/news/stay-home-skill-up-for-free\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"h2\", {\n    \"id\": \"salud\"\n  }, \"Salud\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fitbit Coach (90 d\\xEDas gratis):\"), \" Rutinas de entrenamiento en v\\xEDdeo. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://blog.fitbit.com/letter-from-ceo/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"h2\", {\n    \"id\": \"comunicación\"\n  }, \"Comunicaci\\xF3n\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Microsoft Teams (6 meses gratis):\"), \" Herramienta de comunicaci\\xF3n y trabajo en equipo. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://teams.microsoft.com/start\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"h2\", {\n    \"id\": \"creatividad\"\n  }, \"Creatividad\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Affinity (90 d\\xEDas gratis):\"), \" Suite de herramientas creativas profesionales. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://affinity.serif.com/es/supporting-the-creative-community/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"h2\", {\n    \"id\": \"seguridad\"\n  }, \"Seguridad\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"1Password Business (6 meses gratis):\"), \" Gestor de contrase\\xF1as para empresas en la nube. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://1password.com/es/business/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"h2\", {\n    \"id\": \"gestión-administrativa\"\n  }, \"Gesti\\xF3n administrativa\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Infoaut\\xF3nomos (1 mes gratis):\"), \" Plantillas, seminarios, gu\\xEDas y m\\xE1s recursos \\xFAtiles para aut\\xF3nomos. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://www.infoautonomos.com/login/?next=/cuenta/mes-regalo/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"h2\", {\n    \"id\": \"entretenimiento\"\n  }, \"Entretenimiento\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"My Opera Player:\"), \" \\xD3peras en v\\xEDdeo bajo demanda. \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://likes.movistar.es/cultura-y-ocio/cultura/my-opera-player-gratis-todos\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Enlace\"))), mdx(\"p\", null, \"Foto por \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://unsplash.com/@fusion_medical_animation\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Fusion Medical Animation\"), \" en \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://unsplash.com/photos/EAgGqOiDDMg\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }), \"Unsplash\")));\n}\n;\nMDXContent.isMDXComponent = true;","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGWVqKyKK//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQISAxEi/9oACAEBAAEFAlQmqS2IzPs//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8BZ//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAXEAEAAwAAAAAAAAAAAAAAAAARABIg/9oACAEBAAY/AisM/wD/xAAbEAEAAgIDAAAAAAAAAAAAAAABACEQETFRYf/aAAgBAQABPyEsVZiLfzc37juI3eMf/9oADAMBAAIAAwAAABAPz//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAEDAQE/EKP/xAAXEQEAAwAAAAAAAAAAAAAAAAABEBEh/9oACAECAQE/EBy4f//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFBMVFhkf/aAAgBAQABPxAVCo40+dQzUB4Ksle32JXOmJCwAHhLXln/2Q==","aspectRatio":1.7744360902255638,"src":"/static/1a27355fd1e280ac2a48d61f637d38fe/58fe7/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg","srcSet":"/static/1a27355fd1e280ac2a48d61f637d38fe/e0f30/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 236w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/86afd/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 472w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/58fe7/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 944w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/02748/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 1416w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/5c241/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 1888w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/ff044/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 4000w","srcWebp":"/static/1a27355fd1e280ac2a48d61f637d38fe/99fbb/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp","srcSetWebp":"/static/1a27355fd1e280ac2a48d61f637d38fe/77392/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 236w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/1f177/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 472w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/99fbb/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 944w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/4a492/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 1416w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/b0b8f/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 1888w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/838eb/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 4000w","sizes":"(max-width: 944px) 100vw, 944px"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGWVqKyKK//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQISAxEi/9oACAEBAAEFAlQmqS2IzPs//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8BZ//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAXEAEAAwAAAAAAAAAAAAAAAAARABIg/9oACAEBAAY/AisM/wD/xAAbEAEAAgIDAAAAAAAAAAAAAAABACEQETFRYf/aAAgBAQABPyEsVZiLfzc37juI3eMf/9oADAMBAAIAAwAAABAPz//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAEDAQE/EKP/xAAXEQEAAwAAAAAAAAAAAAAAAAABEBEh/9oACAECAQE/EBy4f//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFBMVFhkf/aAAgBAQABPxAVCo40+dQzUB4Ksle32JXOmJCwAHhLXln/2Q==","aspectRatio":1.7717391304347827,"src":"/static/1a27355fd1e280ac2a48d61f637d38fe/1dc0b/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg","srcSet":"/static/1a27355fd1e280ac2a48d61f637d38fe/3a5ce/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 163w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/05730/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 327w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/1dc0b/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 653w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/f72c7/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 980w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/6e4a3/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 1306w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/ff044/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 4000w","srcWebp":"/static/1a27355fd1e280ac2a48d61f637d38fe/0acdf/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp","srcSetWebp":"/static/1a27355fd1e280ac2a48d61f637d38fe/ac59e/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 163w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/7660b/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 327w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/0acdf/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 653w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/75470/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 980w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/68d47/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 1306w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/838eb/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 4000w","sizes":"(max-width: 653px) 100vw, 653px"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGWVqKyKK//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQISAxEi/9oACAEBAAEFAlQmqS2IzPs//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8BZ//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAXEAEAAwAAAAAAAAAAAAAAAAARABIg/9oACAEBAAY/AisM/wD/xAAbEAEAAgIDAAAAAAAAAAAAAAABACEQETFRYf/aAAgBAQABPyEsVZiLfzc37juI3eMf/9oADAMBAAIAAwAAABAPz//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAEDAQE/EKP/xAAXEQEAAwAAAAAAAAAAAAAAAAABEBEh/9oACAECAQE/EBy4f//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFBMVFhkf/aAAgBAQABPxAVCo40+dQzUB4Ksle32JXOmJCwAHhLXln/2Q==","aspectRatio":1.78125,"src":"/static/1a27355fd1e280ac2a48d61f637d38fe/eaa58/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg","srcSet":"/static/1a27355fd1e280ac2a48d61f637d38fe/5a3ee/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 114w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/41f8f/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 229w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/eaa58/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 457w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/c309b/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 686w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/e3008/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 914w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/ff044/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg 4000w","srcWebp":"/static/1a27355fd1e280ac2a48d61f637d38fe/15384/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp","srcSetWebp":"/static/1a27355fd1e280ac2a48d61f637d38fe/31fce/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 114w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/e3e25/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 229w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/15384/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 457w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/0258d/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 686w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/64ea2/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 914w,\n/static/1a27355fd1e280ac2a48d61f637d38fe/838eb/fusion-medical-animation-EAgGqOiDDMg-unsplash.webp 4000w","sizes":"(max-width: 457px) 100vw, 457px"},"seo":{"src":"/static/1a27355fd1e280ac2a48d61f637d38fe/0ff54/fusion-medical-animation-EAgGqOiDDMg-unsplash.jpg"}}}]}},"staticQueryHashes":["1143375668","1491088328","1921650733","2068910035","2444214635"]}