From 7020a7495d1f151ecda00d01d5ffc93f4ba9f2f2 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Tue, 12 Nov 2024 07:46:56 +0100 Subject: [PATCH] Translations update from Hosted Weblate (#5932) Translations update from [Hosted Weblate](https://hosted.weblate.org) for [Hedy/Adventures](https://hosted.weblate.org/projects/hedy/adventures/). It also includes following components: * [Hedy/slides](https://hosted.weblate.org/projects/hedy/slides/) * [Hedy/Tutorials](https://hosted.weblate.org/projects/hedy/tutorials/) * [Hedy/Texts](https://hosted.weblate.org/projects/hedy/web-texts/) * [Hedy/Quizzes](https://hosted.weblate.org/projects/hedy/quizzes/) * [Hedy/Keywords](https://hosted.weblate.org/projects/hedy/keywords/) * [Hedy/Cheatsheets](https://hosted.weblate.org/projects/hedy/commands/) * [Hedy/client-messages](https://hosted.weblate.org/projects/hedy/client-messages/) * [Hedy/Webpages](https://hosted.weblate.org/projects/hedy/webpages/) * [Hedy/Parsons](https://hosted.weblate.org/projects/hedy/parsons/) Current translation status: ![Weblate translation status](https://hosted.weblate.org/widget/hedy/adventures/horizontal-auto.svg) Co-Authored-By: R_SACI Co-Authored-By: zoom.quiet Co-Authored-By: gallegonovato Co-Authored-By: Kamborio --- content/adventures/es.yaml | 12 +- content/client-messages/es.yaml | 2 +- content/pages/es.yaml | 457 ++++++++++++++++++++--- content/pages/zh_Hans.yaml | 289 +++++++++++--- content/parsons/zh_Hans.yaml | 43 +++ content/quizzes/es.yaml | 20 +- content/slides/es.yaml | 4 +- static/js/appbundle.js | 6 +- static/js/appbundle.js.map | 2 +- static/js/message-translations.ts | 6 +- translations/es/LC_MESSAGES/messages.po | 8 +- translations/kab/LC_MESSAGES/messages.po | 131 +++---- 12 files changed, 768 insertions(+), 212 deletions(-) diff --git a/content/adventures/es.yaml b/content/adventures/es.yaml index 8f655f71e42..dec01314ad2 100644 --- a/content/adventures/es.yaml +++ b/content/adventures/es.yaml @@ -630,7 +630,7 @@ adventures: 7: story_text: |- ### Ejercicio - Sorpresa! Este programa parece mas una salida que un código. Y aún, no queremos que solo agregues comandos `{print}` frente a cada linea. + Sorpresa! Este programa parece más un resultado que un código. Y aún, no queremos que solo agregues comandos `{print}` frente a cada linea. Arregla este programa para convertirlo en the nursery rhyme 'Brother John (Frère Jaques)' usando por su puesto el comando {repeat} ! example_code: | **¡Atención! Este código necesita ser depurado!** @@ -702,7 +702,7 @@ adventures: 11: story_text: |- ### Ejercicio - Depura este programa de calendario. Se supone que la salida de este programa debe parecerse a una lista de fechas. + Depura este programa de calendario. Se supone que el resultado de este programa debe parecerse a una lista de fechas. Por ejemplo: ``` @@ -2595,12 +2595,12 @@ adventures: ``` story_text_2: | ## Contracciones - ¡Importante! Ten en cuenta que estamos usando comillas, Hedy se confundirá cuando uses el apóstrofe para contracciones como I'm o What's. - Asegúrate de eliminar esos apóstrofes y cambia la ortografía a I am o What is. - Comprueba el código de ejemplo para ver la forma incorrecta de usar los apóstrofes. + ¡Importante! Ten en cuenta que estamos usando comillas, Hedy se confundirá cuando uses el apóstrofo para contracciones como I'm o What's. + Asegúrate de eliminar esos apóstrofos y cambia la ortografía a I am o What is. + Comprueba el código de ejemplo para ver la forma incorrecta de usar los apóstrofos. example_code_2: | ``` - _ Esta es la manera incorrecta de usar apóstrofes _ + _ Esta es la manera incorrecta de usar apóstrofos _ {print} 'I'm babysitting my sister's kids' {print} 'What's more fun than that?' ``` diff --git a/content/client-messages/es.yaml b/content/client-messages/es.yaml index e9bce8c79f1..dfe1e917eb8 100644 --- a/content/client-messages/es.yaml +++ b/content/client-messages/es.yaml @@ -1,6 +1,6 @@ CheckInternet: Comprueba si tu conexión a Internet funciona. Connection_error: No se ha podido conectar con el servidor. -Empty_output: Este código funciona pero no imprime nada. Agrega un comando print a tu código o usa una tortuga para mostrar salida. +Empty_output: Este código funciona pero no imprime nada. Agrega un comando print a tu código o usa una tortuga para mostrar el resultado. Errors_found: ¡Has cometido un error! No te preocupes, seguimos ejecutando el programa Execute_error: Algo salió mal mientras se ejecutaba el programa. Other_error: ¡Ups! Quizás hemos cometido un pequeño error. diff --git a/content/pages/es.yaml b/content/pages/es.yaml index 43fd46a695e..2707aa6b157 100644 --- a/content/pages/es.yaml +++ b/content/pages/es.yaml @@ -324,7 +324,7 @@ teacher-guide: text: Para los profesores también es posible crear su propia aventura. Este video te muestra como crear tu propia aventura como un profesor y añadirla a tu(s) clase(s). - title: Aventuras públicas text: |- - ¿Te gustaría usar aventuras hechas por otros profesores? Entonces puedes visitar nuestra página de aventuras públicas. Aquí puedes encontrar todas las aventuras hechas por otros profesores de todo el mundo. Para encontrar un buen ajuste para ti, puedes seleccionar un nivel, idioma e incluso una etiqueta. ¿Has encontrado una aventura que te gustaría usar? Entonces puedes pulsar 'clon' para hacer una copia de esa aventura a tu propia cuenta. Puedes editar el clon a tu gusto y añadir la aventura a tu clase de la misma manera que lo harías en tus propias aventuras. No puede editar el original, por lo que siempre estará a salvo. ¿Has creado una aventura que te gustaría añadir a las aventuras públicas? Marque la casilla que hace su aventura disponible públicamente al crear + ¿Te gustaría utilizar aventuras creadas por otros profesores? Entonces puedes visitar nuestra página de aventuras públicas. Aquí puedes encontrar todas las aventuras creadas por otros profesores de todo el mundo. Para encontrar la que mejor se adapte a ti, puedes seleccionar un nivel, un idioma e incluso una etiqueta. ¿Has encontrado una aventura que te gustaría utilizar? Luego puedes presionar "clonar" para hacer una copia de esa aventura en tu propia cuenta. Puedes editar el clon a tu gusto y agregar la aventura a tu clase de la misma manera que lo harías con tus propias aventuras. No puedes editar el original, por lo que el original siempre estará seguro. ¿Has creado una aventura tú mismo que te gustaría agregar a las aventuras públicas? ¡Marca la casilla que hace que tu aventura esté disponible públicamente al crear la aventura! - title: Explorar página text: "En la página explorar se puede ver el trabajo de otros usuarios de Hedy. Puedes probar sus programas y usarlos como inspiración para crear algo genial.\nTambién puede agregar un programa que ha hecho a la página de exploración usted mismo haciendo clic en 'Guardar y compartir código' en la pantalla de codificación o ir a Mis programas y hacer clic en 'Compartir'.\n ¿Ya no quieres compartir tu trabajo? Simplemente ve a 'Mis programas' y haz clic en 'Unshare'.\nSi desea más información sobre la página de exploración, consulte este vídeo." - title: Mis logros @@ -599,11 +599,11 @@ teacher-guide: solution_code: |- {print} 'Bienvenido al restaurante' comida {is} {ask} '¿Qué te gustaría pedir?' - - title: Los alumnos utilizan un apóstrofe en su texto + - title: Los alumnos utilizan un apóstrofo en su texto example: - error_text: Desde este nivel en adelante no se permiten los apóstrofes. Se suelen usar en inglés al escribir contracciones como you're, don't o what's. + error_text: Desde este nivel en adelante no se permiten los apóstrofos. Se suelen usar en inglés al escribir contracciones como you're, don't o what's. error_code: "{print} 'No está permitido escribir esto'" - solution_text: Puedes elegir usar la gramática incorrecta y solo omitir el apóstrofe. O podrías usar el ` como un apóstrofe. + solution_text: Puedes elegir usar la gramática incorrecta y solo omitir el apóstrofo. O podrías utilizar el ` como un apóstrofo. solution_code: |- {print} 'Se permite que escribas esto (Youre)' {print} 'Y también puedes escribir esto (you`re)' @@ -1133,10 +1133,10 @@ workbooks: levels: - level: '1' exercises: - - contents: "### Ejercicios\nUn ordenador no hace algo por sí mismo. Siempre debe darle una tarea a un ordenador. Tal tarea se llama comando. Para imprimir el código, utilizamos el comando `print`.\n\n### Impresión de texto\nEn la pantalla acaba de leer el comando «imprimir».\nUn comando `print` imprime una palabra, cuando está entre comillas. Por ejemplo `print hello`.\n##### Ejercicio 1: Predecir el resultado" + - contents: "### Ejercicios\nUn ordenador no hace algo por sí mismo. Siempre debe darle una tarea a un ordenador. Dicha tarea se denomina comando. Para imprimir el código, utilizamos el comando `imprimir`.\n\n### Imprimir texto\nEn la pantalla acabas de leer el comando `imprimir`.\nUn comando `imprimir` imprime una palabra, cuando está entre comillas. Por ejemplo `imprimir hola`.\n##### Ejercicio 1: Predecir el resultado" type: texto - type: resultado - code: Imprimir Hola a todos + code: imprimir Hola a todos answer: Hola a todos lines: '1' - type: resultado @@ -1158,7 +1158,7 @@ workbooks: code: imprimir imprimir type: Código MC - type: texto - contents: "### Pedir aportaciones\n\nSólo texto es un poco aburrido. También puede pedir _entrada_ en Hedy. Input es el texto que le das al ordenador.\nEl ordenador recuerda ese texto y te lo puede mostrar más tarde.\nEste código muestra la pregunta ``¿Cuál es tu nombre?\n\n```hedy\npregunta ¿Cuál es tu nombre?\n```\n\n### Mostrando entrada\n\nEl comando ask guarda la respuesta, pero no la muestra todavía. Para eso necesitarás el comando `echo`. `echo` mostrará la respuesta al final de la frase.\nAsí:\n\n``hedy\npregunta ¿cuál es tu nombre?\necho así que tu nombre es:\n```\n\nSi alguien llamado Olivia usara este código, la salida sería:\n\n```\nasí que te llamas Olivia\n```\n\nTen en cuenta que el ordenador imprimirá el texto exactamente como lo has introducido. Por tanto, ¡con los dos puntos y el mismo uso de mayúsculas o minúsculas!\n\n#### Ejercicio 3: Predecir la salida\n\nPredice la salida de estos programas. Imagina que has introducido tu propio nombre." + contents: "### Pedir información\n\nSolo el texto es un poco aburrido. También puedes pedir _entrada_ en Hedy. Entrada es el texto que le das al ordenador.\nEl ordenador recuerda ese texto y te lo puede mostrar más tarde.\nEste código muestra la pregunta '¿Cómo te llamas?'\n\n```hedy\npreguntar ¿Cómo te llamas?\n```\n\n### Mostrar la entrada\n\nEl comando preguntar guarda la respuesta, pero no la muestra todavía. Para eso necesitarás el comando `eco`. `eco` mostrará la respuesta al final de la frase.\nAsí:\n\n```hedy\npreguntar ¿cómo te llamas?\neco así que te llamas:\n```\n\nSi alguien llamado Olivia usara este código, el resultado sería:\n\n```hedy\nasí que te llamas Olivia\n```\n\nTen en cuenta que el ordenador imprimirá el texto exactamente como lo has introducido. Por tanto, ¡con los dos puntos y el mismo uso de mayúsculas o minúsculas!\n\n#### Ejercicio 3: Predecir el resultado\n\nPredice el resultado de estos programas. Imagina que has introducido tu propio nombre." - answer: 'así que te llamas: **nombre**' code: "preguntar ¿cómo te llamas?\neco así que te llamas:" type: resultado @@ -1167,13 +1167,13 @@ workbooks: type: resultado code: "preguntar ¿Cómo te llamas?\neco Encantado de conocerte," answer: Encantado de conocerte, **nombre** - - contents: "#### Ejercicio 4: Palabras de programación\n\nEn cada lección vamos a aprender palabras nuevos, incluso en esta lección. ¿Sabes qué significan estos términos? Explícalo con tus propias palabras." + - contents: "#### Ejercicio 4: Vocabulario de programación\n\nEn cada lección vamos a aprender palabras nuevas, incluso en esta lección. ¿Sabes qué significan estos términos? Explícalo con tus propias palabras." type: texto - type: definir word: comando answer: Una tarea que le darás al ordenador, p. ej., imprimir. lines: '1' - - answer: Que escribir en el ordenador cuando Hedy muestra una pantalla de pregunta + - answer: Lo que escribes en el ordenador cuando Hedy muestra una pantalla de pregunta type: definir lines: '1' word: entrada @@ -1182,25 +1182,25 @@ workbooks: type: definir word: resultado - type: texto - contents: "#### Ejercicio 5: Comandos\n\nYa hemos aprendido 3 comandos: `print`, `ask` y `echo`. ¿Qué hacen? Explícalo con tus propias palabras." + contents: "#### Ejercicio 5: Comandos\n\nYa hemos aprendido 3 comandos: `imprimir`, `preguntar` y `eco`. ¿Qué hacen? Explícalo con tus propias palabras." - answer: Muestra texto por pantalla. lines: '1' type: definir - word: el comando `print` + word: el comando `imprimir` - lines: '1' answer: Pide al usuario que introduzca datos. type: definir - word: el comando `ask` + word: el comando `preguntar` - type: definir - word: el comando `echo` + word: el comando `eco` answer: Repite los datos introducidos por el usuario. lines: '1' - intro: "### Imprimir e introducir\nAl final de esta lección, podrás:\n* Escribir código que imprima texto\n* Crear una historia con entrada" + intro: "### Imprimir y entrada\nAl final de esta lección, podrás:\n* Escribir código que imprima texto\n* Crear una historia con entrada" - level: '2' exercises: - type: texto code: "nombre es Mo\nimprimir nombre" - contents: "### Uso de variables\n\nAcabas de ver el comando «es en la pantalla.\nUn comando \"is\" guarda algo en la memoria de la computadora y le asigna un nombre. Lo llamamos variable.\nLo que se guarda en la variable se llama valor de la variable." + contents: "### Uso de variables\n\nAcabas de ver el comando `es` en la pantalla.\nUn comando `es` guarda algo en la memoria del ordenador y le asigna un nombre. Lo llamamos variable.\nLo que se guarda en la variable se llama valor de la variable." - type: texto contents: '#### Ejercicio 1: Marca el fragmento de código correcto' - goal: variables @@ -1208,15 +1208,15 @@ workbooks: answer: En todas las líneas type: círculo - type: círculo - answer: Línea 1 & 3 + answer: Líneas 1 & 3 goal: lugares donde se **establece** la variable code: "nombre es Hedy\nimprimir Hola nombre\nedad es 17\nImprimir Tienes edad años" - - answer: Línea 2 y 4 + - answer: Líneas 2 y 4 type: círculo goal: lugares donde las variables se **utilizan** code: "nombre es Hedy\nimprimir Hola nombre\nedad es 17\nimprimir Tienes edad años" - type: texto - contents: "##### Ejercicio 2: Predecir el resultado\nConsejo: ¿Te cuesta predecir la salida? Sigue estos pasos:\n\n1. Marcar el lugar donde se establece una variable\n2. Marcar el lugar donde se utiliza una variable\n3. Trazar una línea entre estos dos lugares\n4. Escriba el valor (lo que viene después de `es`) en el lugar donde se utiliza la variable." + contents: "##### Ejercicio 2: Predecir el resultado\nConsejo: ¿Te cuesta predecir el resultado? Sigue estos pasos:\n\n1. Marcar el lugar donde se establece una variable\n2. Marcar el lugar donde se utiliza una variable\n3. Trazar una línea entre estos dos lugares\n4. Escriba el valor (lo que viene después de `es`) en el lugar donde se utiliza la variable." - answer: ¡Gran trabajo Mo! code: "nombre es Mo\nimprimir ¡Buen trabajo nombre!" lines: '1' @@ -1227,7 +1227,7 @@ workbooks: type: resultado - type: resultado lines: '1' - code: "first_name es Layla\nprint ¡Buenos días nombre!" + code: "nombre es Layla\nimprimir ¡Buenos días nombre!" answer: ¡Buenos días Layla! - type: texto contents: "#### Ejercicio 3: ¿Error?\nLee los programas cuidadosamente ¿Cuáles son los correctos?" @@ -1235,26 +1235,36 @@ workbooks: - Correcto - Incorrecto answer: Correcto + code: "apellido es Johnson\nimprimir ¡Buenos días apellido!" + type: Código MC - options: - Correcto - Incorrecto answer: Incorrecto. Nombre no está establecido. + code: "nombre es\nimprimir ¡Buenos días, nombre!" + type: Código MC - options: - Correcto - Incorrecto answer: Correcto. Se permite que utilices una variable varias veces. + code: "nombre es Johnson\nimprimir ¡Buenos días mr nombre!\nimprimir ¡Hola mr nombre!" + type: Código MC - type: texto code: nombre es preguntar ¿Cómo te llamas? + contents: "### Pedir información\n\nSolo guardar texto no es muy útil. En el nivel 1 hemos visto el comando `preguntar`.\n\nDesde ahora se permite que combines `preguntar`con `es`, tal que así:" - type: texto code: "nombre es preguntar ¿Cómo te llamas?\nimprimir así que te llamas: nombre" - contents: "### Mostrar entrada de datos\nCon las variables, ya no necesitamos más `echo`. Simplemente utilizar `print` para mostrar la respuesta." + contents: "### Mostrar entrada\nCon las variables, ya no necesitamos más `eco`. Simplemente utiliza `imprimir` para mostrar la respuesta." - type: texto + contents: "Si alguien llamado Olivia utilizase este código, el resultado sería: `así que te llamas: Olivia`\n### Ejercicio 4: Predecir el resultado\nPredice el resultado de estos programas. Imagina que has utilizado tu propio nombre." - code: "nombre es preguntar ¿Cómo te llamas?\nimprimir así que te llamas: nombre" lines: '1' type: resultado + answer: 'así que te llamas: **nombre**' - code: "animo es preguntar ¿Qué tal estas hoy?\nimprimir Así que hoy te sientes animo" type: resultado lines: '1' + answer: Así que hoy te sientes **animo** - type: texto contents: "#### Ejercicio 5: Vocabulario de programación\n¡Hemos aprendido nuevas palabras en este nivel! Explícalas con tus propias palabras." - type: definir @@ -1268,27 +1278,27 @@ workbooks: - word: ajuste lines: '1' type: definir - answer: Puedes establecer una variable con un comando `is` + answer: Puedes establecer una variable con un comando `es` - type: definir - answer: Un programa en el que un usuario puede hacer aportaciones. + answer: Un programa en el que un usuario puede introducir datos. lines: '1' word: interactivo - type: texto - contents: "#### Ejercicio 6: Comandos\nHemos aprendido nuevos comandos: `is` y `is ask` juntos. ¿Qué hacen? Explícalo con tus propias palabras." + contents: "#### Ejercicio 6: Comandos\nHemos aprendido nuevos comandos: `es` y `es preguntar` juntos. ¿Qué hacen? Explícalo con tus propias palabras." - type: definir - word: el comando `is` - answer: Guardar un valor (tras `is`) en una variable (antes de `is`) + word: el comando `es` + answer: Guardar un valor (tras `es`) en una variable (antes de `es`) lines: '1' - answer: Pedir al usuario que introduzca datos y guardarlos en una variable. type: definir - word: el comando `is ask` + word: el comando `es preguntar` lines: '1' intro: "### Variables\nAl final de esta lección, puedes:\n* Guardar algo en una variable\n* Crear una historia o dibujar utilizando variables" - level: '3' exercises: - code: "amigos es Mo, Layla, Danny\nimprimir Hoy visitaré amigos en aleatorio" type: texto - contents: "### Variables\nAcabas de ver el comando `is`utilizado con una lista.\nComo cualquier otra variable, utilizamos `is`para guardar algo." + contents: "### Variables\nAcabas de ver el comando `es`utilizado con una lista.\nComo cualquier otra variable, utilizamos `es`para guardar algo." - type: texto contents: '#### Ejercicio 1: Marca el fragmento de código correcto' - type: círculo @@ -1300,11 +1310,15 @@ workbooks: type: círculo answer: El final de la línea 2 - type: texto + contents: "##### Ejercicio 2: Predecir el resultado\n¿Te cuesta predecir el resultado? Sigue estos pasos de nuevo para predecir el resultado de la variable:\n1. Marcar el lugar donde se establece una variable\n2. Marcar el lugar donde se utiliza una variable\n3. Trazar una línea entre estos dos lugares\n4. Elige un elemento aleatorio de la lista cuando se utiliza `en` `aleatorio`." - lines: '1' type: resultado - - answer: La profesora de hoy es Hermans. + code: "profesores es Hermans, Merbis, Bagci, Senkal\nimprimir ¡Hoy te darán clase preforesores en aleatorio!" + answer: ¡Hoy te darán clase **elige un profesor**! + - answer: El profesor de hoy es Hermans. type: resultado lines: '1' + code: "profesores es Hermans, Merbis, Bagci, Senkal\nimprimir El profesor de hoy es Hermans." - code: "tiempo es soleado, lluvioso, nublado, tormentoso\nimprimir ¡Qué maravilloso día tiempo!" answer: ¡Qué maravilloso día tiempo! lines: '1' @@ -1315,61 +1329,398 @@ workbooks: - Correcto - Incorrecto answer: Incorrecto. No puedes imprimir una lista + code: "rocas es guijarros, piedras, cantos rodados\nimprimir ¡Me encanta programar! ¡Esto rocas!" + type: Código MC - options: - Correcto - Incorrecto answer: Incorrecto. Profesores no es una lista + code: "profesores es Hermans\nimprimir Hoy será profesores en aleatorio" + type: Código MC - options: - Correcto - Incorrecto code: "profesores es soleado, lluvioso, nublado, tormentoso\nimprimir Hoy será profesores en aleatorio" answer: Correcto, al ordenador no le importa si el nombre de variable no tiene sentido. + type: Código MC - type: texto + contents: "## Aventuras\nEs un buen momento para empezar con estas aventuras:\nIntroducción\nAleatorio\nDados\nPiedra, papel, tijera\nMúsica\nEl adivino\nRestaurante\nLa casa embrujada\nPlatos" - code: "respuestas es sí, no, quizás\nimprimir La respuesta es respuestas en aleatorio" contents: "### Ajustar listas\n\nHasta ahora siempre hemos establecido nuestras listas al inicio del programa." type: texto - type: texto - contents: "Pero a veces quieres que el usuario añada elementos a la lista.\nPuedes utilizar el comando `añadir a`para ello. También puedes eliminar elementos de la lista con `borrar de`." + contents: "Pero a veces quieres que el usuario añada elementos a la lista.\nPuedes utilizar el comando `añadir a` para ello. También puedes eliminar elementos de la lista con `borrar de`." + code: "animales es 🐿, 🦔, 🦇, 🦉\nanimal es preguntar ¿Qué hace ese sonido?\nañadir animal a animales\nimprimir Fue... animales en aleatorio" - type: texto - contents: '#### Ejercicio 4: Correcto o incorrecto?' + contents: '#### Ejercicio 4: ¿Correcto o incorrecto?' - options: - Correcto - Incorrecto answer: Incorrecto. Es `borrar de`, no `borrar a`. code: "letras es a,b,c,d\nborrar a a letras" + type: Código MC - options: - Correcto - Incorrecto code: "comida es pizza, patatas, tacos\nborrar hamburguesa de comida" answer: Correcto, se permite que borres algo que no está en la lista. Pero no tiene sentido hacerlo + type: Código MC - code: "comida es pizza, patatas, tacos\nañadir pizza a comida" answer: Correcto, se permite que añadas algo a una lista dos o varias veces. options: - Correcto - Incorrecto + type: Código MC - type: texto + contents: "#### Ejercicio5: Escribe el código\nEcha un buen vistazo al resultado y escribe un código correspondiente a él.\n**Asegúrate que tu código contiene al menos una opción aleatoria, ¡así no utilizaras solo imprimir!**" - type: entrada de datos + output: "¡Bienvenido a la noche de bingo!
\nLos 3 números de la suerte son:
\n5 y 3 y 10" + answer: "numeros es 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nimprimir ¡Bienvenido a la noche de bingo!\nimprimir Los 3 números de la suerte son:\nimprimir numeros en aleatorio y imprimir numeros en aleatorio y imprimir numeros en aleatorio" - type: entrada de datos + output: "Esta noche vamos a ver una película.
\nElegimos: Al revés" + answer: "peliculas es Los vengadores, Barbie, Al revés\nimprimir Esta noche vamos a ver una película.\nimprimir Elegimos: peliculas en aleatorio" + - type: texto + contents: "#### Ejercicio 6: Vocabulario de programación\n¡Hemos vuelto a aprender nuevas palabras de programación! Explícalas con tus propias palabras." + - type: definir + word: lista + answer: Una variable en la que almacenar varios valores + lines: '1' + - word: aleatorio + answer: Elegido por el ordenador. + lines: '1' + type: definir + - lines: '1' + type: definir + word: añadir + answer: poner algo en una lista - type: texto - - {} - - {} + contents: "#### Ejercicio 7: Comandos\nEl comando `es` ha cambiado en este nivel y hemos aprendido algunos comandos nuevos.\n¿Qué hacen? Explícalo con tus propias palabras." + - type: definir + word: 'El comando `es`(Ten en cuenta: ¡ahora `es` puede hacer muchas cosas!)' + answer: Guardar el valor (antes de es) en una variable o lista (tras es) + lines: '1' + - type: definir + word: 'El comando `añadir a` ' + answer: 'Añadir un elemento a una lista. Tiene el siguiente aspecto: añadir elemento a lista' + lines: '1' + - answer: 'Eliminar un elemento de una lista. Tiene el siguiente aspecto: eliminar elemento de lista' + lines: '1' + type: definir + word: 'El comando `borrar de` ' + - type: definir + word: 'El comando `en aleatorio` ' + answer: Elige un elemento aleatorio de una lista. + lines: '1' + - contents: '#### ¿Qué opinas?' + type: texto + - type: pregunta + lines: '1' + text: ¿Qué ejercicio te ha gustado más de este nivel? + - text: ¿Qué te ha gustado de este ejercicio? + type: pregunta + lines: '5' + - lines: '1' + text: ¿Qué ejercicio te ha gustado menos de este nivel? + type: pregunta + - type: pregunta + text: ¿Qué no te ha gustado de ese ejercicio? + lines: '5' + intro: "### Listas y aleatoriedad\nAl final de esta lección, puedes:\n* Guardar varios elementos en una variable, lo que denomina una lista.\n* Crear una historio en la que ocurren cosas aleatorias.\n* Crear un dibujo en el que se dibujan cosas aleatorias." - exercises: - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} - - {} + - type: texto + code: "amigo es preguntar '¿cómo te llamas?'\nimprimir '¡Genial! Iré al centro comercial con ' amigo" + contents: "### Comillas\n\nHemos aprendido a usar comillas, cuando un texto necesita aparecer literalmente de esa manera en la pantalla.\nUtilizamos comillas con `imprimir` y `preguntar'." + - type: texto + contents: "##### Ejercicio 1: Terminar el código.\nRealiza este ejercicio en dos pasos:\n1. Coloca las comillas correctamente en el código.\n2. ¿Lo hiciste? Entonces predice el resultado de este código." + - answer: "¡Hola a todos!\nBienvenido a Hedy" + lines: '2' + type: resultado + code: "imprimir ¡Hola a todos!\nimprimir Bienvenido a Hedy" + - contents: No te olvides de hacer ambos pasos de este ejercicio. Pon las comillas en el lado izquierdo y el código en el lado derecho. + type: texto + - answer: ¡Hoy Hermans imparte la clase en el aula 305! + lines: '1' + type: resultado + code: "nombre es Hermans\nclase es 305\nimprimir ¡Hoy nombre imparte la clase en el aula clase!" + - answer: Hoy da clase Hermans + lines: '1' + type: resultado + code: "profesores es Hermans, Merbis, Bagci, Senkal\nimprimir Hoy da clase profesores en aleatorio." + - type: resultado + code: "rocas es guijarros, piedras, cantos rodados\nimprimir ¡Me encanta programar! ¡Esto rocas!" + answer: ¡Me encanta programar! Esto rocas + lines: '1' + - code: "imprimir ¡Hoy hace un tiempo estupendo!\nnombre es Bozo" + answer: ¡Hoy hace un tiempo estupendo! + lines: '1' + type: resultado + - contents: "#### Ejercicio 2: ¿Error?\nLee los programas cuidadosamente ¿Cuáles son los correctos?" + type: texto + - options: + - Correcto + - Incorrecto + answer: Incorrecto. No puedes utilizar un apóstrofo cuando utilizas las comillas simples. + type: Código MC + code: imprimir 'Iré al zoológico mañana' + - options: + - Correcto + - Incorrecto + answer: Incorrecto. Necesitas comillas al final de la frase. + code: imprimir 'He visto una llama en el zoo + type: Código MC + - options: + - Correcto + - Incorrecto + code: imprimir "Creo que daré de comer a la llama" + answer: ¡Correcto! Puedes utilizar el apóstrofo cuando utilizas las comillas dobles. + type: Código MC + - options: + - Correcto + - Incorrecto + code: "imprimir 'La llama se escapó a la calle'\nimprimir \"Qué aventura\"" + answer: ¡Correcto! No tienes que utilizar las mismas comillas en cada frase, pero te lo recomendamos + type: Código MC + - type: texto + contents: "#### Preguntar\n¡Recuerda utilizar comillas después de `preguntar` también!\n\n#### Ejercicio 3: ¿Error?\n¡Lee los programas cuidadosamente! ¿Cuáles son correctos?" + - options: + - Correcto + - Incorrecto + code: preguntar '¿Ves esos dos conejos?' + answer: Incorrecto. ¡Recuerda utilizar una variable con preguntar! + type: Código MC + - answer: Incorrecto. Necesitas un par de comillas. + code: nombre es preguntar 'Cómo te llamas + options: + - Correcto + - Incorrecto + type: Código MC + - code: dueño es preguntar "¿Es esa la capibara de Jack o de Lucy?" + answer: Correcto. + options: + - Correcto + - Incorrecto + type: Código MC + - code: "dueño es preguntar \"¿Es esa la capibara de Jack o de Lucy?\"\nimprimir 'Es de dueño'" + options: + - Correcto + - Incorrecto + answer: Incorrecto. Se imprimirá la palabra 'dueño', no el valor de la variable + type: Código MC + - type: texto + contents: "#### Ejercicio 4: Escribe el código\nEcha un vistazo al resultado y escribe un código que se ajuste a él." + - output: "Bienvenido a la noche de bingo\n¡Aquí viene el primer número...!" + answer: "imprimir 'Bienvenido a la noche de bingo'\nimprimir '¡Aquí viene el primer número...!'" + type: entrada + - output: "Esta noche vamos a ir al cine\n¿Qué tipo de película te apetece?" + answer: "imprimir 'Esta noche vamos a ir al cine'\npelicula es preguntar '¿Qué tipo de película te apetece?'" + type: entrada + - contents: "#### Ejercicio 5: Vocabulario de programación\n¡Hemos aprendido nuevas palabras de programación! Explícalas con tus propias palabras." + type: texto + - type: definir + word: comillas + answer: Apóstrofos que utilizas para imprimir o decir algo. + lines: '1' + - word: ¿cómo utilizar las comillas en Hedy? + answer: Puedes utilizar las comillas cuando quieras imprimir el texto literal en la pantalla + lines: '1' + type: definir + - contents: "#### Ejercicio 6: Comandos\nTambién hemos aprendido algunos comandos nuevos en el nivel 4." + type: texto + - type: definir + lines: '1' + word: el comando `limpiar` + answer: Vacía la pantalla + - type: definir + answer: cambia el color de la tortuga + lines: '1' + word: el comando `color` + - type: texto + contents: '#### ¿Qué opinas?' + - type: pregunta + lines: '1' + text: ¿Qué ejercicio te ha gustado más de este nivel? + - type: pregunta + text: ¿Qué te ha gustado? + lines: '5' + - text: ¿Qué ejercicio te ha gustado menos de este nivel? + lines: '1' + type: pregunta + - text: ¿Qué no te ha gustado? + lines: '5' + type: pregunta + level: '4' + intro: "## Comillas\nAl final de esta lección, puedes:\n* entender por qué se necesitan comillas en la programación.\n* poner comillas en los lugares correctos.\n* comprender los mensajes de error sobre el uso indebido de las comillas." + - level: '5' + intro: "## si sino\nAl final de esta lección, puedes:\n* deja que el ordenador reaccione a diferentes entradas." + exercises: + - type: texto + code: "amigo es preguntar \"¿Cómo te llamas?\"\nsi amigo es Yasmine imprimir \"¡Hola Yasmine!\" sino imprimir \"¡No, no me refería a ti!\"" + contents: "### Tomando decisiones\nHasta ahora Hedy siempre ejecutaba todas y cada una de las líneas de código. A partir de ahora puedes dejar que sólo ejecute ciertas líneas en ciertos casos, con un `si`.\nEl código que sigue detrás del `si` se llama condicional.\nEn este ejemplo la condición es `amigo es Yasmine`." + - type: texto + contents: "#### Ejercicio 1: Marca las condiciones\n¿Qué es una condicional? ¡Marca las condicionales en los siguientes programas!" + - answer: hoy es viernes + goal: la condicional + code: "hoy es preguntar '¿Qué día es?'\nsi hoy es viernes imprimir 'Sí' sino imprimir 'No'" + type: círculo + - type: círculo + goal: la condicional + code: "hoy es preguntar '¿Qué día es hoy?'\nsi hoy es sábado imprimir '¡Hoy no hay colegio!'\nsino imprimir 'Tienes que ir al colegio'" + answer: hoy es sábado + - goal: la condicional + answer: edad es 16 + type: círculo + code: "edad es preguntar '¿Cuántos años tienes?'\nSi edad es 16 imprimir 'Perfecto'\nsino imprimir '¡Eres demasiado joven!'" + - type: texto + contents: "##### Ejercicio 2: Marcar las líneas correctas\n ¿Qué código se ejecutará? Marque solo esas partes.\nFinge que hoy es viernes y tienes 12 años." + - type: círculo + goal: el código que se **imprimirá** + code: "hoy es preguntar '¿Qué día es hoy?'\nsi hoy es viernes imprimir 'Viva' sino imprimir 'No'" + answer: imprimir '¡hurra!' + - type: círculo + goal: el código que se **imprimirá** + code: "hoy es preguntar '¿Qué día es hoy?'\nsi hoy es sábado imprimir '¡No hay escuela hoy!'\nsino imprimir 'Tienes que ir a la escuela'" + answer: imprimir 'Tienes que ir a la escuela' + - type: círculo + goal: el código que se **imprimirá** + code: "edad es preguntar '¿Cuántos años tienes?'\nsi edad es 16 imprimir 'Perfecto'\nsino imprimir '¡Eres demasiado joven!'" + answer: imprimir '¡Eres demasiado joven!' + - type: texto + contents: "#### Ejercicio 3: ¿Error?\n¡Lee atentamente los programas! ¿Cuáles son los correctos?" + - type: Código MC + options: + - Correcto + - Incorrecto + code: "La edad es preguntar '¿Cuántos años tienes?'\nSi la edad es 16, escribe \"¡Correcto!\". De lo contrario, \"¡Eres demasiado joven!\"" + answer: Incorrecto. No hay ningún `imprimir` después de `sino` + - type: Código MC + options: + - Correcto + - Incorrecto + answer: ¡Correcto! No siempre necesitas un `sino` + code: "animal es preguntar '¿Qué clase de animal es ese?'\nsi animal es llama, imprimir 'Bahhhhh'" + - type: Código MC + options: + - Correcto + - Incorrecto + answer: ¡Correcto! Puedes utilizar el apóstrofo cuando uses comillas dobles. + code: imprimir "¡Estoy tan feliz!" + - type: Código MC + options: + - Correcto + - Incorrecto + answer: Incorrecto. Tiene que haber un `es`en la primera línea. + code: "si nombre Hedy\nimprimir '¡Programar es divertido!'" + - type: Código MC + code: "preguntar '¿A qué escuela vas?'\nsi escuela es LK imprimir '¡Sí!'" + options: + - Correcto + - Incorrecto + answer: Incorrecto. No hay variables en la primera línea. + - type: Código MC + code: "cantidad es preguntar \"¿cuántos capibaras hay por ahí?\"\nsi cantidad es 5 imprimir 'Hay cantidad capibaras por allí.'" + options: + - Correcto + - Incorrecto + answer: Incorrecto. La variable cantidad se imprime como texto. + - contents: "#### Ejercicio 4: Predecir el resultado\n¿Cuál será el resultado de estos programas?\n¡Atención! A veces se utiliza `aleatorio` en un programa. Puedes elegir tú mismo un elemento aleatorio.\n¡Esto significa que varias respuestas pueden ser correctas!" + type: texto + - code: "profesores es Hermans, Merbis, Bagci, Senkal\nprofesor es profesores en aleatorio\nsi profesor es Hermans imprimir '¡Viva!'" + type: resultado + answer: ¡Hurra! o sin resultado + lines: '1' + - lines: '1' + answer: ¡Que mal! o ¡Hurra! + code: "profesores es Hermans, Merbis, Bagci, Senkal\nprofesor es profesore en aleatorio\nsi profesor es Hermans, imprimir \"¡Qué lástima!\" sino imprimir \"¡Viva!\"" + type: resultado + - lines: '2' + type: resultado + answer: "¡Bienvenido a la noche del bingo!\n¡Gané! o Qué pena" + code: "números es 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nimprimir '¡Bienvenido a la noche de bingo!'\nnúmero es números en aleatorio\nsi número es 10 imprimir '¡Gané!' o imprimir 'Que pena'" + - type: resultado + lines: '1' + code: "número es preguntar '¿Cuál es tu número favorito?'\nsi número es 10, imprimir '¡El mío también!'" + answer: ¡También el mio! o sin resultado + - type: texto + contents: "#### Ejercicio 5: Vocabulario de programación\n¡Hemos aprendido nuevo vocabulario de programación en esta lección! Explícalo con tus propias palabras." + - answer: Algo que es verdadero o falso. Sigue detrás del `si`. + type: definir + word: conditional + lines: '1' + - type: texto + contents: "#### Ejercicio 6: Comandos\nHemos aprendido algunos comandos nuevos en el nivel 5." + - word: el comando `si` + lines: '1' + answer: Decide qué código se ejecutará. Si el condicional es verdadero, se ejecutará el código que hay detrás. + type: definir + - type: definir + lines: '1' + word: el comando `sino` + answer: Decide qué código se ejecutará. Si el condicional es falso, se ejecutará el código que hay detrás. + - type: texto + contents: '#### ¿Qué opinas?' + - type: pregunta + text: ¿Qué ejercicio te ha gustado más de este nivel? + lines: '1' + - text: ¿Qué te ha gustado? + lines: '5' + type: pregunta + - text: ¿Qué ejercicio te ha gustado menos de este nivel? + lines: '1' + type: pregunta + - type: pregunta + lines: '5' + text: ¿Qué no te ha gustado? + - exercises: + - type: texto + code: imprimir 'cinco veces cinco es ' 5 * 5 + contents: "### Matemáticas\nHacer cálculos es una tarea importante para los ordenadores.\n\nLa suma se realiza con el signo más normal: `5 + 5`.\nLa resta también se hace con el signo menos normal: `5 - 5`.\nCon las multiplicaciones puede parecer un poco diferente de lo habitual, utilizamos el asterisco (por encima del 8): `5 * 5`.\nLa división se hace con la barra diagonal: `5 / 5`.\n\nTen en cuenta que el código matemático no necesita comillas." + - type: texto + contents: "#### Ejercicio 1: Predice el resultado\n¿Cuál crees que será el resultado de estos programas?" + - lines: '3' + type: resultado + answer: "dos más diez es 20\n25 es 30 menos 5\n5" + code: "imprimir 'dos más diez es ' 2 * 10\nimprimir 5 * 5 ' es 30 menos 5'\nimprimir 10 / 2" + - type: texto + contents: "#### Ejercicio 2: Matemáticas\nSigue estos pasos para completar el ejercicio:\n1. Termina los programas rellenando una suma en las líneas. El código tiene que tener sentido.\n2. ¿Has terminado? Escribe cuál crees que será el resultado del código." + - type: resultado + lines: '4' + code: "imprimir 'cinco más diez es ' __\nimprimir 'seis menos cinco es ' ___\nimprimir 'cien dividido por cinco es ' ___\n___ _________________________ 4 * 12" + answer: "cinco más diez es 50\nseis menos cinco es 1\ncien dividido entre cinco es 20\ncuatro veces doce es 48" + - type: texto + contents: "### Ejercicio 2: Matemáticas con preguntar y variables\nTambién puede guardar una suma en una variable, compararla con `preguntar' y ejecutarla con un `si`.\nVamos a practicar eso ahora.\nPredice el resultado de estos programas.\nCuando se utilizan `preguntar`y `aleatorio`, puedes inventarte tus propias respuestas." + - type: resultado + lines: '1' + answer: La respuesta a la suma es 10 + code: "suma = 2 * 5\nimprimir 'La respuesta a esta suma es ' suma" + - type: resultado + answer: ¡Gran trajabo! o ¡Mala suerte! + lines: '1' + code: "respuesta_correcta = 142 / 2\ntu_respuesta = preguntar '¿Cuánto es 142 dividido por 2?'\nsi respuesta_correcta es tu_respuesta\nimprimir 'Gran trabajo'\nsino imprimir '¡Qué pena!'" + - type: resultado + lines: '1' + answer: '¿Cuánto es 7 veces 7? (o cualquier otro número de la lista: 2, 4, 6, 9, 11, 17)' + code: "numeros es 2, 4, 6, 7, 9, 11, 17\nnumero es numeros en aleatorio\nimprimir '¿Cuánto es ' numero ' veces 7?'" + - answer: 3 veces 6 (por ejemplo) es 18 + lines: '1' + type: resultado + code: "favorito es preguntar '¿Cuál es tu número favorito?'\nimprimir '3 veces ' favorito ' es ' 3 * favorito" + - type: texto + contents: "### Ejercicio 3: Entrada\nSe te mostrará un resultado. Escribe un programa que pueda producir este resultado.\nTen en cuenta: Varias respuestas pueden ser correctas. Elige la que quieras, siempre que sea correcta.\nRellena todas las líneas, ¡así que fíjate bien en la cantidad de líneas!" + - type: entrada + answer: imprimir 'Este es un número muy grande:' 4*17 + output: 'Este es un número muy grande: 68' + - type: entrada + answer: imprimir 1000/10 ' es la respuesta a 1000/10.' + output: 100 es la respuesta a 1000/10. + - type: entrada + answer: "numeros is 1,2,3,4,5,6,7,8,9,10\nimprimir numeros en aleatoio * 7 ' es un múltiplo aleatorio de 7'" + output: 14 es un múltiplo aleatorio de 7 + - type: texto + contents: "#### Ejercicio 4: Vocabulario de programación\nHemos aprendido a utilizar algunos signos nuevos en nuestro código. ¿Qué signos se utilizan en qué casos?" + - type: definir + word: veces + lines: '1' + answer: '*' - word: dividido por type: definir answer: / @@ -1378,13 +1729,15 @@ workbooks: contents: '#### ¿Qué te pareció?' - lines: '1' type: pregunta - text: ¿Qué ejercicio te gustó más en este nivel? - - text: ¿Qué te gustó? + text: ¿Qué ejercicio te ha gustado más de este nivel? + - text: ¿Qué te ha gustado? type: pregunta lines: '5' - lines: '1' - text: ¿Qué ejercicio te gustó menos de este nivel ? + text: ¿Qué ejercicio te ha gustado menos de este nivel? type: pregunta - - text: ¿Qué no te gustó? + - text: ¿Qué no te ha gustado? lines: '5' type: pregunta + intro: "## Matemáticas\nAl final de esta lección, puedes:\n* utilizar las matemáticas en Hedy" + level: '6' diff --git a/content/pages/zh_Hans.yaml b/content/pages/zh_Hans.yaml index f431fb2cda6..dc6fee71047 100644 --- a/content/pages/zh_Hans.yaml +++ b/content/pages/zh_Hans.yaml @@ -51,7 +51,8 @@ join-sections: 海蒂编程旨在支持教师在课堂上教编程课程。我们有特定的教师功能,例如创建班级、自定义班级和查看学生表现的选项。 如果您喜欢海蒂编程,您可以联系您认识的学校来帮助教师了解和尝试海蒂编程!我们可以通过Discord帮助您找到学校或老师。 learn-more-sections: -- {} +- text: "Hedy 由 Hedy 基金会 (Stichting Hedy) 维护,地址:Sportmanstaat 8, 2341 JG Oegstgeest,荷兰商会编号 94013985。\n\n基金会董事会由以下人员组成:\n\n* Felienne Hermans,总裁\n* Eelko Huizing,财务\n* Renée Merbis,秘书\n\nStichting Hedy 董事会不会因其工作而获得任何经济报酬。 " + title: Hedy 基金会 - title: 深潜! text: |- 想了解更多关于海蒂的理念和设计吗?请看翡丽娜(Felienne)在 2022 年 StrangeLoop 会议上的演讲: @@ -95,37 +96,34 @@ start-sections: * 我们随时为您提供帮助,您可以在 [Discord](https://discord.gg/8yY7dEme9r) 上找到我们,也可以 [给我们发送电子邮件](hello@hedy.org)。 - title: 关于 海蒂 老师 text: |- - 世界各地的许多老师都表达了他们对 Hedy 的热情,有些老师与我们分享: + 世界各地的老师都表达了对 Hedy 的热爱,其中一些老师与我们分享道: - *令人难以置信的鼓舞人心! 让你自己和学生更容易编程的超级好方法。 玩起来非常有趣,并且与学生一起使用有很大的潜力。 我认为这是一个非常好的工具! 我相信这对于孩子们开始学习编程来说是一个很有价值的方式。 Python和编码一直非常令人兴奋,因为学习的门槛非常高。 现在一切都降低了一点,并且解释说它实际上可以非常容易。 我很高兴看到 Hedy 如何尝试让用户尽可能轻松地进行编程!* + * 非常鼓舞人心!这是一个很好的方法,让您自己和学生都更容易学习编程。玩起来非常有趣,而且有很大的潜力可以与学生一起使用。我认为这是一个非常好的工具!我相信这是孩子们开始学习编程的一种有价值的方式。Python 和编码一直非常令人兴奋,因为学习的门槛很高。现在一切都低了一些,而且有人解释说这实际上可以很容易。我很高兴看到 Hedy 努力让用户尽可能地轻松上手编程!* 荷兰:数学教师培训(中学) - *简单的界面和很好的例子。*教师:三年级 - 六年级(小学) + *简单的界面和很好的例子。*教师:3-6 年级(小学) - *多语言编程和渐进式编程概念本身。*美国:中学,6-8 年级 + *多语言编程和循序渐进的编程概念本身。*美国:中学,6-8 年级 - *引入编程的渐进性。*澳大利亚:高中 + *引入编程的循序渐进性质。*澳大利亚:高中 - *自动继续。* 荷兰:2 HAVO-VWO + *自动继续。*荷兰:2 HAVO-VWO - *解释可以是荷兰语(代码是英语),并且它具有越来越多的可能性。* 荷兰:Plus 班级组 + *解释可以用荷兰语(代码可以用英语),并且它具有越来越多的可能性。*荷兰:Plus 班级组 - *但是 Hedy 和它的渐进关卡……真是个好主意,我想亲自感谢你创造了这个。 我不知道该怎么感谢你才足够。 此外,我从未见过我的学生的参与度和热情,就像我在 Hedy 身上看到的那样。 我们已经学习到第 5 级,并计划在开始 Python 之前再花一周的时间在课堂和实验室中进行学习。* 巴基斯坦 + *但是 Hedy 及其循序渐进的水平……真是个好主意,我想亲自感谢您创造了这个。我对您感激不尽。此外,我从未见过我的学生像 Hedy 那样参与和热情。我们已经讲到了第 5 级,计划在开始学习 Python 之前,在课堂和实验室再花一周时间学习。* 巴基斯坦 - *编程的“真实性”,就像现实中的情况一样。*荷兰: 4 至 8 级班级 + *编程的“真实性”,它与现实中的情况非常相似。* 荷兰:Plus 班级 4 至 8 人 - *循序渐进的活动。 有趣的活动。* 荷兰:1e 所有级别、2e VWO/HAVO 2e VWO +、3e HAVO 3e VWO + *循序渐进的活动。有趣的活动。* 荷兰:1e 所有级别,2e VWO/HAVO 2e VWO +,3e HAVO 3e VWO - *我真的很喜欢Hedy,而且它的设置也很好,这使得它很适合在小学使用。 海蒂的循序渐进的方法非常有效。 每个级别开始时的简短说明和简短的示例程序有助于让孩子们快速了解所选级别中的新内容。 孩子们可以选择的不同作业也非常有效。 你会看到孩子们选择了他们感兴趣的作业,然后他们开始与这些作业一起完成各个级别的工作。 Hedy 对于擅长编程并想尝试真正的编程语言的孩子来说非常有趣。 一旦中学提供更多的信息通信技术教育,就可以为进入中学做好良好的准备。* 荷兰:Oegstgeest Montessori 学校 + *我非常喜欢 Hedy,而且它的设置也很好,非常适合在小学使用。Hedy 的循序渐进方法非常有效。每个级别开头的简短说明和简短的示例程序有助于让孩子们快速了解所选级别的新内容。孩子们可以选择的不同作业也非常有效。你会看到孩子们选择他们喜欢的作业,然后他们开始通过各个级别与他们一起工作。对于擅长编程并想体验真正的编程语言的孩子来说,Hedy 非常有趣。那里一旦开设更多的 ICT 教育,就可以为进入中学做好很好的准备。* 荷兰:Oegstgeest Montessori 学校 - *建筑非常好。* 荷兰:初中HAVO-VWO + *建筑非常好。* 荷兰:初中 HAVO-VWO - *我可以跟上班级的节奏。* 荷兰:第 7 组和第 8 组 + *我可以跟上课堂的节奏。* 荷兰:7 和 8 组 - ![Felienne 教孩子们](/images/teacherfeedback/Fkids1.JPG) *Felienne 费里安教孩子们* - - - ![孩子们学习Hedy](/images/teacherfeedback/Fkids2.JPG) *孩子们学习Hedy* + ![Felienne 教孩子们](/images/teacherfeedback/Fkids1.JPG) *Felienne 教孩子们* ![孩子们了解 Hedy](/images/teacherfeedback/Fkids2.JPG) *孩子们了解 Hedy* teacher-guide: - title: 简介 key: 简介 @@ -198,38 +196,38 @@ teacher-guide: 要从您的班级中删除第二位教师,请转到班级页面并删除第二位教师。创建班级的老师不能被移除。 - title: 定制你的班级 text: |- - 您可以自定义您的课程,并为您的学生选择哪些冒险活动。这样你的学生就不会被大量的冒险和关卡所淹没,他们可以特别专注于你想让他们练习的冒险。 - 在教师页面点击您的班级,选择“自定义班级”。在这个页面上,您可以选择级别,设置开放日期,解锁级别阈值等。 + 您可以自定义班级并选择可供学生参加的冒险。这样,您的学生就不会被冒险和关卡的数量所淹没,他们可以专注于您希望他们练习的冒险。 + 在教师页面上单击您的班级,然后选择“自定义班级”。在此页面上,您可以选择级别、设置开放日期、解锁级别阈值等。 - **选择和排序冒险** + **选择和订购冒险** - 在这个部分中,您可以选择和排序冒险。粉色标签是带有新命令的冒险。灰色的标签是常规的冒险。要重新排列冒险的顺序,可以拖动选项卡。但是,我们建议您使用常规的冒险顺序,因为Hedy团队确保冒险从最容易到最难。 - 如果你想为你的学生删除一个冒险,只需点击冒险标签上的叉号。 + 在此部分中,您可以选择和订购冒险。粉色标签是具有新命令的冒险。灰色标签是常规冒险。要重新排列冒险的顺序,您可以拖动标签。但是,我们建议您使用常规的冒险顺序,因为 Hedy 团队确保冒险从最简单到最困难。 + 如果您想为学生删除冒险,只需单击冒险选项卡上的叉号即可。 - 如果您想添加冒险,例如您自己的冒险或意外删除的冒险,请使用此菜单将冒险添加到学生的冒险中。只需单击要添加的冒险,它就会(重新)出现在冒险行中。要撤销对冒险的所有更改,请单击“重置”。 + 如果您想添加冒险,例如您自己的冒险或您不小心删除的冒险,请使用此菜单将冒险添加到您学生的冒险中。只需单击您要添加的冒险,它就会(重新)出现在冒险行中。要撤消对冒险的所有更改,请单击“重置”。 - * * 开放日期* * + **开放日期** - 有了这个功能,你可以设置关卡的开放日期。这样你就可以在课程开始前制定一个课程计划,而不用担心每周都要打开新的关卡。在上图中,第一个关卡是直接打开的,第二个关卡将在9月23日打开,第三个关卡将在9月23日打开。其他关卡都关闭了。 - 不想设定起始日期?没问题,这部分空着就行。 + 使用此功能,您可以设置各级别的开放日期。这样,您可以在课程开始前制定课程计划,而不必担心每周开设新级别。上图中,第一级直接开放,第二级将于 9 月 23 日开放,第三级将于下一周开放。其他级别已关闭。 + 不想设置开放日期?没问题,只需将此部分留空即可。 **解锁级别阈值** - - 这个功能允许你为学生的测验成绩设置一个阈值,然后他们才能继续下一关。例如,如果你输入“80”,你的学生必须在测试中获得至少80%的分数才能进入下一关。如果他们没有达到这个门槛,他们将不能继续,必须重新参加测试。 - 不想使用阈值?不用担心,这部分不用写。 + + 此功能允许您为学生的测验成绩设置阈值,然后他们才能继续进入下一级别。例如,如果您输入“80”,则您的学生必须在测验中至少获得 80% 的分数,然后才允许他们进入下一级别。如果他们没有达到阈值,他们将不允许继续,必须重新参加测验。 + 不想使用阈值?不用担心,只需将此部分留空即可。 - * * 其他设置* * - < img src = " https://github.com/hedyorg/hedy/assets/80678586/a8491d67-6d6e-42a7-b672-fd3d083a76f8 " / > - 还有一些其他的设置也可能对你有用。我们的第一个额外设置是“强制开发者模式”。在开发者模式下,学生只能看到他们的输入和输出屏幕以及运行按钮。冒险是隐藏的,没有可用的小抄。这可能会在测试情况下派上用场。 - 如果这个选项没有被选中,开发者的模式也可以作为一个自愿的选项提供给学生。 + **其他设置** + + 还有一些其他设置可能对您也有用。我们的第一个额外设置是“强制开发者模式”。在开发者模式下,学生只能看到他们的输入和输出屏幕以及运行按钮。冒险被隐藏,没有可用的备忘单。这在测试情况下可能会派上用场。 + 如果未选择此选项,则学生也可以自愿选择开发者模式。 - 如果您希望所有学生都能在班级高分中显示,您可以选择第二个选项。 - 在所有其他选项中,您可以选择为学生隐藏一些功能或内容,这可能有助于他们更专注。 + 如果您希望所有学生都显示在班级高分榜上,您可以选择第二个选项。 + 对于所有其他选项,您可以选择为学生隐藏某些功能或内容,这可能有助于他们更加专注。 **保存** - 当您完成对课程的定制后,不要忘记保存更改。 + 自定义完课程后,别忘了保存更改。 - title: 学生账户 text: |- 这里有两种方法可以让您的学生加入您的班级。您可以您可以为他们创建账户,或者让他们建立自己的账户。 @@ -362,13 +360,11 @@ teacher-guide: subsections: - title: 制作你自己的探险活动 text: 教师也有可能创建你自己的探险活动。这个视频 ,告诉你如何作为教师创建自己的探险活动,并将其添加到你的班级里。 - - title: 浏览页面 + - title: 公开冒险 text: |- - 在explore页面上,你可以查看其他海蒂编程用户的作品。您可以试着运行他们的程序并将它们当作灵感来创造一些很酷的东西。 - 你还可以通过单击编码屏幕中的“保存和共享代码”或转到“我的程序”并单击“共享”来将你制作的程序添加到浏览页面。 - 不想再分享您的程序了?只需转到“我的程序”,然后单击“取消共享”。 - 如果需要有关浏览页面的更多信息,请查看此 视频。 - - {} + 您想使用其他教师制作的冒险吗?那么您可以访问我们的公开冒险页面。在这里,您可以找到来自世界各地的其他教师制作的所有冒险。要找到适合您的冒险,您可以选择级别、语言甚至标签。您是否找到了想要使用的冒险?然后您可以按“克隆”将该冒险复制到您自己的帐户。您可以根据自己的喜好编辑克隆,并以与您自己的冒险相同的方式将冒险添加到您的班级。您无法编辑原始内容,因此原始内容始终是安全的。您是否自己制作了冒险并想将其添加到公开冒险中?在创建冒险时勾选将您的冒险公开的复选框! + - title: 探索页面 + text: "在探索页面上,您可以查看其他 Hedy 用户的作品。您可以试用他们的程序,并以它们为灵感,自己创造一些很酷的东西。\n您也可以自己将自己制作的程序添加到探索页面,方法是单击编码屏幕中的“保存并共享代码”,或者转到“我的程序”并单击“共享”。\n不想再分享您的作品?只需转到“我的程序”并单击“取消共享”即可。\n如果您想了解有关探索页面的更多信息,请查看此视频。" - title: 我的成绩 text: |- 如果你点击屏幕右上角的用户名,你可以进入“我的成绩” 。你所有的成绩都被收集起来展示在这个页面上。你的学生也有这样一个页面。 @@ -1171,3 +1167,210 @@ teacher-guide: solution_code: |- temperature = 25 print('室外温度是 ', temperature, '摄氏度') +workbooks: + levels: + - level: '1' + intro: "### 打印和输入\n在本课结束时,您可以:\n* 编写打印文本的代码\n* 创建带有输入的故事" + exercises: + - type: 文本 + contents: "### 练习\n计算机不会自己做某事。你必须始终给计算机一个任务。这样的任务称为命令。要打印出代码,我们使用命令“print”。\n\n### 打印文本\n在屏幕上,你刚刚看到了“print”命令。\n“print”命令会打印一个单词,如果它在引号之间。例如“print hello”。\n#### 练习 1:预测输出" + - type: 输出 + code: 打印 Hello everybody + answer: Hello everybody + lines: '1' + - answer: goedemorgen + lines: '1' + type: 输出 + code: 打印 goedemorgen + - type: 文本 + contents: "#### 练习 2:错误?\n有时错误会潜入您的代码中。这没什么大不了的,但 Hedy 无法正确读取您的代码。\n您认为以下哪些程序是错误的?" + - type: MC-code + options: + - 正确 + - 警告 + answer: 警告 + code: 打印 Hello everybody! + - type: MC-code + options: + - 正确 + - 警告 + code: 打印 print + answer: 正确 + - type: 文本 + contents: "### 要求输入\n\n只有文本有点无聊。您还可以在 Hedy 中要求输入。输入是您提供给计算机的文本。\n计算机会记住该文本,并可以在以后显示给您。\n此代码显示问题“你叫什么名字?”\n\n```hedy\n问你叫什么名字?\n```\n\n### 显示输入\n\nask 命令保存答案,但尚未显示。为此,您需要 `echo` 命令。`echo` 将在句子末尾显示答案。\n像这样:\n\n```hedy\n问你叫什么名字?\necho so your name is:\n```\n\n如果有人叫 Olivia 使用此代码,则输出将是:\n\n```\nso your name is: Olivia\n```\n\n请注意,计算机将准确打印您输入的文本。因此,使用冒号和大写或小写字母!\n\n#### 练习 3:预测输出\n\n预测这些程序的输出。假设已经填写了你自己的名字。" + - type: 输出 + code: "ask 你叫什么名字?\necho 所以你的名字是:" + lines: '2' + answer: 所以你的名字是:**name** + - type: 输出 + code: "ask 你叫什么名字?\necho 很高兴认识你," + lines: '2' + answer: 很高兴认识你,**name** + - type: 文本 + contents: "#### 练习 4:编程词汇\n\n每节课我们都会学习新词汇,包括本课。你知道这些术语是什么意思吗?用你自己的话来解释一下。" + - type: 定义 + lines: '1' + answer: 您要交给计算机的任务,例如 print. + word: 指令 + - type: 定义 + word: 输入 + lines: '1' + answer: 当 Hedy 展示询问屏幕时你在电脑里输入的内容 + - type: 定义 + word: 输出 + answer: 按下“运行代码”按钮后,Hedy 在右侧屏幕上显示的内容。 + lines: '1' + - type: 文本 + contents: "#### 练习 5:命令\n\n到目前为止,我们已经学习了 3 个命令:`print`、`ask` 和 `echo`。它们有什么作用?用你自己的话解释一下。" + - type: 定义 + word: '`print` 命令' + answer: 在屏幕上显示文本。 + lines: '1' + - type: 定义 + word: '`ask` 命令' + answer: 要求用户输入。 + lines: '1' + - lines: '1' + answer: 重复用户的输入。 + word: '`echo` 命令' + type: 定义 + - level: '2' + exercises: + - type: 文本 + code: "名字是 Mo\n打印名字" + contents: "### 使用变量\n\n您刚刚在屏幕上看到了 `is` 命令。\n`is` 命令将某些内容保存在计算机内存中并为其命名。我们称之为变量。\n变量中保存的内容称为变量的值。" + - type: 文本 + contents: '#### 练习 1:标记正确的代码片段' + - type: circle + answer: 在所有行上 + goal: 变量 + code: "名字是 Hedy\n打印 你好 名字\n年龄是 17\n打印 你的年龄是 岁" + - type: circle + answer: 行1和3 + code: "名字 is Hedy\nprint 你好 名字\n年龄 is 17\nprint你的年龄是 岁" + goal: 变量**被设置**的地方 + - type: circle + goal: 变量**被使用的**地方 + code: "名字is Hedy\npirint 你好 名字\n年龄is 17\nprint 你的年龄是 岁" + answer: 行2和4 + - type: 文本 + contents: "#### 练习 2:预测输出\n提示:您是否很难预测输出?请按照以下步骤操作:\n\n1. 标记设置变量的位置\n2. 标记使用变量的位置\n3. 在这两个位置之间画一条线\n4. 在使用变量的位置写入值(“is”后面的内容)。" + - type: 输出 + code: "名字是 Mo\n打印 干得好名字!" + answer: 干得好 Mo! + lines: '1' + - type: 输出 + answer: 干得好 Mo! + lines: '1' + code: "名字是 Mo\n打印 干得好,Mo!" + - answer: 早上好 Layla! + type: 输出 + code: "first_name is Layla\nprint 早上好 first_name!" + lines: '1' + - type: 文本 + contents: "#### 练习 3:错误?\n仔细阅读程序。哪些是正确的?" + - type: MC-code + options: + - 正确 + - 错误 + answer: 正确 + code: "姓氏is Johnson\n打印 早上好 姓氏!" + - type: MC-code + options: + - 正确 + - 错误 + answer: 不正确。名称未设置。 + code: "名字 is\nprint 早上好,名字!" + - options: + - 正确 + - 错误 + code: "名字is Johnson\nprint 早上好,先生,名字!\nprint 你好,先生,名字!" + answer: 正确。你可以多次使用一个变量。 + type: MC-code + - type: 文本 + code: name is ask What is your name? + contents: "### 请求输入\n\n仅保存文本并不是很有用。在第 1 级中,我们已看到代码“ask”。\n\n从现在开始,您可以将“ask”与“is”组合在一起,如下所示:" + - type: 文本 + contents: "### 显示输入\n有了变量,我们就不再需要 `echo` 了。只需使用 `print` 即可显示答案。" + code: "name is ask What is your name?\nprint so you are called: name" + - type: 文本 + contents: "如果某个名叫 Olivia 的人使用此代码,则输出将是:“所以你叫:Olivia”\n#### 练习 4:预测输出\n预测这些程序的输出。假装使用了你自己的名字。" + - type: 输出 + answer: '所以你被称为: **name**' + code: "name is ask 你叫什么名字?\nprint 所以你被称为: name" + lines: '1' + - answer: 所以你今天感觉 **mood** + lines: '1' + code: "mood is ask 你今天过得怎么样?\nprint 所以你今天 mood 很好" + type: 输出 + - type: 文本 + contents: "#### 练习 5:编程单词\n我们在这一级别学习了一些新单词!用你自己的话解释它们。" + - type: 定义 + word: 变量 + answer: 您赋予某事物的名称,例如姓氏或年龄。 + lines: '1' + - type: 定义 + word: 值 + answer: 变量中保存了什么,例如 Andrew 或 12。 + lines: '1' + - type: 定义 + word: 配置 + lines: '1' + answer: 你可以使用‘is’命令设置变量 + - type: 定义 + lines: '1' + word: 交互 + answer: 用户可以提供输入的程序。 + - type: 文本 + contents: "#### 练习 6:命令\n我们一起学习了新命令:`is` 和 `is ask`。它们做什么?用你自己的话解释一下。" + - type: 定义 + answer: 将值(在 `is` 之后)保存到变量中(在 `is` 之前) + lines: '1' + word: '`is` 命令' + - type: 定义 + lines: '1' + word: '`is ask` 命令' + answer: 要求用户输入并将其保存在变量中。 + intro: "### 变量\n在本课结束时,您可以:\n* 将某些内容保存在变量中\n* 使用变量创建故事或绘图" + - level: '3' + exercises: + - type: 文本 + code: "friends is Mo, Layla, Danny\n打印 今天我将拜访 friends at random" + contents: "### 变量\n您刚刚看到了`is`命令与列表一起使用。\n就像常规变量一样,我们使用`is`来保存某些内容。" + - type: 文本 + contents: '#### 练习 1:标记正确的代码片段' + - code: "today is monday\nclasses is 1HC, 1HB, 1HA\nrooms is 011, 304, 305, 501" + answer: classes 和 rooms + type: circle + goal: lists + - code: "classes is 1HC, 1HB, 1HA\nprint today classes at random gets a day off!" + type: circle + goal: 使用列表中的文本的地方 + answer: 第 2 行结束 + - type: 文本 + contents: "#### 练习 2:预测输出\n很难吗?再次使用这些步骤来预测变量的输出。\n1. 标记设置变量的位置\n2. 标记使用变量的位置\n3. 在这两个位置之间画一条线\n4. 当使用 `at` `random` 时,从列表中随机选择一个项目。" + - type: 输出 + answer: 今天**选一位老师**来教你! + code: "teachers is Hermans, Merbis, Bagci, Senkal\nprint 今天有老师 teachers at random 来教你!" + lines: '1' + - answer: 今天的老师是 Hermans. + lines: '1' + type: 输出 + code: "teachers is Hermans, Merbis, Bagci, Senkal\nprint 今天的老师是 Hermans." + - type: 输出 + lines: '1' + answer: 今天 weather 多好啊! + code: "weather is sunny, rainy, cloudy, stormy\nprint 今天 weather 真可爱!" + - type: 文本 + contents: "#### 练习 3:错误?\n仔细阅读程序。哪些是正确的?" + - type: MC-code + options: + - 正确 + - 错误 + code: "rocks is pebbles, stones, boulders\nprint 我爱 ! It rocks!" + answer: 不正确。您无法打印列表 + - type: MC-code + options: + - 正确 + - 错误 + intro: "### 列表和随机性\n在本课结束时,您可以:\n* 将多个项目保存在一个变量中,这称为列表。\n* 创建一个故事,其中会发生随机的事情。\n* 创建一个将绘制随机事物的绘图。" diff --git a/content/parsons/zh_Hans.yaml b/content/parsons/zh_Hans.yaml index e1bf0363ae0..1b75fc36649 100644 --- a/content/parsons/zh_Hans.yaml +++ b/content/parsons/zh_Hans.yaml @@ -20,6 +20,7 @@ levels: {ask} 你准备好参加派对了吗? {ask} 你想听什么歌? {echo} 很棒的选择!我喜欢这首歌 + story: 您在 DJ 台点播一首歌曲。创建一个程序,询问您是否准备好参加派对,然后询问您想听哪首歌。 2: 1: code: |- @@ -27,12 +28,14 @@ levels: 电影 {is} 刺猬索尼克2 {print} 我们要看电影 {print} 玩得愉快! + story: "你和你的朋友将要观看 Netflix。\n显示你将要观看的电影,并祝观众玩得开心!" 2: code: |- {print} 欢迎来到我们的玩具店 玩具 {is} {ask} 你想买什么? {print}玩具已添加到您的购物车中。 {print} 感谢您与我们一起购物! + story: 这是一家玩具店的网上商店。创建一个程序,让客户可以将商品添加到购物车中。 4: 1: story: |- @@ -44,6 +47,9 @@ levels: {print} “这将是你的第一只神奇宝贝!” {sleep} {print} 口袋妖怪 {at} {random} + 2: + story: 创建一个彩票,让您可以选择可能赢得的额外奖品。 + code: "prizes {is} car, hamster, 1 million euros\nprize {is} {ask} 'What would you like to win?'\n{add} prize {to_list} prizes\n{print} 'You won a ' prizes {at} {random}" 6: 1: code: |- @@ -52,6 +58,10 @@ levels: 猫的年龄 = 年龄 * 5 {print}“在狗年里,你已经'dog_age'岁了。” {print} “在猫年里,你已经'cat_age'岁了。” + story: "编写一个程序来计算您的狗和猫年龄。\n首先询问用户的年龄并开始计算。\n首先计算狗的年龄,然后计算猫的年龄。\n向用户显示不同的年龄。" + 2: + story: 创建一个程序,帮助您计算应该为生日聚会购买多少个蛋糕。 + code: "{print} '今天是你的生日!'\npeople = {ask} '你想给多少人分一块蛋糕?'\ncakes_amount = people/8\n{print} '你将不得不购买 ' cakes_amount ' 个蛋糕'" 7: 2: code: |- @@ -59,6 +69,10 @@ levels: {repeat} 3 {times} {print} 'round and round' {print} 'the wheels of the bus go round and round' {print} 'all through the town' + story: 创作歌曲《公共汽车的轮子转啊转》 + 1: + story: 完成小鲨鱼歌曲。首先是小鲨鱼,然后是妈妈,最后是爸爸鲨鱼。 + code: "{repeat} 3 {times} {print} '小鲨鱼tututututudu'\n{print} '小鲨鱼'\n{repeat} 3 {times} {print} '妈妈鲨鱼tututututudu'\n{print} '妈妈鲨鱼'\n{repeat} 3 {times} {print} '爸爸鲨鱼tututututudu'\n{print} '爸爸鲨鱼'" 8: 2: story: Print the countdown for a game of hide and seek. @@ -69,20 +83,29 @@ levels: {print} 计数器 {sleep} 1 {print} “准备好了,我来不来!” + 1: + story: "你和其他四个朋友正在玩 Pokémon Go!创建一个程序来决定你们每个人将加入哪个队伍。\n红色、黄色或蓝色!宣布队伍后稍作休息。" + code: "团队 = 红色,黄色,蓝色\n{print} '红色、黄色还是蓝色?'\n{repeat} 5 {times}\n {print} '您被选入团队... '\n {print} 团队 {at} {random}\n {sleep} 2" 9: 2: story: |- 此代码询问餐厅的顾客是否要订购甜点。如果他们这样做,它会问他们什么样的甜点。如果他们订购提拉米苏,他们会被告知提拉米苏已经售罄。 你能让代码工作吗? + code: "order = {ask} 'Would you like to order dessert?'\n{if} order = yes\n dessert = {ask} 'What kind of dessert would you like?'\n {if} dessert = tiramisu\n {print} 'Sorry, we are out of tiramisu.'\n {else}\n {print} 'One ' dessert ' coming right up!'\n{else}\n {print} 'You dont want a dessert. No problem!'" + 1: + story: 这个游戏会给你三道数学作业,每次的题目都不一样,你能找出顺序吗? + code: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n{repeat} 3 {times}\n number = numbers {at} {random}\n correct_answer = 5 * number\n answer = {ask} '5 次' number ' 是多少?'\n {if} answer = correct_answer\n {print} '做得好!'\n {else}\n {print} '不!正确答案是 ' correct_answer" 10: 1: story: |- 通过制定一个时间表来帮助这个家庭摆脱困境,确定谁在做饭以及他们本周应该做什么。 `{remove}` 命令确保没有人需要做饭两次,这样每天都有不同的晚餐。 **注意!** 变量顺序应该是先是哪一天,然后是人,最后是晚餐选项。 这也适用于带有`{remove}` 命令的行。 + code: "days = 星期一,星期二,星期三,星期四,星期五\npeople = 妈妈,爸爸,马丁,艾比,杰西\ndinner_options = 披萨,玉米饼,煎饼,沙拉,千层面\n{for} day {in} days\n chosen_person = people {at} {random}\n chosen_dinner = dinner_options {at} {random}\n {print} '在 ' day ' ' chosen_person ' 正在做 ' chosen_dinner\n {remove} chosen_person {from} people\n {remove} chosen_dinner {from} dinner_options" 2: story: |- 这个化妆机器人将为您决定您的新发型。如果您不同意第一个选择,可以重试。 **头脑**变量人定义在第一行。第二个中的可变发型。 + code: "people = Betty, Amanda, Marc\nhairstyles = a bald head, a mohawk, a ponytail, spikes\n{for} person {in} people\n {print} person ' will get ' hairstyles {at} {random}\n happy = {ask} person ', are you happy with this choice?'\n {if} happy {is} yes\n {print} 'Great'\n {else}\n {print} 'Lets try again... Then 'person ' will get ' hairstyles {at} {random}" 11: 1: story: 创建除夕倒计时!程序应该在一秒钟内显示从10到1的数字,然后祝你新年快乐。 @@ -96,6 +119,7 @@ levels: story: |- 创建一个程序,告诉我们科学集市的最终结果。首先定义变量参赛者,然后定义变量位置。 **提示** 第 5 行应该是睡眠命令,而且你应该以表示祝贺结束。 + code: "{print} 'And now we will reveal the results of the science fair'\ncontestants = Vivienne, Paul, Trixy, Bianca, Katya\nplace = 5\n{for} contestant {in} contestants\n {sleep} 2\n {print} 'On number ' place ' has ended... ' contestant\n place = place - 1\n{print} 'Congratulations!'" 12: 1: story: |- @@ -109,5 +133,24 @@ levels: 她冉冉升起 她冉冉升起 清晨 + code: "verses = '我们该怎么处置这个醉酒的水手', '她好嗨,然后站了起来'\n{for} verse {in} verses\n {for} count {in} {range} 1 {to} 3\n {print} verse\n {print} '一大早'" 2: story: 和我们一起玩龙卷风游戏!首先定义可变的人,然后是四肢,然后是颜色。 + code: "people = 'Jess', 'Nick', 'Winston'\nlimbs = 'left hand', 'left foot', 'right hand', 'right foot'\ncolors = 'red', 'blue', 'green', 'yellow'\n{for} person {in} people\n {print} person ', put your ' limbs {at} {random} ' on ' colors {at} {random}" + 3: + 2: + story: 创建一个程序,为您随机选择一顿饭。列出食物和配料清单,让程序决定您要吃什么! + code: "食物 {is} 披萨、冰淇淋、沙拉、三明治\n配料 {is} 巧克力、奶酪、金枪鱼、糖屑\n{print} 您今天的随机餐是...\n{sleep} 2\n{print} 食物 {at} {random} 配料 {at} {random}" + 1: + story: "霍格沃茨的新学年开始了!\n分院帽的工作就是把你分到不同的学院。\n你会被分到哪个学院?你是格兰芬多、赫奇帕奇、拉文克劳还是斯莱特林。\n在分院帽揭晓你的学院之前,你可以告诉它不要选择其中一个学院。" + code: "{print} 分院帽已准备好将您分入霍格沃茨学院。\nhouses {is} 格兰芬多、赫奇帕夫、拉文克劳、斯莱特林\ndislike {is} {ask} 有哪些学院您不想加入?\n{remove} dislike {from} houses\n{print} 不讨厌吧?最好是... houses {at} {random}" + 3: + story: "在国际象棋锦标赛中,剩下三名选手。\n创建一个程序来决定哪两名选手必须先对决。\n首先打印参加第一场比赛的两名选手,然后打印获胜者将与哪名选手对决。" + code: "玩家 {is} Liam、Noah、Sophie\nplayer_1 {is} 玩家 {at} {random}\n{remove} player_1 {from} 玩家\nplayer_2 {is} 玩家 {at} {random}\n{print} player_1 ' 首先与 ' player_2 比赛\n{remove} player_2 {from} 玩家\n{print} ' 获胜者与 ' 玩家 {at} {random} 比赛" + 5: + 2: + story: 创建一个数学游戏。 + code: "{print} '解答这个问题'\n答案 {is} {ask} '88 - 16 = ?'\n{if} 答案 {is} 72 {print} '正确!'\n{else} {print} '错误!答案是 72'" + 1: + story: "编写一个程序来检查你最喜欢的电影是否已经在计算机的列表中。\n如果是,则打印出你很有品味,否则将电影添加到列表中。" + code: "favorite_movies {is} 蝙蝠侠、蜘蛛侠、复仇者联盟、侏罗纪公园\nmovie {is} {ask} “你最喜欢的电影是什么?”\n{if} movie {in} favorite_movies {print} “你很有品味!”\n{else} {print} “很遗憾你最喜欢的电影不在列表中,我们会立即添加它!”\n{add} movie {to_list} favorite_movies" diff --git a/content/quizzes/es.yaml b/content/quizzes/es.yaml index 429b19c22da..20b26250fa7 100644 --- a/content/quizzes/es.yaml +++ b/content/quizzes/es.yaml @@ -624,12 +624,12 @@ levels: ``` {print} '¡Tengo muchas ganas de hacer este cuestionario!' ``` - feedback: no utilices apóstrofe o utiliza contracita en su lugar + feedback: no utilices apóstrofo o utiliza en su lugar el acento grave - option: |- ``` {print} '¡Tengo muchas ganas de hacer este cuestionario! ``` - feedback: cuidado al usar comillas y apóstrofe + feedback: cuidado al usar comillas y apóstrofo hint: En el nivel 4 necesitas comillas para 2 comandos. correct_answer: A question_score: '10' @@ -1298,7 +1298,7 @@ levels: feedback: '`{repeat}` está mal escrito' - option: '`{times}`' feedback: '`{times}` está mal escrito' - hint: Estoy equivocado, no puedes usar apóstrofes en una oración + hint: Estoy equivocado, no puedes usar apóstrofos en una oración question_score: '10' correct_answer: A 5: @@ -1313,7 +1313,7 @@ levels: question_score: '10' correct_answer: A 6: - question_text: ¿Cuál será la salida de este código? + question_text: ¿Cuál será el resultado de este código? code: |- {print} 'las ruedas del bus' {repeat} 3 {times} {print} ' giran y giran' @@ -1389,7 +1389,7 @@ levels: question_score: '10' correct_answer: B 8: - question_text: ¿Qué código de Hedy corresponde a esta salida? + question_text: ¿Qué código de Hedy corresponde a este resultado? code: |- Ahí viene el Sol Do do do do @@ -2122,7 +2122,7 @@ levels: - option: los perros son mascotas adorables feedback: La línea 2 dice {for} cada animal en la lista de animales. Así que se {print} cada animal. - option: perros, gatos, hámsteres, gallinas son mascotas adorables - feedback: Cada animal tiene su propia línea en la salida. + feedback: Cada animal tiene su propia línea en el resultado. - option: |- los perros son mascotas adorables los gatos son mascotas adorables @@ -2890,7 +2890,7 @@ levels: question_score: '10' correct_answer: B 3: - question_text: ¿Qué salida se le da a un miembro sin un código de descuento? + question_text: ¿Qué resultado se da a un miembro sin un código de descuento? code: |- miembro = {ask} '¿Tienes tarjeta de socio?' descuento = {ask} '¿Tienes un código de descuento?' @@ -3008,7 +3008,7 @@ levels: question_score: '10' correct_answer: C 8: - question_text: ¿Qué salida recibes si pides palomitas sin bebida? + question_text: ¿Qué resultado obtienes si pides palomitas sin bebida? code: |- {print} 'Bienvenido al cine' palomitas = {ask} '¿Quieres palomitas?' @@ -3825,7 +3825,7 @@ levels: question_score: '10' 17: 1: - question_text: ¿Cuál es la salida de este código? + question_text: ¿Cuál es el resultado de este código? mp_choice_options: - option: |- ``` @@ -4097,7 +4097,7 @@ levels: question_score: '10' correct_answer: C 9: - question_text: ¿Cuál de los códigos de abajo dio esta salida? + question_text: ¿Cuál de los siguientes códigos produjo este resultado? code: |- -5 es negativo -4 es negativo diff --git a/content/slides/es.yaml b/content/slides/es.yaml index 50692391ac5..ad56f4626c0 100644 --- a/content/slides/es.yaml +++ b/content/slides/es.yaml @@ -42,7 +42,7 @@ levels: code: '{print} ¡Bienvenido/a a Hedy!' 9: header: Programar en Hedy - text: La salida también puede ser un dibujo. + text: El resultado también puede ser un dibujo. code: "{forward} 100\n{turn} {left}" 1: 1: @@ -304,7 +304,7 @@ levels: 8: header: Comillas y contracciones text: |- - ¡Cuidado! Ahora que estás usando comillas, no puedes usar apóstrofes en las abreviaturas. + ¡Cuidado! Ahora que estás usando comillas, no puedes usar apóstrofos en las abreviaturas. Por favor intenta imprimir una contracción como "you're" o "I'm" en la pantalla de abajo y verás que sucede.... code: '{print} ''¡Esto no'' funcionará!''' diff --git a/static/js/appbundle.js b/static/js/appbundle.js index 959616cee24..df261bc61db 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -61135,7 +61135,7 @@ ${o3}` : i3; "es": { "CheckInternet": "Comprueba si tu conexi\xF3n a Internet funciona.", "Connection_error": "No se ha podido conectar con el servidor.", - "Empty_output": "Este c\xF3digo funciona pero no imprime nada. Agrega un comando print a tu c\xF3digo o usa una tortuga para mostrar salida.", + "Empty_output": "Este c\xF3digo funciona pero no imprime nada. Agrega un comando print a tu c\xF3digo o usa una tortuga para mostrar el resultado.", "Errors_found": "\xA1Has cometido un error! No te preocupes, seguimos ejecutando el programa", "Execute_error": "Algo sali\xF3 mal mientras se ejecutaba el programa.", "Other_error": "\xA1Ups! Quiz\xE1s hemos cometido un peque\xF1o error.", @@ -61786,13 +61786,13 @@ ${o3}` : i3; "Transpile_success": "Igerrez!\nGedha!\nYelha!\nIzad!\nD amahil izaden!", "Transpile_warning": "\u0194ur-k!", "Unsaved_Changes": "Ahil-a ur yettwasekles ara. Teb\u0263i\u1E0D ad teff\u0263e\u1E0D war ma teskelse\u1E0D-t?", - "adventures_completed": "Adventures completed: {number_of_adventures}", + "adventures_completed": "Tidyanin mmdent: {number_of_adventures}", "adventures_restored": "The default adventures have been restored.", "adventures_tried": "Adventures tried", "copy_link_to_share": "N\u0263el ase\u0263wen ara teb\u1E0Du\u1E0D", "customization_deleted": "Customizations successfully deleted.", "dice": "\u{1F3B2}", - "directly_available": "Directly open", + "directly_available": "Ldi imir", "disabled": "Disabled", "errors": "Tucc\u1E0Diwin", "fortune": "\u{1F52E}, \u2728", diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index d4a49b3d7dc..0168c860800 100644 --- a/static/js/appbundle.js.map +++ b/static/js/appbundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../node_modules/jszip/dist/jszip.min.js", "../../node_modules/@babel/runtime/helpers/arrayWithHoles.js", "../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js", "../../node_modules/@babel/runtime/helpers/arrayLikeToArray.js", "../../node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js", "../../node_modules/@babel/runtime/helpers/nonIterableRest.js", "../../node_modules/@babel/runtime/helpers/slicedToArray.js", "../../node_modules/@babel/runtime/helpers/classCallCheck.js", "../../node_modules/@babel/runtime/helpers/typeof.js", "../../node_modules/@babel/runtime/helpers/toPrimitive.js", "../../node_modules/@babel/runtime/helpers/toPropertyKey.js", "../../node_modules/@babel/runtime/helpers/createClass.js", "../../node_modules/automation-events/build/es5/bundle.js", "../../node_modules/dompurify/src/utils.js", "../../node_modules/dompurify/src/tags.js", "../../node_modules/dompurify/src/attrs.js", "../../node_modules/dompurify/src/regexp.js", "../../node_modules/dompurify/src/purify.js", "ckeditor.js", "index.ts", "message-translations.ts", "client-messages.ts", "modal.ts", "app.ts", "../../node_modules/tone/Tone/version.ts", "../../node_modules/standardized-audio-context/src/module.ts", "../../node_modules/standardized-audio-context/src/factories/abort-error.ts", "../../node_modules/standardized-audio-context/src/factories/add-active-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-node-connections.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-param-connections.ts", "../../node_modules/standardized-audio-context/src/globals.ts", "../../node_modules/standardized-audio-context/src/helpers/is-constructible.ts", "../../node_modules/standardized-audio-context/src/helpers/split-import-statements.ts", "../../node_modules/standardized-audio-context/src/factories/add-audio-worklet-module.ts", "../../node_modules/standardized-audio-context/src/helpers/get-value-for-key.ts", "../../node_modules/standardized-audio-context/src/helpers/pick-element-from-set.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-passive-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-event-listeners-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-active.ts", "../../node_modules/standardized-audio-context/src/guards/audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-passive.ts", "../../node_modules/standardized-audio-context/src/helpers/set-internal-state-to-passive-when-necessary.ts", "../../node_modules/standardized-audio-context/src/factories/add-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-passive-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/add-silent-connection.ts", "../../node_modules/standardized-audio-context/src/factories/add-unrendered-audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/factories/analyser-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/is-owned-by-context.ts", "../../node_modules/standardized-audio-context/src/factories/analyser-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-copy-channel-methods-out-of-bounds-support.ts", "../../node_modules/standardized-audio-context/src/factories/index-size-error.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-get-channel-data-method.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-constructor.ts", "../../node_modules/standardized-audio-context/src/constants.ts", "../../node_modules/standardized-audio-context/src/helpers/is-active-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-buffer-source-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/guards/audio-buffer-source-node.ts", "../../node_modules/standardized-audio-context/src/guards/biquad-filter-node.ts", "../../node_modules/standardized-audio-context/src/guards/constant-source-node.ts", "../../node_modules/standardized-audio-context/src/guards/gain-node.ts", "../../node_modules/standardized-audio-context/src/guards/oscillator-node.ts", "../../node_modules/standardized-audio-context/src/guards/stereo-panner-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-node-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-param-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/deactivate-active-audio-node-input-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/deactivate-audio-graph.ts", "../../node_modules/standardized-audio-context/src/helpers/is-valid-latency-hint.ts", "../../node_modules/standardized-audio-context/src/factories/audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-destination-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-destination-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/audio-listener-factory.ts", "../../node_modules/standardized-audio-context/src/guards/audio-node.ts", "../../node_modules/standardized-audio-context/src/guards/audio-node-output-connection.ts", "../../node_modules/standardized-audio-context/src/helpers/insert-element-in-set.ts", "../../node_modules/standardized-audio-context/src/helpers/add-active-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/add-passive-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/guards/native-audio-node-faker.ts", "../../node_modules/standardized-audio-context/src/helpers/connect-native-audio-node-to-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-active-input-connection.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-active-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-event-listeners-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/delete-passive-input-connection-to-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/disconnect-native-audio-node-from-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-native-audio-param.ts", "../../node_modules/standardized-audio-context/src/helpers/is-part-of-a-cycle.ts", "../../node_modules/standardized-audio-context/src/helpers/is-passive-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-node-disconnect-method-support.ts", "../../node_modules/standardized-audio-context/src/helpers/visit-each-audio-node-once.ts", "../../node_modules/standardized-audio-context/src/guards/native-audio-node.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-node-disconnect-method.ts", "../../node_modules/standardized-audio-context/src/factories/audio-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-param-factory.ts", "../../node_modules/standardized-audio-context/src/factories/audio-param-renderer.ts", "../../node_modules/standardized-audio-context/src/read-only-map.ts", "../../node_modules/standardized-audio-context/src/factories/audio-worklet-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/copy-from-channel.ts", "../../node_modules/standardized-audio-context/src/helpers/copy-to-channel.ts", "../../node_modules/standardized-audio-context/src/helpers/create-nested-arrays.ts", "../../node_modules/standardized-audio-context/src/helpers/get-audio-worklet-processor.ts", "../../node_modules/standardized-audio-context/src/factories/audio-worklet-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/base-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/biquad-filter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/biquad-filter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/cache-test-result.ts", "../../node_modules/standardized-audio-context/src/factories/channel-merger-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/channel-merger-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/channel-splitter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/channel-splitter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/connect-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/connect-multiple-outputs.ts", "../../node_modules/standardized-audio-context/src/factories/connected-native-audio-buffer-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/constant-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/constant-source-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/convert-number-to-unsigned-long.ts", "../../node_modules/standardized-audio-context/src/factories/convolver-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/convolver-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/create-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/data-clone-error.ts", "../../node_modules/standardized-audio-context/src/helpers/detach-array-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/decode-audio-data.ts", "../../node_modules/standardized-audio-context/src/factories/decrement-cycle-counter.ts", "../../node_modules/standardized-audio-context/src/factories/delay-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/delay-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/delete-active-input-connection-to-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/delete-unrendered-audio-worklet-node.ts", "../../node_modules/standardized-audio-context/src/guards/delay-node.ts", "../../node_modules/standardized-audio-context/src/factories/detect-cycles.ts", "../../node_modules/standardized-audio-context/src/factories/disconnect-multiple-outputs.ts", "../../node_modules/standardized-audio-context/src/factories/dynamics-compressor-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/dynamics-compressor-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/encoding-error.ts", "../../node_modules/standardized-audio-context/src/factories/evaluate-source.ts", "../../node_modules/standardized-audio-context/src/factories/event-target-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/expose-current-frame-and-current-time.ts", "../../node_modules/standardized-audio-context/src/factories/fetch-source.ts", "../../node_modules/standardized-audio-context/src/factories/gain-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/gain-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/get-active-audio-worklet-node-inputs.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-node-renderer.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-node-tail-time.ts", "../../node_modules/standardized-audio-context/src/factories/get-audio-param-renderer.ts", "../../node_modules/standardized-audio-context/src/factories/get-backup-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/invalid-state-error.ts", "../../node_modules/standardized-audio-context/src/factories/get-native-context.ts", "../../node_modules/standardized-audio-context/src/factories/get-or-create-backup-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/get-unrendered-audio-worklet-nodes.ts", "../../node_modules/standardized-audio-context/src/factories/invalid-access-error.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-iir-filter-node-get-frequency-response-method.ts", "../../node_modules/standardized-audio-context/src/factories/iir-filter-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/filter-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/iir-filter-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/increment-cycle-counter-factory.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/is-any-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/is-secure-context.ts", "../../node_modules/standardized-audio-context/src/factories/media-element-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-audio-destination-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/media-stream-track-audio-source-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-base-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/test-promise-support.ts", "../../node_modules/standardized-audio-context/src/factories/minimal-offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/monitor-connections.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-option.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/test-analyser-node-get-float-time-domain-data-method-support.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-analyser-node-get-float-time-domain-data-method.ts", "../../node_modules/standardized-audio-context/src/factories/native-analyser-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-buffer-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/assign-native-audio-node-audio-param-value.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-source-node-start-method-consecutive-calls.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-start-method-negative-parameters.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-stop-method-negative-parameters.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-buffer-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-destination-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-constructor.ts", "../../node_modules/standardized-audio-context/src/helpers/test-clonability-of-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/compute-buffer-size.ts", "../../node_modules/standardized-audio-context/src/helpers/clone-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/create-audio-worklet-processor-promise.ts", "../../node_modules/standardized-audio-context/src/helpers/create-audio-worklet-processor.ts", "../../node_modules/standardized-audio-context/src/factories/native-audio-worklet-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-biquad-filter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-channel-merger-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-channel-splitter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-channel-splitter-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-constant-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/helpers/intercept-connections.ts", "../../node_modules/standardized-audio-context/src/factories/native-constant-source-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-convolver-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-delay-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-dynamics-compressor-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-gain-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-iir-filter-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-iir-filter-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-element-audio-source-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-audio-destination-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-audio-source-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-media-stream-track-audio-source-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/native-oscillator-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-panner-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-panner-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-periodic-wave-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-script-processor-node.ts", "../../node_modules/standardized-audio-context/src/factories/native-stereo-panner-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-stereo-panner-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-wave-shaper-node-factory.ts", "../../node_modules/standardized-audio-context/src/factories/native-wave-shaper-node-faker-factory.ts", "../../node_modules/standardized-audio-context/src/factories/not-supported-error.ts", "../../node_modules/standardized-audio-context/src/factories/offline-audio-context-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/oscillator-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/oscillator-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/panner-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/panner-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/periodic-wave-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/render-automation.ts", "../../node_modules/standardized-audio-context/src/factories/render-inputs-of-audio-node.ts", "../../node_modules/standardized-audio-context/src/factories/render-inputs-of-audio-param.ts", "../../node_modules/standardized-audio-context/src/factories/render-native-offline-audio-context.ts", "../../node_modules/standardized-audio-context/src/factories/set-active-audio-worklet-node-inputs.ts", "../../node_modules/standardized-audio-context/src/factories/set-audio-node-tail-time.ts", "../../node_modules/standardized-audio-context/src/factories/start-rendering.ts", "../../node_modules/standardized-audio-context/src/factories/stereo-panner-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/stereo-panner-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/test-audio-buffer-constructor-support.ts", "../../node_modules/standardized-audio-context/src/factories/test-audio-worklet-processor-post-message-support.ts", "../../node_modules/standardized-audio-context/src/factories/test-offline-audio-context-current-time-support.ts", "../../node_modules/standardized-audio-context/src/factories/unknown-error.ts", "../../node_modules/standardized-audio-context/src/factories/wave-shaper-node-constructor.ts", "../../node_modules/standardized-audio-context/src/factories/wave-shaper-node-renderer-factory.ts", "../../node_modules/standardized-audio-context/src/factories/window.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-copy-channel-methods.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-copy-channel-methods-out-of-bounds.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-audio-buffer-source-node-stop-method-nullified-buffer.ts", "../../node_modules/standardized-audio-context/src/factories/wrap-channel-merger-node.ts", "../../node_modules/standardized-audio-context/src/helpers/get-first-sample.ts", "../../node_modules/standardized-audio-context/src/helpers/is-dc-curve.ts", "../../node_modules/standardized-audio-context/src/helpers/overwrite-accessors.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-audio-worklet-node-options.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-channel-splitter-options.ts", "../../node_modules/standardized-audio-context/src/helpers/sanitize-periodic-wave-options.ts", "../../node_modules/standardized-audio-context/src/helpers/set-value-at-time-until-possible.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-start-method-consecutive-calls-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-start-method-offset-clamping-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-buffer-source-node-stop-method-nullified-buffer-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-start-method-negative-parameters-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-stop-method-consecutive-calls-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-scheduled-source-node-stop-method-negative-parameters-support.ts", "../../node_modules/standardized-audio-context/src/helpers/test-audio-worklet-node-options-clonability.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-buffer-source-node-start-method-offset-clamping.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-audio-scheduled-source-node-stop-method-consecutive-calls.ts", "../../node_modules/standardized-audio-context/src/helpers/wrap-event-listener.ts", "../../node_modules/tone/Tone/core/util/Debug.ts", "../../node_modules/tone/Tone/core/util/TypeCheck.ts", "../../node_modules/tone/Tone/core/context/AudioContext.ts", "../../node_modules/tslib/tslib.es6.mjs", "../../node_modules/tone/Tone/core/clock/Ticker.ts", "../../node_modules/tone/Tone/core/util/AdvancedTypeCheck.ts", "../../node_modules/tone/Tone/core/util/Defaults.ts", "../../node_modules/tone/Tone/core/Tone.ts", "../../node_modules/tone/Tone/core/util/Math.ts", "../../node_modules/tone/Tone/core/util/Timeline.ts", "../../node_modules/tone/Tone/core/context/ContextInitialization.ts", "../../node_modules/tone/Tone/core/util/Emitter.ts", "../../node_modules/tone/Tone/core/context/BaseContext.ts", "../../node_modules/tone/Tone/core/context/Context.ts", "../../node_modules/tone/Tone/core/context/DummyContext.ts", "../../node_modules/tone/Tone/core/util/Interface.ts", "../../node_modules/tone/Tone/core/context/ToneAudioBuffer.ts", "../../node_modules/tone/Tone/core/context/OfflineContext.ts", "../../node_modules/tone/Tone/core/Global.ts", "../../node_modules/tone/Tone/core/type/Conversions.ts", "../../node_modules/tone/Tone/core/type/TimeBase.ts", "../../node_modules/tone/Tone/core/type/Time.ts", "../../node_modules/tone/Tone/core/type/Frequency.ts", "../../node_modules/tone/Tone/core/type/TransportTime.ts", "../../node_modules/tone/Tone/core/context/ToneWithContext.ts", "../../node_modules/tone/Tone/core/util/StateTimeline.ts", "../../node_modules/tone/Tone/core/context/Param.ts", "../../node_modules/tone/Tone/core/context/ToneAudioNode.ts", "../../node_modules/tone/Tone/core/context/Gain.ts", "../../node_modules/tone/Tone/source/OneShotSource.ts", "../../node_modules/tone/Tone/signal/ToneConstantSource.ts", "../../node_modules/tone/Tone/signal/Signal.ts", "../../node_modules/tone/Tone/core/clock/TickParam.ts", "../../node_modules/tone/Tone/core/clock/TickSignal.ts", "../../node_modules/tone/Tone/core/clock/TickSource.ts", "../../node_modules/tone/Tone/core/clock/Clock.ts", "../../node_modules/tone/Tone/core/context/ToneAudioBuffers.ts", "../../node_modules/tone/Tone/core/type/Midi.ts", "../../node_modules/tone/Tone/core/type/Ticks.ts", "../../node_modules/tone/Tone/core/util/Draw.ts", "../../node_modules/tone/Tone/core/util/IntervalTimeline.ts", "../../node_modules/tone/Tone/component/channel/Volume.ts", "../../node_modules/tone/Tone/core/context/Destination.ts", "../../node_modules/tone/Tone/core/util/TimelineValue.ts", "../../node_modules/tone/Tone/core/clock/TransportEvent.ts", "../../node_modules/tone/Tone/core/clock/TransportRepeatEvent.ts", "../../node_modules/tone/Tone/core/clock/Transport.ts", "../../node_modules/tone/Tone/source/Source.ts", "../../node_modules/tone/Tone/source/buffer/ToneBufferSource.ts", "../../node_modules/tone/Tone/source/Noise.ts", "../../node_modules/tone/Tone/source/oscillator/OscillatorInterface.ts", "../../node_modules/tone/Tone/source/oscillator/ToneOscillatorNode.ts", "../../node_modules/tone/Tone/source/oscillator/Oscillator.ts", "../../node_modules/tone/Tone/signal/SignalOperator.ts", "../../node_modules/tone/Tone/signal/WaveShaper.ts", "../../node_modules/tone/Tone/signal/AudioToGain.ts", "../../node_modules/tone/Tone/signal/Multiply.ts", "../../node_modules/tone/Tone/source/oscillator/AMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/FMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/PulseOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/FatOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/PWMOscillator.ts", "../../node_modules/tone/Tone/source/oscillator/OmniOscillator.ts", "../../node_modules/tone/Tone/core/util/Decorator.ts", "../../node_modules/tone/Tone/source/buffer/Player.ts", "../../node_modules/tone/Tone/component/envelope/Envelope.ts", "../../node_modules/tone/Tone/instrument/Instrument.ts", "../../node_modules/tone/Tone/instrument/Monophonic.ts", "../../node_modules/tone/Tone/component/envelope/AmplitudeEnvelope.ts", "../../node_modules/tone/Tone/instrument/Synth.ts", "../../node_modules/tone/Tone/instrument/MembraneSynth.ts", "../../node_modules/tone/Tone/core/worklet/WorkletGlobalScope.ts", "../../node_modules/tone/Tone/core/worklet/ToneAudioWorkletProcessor.worklet.ts", "../../node_modules/tone/Tone/core/worklet/SingleIOProcessor.worklet.ts", "../../node_modules/tone/Tone/core/worklet/DelayLine.worklet.ts", "../../node_modules/tone/Tone/component/filter/FeedbackCombFilter.worklet.ts", "../../node_modules/tone/Tone/instrument/PolySynth.ts", "../../node_modules/tone/Tone/instrument/Sampler.ts", "../../node_modules/tone/Tone/component/channel/Panner.ts", "../../node_modules/tone/Tone/effect/BitCrusher.worklet.ts", "../../node_modules/tone/Tone/effect/Freeverb.ts", "../../node_modules/tone/Tone/effect/JCReverb.ts", "../../node_modules/tone/Tone/component/channel/Solo.ts", "../../node_modules/tone/Tone/component/channel/PanVol.ts", "../../node_modules/tone/Tone/component/channel/Channel.ts", "../../node_modules/tone/Tone/core/context/Listener.ts", "../../node_modules/tone/Tone/index.ts", "event-emitter.ts", "tabs.ts", "pythonPrefixes.ts", "types.ts", "tutorials/utils.ts", "tutorials/intro.ts", "tutorials/teacher.ts", "tutorials/level1.ts", "tutorials/tutorial.ts", "editor.ts", "../../node_modules/@codemirror/state/dist/index.js", "../../node_modules/style-mod/src/style-mod.js", "../../node_modules/w3c-keyname/index.js", "../../node_modules/@codemirror/view/dist/index.js", "../../node_modules/@lezer/common/dist/index.js", "../../node_modules/@lezer/highlight/dist/index.js", "../../node_modules/@codemirror/language/dist/index.js", "../../node_modules/@codemirror/commands/dist/index.js", "../../node_modules/crelt/index.js", "../../node_modules/@codemirror/search/dist/index.js", "cm-decorations.ts", "../../node_modules/@lezer/lr/dist/index.js", "lezer-parsers/level1-parser.terms.ts", "lezer-parsers/level2-parser.terms.ts", "lezer-parsers/level3-parser.terms.ts", "lezer-parsers/level4-parser.terms.ts", "lezer-parsers/level5-parser.terms.ts", "lezer-parsers/level6-parser.terms.ts", "lezer-parsers/level7-parser.terms.ts", "lezer-parsers/level8-parser.terms.ts", "lezer-parsers/level10-parser.terms.ts", "lezer-parsers/level11-parser.terms.ts", "lezer-parsers/level12-parser.terms.ts", "lezer-parsers/level13-parser.terms.ts", "lezer-parsers/level14-parser.terms.ts", "lezer-parsers/level15-parser.terms.ts", "lezer-parsers/level16-parser.terms.ts", "lezer-parsers/level17-parser.terms.ts", "lezer-parsers/level18-parser.terms.ts", "utils.ts", "lezer-parsers/tokens.ts", "lezer-parsers/level1-parser.ts", "lezer-parsers/level2-parser.ts", "lezer-parsers/level3-parser.ts", "lezer-parsers/level4-parser.ts", "lezer-parsers/level5-parser.ts", "lezer-parsers/level6-parser.ts", "lezer-parsers/level7-parser.ts", "lezer-parsers/level8-parser.ts", "lezer-parsers/level9-parser.ts", "lezer-parsers/level10-parser.ts", "lezer-parsers/level11-parser.ts", "lezer-parsers/level12-parser.ts", "lezer-parsers/level13-parser.ts", "lezer-parsers/level14-parser.ts", "lezer-parsers/level15-parser.ts", "lezer-parsers/level16-parser.ts", "lezer-parsers/level17-parser.ts", "lezer-parsers/level18-parser.ts", "lezer-parsers/language-packages.ts", "cm-monokai-theme.ts", "cm-editor.ts", "../../node_modules/sortablejs/modular/sortable.esm.js", "parsons.ts", "browser-helpers/on-element-becomes-visible.ts", "debugging.ts", "local.ts", "teachers.ts", "adventure.ts", "autosave.ts", "../../node_modules/@kurkle/color/dist/color.esm.js", "../../node_modules/chart.js/src/helpers/helpers.core.ts", "../../node_modules/chart.js/src/helpers/helpers.math.ts", "../../node_modules/chart.js/src/helpers/helpers.collection.ts", "../../node_modules/chart.js/src/helpers/helpers.extras.ts", "../../node_modules/chart.js/src/helpers/helpers.easing.ts", "../../node_modules/chart.js/src/helpers/helpers.color.ts", "../../node_modules/chart.js/src/core/core.animations.defaults.js", "../../node_modules/chart.js/src/core/core.layouts.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.intl.ts", "../../node_modules/chart.js/src/core/core.ticks.js", "../../node_modules/chart.js/src/core/core.scale.defaults.js", "../../node_modules/chart.js/src/core/core.defaults.js", "../../node_modules/chart.js/src/helpers/helpers.canvas.ts", "../../node_modules/chart.js/src/helpers/helpers.options.ts", "../../node_modules/chart.js/src/helpers/helpers.config.ts", "../../node_modules/chart.js/src/helpers/helpers.curve.ts", "../../node_modules/chart.js/src/helpers/helpers.dom.ts", "../../node_modules/chart.js/src/helpers/helpers.interpolation.ts", "../../node_modules/chart.js/src/helpers/helpers.rtl.ts", "../../node_modules/chart.js/src/helpers/helpers.segment.js", "../../node_modules/chart.js/src/core/core.animator.js", "../../node_modules/chart.js/src/core/core.animation.js", "../../node_modules/chart.js/src/core/core.animations.js", "../../node_modules/chart.js/src/core/core.datasetController.js", "../../node_modules/chart.js/src/controllers/controller.bar.js", "../../node_modules/chart.js/src/controllers/controller.bubble.js", "../../node_modules/chart.js/src/controllers/controller.doughnut.js", "../../node_modules/chart.js/src/controllers/controller.line.js", "../../node_modules/chart.js/src/controllers/controller.polarArea.js", "../../node_modules/chart.js/src/controllers/controller.pie.js", "../../node_modules/chart.js/src/controllers/controller.radar.js", "../../node_modules/chart.js/src/controllers/controller.scatter.js", "../../node_modules/chart.js/src/core/core.adapters.ts", "../../node_modules/chart.js/src/core/core.interaction.js", "../../node_modules/chart.js/src/core/core.layouts.js", "../../node_modules/chart.js/src/platform/platform.base.js", "../../node_modules/chart.js/src/platform/platform.basic.js", "../../node_modules/chart.js/src/platform/platform.dom.js", "../../node_modules/chart.js/src/platform/index.js", "../../node_modules/chart.js/src/core/core.element.ts", "../../node_modules/chart.js/src/core/core.scale.autoskip.js", "../../node_modules/chart.js/src/core/core.scale.js", "../../node_modules/chart.js/src/core/core.typedRegistry.js", "../../node_modules/chart.js/src/core/core.registry.js", "../../node_modules/chart.js/src/core/core.plugins.js", "../../node_modules/chart.js/src/core/core.config.js", "../../node_modules/chart.js/src/core/core.controller.js", "../../node_modules/chart.js/src/elements/element.arc.ts", "../../node_modules/chart.js/src/elements/element.line.js", "../../node_modules/chart.js/src/elements/element.point.ts", "../../node_modules/chart.js/src/elements/element.bar.js", "../../node_modules/chart.js/src/plugins/plugin.colors.ts", "../../node_modules/chart.js/src/plugins/plugin.decimation.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.segment.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.helper.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.options.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.stack.js", "../../node_modules/chart.js/src/plugins/plugin.filler/simpleArc.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.js", "../../node_modules/chart.js/src/plugins/plugin.filler/filler.drawing.js", "../../node_modules/chart.js/src/plugins/plugin.filler/index.js", "../../node_modules/chart.js/src/plugins/plugin.legend.js", "../../node_modules/chart.js/src/plugins/plugin.title.js", "../../node_modules/chart.js/src/plugins/plugin.subtitle.js", "../../node_modules/chart.js/src/plugins/plugin.tooltip.js", "../../node_modules/chart.js/src/scales/scale.category.js", "../../node_modules/chart.js/src/scales/scale.linearbase.js", "../../node_modules/chart.js/src/scales/scale.linear.js", "../../node_modules/chart.js/src/scales/scale.logarithmic.js", "../../node_modules/chart.js/src/scales/scale.radialLinear.js", "../../node_modules/chart.js/src/scales/scale.time.js", "../../node_modules/chart.js/src/scales/scale.timeseries.js", "../../node_modules/chart.js/src/index.ts", "loading.ts", "comm.ts", "auth.ts", "local-save-warning.ts", "user-activity.ts", "index-tabs.ts", "htmx-integration.ts", "statistics.ts", "logs.ts", "admin.ts", "profile.ts", "initialize.ts", "../../node_modules/tw-elements/src/js/dom/data.js", "../../node_modules/tw-elements/src/js/util/index.js", "../../node_modules/tw-elements/src/js/dom/event-handler.js", "../../node_modules/tw-elements/src/js/base-component.js", "../../node_modules/tw-elements/src/js/components/button.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/enums.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/math.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/userAgent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/contains.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/within.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/arrow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getVariation.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/flip.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/hide.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/offset.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/debounce.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/format.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/validateModifiers.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/uniqueBy.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/utils/mergeByName.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/createPopper.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/popper-lite.js", "../../node_modules/tw-elements/node_modules/@popperjs/core/lib/popper.js", "../../node_modules/tw-elements/src/js/dom/manipulator.js", "../../node_modules/tw-elements/src/js/dom/selector-engine.js", "../../node_modules/tw-elements/src/js/components/dropdown.js", "../../node_modules/tw-elements/src/js/components/collapse.js", "../../node_modules/tw-elements/src/js/util/scrollbar.js", "../../node_modules/tw-elements/src/js/util/backdrop.js", "../../node_modules/tw-elements/src/js/util/focusTrap.js", "../../node_modules/tw-elements/src/js/util/component-functions.js", "../../node_modules/tw-elements/src/js/components/offcanvas.js", "../../node_modules/tw-elements/src/js/components/alert.js", "../../node_modules/tw-elements/src/js/components/carousel.js", "../../node_modules/tw-elements/src/js/components/modal.js", "../../node_modules/tw-elements/src/js/util/sanitizer.js", "../../node_modules/tw-elements/src/js/components/tooltip.js", "../../node_modules/tw-elements/src/js/components/popover.js", "../../node_modules/tw-elements/src/js/navigation/scrollspy.js", "../../node_modules/tw-elements/src/js/navigation/tab.js", "../../node_modules/tw-elements/src/js/components/toast.js", "../../node_modules/tw-elements/node_modules/detect-autofill/dist/detect-autofill.js", "../../node_modules/tw-elements/src/js/forms/input.js", "../../node_modules/tw-elements/src/js/content-styles/animate.js", "../../node_modules/tw-elements/src/js/methods/ripple.js", "../../node_modules/tw-elements/src/js/forms/datepicker/date-utils.js", "../../node_modules/tw-elements/src/js/forms/datepicker/templates.js", "../../node_modules/tw-elements/src/js/util/keycodes.js", "../../node_modules/tw-elements/src/js/forms/datepicker/index.js", "../../node_modules/tw-elements/src/js/forms/timepicker/templates.js", "../../node_modules/tw-elements/src/js/forms/timepicker/utils.js", "../../node_modules/tw-elements/src/js/forms/timepicker/index.js", "../../node_modules/tw-elements/src/js/util/touch/swipe.js", "../../node_modules/tw-elements/src/js/util/touch/index.js", "../../node_modules/tw-elements/src/js/navigation/sidenav.js", "../../node_modules/tw-elements/src/js/components/stepper.js", "../../node_modules/tw-elements/src/js/forms/select/select-option.js", "../../node_modules/tw-elements/src/js/forms/select/selection-model.js", "../../node_modules/tw-elements/src/js/forms/select/util.js", "../../node_modules/tw-elements/src/js/forms/select/templates.js", "../../node_modules/tw-elements/src/js/forms/select/index.js", "../../node_modules/tw-elements/src/js/components/chips/templates.js", "../../node_modules/tw-elements/src/js/components/chips/chip.js", "../../node_modules/tw-elements/src/js/components/chips/index.js", "../../node_modules/tw-elements/src/js/data/chart/chartDefaults.js", "../../node_modules/tw-elements/node_modules/deepmerge/dist/cjs.js", "../../node_modules/tw-elements/src/js/data/chart/charts.js", "../../node_modules/tw-elements/node_modules/perfect-scrollbar/dist/perfect-scrollbar.esm.js", "../../node_modules/tw-elements/src/js/methods/perfect-scrollbar.js", "../../node_modules/tw-elements/src/js/data/datatables/html/pagination.js", "../../node_modules/tw-elements/src/js/data/datatables/html/columns.js", "../../node_modules/tw-elements/src/js/data/datatables/html/rows.js", "../../node_modules/tw-elements/src/js/data/datatables/html/table.js", "../../node_modules/tw-elements/src/js/data/datatables/util.js", "../../node_modules/tw-elements/src/js/data/datatables/index.js", "../../node_modules/tw-elements/src/js/components/rating.js", "../../node_modules/tw-elements/src/js/components/popconfirm.js", "../../node_modules/tw-elements/src/js/components/lightbox.js", "../../node_modules/tw-elements/src/js/forms/validation/rules.js", "../../node_modules/tw-elements/src/js/forms/validation/validation.js", "../../node_modules/tw-elements/src/js/methods/touch/touchUtil.js", "../../node_modules/tw-elements/src/js/methods/touch/press.js", "../../node_modules/tw-elements/src/js/methods/touch/swipe.js", "../../node_modules/tw-elements/src/js/methods/touch/pan.js", "../../node_modules/tw-elements/src/js/methods/touch/pinch.js", "../../node_modules/tw-elements/src/js/methods/touch/tap.js", "../../node_modules/tw-elements/src/js/methods/touch/rotate.js", "../../node_modules/tw-elements/src/js/methods/touch/index.js", "../../node_modules/tw-elements/src/js/methods/smooth-scroll.js", "../../node_modules/tw-elements/src/js/methods/lazy-load.js", "../../node_modules/tw-elements/src/js/methods/clipboard.js", "../../node_modules/tw-elements/src/js/methods/infinite-scroll.js", "../../node_modules/tw-elements/src/js/methods/loading-management/templates.js", "../../node_modules/tw-elements/src/js/methods/loading-management/index.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/utils.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/templates.js", "../../node_modules/tw-elements/src/js/forms/dateTimepicker/index.js", "../../node_modules/tw-elements/src/js/methods/sticky.js", "../../node_modules/tw-elements/src/js/autoinit/jqueryInit.js", "../../node_modules/tw-elements/src/js/autoinit/autoinitCallbacks.js", "../../node_modules/tw-elements/src/js/autoinit/chartsInit.js", "../../node_modules/tw-elements/src/js/autoinit/Register.js", "../../node_modules/tw-elements/src/js/autoinit/index.js", "tailwind.ts", "public-adventures.ts", "microbit.ts", "custom-elements.ts"], - "sourcesContent": ["/*!\n\nJSZip v3.10.1 - A JavaScript class for generating and reading zip files\n\n\n(c) 2009-2016 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/main/LICENSE\n*/\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l=\"function\"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{\"./support\":30,\"./utils\":32}],2:[function(e,t,r){\"use strict\";var n=e(\"./external\"),i=e(\"./stream/DataWorker\"),s=e(\"./stream/Crc32Probe\"),a=e(\"./stream/DataLengthProbe\");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),t=this;return e.on(\"end\",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(t.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",t)},t.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(e,t,r){\"use strict\";var n=e(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=e(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(e,t,r){\"use strict\";var n=e(\"./utils\");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?\"string\"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{\"./utils\":32}],5:[function(e,t,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){\"use strict\";var n=null;n=\"undefined\"!=typeof Promise?Promise:e(\"lie\"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=e(\"pako\"),s=e(\"./utils\"),a=e(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function h(e,t){a.call(this,\"FlateWorker/\"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic=\"\\b\\0\",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h(\"Deflate\",e)},r.uncompressWorker=function(){return new h(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(e,t,r){\"use strict\";function A(e,t){var r,n=\"\";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo(\"string\",s(h.name)),c=I.transformTo(\"string\",O.utf8encode(h.name)),d=h.comment,p=I.transformTo(\"string\",s(d)),m=I.transformTo(\"string\",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b=\"\",v=\"\",y=\"\",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),\"UNIX\"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+=\"up\"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+=\"uc\"+A(y.length,2)+y);var E=\"\";return E+=\"\\n\\0\",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+\"\\0\\0\\0\\0\"+A(z,4)+A(n,4)+f+b+p}}var I=e(\"../utils\"),i=e(\"../stream/GenericWorker\"),O=e(\"../utf8\"),B=e(\"../crc32\"),R=e(\"../signature\");function s(e,t,r,n){i.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo(\"string\",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{\"../utils\":32}],19:[function(e,t,r){\"use strict\";var n=e(\"./Uint8ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(e,t,r){\"use strict\";var n=e(\"./DataReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(e,t,r){\"use strict\";var n=e(\"./ArrayReader\");function i(e){n.call(this,e)}e(\"../utils\").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"../support\"),s=e(\"./ArrayReader\"),a=e(\"./StringReader\"),o=e(\"./NodeBufferReader\"),h=e(\"./Uint8ArrayReader\");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),\"string\"!==t||i.uint8array?\"nodebuffer\"===t?new o(e):i.uint8array?new h(n.transformTo(\"uint8array\",e)):new s(n.transformTo(\"array\",e)):new a(e)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(e,t,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../utils\");function s(e){n.call(this,\"ConvertWorker to \"+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(e,t,r){\"use strict\";var n=e(\"./GenericWorker\"),i=e(\"../crc32\");function s(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}e(\"../utils\").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataLengthProbe for \"+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(e,t,r){\"use strict\";var n=e(\"../utils\"),i=e(\"./GenericWorker\");function s(e){i.call(this,\"DataWorker\");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":e=this.data.substring(this.index,t);break;case\"uint8array\":e=this.data.subarray(this.index,t);break;case\"array\":case\"nodebuffer\":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(e,t,r){\"use strict\";function n(e){this.name=e||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit(\"data\",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit(\"error\",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit(\"error\",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r \"+e:e}},t.exports=n},{}],29:[function(e,t,r){\"use strict\";var h=e(\"../utils\"),i=e(\"./ConvertWorker\"),s=e(\"./GenericWorker\"),u=e(\"../base64\"),n=e(\"../support\"),a=e(\"../external\"),o=null;if(n.nodestream)try{o=e(\"../nodejs/NodejsStreamOutputAdapter\")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on(\"data\",function(e,t){n.push(e),o&&o(t)}).on(\"error\",function(e){n=[],r(e)}).on(\"end\",function(){try{var e=function(e,t,r){switch(e){case\"blob\":return h.newBlob(h.transformTo(\"arraybuffer\",t),r);case\"base64\":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo(\"nodebuffer\",e).toString(\"utf-8\"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?\"uint8array\":\"array\",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?\"uint8array\":\"array\",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(e,t,a){\"use strict\";var o=e(\"./support\"),h=e(\"./base64\"),r=e(\"./nodejsUtils\"),u=e(\"./external\");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{\"./common\":41}],43:[function(e,t,r){\"use strict\";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){\"use strict\";var h,c=e(\"../utils/common\"),u=e(\"./trees\"),d=e(\"./adler32\"),p=e(\"./crc32\"),n=e(\"./messages\"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&u)){e.msg=\"unknown compression method\",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg=\"invalid distance code\",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{\"../utils/common\":41}],53:[function(e,t,r){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){\"use strict\";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i=\"[object process]\"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage(\"\",\"*\"),r.onmessage=t,e}}()?(a=\"setImmediate$\"+Math.random()+\"$\",r.addEventListener?r.addEventListener(\"message\",d,!1):r.attachEvent(\"onmessage\",d),function(e){r.postMessage(a+e,\"*\")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&\"onreadystatechange\"in l.createElement(\"script\")?(s=l.documentElement,function(e){var t=l.createElement(\"script\");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),r=0;r arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : String(i);\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;", "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/slicedToArray'), require('@babel/runtime/helpers/classCallCheck'), require('@babel/runtime/helpers/createClass')) :\n typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/createClass'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.automationEvents = {}, global._slicedToArray, global._classCallCheck, global._createClass));\n})(this, (function (exports, _slicedToArray, _classCallCheck, _createClass) { 'use strict';\n\n var createExtendedExponentialRampToValueAutomationEvent = function createExtendedExponentialRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createExtendedLinearRampToValueAutomationEvent = function createExtendedLinearRampToValueAutomationEvent(value, endTime, insertTime) {\n return {\n endTime: endTime,\n insertTime: insertTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetValueAutomationEvent = function createSetValueAutomationEvent(value, startTime) {\n return {\n startTime: startTime,\n type: 'setValue',\n value: value\n };\n };\n\n var createSetValueCurveAutomationEvent = function createSetValueCurveAutomationEvent(values, startTime, duration) {\n return {\n duration: duration,\n startTime: startTime,\n type: 'setValueCurve',\n values: values\n };\n };\n\n var getTargetValueAtTime = function getTargetValueAtTime(time, valueAtStartTime, _ref) {\n var startTime = _ref.startTime,\n target = _ref.target,\n timeConstant = _ref.timeConstant;\n return target + (valueAtStartTime - target) * Math.exp((startTime - time) / timeConstant);\n };\n\n var isExponentialRampToValueAutomationEvent = function isExponentialRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'exponentialRampToValue';\n };\n\n var isLinearRampToValueAutomationEvent = function isLinearRampToValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'linearRampToValue';\n };\n\n var isAnyRampToValueAutomationEvent = function isAnyRampToValueAutomationEvent(automationEvent) {\n return isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent);\n };\n\n var isSetValueAutomationEvent = function isSetValueAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValue';\n };\n\n var isSetValueCurveAutomationEvent = function isSetValueCurveAutomationEvent(automationEvent) {\n return automationEvent.type === 'setValueCurve';\n };\n\n var getValueOfAutomationEventAtIndexAtTime = function getValueOfAutomationEventAtIndexAtTime(automationEvents, index, time, defaultValue) {\n var automationEvent = automationEvents[index];\n return automationEvent === undefined ? defaultValue : isAnyRampToValueAutomationEvent(automationEvent) || isSetValueAutomationEvent(automationEvent) ? automationEvent.value : isSetValueCurveAutomationEvent(automationEvent) ? automationEvent.values[automationEvent.values.length - 1] : getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, automationEvent.startTime, defaultValue), automationEvent);\n };\n\n var getEndTimeAndValueOfPreviousAutomationEvent = function getEndTimeAndValueOfPreviousAutomationEvent(automationEvents, index, currentAutomationEvent, nextAutomationEvent, defaultValue) {\n return currentAutomationEvent === undefined ? [nextAutomationEvent.insertTime, defaultValue] : isAnyRampToValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.endTime, currentAutomationEvent.value] : isSetValueAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime, currentAutomationEvent.value] : isSetValueCurveAutomationEvent(currentAutomationEvent) ? [currentAutomationEvent.startTime + currentAutomationEvent.duration, currentAutomationEvent.values[currentAutomationEvent.values.length - 1]] : [currentAutomationEvent.startTime, getValueOfAutomationEventAtIndexAtTime(automationEvents, index - 1, currentAutomationEvent.startTime, defaultValue)];\n };\n\n var isCancelAndHoldAutomationEvent = function isCancelAndHoldAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelAndHold';\n };\n\n var isCancelScheduledValuesAutomationEvent = function isCancelScheduledValuesAutomationEvent(automationEvent) {\n return automationEvent.type === 'cancelScheduledValues';\n };\n\n var getEventTime = function getEventTime(automationEvent) {\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n return automationEvent.cancelTime;\n }\n if (isExponentialRampToValueAutomationEvent(automationEvent) || isLinearRampToValueAutomationEvent(automationEvent)) {\n return automationEvent.endTime;\n }\n return automationEvent.startTime;\n };\n\n var getExponentialRampValueAtTime = function getExponentialRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n if (valueAtStartTime === value) {\n return value;\n }\n if (0 < valueAtStartTime && 0 < value || valueAtStartTime < 0 && value < 0) {\n return valueAtStartTime * Math.pow(value / valueAtStartTime, (time - startTime) / (endTime - startTime));\n }\n return 0;\n };\n\n var getLinearRampValueAtTime = function getLinearRampValueAtTime(time, startTime, valueAtStartTime, _ref) {\n var endTime = _ref.endTime,\n value = _ref.value;\n return valueAtStartTime + (time - startTime) / (endTime - startTime) * (value - valueAtStartTime);\n };\n\n var interpolateValue = function interpolateValue(values, theoreticIndex) {\n var lowerIndex = Math.floor(theoreticIndex);\n var upperIndex = Math.ceil(theoreticIndex);\n if (lowerIndex === upperIndex) {\n return values[lowerIndex];\n }\n return (1 - (theoreticIndex - lowerIndex)) * values[lowerIndex] + (1 - (upperIndex - theoreticIndex)) * values[upperIndex];\n };\n\n var getValueCurveValueAtTime = function getValueCurveValueAtTime(time, _ref) {\n var duration = _ref.duration,\n startTime = _ref.startTime,\n values = _ref.values;\n var theoreticIndex = (time - startTime) / duration * (values.length - 1);\n return interpolateValue(values, theoreticIndex);\n };\n\n var isSetTargetAutomationEvent = function isSetTargetAutomationEvent(automationEvent) {\n return automationEvent.type === 'setTarget';\n };\n\n var AutomationEventList = /*#__PURE__*/function (_Symbol$iterator) {\n function AutomationEventList(defaultValue) {\n _classCallCheck(this, AutomationEventList);\n this._automationEvents = [];\n this._currenTime = 0;\n this._defaultValue = defaultValue;\n }\n _createClass(AutomationEventList, [{\n key: _Symbol$iterator,\n value: function value() {\n return this._automationEvents[Symbol.iterator]();\n }\n }, {\n key: \"add\",\n value: function add(automationEvent) {\n var eventTime = getEventTime(automationEvent);\n if (isCancelAndHoldAutomationEvent(automationEvent) || isCancelScheduledValuesAutomationEvent(automationEvent)) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n if (isCancelScheduledValuesAutomationEvent(automationEvent) && isSetValueCurveAutomationEvent(currentAutomationEvent)) {\n return currentAutomationEvent.startTime + currentAutomationEvent.duration >= eventTime;\n }\n return getEventTime(currentAutomationEvent) >= eventTime;\n });\n var removedAutomationEvent = this._automationEvents[index];\n if (index !== -1) {\n this._automationEvents = this._automationEvents.slice(0, index);\n }\n if (isCancelAndHoldAutomationEvent(automationEvent)) {\n var lastAutomationEvent = this._automationEvents[this._automationEvents.length - 1];\n if (removedAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(removedAutomationEvent)) {\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n throw new Error('The internal list is malformed.');\n }\n var startTime = lastAutomationEvent === undefined ? removedAutomationEvent.insertTime : isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.startTime + lastAutomationEvent.duration : getEventTime(lastAutomationEvent);\n var startValue = lastAutomationEvent === undefined ? this._defaultValue : isSetValueCurveAutomationEvent(lastAutomationEvent) ? lastAutomationEvent.values[lastAutomationEvent.values.length - 1] : lastAutomationEvent.value;\n var value = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? getExponentialRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent) : getLinearRampValueAtTime(eventTime, startTime, startValue, removedAutomationEvent);\n var truncatedAutomationEvent = isExponentialRampToValueAutomationEvent(removedAutomationEvent) ? createExtendedExponentialRampToValueAutomationEvent(value, eventTime, this._currenTime) : createExtendedLinearRampToValueAutomationEvent(value, eventTime, this._currenTime);\n this._automationEvents.push(truncatedAutomationEvent);\n }\n if (lastAutomationEvent !== undefined && isSetTargetAutomationEvent(lastAutomationEvent)) {\n this._automationEvents.push(createSetValueAutomationEvent(this.getValue(eventTime), eventTime));\n }\n if (lastAutomationEvent !== undefined && isSetValueCurveAutomationEvent(lastAutomationEvent) && lastAutomationEvent.startTime + lastAutomationEvent.duration > eventTime) {\n var duration = eventTime - lastAutomationEvent.startTime;\n var ratio = (lastAutomationEvent.values.length - 1) / lastAutomationEvent.duration;\n var length = Math.max(2, 1 + Math.ceil(duration * ratio));\n var fraction = duration / (length - 1) * ratio;\n var values = lastAutomationEvent.values.slice(0, length);\n if (fraction < 1) {\n for (var i = 1; i < length; i += 1) {\n var factor = fraction * i % 1;\n values[i] = lastAutomationEvent.values[i - 1] * (1 - factor) + lastAutomationEvent.values[i] * factor;\n }\n }\n this._automationEvents[this._automationEvents.length - 1] = createSetValueCurveAutomationEvent(values, lastAutomationEvent.startTime, duration);\n }\n }\n } else {\n var _index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > eventTime;\n });\n var previousAutomationEvent = _index === -1 ? this._automationEvents[this._automationEvents.length - 1] : this._automationEvents[_index - 1];\n if (previousAutomationEvent !== undefined && isSetValueCurveAutomationEvent(previousAutomationEvent) && getEventTime(previousAutomationEvent) + previousAutomationEvent.duration > eventTime) {\n return false;\n }\n var persistentAutomationEvent = isExponentialRampToValueAutomationEvent(automationEvent) ? createExtendedExponentialRampToValueAutomationEvent(automationEvent.value, automationEvent.endTime, this._currenTime) : isLinearRampToValueAutomationEvent(automationEvent) ? createExtendedLinearRampToValueAutomationEvent(automationEvent.value, eventTime, this._currenTime) : automationEvent;\n if (_index === -1) {\n this._automationEvents.push(persistentAutomationEvent);\n } else {\n if (isSetValueCurveAutomationEvent(automationEvent) && eventTime + automationEvent.duration > getEventTime(this._automationEvents[_index])) {\n return false;\n }\n this._automationEvents.splice(_index, 0, persistentAutomationEvent);\n }\n }\n return true;\n }\n }, {\n key: \"flush\",\n value: function flush(time) {\n var index = this._automationEvents.findIndex(function (currentAutomationEvent) {\n return getEventTime(currentAutomationEvent) > time;\n });\n if (index > 1) {\n var remainingAutomationEvents = this._automationEvents.slice(index - 1);\n var firstRemainingAutomationEvent = remainingAutomationEvents[0];\n if (isSetTargetAutomationEvent(firstRemainingAutomationEvent)) {\n remainingAutomationEvents.unshift(createSetValueAutomationEvent(getValueOfAutomationEventAtIndexAtTime(this._automationEvents, index - 2, firstRemainingAutomationEvent.startTime, this._defaultValue), firstRemainingAutomationEvent.startTime));\n }\n this._automationEvents = remainingAutomationEvents;\n }\n }\n }, {\n key: \"getValue\",\n value: function getValue(time) {\n if (this._automationEvents.length === 0) {\n return this._defaultValue;\n }\n var indexOfNextEvent = this._automationEvents.findIndex(function (automationEvent) {\n return getEventTime(automationEvent) > time;\n });\n var nextAutomationEvent = this._automationEvents[indexOfNextEvent];\n var indexOfCurrentEvent = (indexOfNextEvent === -1 ? this._automationEvents.length : indexOfNextEvent) - 1;\n var currentAutomationEvent = this._automationEvents[indexOfCurrentEvent];\n if (currentAutomationEvent !== undefined && isSetTargetAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || nextAutomationEvent.insertTime > time)) {\n return getTargetValueAtTime(time, getValueOfAutomationEventAtIndexAtTime(this._automationEvents, indexOfCurrentEvent - 1, currentAutomationEvent.startTime, this._defaultValue), currentAutomationEvent);\n }\n if (currentAutomationEvent !== undefined && isSetValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n if (currentAutomationEvent !== undefined && isSetValueCurveAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent) || currentAutomationEvent.startTime + currentAutomationEvent.duration > time)) {\n if (time < currentAutomationEvent.startTime + currentAutomationEvent.duration) {\n return getValueCurveValueAtTime(time, currentAutomationEvent);\n }\n return currentAutomationEvent.values[currentAutomationEvent.values.length - 1];\n }\n if (currentAutomationEvent !== undefined && isAnyRampToValueAutomationEvent(currentAutomationEvent) && (nextAutomationEvent === undefined || !isAnyRampToValueAutomationEvent(nextAutomationEvent))) {\n return currentAutomationEvent.value;\n }\n if (nextAutomationEvent !== undefined && isExponentialRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf2 = _slicedToArray(_getEndTimeAndValueOf, 2),\n startTime = _getEndTimeAndValueOf2[0],\n value = _getEndTimeAndValueOf2[1];\n return getExponentialRampValueAtTime(time, startTime, value, nextAutomationEvent);\n }\n if (nextAutomationEvent !== undefined && isLinearRampToValueAutomationEvent(nextAutomationEvent)) {\n var _getEndTimeAndValueOf3 = getEndTimeAndValueOfPreviousAutomationEvent(this._automationEvents, indexOfCurrentEvent, currentAutomationEvent, nextAutomationEvent, this._defaultValue),\n _getEndTimeAndValueOf4 = _slicedToArray(_getEndTimeAndValueOf3, 2),\n _startTime = _getEndTimeAndValueOf4[0],\n _value = _getEndTimeAndValueOf4[1];\n return getLinearRampValueAtTime(time, _startTime, _value, nextAutomationEvent);\n }\n return this._defaultValue;\n }\n }]);\n return AutomationEventList;\n }(Symbol.iterator);\n\n var createCancelAndHoldAutomationEvent = function createCancelAndHoldAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelAndHold'\n };\n };\n\n var createCancelScheduledValuesAutomationEvent = function createCancelScheduledValuesAutomationEvent(cancelTime) {\n return {\n cancelTime: cancelTime,\n type: 'cancelScheduledValues'\n };\n };\n\n var createExponentialRampToValueAutomationEvent = function createExponentialRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'exponentialRampToValue',\n value: value\n };\n };\n\n var createLinearRampToValueAutomationEvent = function createLinearRampToValueAutomationEvent(value, endTime) {\n return {\n endTime: endTime,\n type: 'linearRampToValue',\n value: value\n };\n };\n\n var createSetTargetAutomationEvent = function createSetTargetAutomationEvent(target, startTime, timeConstant) {\n return {\n startTime: startTime,\n target: target,\n timeConstant: timeConstant,\n type: 'setTarget'\n };\n };\n\n exports.AutomationEventList = AutomationEventList;\n exports.createCancelAndHoldAutomationEvent = createCancelAndHoldAutomationEvent;\n exports.createCancelScheduledValuesAutomationEvent = createCancelScheduledValuesAutomationEvent;\n exports.createExponentialRampToValueAutomationEvent = createExponentialRampToValueAutomationEvent;\n exports.createLinearRampToValueAutomationEvent = createLinearRampToValueAutomationEvent;\n exports.createSetTargetAutomationEvent = createSetTargetAutomationEvent;\n exports.createSetValueAutomationEvent = createSetValueAutomationEvent;\n exports.createSetValueCurveAutomationEvent = createSetValueCurveAutomationEvent;\n\n}));\n", "const {\n hasOwnProperty,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!apply) {\n apply = function (fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\n\nif (!freeze) {\n freeze = function (x) {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x) {\n return x;\n };\n}\n\nif (!construct) {\n construct = function (Func, args) {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\nexport function numberIsNaN(x) {\n // eslint-disable-next-line unicorn/prefer-number-properties\n return typeof x === 'number' && isNaN(x);\n}\n\nexport function unapply(func) {\n return (thisArg, ...args) => apply(func, thisArg, args);\n}\n\nexport function unconstruct(func) {\n return (...args) => construct(func, args);\n}\n\n/* Add properties to a lookup table */\nexport function addToSet(set, array, transformCaseFunc) {\n transformCaseFunc = transformCaseFunc ?? stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n}\n\n/* Shallow clone an object */\nexport function clone(object) {\n const newObject = create(null);\n\n let property;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property]) === true) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n}\n\n/* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n // Object\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n hasOwnProperty,\n isFrozen,\n setPrototypeOf,\n seal,\n // RegExp\n regExpTest,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringTrim,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'shadow',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n]);\n\n// SVG\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n]);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n]);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'fedropshadow',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n]);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n]);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n]);\n\nexport const text = freeze(['#text']);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'xmlns',\n 'slot',\n]);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n]);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnsalign',\n 'columnlines',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lspace',\n 'lquote',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n]);\n", "import { seal } from './utils.js';\n\n// eslint-disable-next-line unicorn/better-regex\nexport const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\nexport const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n", "import * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n freeze,\n arrayForEach,\n arrayPop,\n arrayPush,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringIndexOf,\n stringTrim,\n numberIsNaN,\n regExpTest,\n typeErrorCreate,\n lookupGetter,\n} from './utils.js';\n\nconst getGlobal = () => (typeof window === 'undefined' ? null : window);\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\nconst _createTrustedTypesPolicy = function (trustedTypes, document) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (\n document.currentScript &&\n document.currentScript.hasAttribute(ATTR_NAME)\n ) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n },\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nfunction createDOMPurify(window = getGlobal()) {\n const DOMPurify = (root) => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = VERSION;\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n const originalDocument = window.document;\n\n let { document } = window;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n const trustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n originalDocument\n );\n const emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';\n\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName,\n } = document;\n const { importNode } = originalDocument;\n\n let documentMode = {};\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof getParentNode === 'function' &&\n implementation &&\n implementation.createHTMLDocument !== undefined &&\n documentMode !== 9;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(\n Object.create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false,\n },\n })\n );\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (\u00A77.3.3)\n * - DOM Tree Accessors (\u00A73.1.5)\n * - Form Element Parent-Child Relations (\u00A74.10.3)\n * - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n * - HTMLCollection (\u00A74.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n 'style',\n 'svg',\n 'template',\n 'thead',\n 'title',\n 'video',\n 'xmp',\n ]);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n 'audio',\n 'video',\n 'img',\n 'source',\n 'image',\n 'track',\n ]);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n 'alt',\n 'class',\n 'for',\n 'id',\n 'label',\n 'name',\n 'pattern',\n 'placeholder',\n 'role',\n 'summary',\n 'title',\n 'value',\n 'style',\n 'xmlns',\n ]);\n\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet(\n {},\n [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE],\n stringToString\n );\n\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc;\n\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Specify the maximum element nesting depth to prevent mXSS */\n const MAX_NESTING_DEPTH = 255;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n\n const isRegexOrFunction = function (testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function (cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1\n ? (PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE)\n : (PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE);\n\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc =\n PARSER_MEDIA_TYPE === 'application/xhtml+xml'\n ? stringToString\n : stringToLowerCase;\n\n /* Set configuration parameters */\n ALLOWED_TAGS =\n 'ALLOWED_TAGS' in cfg\n ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc)\n : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR =\n 'ALLOWED_ATTR' in cfg\n ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc)\n : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES =\n 'ALLOWED_NAMESPACES' in cfg\n ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString)\n : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES =\n 'ADD_URI_SAFE_ATTR' in cfg\n ? addToSet(\n clone(DEFAULT_URI_SAFE_ATTRIBUTES), // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS =\n 'ADD_DATA_URI_TAGS' in cfg\n ? addToSet(\n clone(DEFAULT_DATA_URI_TAGS), // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS, // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS =\n 'FORBID_CONTENTS' in cfg\n ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc)\n : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS =\n 'FORBID_TAGS' in cfg\n ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc)\n : {};\n FORBID_ATTR =\n 'FORBID_ATTR' in cfg\n ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc)\n : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)\n ) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck =\n cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n\n if (\n cfg.CUSTOM_ELEMENT_HANDLING &&\n typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements ===\n 'boolean'\n ) {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements =\n cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [...TAGS.text]);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, TAGS.html);\n addToSet(ALLOWED_ATTR, ATTRS.html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, TAGS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, TAGS.svgFilters);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, TAGS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n ]);\n\n const HTML_INTEGRATION_POINTS = addToSet({}, [\n 'foreignobject',\n 'annotation-xml',\n ]);\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script',\n ]);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, TAGS.svg);\n addToSet(ALL_SVG_TAGS, TAGS.svgFilters);\n addToSet(ALL_SVG_TAGS, TAGS.svgDisallowed);\n\n const ALL_MATHML_TAGS = addToSet({}, TAGS.mathMl);\n addToSet(ALL_MATHML_TAGS, TAGS.mathMlDisallowed);\n\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function (element) {\n let parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template',\n };\n }\n\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return (\n tagName === 'svg' &&\n (parentTagName === 'annotation-xml' ||\n MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n );\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (\n parent.namespaceURI === SVG_NAMESPACE &&\n !HTML_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n if (\n parent.namespaceURI === MATHML_NAMESPACE &&\n !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return (\n !ALL_MATHML_TAGS[tagName] &&\n (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName])\n );\n }\n\n // For XHTML and XML documents that support custom namespaces\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n ALLOWED_NAMESPACES[element.namespaceURI]\n ) {\n return true;\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function (node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function (name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node,\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node,\n });\n }\n\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function (dirty) {\n /* Create a HTML document */\n let doc;\n let leadingWhitespace;\n\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n\n if (\n PARSER_MEDIA_TYPE === 'application/xhtml+xml' &&\n NAMESPACE === HTML_NAMESPACE\n ) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty =\n '' +\n dirty +\n '';\n }\n\n const dirtyPayload = trustedTypesPolicy\n ? trustedTypesPolicy.createHTML(dirty)\n : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT\n ? emptyHTML\n : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n\n const body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(\n document.createTextNode(leadingWhitespace),\n body.childNodes[0] || null\n );\n }\n\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(\n doc,\n WHOLE_DOCUMENT ? 'html' : 'body'\n )[0];\n }\n\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n const _createIterator = function (root) {\n return createNodeIterator.call(\n root.ownerDocument || root,\n root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT |\n NodeFilter.SHOW_COMMENT |\n NodeFilter.SHOW_TEXT |\n NodeFilter.SHOW_PROCESSING_INSTRUCTION |\n NodeFilter.SHOW_CDATA_SECTION,\n null,\n false\n );\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function (elm) {\n return (\n elm instanceof HTMLFormElement &&\n ((typeof elm.__depth !== 'undefined' &&\n typeof elm.__depth !== 'number') ||\n (typeof elm.__removalCount !== 'undefined' &&\n typeof elm.__removalCount !== 'number') ||\n typeof elm.nodeName !== 'string' ||\n typeof elm.textContent !== 'string' ||\n typeof elm.removeChild !== 'function' ||\n !(elm.attributes instanceof NamedNodeMap) ||\n typeof elm.removeAttribute !== 'function' ||\n typeof elm.setAttribute !== 'function' ||\n typeof elm.namespaceURI !== 'string' ||\n typeof elm.insertBefore !== 'function' ||\n typeof elm.hasChildNodes !== 'function')\n );\n };\n\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function (object) {\n return typeof Node === 'object'\n ? object instanceof Node\n : object &&\n typeof object === 'object' &&\n typeof object.nodeType === 'number' &&\n typeof object.nodeName === 'string';\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function (entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], (hook) => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function (currentNode) {\n let content;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check if tagname contains Unicode */\n if (regExpTest(/[\\u0080-\\uFFFF]/, currentNode.nodeName)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS,\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (\n currentNode.hasChildNodes() &&\n !_isNode(currentNode.firstElementChild) &&\n (!_isNode(currentNode.content) ||\n !_isNode(currentNode.content.firstElementChild)) &&\n regExpTest(/<[/\\w]/g, currentNode.innerHTML) &&\n regExpTest(/<[/\\w]/g, currentNode.textContent)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Mitigate a problem with templates inside select */\n if (\n tagName === 'select' &&\n regExpTest(/