From 2458595a7610968bc2371be4624755face41645a Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 28 Sep 2024 08:45:15 +0200 Subject: [PATCH] Translations update from Hosted Weblate (#5816) 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/Keywords](https://hosted.weblate.org/projects/hedy/keywords/) * [Hedy/Quizzes](https://hosted.weblate.org/projects/hedy/quizzes/) * [Hedy/slides](https://hosted.weblate.org/projects/hedy/slides/) * [Hedy/client-messages](https://hosted.weblate.org/projects/hedy/client-messages/) * [Hedy/Texts](https://hosted.weblate.org/projects/hedy/web-texts/) * [Hedy/Webpages](https://hosted.weblate.org/projects/hedy/webpages/) * [Hedy/Parsons](https://hosted.weblate.org/projects/hedy/parsons/) * [Hedy/Cheatsheets](https://hosted.weblate.org/projects/hedy/commands/) * [Hedy/Tutorials](https://hosted.weblate.org/projects/hedy/tutorials/) Current translation status: ![Weblate translation status](https://hosted.weblate.org/widget/hedy/adventures/horizontal-auto.svg) --- content/adventures/ca.yaml | 906 ++++++++++++------------ content/adventures/es.yaml | 117 ++- content/cheatsheets/fi.yaml | 18 +- content/client-messages/ca.yaml | 2 +- content/pages/es.yaml | 36 +- content/parsons/ca.yaml | 34 +- content/quizzes/ca.yaml | 62 +- static/js/appbundle.js | 16 +- static/js/appbundle.js.map | 2 +- static/js/message-translations.ts | 16 +- translations/ca/LC_MESSAGES/messages.po | 55 +- translations/es/LC_MESSAGES/messages.po | 129 ++-- 12 files changed, 664 insertions(+), 729 deletions(-) diff --git a/content/adventures/ca.yaml b/content/adventures/ca.yaml index 547523efa6f..a8fcc4960ef 100644 --- a/content/adventures/ca.yaml +++ b/content/adventures/ca.yaml @@ -95,6 +95,7 @@ adventures: Torna als nivells anteriors i copia el teu codi de la història. Fes funcionar el codi en aquest nivell afegint cometes als llocs adequats. Recorda: Les variables de la teva pròpia història han d'estar fora de les cometes. Igual que a la segona línia de l'exemple de codi. En aquesta línia, la variable nom es col·loca fora de les cometes. example_code: | + ``` nom {is} {ask} _ Com et dius? _ {print} _ El protagonista es diu _ nom _ @@ -104,6 +105,7 @@ adventures: animals {is} 🦔, 🐿, 🦉, 🦇 {print} _ Sent el so de _ animals {at} {random} {print} name _ li fa por que estigui en un bosc encantat _ + ``` 5: story_text: | En aquest nivell, pots programar diferents finals, cosa que farà que la teva història sigui encara més divertida. @@ -177,9 +179,9 @@ adventures: {print} 'Robin sees an interesting looking book' book = {ask} 'Does Robin buy the book?' {if} book {is} yes - {print} 'Robin buys the book and goes home' + _{print} 'Robin buys the book and goes home' {else} - {print} 'Robin leaves the shop and goes home' + _{print} 'Robin leaves the shop and goes home' {else} {print} 'Robin goes home' ``` @@ -188,23 +190,16 @@ adventures: In this level you can use the {for} command in your story. In this way you could easily program the children's book 'brown bear, brown bear, what do you see'. example_code: | ``` - animals = red bird, black sheep, green frog, yellow duck, little child - {print} 'brown bear' - {print} 'brown bear' - {print} 'What do you see?' - {for} animal {in} animals - {print} 'I see a ' animal ' looking at me' - {print} animal - {print} animal - {print} 'What do you see?' - {print} 'I see all the animals looking at me!' + animals = _ , _ , _ + {print} 'Os bru, Os bru' + {print} 'Què veus?' ``` 12: story_text: In this level you can use the quotation marks to save multiple words in a variable. example_code: | ``` nom = "La Reina d'Englaterra" - {print} nom ' menjava un tall de pastís, quan de sopte...' + {print} nom ' menjava un tall de pastís, quan de sopte…' ``` 13: story_text: | @@ -264,9 +259,9 @@ adventures: {print}('Benvingut a aquesta història!') ``` add_remove_command: - name: '{add} {to} & {remove} {from}' + name: '{add} {to_list} & {remove} {from}' default_save_name: comanda_afegir_borrar - description: Introduint afegeix i esborra de + description: Introduint {add} {to_list} i {remove} {from} levels: 3: story_text: | @@ -305,7 +300,7 @@ adventures: and_or_command: name: '{and} & {or}' default_save_name: i o - description: Introduint i o + description: Introduint {and} & {or} levels: 13: story_text: |- @@ -322,7 +317,7 @@ adventures: ask_command: name: '{ask}' default_save_name: comanda_pregunta - description: Introducció a la comanda preguntar + description: Introducció a la comanda {ask} levels: 1: story_text: | @@ -334,8 +329,9 @@ adventures: {ask} Com et dius? ``` story_text_2: | - ## The echo command - If you want the computer to repeat the answer, you can use the `{echo}` command. The answer will then be echoed back at the end of the sentence, so in this example after hello. + ## La comanda `{echo}` + Si vols que l'ordinador et repeteixi la resposta, pots utilitzar l'ordre `{echo}`. La resposta es mostrarà al final de la frase, com en aquest exemple després d'hola. + . example_code_2: | ``` {print} Hola! @@ -375,8 +371,8 @@ adventures: Copia el teu codi de la pestanya anterior i fes que les variables siguin interactives mitjançant la comanda `{ask}`. example_code_2: | ``` - animals_preferits {is} {ask} Quin són els teus animals preferits? - {print} M'agrada els/les animals_preferits + animal_preferit {is} {ask} Quin és el teu animal preferit? + {print} M'agrada el animal_preferit ``` 18: story_text: The final change we will need to make to get Python code is changing `{ask}` into `{input}`. @@ -389,7 +385,7 @@ adventures: blackjack: name: Blackjack default_save_name: Blackjack - description: Try to get as close to 21 as you can + description: Intenta apropar-te tant com puguis a 21 levels: 17: story_text: | @@ -577,19 +573,19 @@ adventures: _ ``` calculator: - name: Calculator - default_save_name: Calculator - description: Create a calculator + name: Calculadora + default_save_name: Calculadora + description: Crea una calculadora levels: 6: story_text: | Now that you can do maths, you can make a calculator yourself! example_code: | ``` - number_1 {is} {ask} 'Fill in the first number:' - number_2 {is} {ask} 'Fill in the second number:' - correct_answer = number_1 * number_2 - {print} number_1 ' times ' number_2 ' is ' correct_answer + nombre_1 = {ask} 'Escriu el primer nombre:' + nombre_2 = {ask} 'Escriu el segon nombre:' + resposta_correcta = nombre_1 * nombre_2 + {print} nombre_1 ' per ' nombre_2 ' és ' resposta_correcta ``` story_text_2: | ### Exercise @@ -597,21 +593,23 @@ adventures: Fill in the blanks to make it complete! example_code_2: | ``` - correct_answer = 11 * 27 - answer = {ask} 'How much is 11 times 27?' - {if} answer {is} _ {print} 'good job!' - {else} {print} 'Wrong! It was ' _ + resposta_correcta = 11 * 27 + resposta = {ask} 'Quant és 11 per 27?' + {if} resposta {is} _ {print} 'Bona feina!' + {else} {print} 'Incorrecte! Era ' _ ``` story_text_3: | - You can also let the computer do random calculations on its own using {random}. - example_code_3: | - numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 - number_1 = _ - number_2 = _ - correct_answer = number_1 * number_2 - given_answer = 'What is ' number_1 ' times ' number_2 '?' + **Extra** També pots deixar que l'ordinador faci productes aleatoris per ell mateix utilitzant `{random}`. + example_code_3: |- + ``` + nombres = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + nombre_1 = _ + nombre_2 = _ + resposta_correcta = nombre_1 * nombre_2 + resposta_dada = {ask} 'Quin és ' nombre_1 ' per ' nombre_2 '?' {if} _ {else} _ + ``` 9: story_text: | In a previous level you've created a calculator, in this level you can expand that code so it asks multiple questions. @@ -677,18 +675,26 @@ adventures: example_code: | ``` number = 10 - {for} i {in} {range} 1 to 10 + {for} i {in} {range} 1 {to} 10 {print} i * number ``` 12: story_text: | - Now you can make a calculator that works for decimal numbers. Fill in the blanks to get it to work properly! + En aquest nivell, pots fer una calculadora que funcioni amb nombres decimals. + + ### Exercici 1 + Omple els buits per completar la calculadora. Recorda utilitzar un punt i no una coma per als nombres decimals. + + ### Exercici 2 + Crea un nou programa de pràctica matemàtica, però ara utilitza nombres decimals. + Crea una llista de nombres, tria'n dos per multiplicar i deixa que el jugador respongui. + I, per descomptat, has de validar la resposta! **Extra** Augmenta la dificultat afegint vides: un jugador perd una vida per cada resposta incorrecta i el joc acaba després de tres respostes incorrectes. example_code: | ``` - number1 = {ask} 'What is the first number?' - number2 = {ask} 'What is the second number?' - answer = _ - {print} number1 ' plus ' number2 ' is ' answer + nombre1 = {ask} 'Quin és el primer nombre?' + nombre2 = {ask} 'Quin és el segon nombre?' + resposta = _ + {print} nombre1 ' més ' nombre2 ' és ' _ ``` 13: story_text: | @@ -701,8 +707,8 @@ adventures: Empty the programming field and create your own solution. example_code: | ``` - answer1 = {ask} 'What is 10 times 7?' - answer2 = {ask} 'What is 6 times 7?' + resposta1 = {ask} 'Quin és 10 per 7?' + resposta2 = {ask} 'Quin és 6 per 7?' {if} _ _ _ _ _ _ _ {print} _ ``` @@ -789,7 +795,7 @@ adventures: clear_command: name: '{clear}' default_save_name: clear_command - description: clear command + description: comanda {clear} levels: 4: story_text: | @@ -809,85 +815,85 @@ adventures: {print} 'SURPRISE!' ``` debugging: - name: debugging - default_save_name: debugging - description: debugging adventure + name: depuració + default_save_name: depuració + description: l'aventura de depurar levels: 1: story_text: |- - Welcome to a debugging adventure. Debugging a code means getting rid of mistakes in the code. - That means that in these debugging adventures, we will show you code that does not work yet. - You will have to figure out what's wrong and correct the mistakes. + Benvingut a una aventura de depuració. Depurar un codi significa eliminar errors en el codi. + Això vol dir que en aquestes aventures de depuració, t'ensenyarem codi que encara no funciona. + Hauràs de descobrir què està malament i corregir els errors. - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - {print} I love programming - Do you love programming too? + {print} M'encanta programar + T'agrada programar també? {echo} - {print} What are your hobbies? - {echo} Your hobbies are + {print} Quins són les teves aficions? + {echo} Les teves aficions són ``` 2: story_text: |- - Welcome to a debugging adventure. Debugging a code means getting rid of mistakes in the code. - That means that in these debugging adventures, we will give you a code that does not work yet. - You will have to figure out what's wrong and correct the mistakes. + Benvingut a una aventura de depuració. Depurar un codi significa eliminar errors en el codi. + Això vol dir que en aquestes aventures de depuració, et donarem un codi que encara no funciona. + Hauràs de descobrir què està malament i corregir els errors. - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - destination {ask} Where are you going on holidays? - {print} The flight to dstination leaves at 3 pm. - {ask} Did you check in your luggage yet? + destinacio {ask} On vas de vacances? + {print} El vol surt a les 3 de la tarda. + {ask} Ja has fet el check-in del teu equipatge? {echo} - {print} Let me print your boarding pass for you. + {print} Deixa'm imprimir-te la targeta d'embarcament. {sleep} - Here you go! Have a nice trip! + Aquí tens! Que tinguis un bon viatge! ``` 3: story_text: |- - Welcome to a debugging adventure. Debugging a code means getting rid of mistakes in the code. - That means that in these debugging adventures, we will give you a code that does not work yet. - You will have to figure out what's wrong and correct the mistakes. + Benvingut a una aventura de depuració. Depurar un codi significa eliminar errors en el codi. + Això vol dir que en aquestes aventures de depuració, et donarem un codi que encara no funciona. + Hauràs de descobrir què està malament i corregir els errors. - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - movie_choices {is} dracula, fast and furious, home alone, barbie - chosen_movie {is} movies {at} {random} - {print} Tonight we will watch chosen _movies - like {ask} Do you like that movie? - {print} Tomorrow we will watch something else. - {add} chosen_movie {to} movie_choices - {print} Tomorrow we will watch tomorrows_movie - tomorrows_movie {is} movie_choices {at} {random} - I'll go get the popcorn! {print} + opcions_pelicula {is} dracula, fast and furious, solo en casa, barbie + pelicula_escollida {is} movies {at} {random} + {print} Aquesta nit veurem _pelicula_escollida + com {ask} T'agrada aquesta pel·lícula? + {print} Demà veurem una altra cosa. + {add} pelicula_escollida {to_list} opcions_pelicula + {print} Demà veurem pelicula_dema + pelicula_dema {is} opcions_pelicula {at} {random} + Aniré a buscar les crispetes! {print} ``` 4: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - {print} 'Welcome to the online library! - {ask} What genre of books do you like? - {print} You like genre - author {is} {ask} 'Who's your favorite author?' - {print} 'author is your favorite author' - {print} Hmmm... i think you should try... books {at} {random} + {print} 'Benvingut a la biblioteca en línia!' + {ask} Quin gènere de llibres t'agrada? + {print} T'agrada el gènere + autor {is} {ask} 'Qui és el teu autor preferit?' + {print} 'autor és el teu autor preferit' + {print} Hmmm... crec que hauries de provar... llibres {at} {random} ``` 5: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | **Warning! This code needs to be debugged!** ``` @@ -907,8 +913,8 @@ adventures: ``` 6: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | **Warning! This code needs to be debugged!** ``` @@ -929,21 +935,21 @@ adventures: ``` 7: story_text: |- - ### Exercise - Surprise! This program looks more like an output than a code. And yet, we don't want you to just add `{print}` commands in front of each line. - Fix this program to turn it into the nursery rhyme 'Brother John (Frère Jaques)' by using the {repeat} command of course! + ### Exercici + Sorpresa! Aquest programa sembla més una sortida que un codi. I, tanmateix, no volem que simplement afegeixis comandes `{print}` davant de cada línia. + Arregla aquest programa per convertir-lo en la cançó infantil 'Frère Jacques' utilitzant la comanda {repeat}, és clar! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - Are you sleeping? - Brother John! - Morning bells are ringing! - Ding, dang, dong! + Frère Jacques, frère Jacques, + Dormez-vous? Dormez-vous? + Sonnez les matines! Sonnez les matines! + Ding, dang, dong. Ding, dang, dong. ``` 8: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | **Warning! This code needs to be debugged!** ``` @@ -967,287 +973,264 @@ adventures: ``` 9: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - {print} 'Welcome to our sandwich shop' - amount 'How many sandwiches would you like to buy?' - {repeat} amount {times} - {ask} {is} {ask} 'What kind or bread would you like your sandwich to be?' - types_of_bread {is} white, wheat, rye, garlic, gluten free - {if} chosen_bread in types_of_bread - {print} 'Lovely!' + {print} "Benvingut a la nostra botiga d'entrepans" + quantitat "Quants entrepans t'agradaria comprar?" + {repeat} quantitat {times} + {ask} {is} {ask} "Quin tipus de pa t'agradaria per al teu entrepà?" + tipus_de_pa {is} blanc, blat, sègol, all, sense gluten + {if} pa_elegit in tipus_de_pa + {print} "Excel·lent!" {else} - 'I'm sorry we don't sell that' - topping {is} {ask} 'What kind of topping would you like?' - sauce {is} {ask} 'What kind of sauce would you like?' - {print} One chosen_bread with topping and sauce. - price = amount * 6 - {print} 'That will be 'price dollar' please' + "Ho sento, no venem això" + guarnicio {is} {ask} "Quin tipus de guarnició t'agradaria?" + salsa {is} {ask} "Quin tipus de salsa t'agradaria?" + {print} Un pa_elegit amb guarnicio i salsa. + preu = quantitat * 6 + {print} "Seran " preu " euros, si us plau" ``` - - price = amount * 6 - {print} 'That will be 'price dollar' please' 10: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - names = Muad Hasan Samira Noura - activities = fly a kite, go swimming, go hiking, catch tan in the sun - {for} name {is} names - {print} At the beach name loves to activity at random + noms = Muad Hasan Samira Noura + activitats = volar un estel, anar a nedar, fer senderisme, posar-se moreno + {for} nom {is} noms + {print} A la platja, nom li encanta activity {at} {random} ``` 11: story_text: |- - ### Exercise - Debug this calender program. The output of this program is supposed to look like a list of dates. - For example: - - ``` - Hedy calender - Here are all the days of November - November 1 - November 2 - November 3 - ``` - And so on. + ### Exercici + Depura aquest programa de calendari. La sortida d'aquest programa hauria de semblar una llista de dates. + Per exemple: + + ``` + Calendari de Hedy + Tots els dies de novembre: + 1 de novembre + 2 de novembre + 3 de novembre + ``` + I així successivament. + + Tingues en compte que has de provar el teu codi amb molta cura per al mes de febrer, ja que la quantitat de dies en aquest mes canvia als anys de traspàs. + example_code: | + **Advertència! Aquest codi necessita ser depurat!** + ``` + {print} "Calendari de Hedy" + mesos_amb_31_dies = Gener, Març, Maig, Juliol, Setembre, Octubre, Desembre + mesos_amb_30_dies = Abril, Juny, Agost, Novembre + mes = {ask} "Quin mes t'agradaria veure?" + {if} mes {in} mesos_amb_31_dies + dies = 31 + {if} mes {in} mesos_amb_30_dies + dies = 30 + {if} mes = Febrer + anys_de_traspàs = 2020, 2024, 2028, 2036, 2040, 2044, 2028 + any = {ask} "Quin any és?" + {if} any {in} anys_de_traspàs + dies = 29 + {else} + dies = 28 - Mind that you have to test your code extra carefully for the month February, because the amount of days in this month changes in leap years. - example_code: | - **Warning! This code needs to be debugged!** - ``` - print 'Hedy calender' - months_with_31 days = January, March, May, July, September, October, December - months_with_30_days = April, June, August, November - month = ask 'Which month would you like to see?' - if month in months_with_31_days - days = 31 - if month in months_with30_days - days = 30 - if month = February - leap_years = 2020, 2024, 2028, 2036, 2040, 2044, 2028 - year = ask 'What year is it?' - if year in leap_years - days = 29 - else - days = 28 - - print 'Here are all the days of ' moth - for i in range 1 to days - print month i + {print} "Aquí tens tots els dies de " mse + {for} i {in} {range} 1 {to} dies + {print} mes i ``` 12: story_text: |- - ### Exercise - Debug this code. Good luck! - example_code: | - **Warning! This code needs to be debugged!** - ``` - define greet - greetings = 'Hello', 'Hi there', 'Goodevening' - print greetings at random - - define take_order - food = ask 'What would you like to eat?' - print 'One food' - drink = 'What would you like to drink?' - print 'One ' drink - more = ask 'Would you like anything else?' - if more is 'no' - print 'Alright' - else - print 'And ' more - print 'Thank you' - - print 'Welcome to our restaurant' - people = ask 'How many people are in your party tonight?' - for i in range 0 to people - call greet_costumer + ### Exercici + Depura aquest codi. Bona sort! + example_code: | + **Advertència! Aquest codi necessita ser depurat!** + ``` + {define} saludar + greetings = "Hola", "Hola a tots", "Bona tarda" + {print} greetings {at} {random} + + {define} prendre_comanda + menjar = {ask} "Què t'agradaria menjar?" + {print} "Un menjar" + beguda = "Què t'agradaria beure?" + {print} "Una " beguda + mes = {ask} "Vols alguna cosa més?" + {if} mes {is} "no" + {print} "Molt bé" + {else} + {print} "I " mes + {print} "Gràcies" + + {print} "Benvingut al nostre restaurant" + persones = {ask} "Quantes persones sou aquesta nit?" + {for} i {in} {range} 0 {to} persones + {call} saludar_client ``` 13: story_text: |- - ### Exercise - Debug this code. Good luck! - example_code: | - **Warning! This code needs to be debugged!** - ``` - defin movie_recommendation with name - action_movies == 'Die Hard', 'Fast and Furious', 'Inglorious Bastards' - romance_movies = 'Love Actually', 'The Notebook', 'Titanic' - comedy_movies = 'Mr Bean' 'Barbie''Deadpool' - kids_movies = 'Minions', 'Paddington', 'Encanto' - if name is 'Camila' or name is 'Manuel' - recommended_movie = kids_movie at random - if name is 'Pedro' or 'Gabriella' - mood = ask 'What you in the mood for?' - if mood is 'action' - recommended_movie = comedy_movies at random - if mood is 'romance' - recommended_movie = romance_movies - if mood is 'comedy' - recommended_movie = comedy_movies at random - - print 'I would recommend ' recommended_movie ' for ' name - - name = ask 'Who is watching?' - recommendation = ask 'Would you like a recommendation?' - if recommendaion is 'yes' - print movie_recommendation with name - else - print 'No problem!' + ### Exercici + Depura aquest codi. Bona sort! + example_code: | + **Advertència! Aquest codi necessita ser depurat!** + ``` + {define} recomanacio_pelicula {with} nom + pelicules_accio = "Die Hard", "Fast and Furious", "Malditos Bastardos" + pelicules_romantiques = "Love Actually", "Barcelona nit d'estiu", "Titanic" + pelicules_comedia = "Mr Bean", "Barbie", "La casa en flames" + pelicules_nens = "Tintin", "Les tres bessones", "Inside out" + {if} nom {is} "Camila" {or} nom {is} "Manel" + pelicula_recomanada = pelicules_nens {at} {random} + {if} nom {is} "Pere" {or} "Gabriella" + estat_d_ànim = {ask} "Quin estat d'ànim tens?" + {if} estat_d_ànim {is} "acció" + pelicula_recomanada = pelicules_accio {at} {random} + {if} estat_d_ànim {is} "romantica" + pelicula_recomanada = pelicules_romantiques + {if} estat_d_ànim {is} "comedia" + pelicula_recomanada = pelicules_comedia {at} {random} + + {print} "Et recomanaria " pelicula_recomanada " per " nom + + nom = {ask} "Qui està mirant?" + recomanacio = {ask} "Vols una recomanació?" + {if} recomanacio {is} "sí" + {print} recomanacio_pelicula {with} nom + {else} + {print} "Cap problema!" ``` 14: story_text: |- - ### Exercise - Debug this code. Good luck! - example_code: | - **Warning! This code needs to be debugged!** + ### Exercici + Depura aquest codi. Bona sort! + example_code: | + **Advertència! Aquest codi necessita ser depurat!** + ``` + {define} calcular_pulsacions + {print} "Pressiona els dits suaument contra el costat del teu coll" + {print} "(just sota de la mandíbula)" + {print} "Conta el nombre de pulsacions que sents durant 15 segons" + pulsacions == {ask} "Quantes pulsacions sents en 15 segons?" + pols = pulsacions * 4 + {print} "El teu pols és " pols + {if} pols >= 60 {or} pols <= 100 + {print} "El teu pols sembla estar bé" + {else} + {if} pols > 60 + {print} "El teu pols sembla massa baix" + {if} pols < 100 + {print} "El teu pols sembla massa alt" + {print} "Potser hauries de contactar amb un professional mèdic" + + mesurar_pulsacio = {ask} "Vols mesurar el teu pols?" + {if} mesurar_pulsacio = "sí" + {call} calcular_pulsacions + {else} + "Cap problema" ``` - define calculate_heartbeat - print 'Press your fingertips gently against the side of your neck' - print '(just under your jawline)' - print 'Count the number of beats you feel for 15 seconds' - beats == ask 'How many beats do you feel in 15 seconds?' - heartbeat = beats*4 - print 'Your heartbeat is ' heartbeat - if heartbeat >= 60 or heartbeat <= 100 - print 'Your heartbeat seems fine' - else - if heartbeat > 60 - print 'Your heartbeat seems to be too low' - if heartbeat < 100 - print 'Your heartbeat seems to be too high' - print 'You might want to contact a medical professional' - - measure_heartbeat = ask 'Would you like to measure your heartbeat?' - if measure_heartbeat = 'yes' - call measure_heartbeat - else - 'no problem' - ``` - - print '(just under your jawline)' - print 'Count the number of beats you feel for 15 seconds' - beats == ask 'How many beats do you feel in 15 seconds?' - heartbeat = beats*4 - print 'Your heartbeat is ' heartbeat - if heartbeat >= 60 or heartbeat <= 100 - print 'Your heartbeat seems fine' - else - if heartbeat > 60 - print 'Your heartbeat seems to be too low' - if heartbeat < 100 - print 'Your heartbeat seems to be too high' - print 'You might want to contact a medical professional' - - measure_heartbeat = ask 'Would you like to measure your heartbeat?' - if measure_heartbeat = 'yes' - call measure_heartbeat - else - 'no problem' 15: story_text: |- - ### Exercise - Debug this random children's story. Good luck! - example_code: | - **Warning! This code needs to be debugged!** - ``` - names = 'Tanya', 'Romy', 'Kayla', 'Aldrin', 'Ali' - verbs='walking', 'skipping', 'cycling', 'driving', 'running' - locations = 'on a mountaintop', 'in the supermarket', 'to the swimming pool' - hiding_spots = 'behind a tree', under a table', in a box' - sounds = 'a trumpet', 'a car crash', 'thunder' - causes_of_noise = 'a television', 'a kid with firecrackers', 'a magic elephant', 'a dream' - - chosen_ name = names at random - chosen_verb = verbs at random - chosen_location = 'locations at random' - chosen_sounds = noises at random - chosen_spot = hiding_spots random - chosen_causes = causes_of_noise at random - - print chosen_name ' was ' chosen_verb ' ' chosen_location - print 'when they suddenly heard a sound like ' sounds at random - print chosen_name ' looked around, but they couldn't discover where the noise came from' - print chosen_name ' hid ' chosen_spot' - print 'They tried to look around, but couldn't see anything from there' - hidden = 'yes' - while hidden = 'yes' - print chosen_name 'still didn't see anything' - answer = ask 'does ' chosen_name ' move from their hiding spot?' - if answer = 'yes' - hidden == 'no' - print 'chosen_name moved from' chosen_spot - print 'And then they saw it was just' chosen_cause - print chosen_name 'laughed and went on with their day' - print The End + ### Exercici + Depura aquesta història infantil aleatòria. Bona sort! + example_code: | + **Advertència! Aquest codi necessita ser depurat!** + ``` + noms = "Tanya", "Romy", "Kayla", "Aldrin", "Ali" + verbs = "caminant", "saltant", "ciclant", "conduint", "corrent" + llocs = "en un cim", "al supermercat", "cap a la piscina" + llocs_on = "darrera d'un arbre", "sota d'una taula", "dins d'una caixa" + sons = "una trompeta", "un xoc de cotxes", "un tro" + causes_de_sorolls= "un televisor", "un nen amb petards", "un elefant màgic", "un somni" + + elegit_nom = noms {at} {random} + elegit_verb = verbs {at} {random} + elegit_lloc = llocs {at} {random} + elegit_so = sons {at} {random} + elegit_lloc = llocs_on {random} + elegit_causa = causes_de_sorolls {at} {random} + + {print} elegit_nom " estava " elegit_verb " " elegit_lloc + {print} "quan de sobte van sentir un so com " sounds {at} {random} + {print} elegit_nom " va mirar al seu voltant, però no va poder descobrir d'on venia el soroll" + {print} elegit_nom " es va amagar " elegit_lloc + {print} "Van intentar mirar al seu voltant, però no van poder veure res des d'allà" + amagat = "sí" + {while} amagat = "sí" + {print} elegit_nom " encara no veia res" + resposta = {ask} "Es mou " elegit_nom " del seu lloc d'amagat?" + {if} resposta = "sí" + amagat == "no" + {print} elegit_nom " es va moure de " elegit_lloc + {print} "I llavors van veure que només era " elegit_causa + {print} elegit_nom " va riure i va continuar amb el seu dia" + {print} "Fi" ``` 16: story_text: |- - ### Exercise - Debug this code. Good luck! - Tip: Make sure that you only see your score once in the end. - example_code: | - **Warning! This code needs to be debugged!** - ``` - country = ['The Netherlands', 'Poland', 'Turkey', 'Zimbabwe', 'Thailand', 'Brasil', 'Peru', 'Australia', 'India', 'Romania' ] - capitals = 'Amsterdam', 'Warshaw' 'Istanbul', 'Harare', 'Bangkok', 'Brasilia', 'Lima', 'Canberra', 'New Delhi', 'Bucharest' - score = 0 - for i in range 0 to 10 - answer = ask 'What's the capital of ' countries[i] - correct = capital[i] - if answer = correct - print 'Correct!' - score = score + 1 - else - print 'Wrong,' capitals[i] 'in the capital of' countries[i] - print 'You scored ' score ' out of 10' + ### Exercici + Depura aquest codi. Bona sort! + Consell: Assegura't que només vegis la teva puntuació una vegada al final. + example_code: | + **Advertència! Aquest codi necessita ser depurat!** + ``` + país = ['Països Baixos', 'Catalunya', 'Turquia', 'Zimbabwe', 'Tailàndia', 'País Basc', 'Perú', 'Austràlia', 'Índia', 'Romania'] + capitals = 'Amsterdam', 'Barcelona', 'Istanbul', 'Harare', 'Bangkok', 'Bilbao', 'Lima', 'Canberra', 'Nova Delhi', 'Bucarest' + puntuació = 0 + {for} i {in} {range} 0 {to} 10 + resposta = {ask} 'Quina és la capital de ' país[i] + correcte = capitals[i] + {if} resposta = correcte + {print} 'Correcte!' + puntuació = puntuació + 1 + {else} + {print} 'Incorrecte, ' capitals[i] ' és la capital de ' país[i] + {print} 'Has obtingut ' puntuació ' de 10' ``` 17: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Exercici + Depura aquest codi. Bona sort! example_code: | - **Warning! This code needs to be debugged!** + **Advertència! Aquest codi necessita ser depurat!** ``` - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + {define} comanda_menjar + ingredients = {ask} "de pepperoni, de tonyina, vegetariana o de formatge?" + mida = {ask} "gran, mitjana o petita?" + nombre_de_pizzas = {ask} "Quantes d'aquestes pizzes voldries?" - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + {print} "HAS ORDENAT" + {print} nombre_de_pizzas " mida pizza " ingredients - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + {define} comanda_beure + beguda = {ask} "aigua, cola, te gelat, limonada o cafè?" + nombre_de_bebides = {ask} "Quantes d'aquestes begudes voldries?" - print 'YOU ORDERED' - print number_of_drinks ' ' drink + {print} "HAS ORDENAT" + {print} nombre_de_bebides " " beguda - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + "Benvingut a Hedy pizza" + més_comanda = {ask} "Voldries demanar una pizza?" + {while} més_comanda = "sí" + {return} comanda_menjar + més_comanda = {ask} "Voldries demanar una pizza?" + més_bebides = {ask} "Voldries demanar alguna beguda?" + {while} més_bebides = "sí" + {call} comanda_beure + més_bebides = {ask} "Voldries demanar més begudes?" - print 'Thanks for ordering!' + {print} "Gràcies per la teva comanda!" ``` 18: story_text: |- - ### Exercise - Debug this Old MacDonald program from level 16. Good luck! + ### Exercici + Depura aquest programa d'Old MacDonald del nivell 16. Bona sort! example_code: | **Warning! This code needs to be debugged!** ``` @@ -1273,11 +1256,12 @@ adventures: levels: 1: story_text: | - Benvingut a Hedy! + Benvingut a Hedy! Aquí pots aprendre a programar pas a pas. - Per provar el codi tan sols has de fer clic al botó 'Executa' sota el bloc de programació. + Prova el codi tu mateix! El botó groc copia el codi d'exemple al teu camp de programació. + Després, prem el botó verd 'Executa codi' sota del camp de programació per executar el codi. - Estàs llest?, ves a la següent pestanya per aprendre la teva primera comanda. + Preparat? Ves a la pestanya següent per aprendre com fer el teu propi codi! example_code: | ``` {print} Hello world! @@ -1341,9 +1325,9 @@ adventures: Al nivell anterior has practicat amb `{ask}` i `{if}`. Ara per exemple pots preguntar als convidats què volen per menjar. Encara, però no pots calcular el preu del sopar per tothom. - El següent nivell serà possible utilitzar la suma, resta i la multiplicació als reus programes. D'aquesta manera podràs calcular preus al teu restaurant, també podràs afegir un codi secret per compartir-lo amb els teus amics i família. + En aquest nivell serà possible utilitzar la suma, resta i la multiplicació als reus programes. D'aquesta manera podràs calcular preus al teu restaurant, també podràs afegir un codi secret per compartir-lo amb els teus amics i família. - Una altra opció del següent nivell serà programar el teu propi joc matemàtic, per ajudar al teu germanet o germaneta a practicar les multiplicacions. + Una altra opció d'aquest nivell serà programar el teu propi joc matemàtic, i podràs ajudar al teu germanet o germaneta a practicar les multiplicacions. Descobreix-ho tu mateix! example_code: | ``` @@ -1356,7 +1340,7 @@ adventures: {if} comanda {is} patates preu_menjar {is} 2 beguda {is} {ask} 'Què voleu per beure?' {if} beguda {is} aigua preu_beguda {is} 0 - else preu_beguda {is} 3 + {else} preu_beguda {is} 3 preu_total {is} preu_menjar + preu_beguda {print} 'Seran ' preu_total ' euros, siusplau' ``` @@ -1383,13 +1367,13 @@ adventures: ``` 9: story_text: | - Bona feina! Has aconseguit un nou nivell! Al nivell anterior has aprés a fer servir múltiples línies de codi dins una comanda {if} o {repeat}. Encara, però no pots combinar-les... - Bones notícies! En aquest nivell estarà permès situar un {if} dins d'un altre {if}, o dins d'una comanda {repeat}. + Bona feina! Has aconseguit un nou nivell! Al nivell anterior has après a fer servir múltiples línies de codi dins una comanda {if} o {repeat}. Encara, però no pots combinar-les... + Bones notícies! En aquest nivell estarà permès situar un {if} dins d'un altre {if}, o dins d'una comanda {repeat}. Posar un bloc de codi dins d'un altre bloc de codi es diu anidament. ```Posar un bloc de codi dins d'un altre bloc de codi es diu anidament. example_code: | ``` resposta = {ask} 'Estàs llest per aprendre una cosa nova?' {if} resposta {is} si - {print} 'Genial!, pots aprendre a fer servir la comanda repeteix dins la comanda si!' + {print} 'Genial!, pots aprendre a fer servir la comanda repeat dins la comanda if!' {print} 'Hurra!' {print} 'Hurra!' {print} 'Hurra!' @@ -1397,12 +1381,12 @@ adventures: {print} 'Potser hauràs de repassar el nivell anterior...' 10: story_text: | - Ho estàs fent molt bé! Als nivells anteriors ens hem trobat amb un petit problema. Has après a repetir línies, però què passa si vols fer petits canvis a la línia. - Per exemple si vols cantar la cançó "si ets feliç i ho saps". Tindrà el següent aspecte: + Ho estàs fent molt bé! En els nivells anteriors encara ens vam haver d'enfrontar a un petit problema. Has après a repetir línies, però què passaria si volguessis canviar lleugerament la línia. + Per exemple, si vols cantar la cançó 'Si ets feliç i ho saps'. Es veuria així: - Si també vols el següent vers 'stomp your feet', i el següent, i el següent, hauràs de canviar el codi completament. - En aquest nivell aprendràs la comanda `{for}`, que et permetrà fer una llista d'accions i repetir el codi amb una noca acció cada vegada! - Fes-hi una ullada! + Si també vols el següent vers 'pica de peus', i el següent, i el següent, hauries de canviar completament el codi. + En aquest nivell, aprendràs la comanda `{for}`, que et permet fer una llista d'accions i repetir el codi amb una altra acció cada vegada! + Fem-hi un cop d'ull! example_code: | ``` {repeat} 2 {times} @@ -1447,7 +1431,7 @@ adventures: ``` 14: story_text: | - Amb el programa següent pots calcular si has aprovat una assignatura (per tant, una nota superior o igual a 5). + Amb el codi d'exemple pots calcular si has aprovat una assignatura (per tant, una nota superior o igual a 5). Pots observar que aquest codi és extremadament ineficient, a causa de la longitud excessiva de la línia 5. Totes les notes de l'1 al 5 s'han programat per separat. Estàs de sort, ja que en aquest nivell aprendràs a fer-ho molt més curt! example_code: | @@ -1469,13 +1453,13 @@ adventures: Durant aquest nivell aprendràs una comanda que fa la vida fàcil amb tot això! example_code: | ``` - joc {is} 'en curs' + joc = 'en curs' {for} i {in} {range} 1 {to} 100 - {if} joc {is} 'en curs' + {if} joc == 'en curs' resposta = {ask} 'Vols continuar?' - {if} resposta {is} 'no' - joc {is} 'acabat' - {if} resposta {is} 'si' + {if} resposta == 'no' + joc = 'acabat' + {if} resposta == 'si' {print} D'acord continuem' ``` 16: @@ -1510,22 +1494,22 @@ adventures: L'enhorabona! Has assolit l'últim nivell de Hedy! El codi has creat aquí pot ser copiat a entorns reals de Python com replit o PyCharm, i pots continuar aprenent allà! Tingues en compte que aquell Python només pot llegir comandes en anglès, així que si has estat utilitzant altres llengües, ara les hauràs de posar en anglès. dice: - name: Dice - default_save_name: Dice - description: Make your own dice + name: Dau + default_save_name: Dau + description: Fes el teu dau levels: 3: story_text: | - In this level we can choose from a list. With that we can let the computer choose one side of the die. - Take a look at the games you have in your closet at home. - Are there games with a (special) die? You can also copy it with this code. - For example, the dice of the game Earthworms with the numbers 1 to 5 and an earthworm on it. + En aquest nivell podem escollir des d'una llista. D'aquesta manera podem fer que l'ordinador tiri un dau. + Busca i dona una ullada als jocs que tens a l'armari a casa. + Tens jocs amb un algun dau normal? (o algun amb un dau especial?) Pots recrear-los amb el següent programa. + Per exemple, el dau del joc del Pikomino té els números de l'1 al 5 i en lloc del 6 un cuc de terra dibuixat. - ![Die of earthworms with 1 to 5 and an earthworm on it](https://cdn.jsdelivr.net/gh/felienne/hedy@24f19e9ac16c981517e7243120bc714912407eb5/coursedata/img/dobbelsteen.jpeg) + ![Dau del Pikomino amb cares de l'1 al 5 més un cuc](https://cdn.jsdelivr.net/gh/felienne/hedy@24f19e9ac16c981517e7243120bc714912407eb5/coursedata/img/dobbelsteen.jpeg) example_code: | ``` - choices {is} 1, 2, 3, 4, 5, earthworm - {print} choices {at} {random} + opcions {is} 1, 2, 3, 4, 5, cuc + {print} opcions {at} {random}! ``` story_text_2: | ### Exercise @@ -1533,7 +1517,7 @@ adventures: Or other special dice from a different game? example_code_2: | ``` - choices {is} _ + opcions {is} _ ``` 4: story_text: | @@ -1541,57 +1525,60 @@ adventures: This time the sample code is not quite complete. Can you finish the code? 5: story_text: | - You can also make a die again in this level using the `{if}`. - Complete the sample code so that the code says "You can stop throwing" once you have thrown an earthworm. + Afegirem les comandes `{if}` i `{else}` als nostres daus! - But maybe you want to recreate a die from a completely different game. That's fine too! Then make up your own reaction, e.g. 'yes' for 6 and 'pity' for something else. + ### Exercici + Completa el codi d'exemple perquè el codi digui "Pots deixar de tirar" un cop hagis tirat un cuc. Ha de dir "Has de tornar a tirar" si has tirat qualsevol altra cosa. + **Extra** Potser vols recrear un dau d'un joc completament diferent. També està bé! Llavors, crea la teva pròpia reacció, per exemple, 'sí' per a 6 i 'quina pena' per a qualsevol altra cosa. example_code: | ``` - choices {is} 1, 2, 3, 4, 5, earthworm - throw {is} _ - {print} 'you have' _ 'thrown' - {if} _ {is} earthworm {print} 'You can stop throwing.' _ {print} 'You have to hear it again!' + opcions {is} 1, 2, 3, 4, 5, cuc + tirada {is} opcions {at} {random} + {print} 'Has tirat ' tirada + _ tirada {is} cuc {print} 'Pots parar de tirar.' + _ {print} 'Has de tornar a tirar' ``` 6: story_text: | - You can also make an Earthworm die again in this, but now you can also calculate how many points have been rolled. - You may know that the worm counts 5 points for Earthworms. Now after a roll you can immediately calculate how many points you have thrown. - This is the code to calculate points for one die: + En aquest nivell pots tornar a fer el dau del Pikomino (dau del cuc de terra), ara, però calcularem quants punts s'han aconseguit tirant el dau. + Com segurament ja saps, el cuc compta per 5 punts. Ara, després d'un llançament, pots calcular immediatament quants punts has aconseguit amb la tirada. + Aquest és el codi per calcular els punts d'un dau: - ### Exercise - Can you make the code so that you get the total score for 8 dice? To do that, you have to cut and paste some lines of the code. + ### Exercici + Pots fer el codi per obtenir la puntuació total per a 8 daus? Per fer-ho, hauràs de copiar i enganxar algunes línies del codi. example_code: | ``` - choices = 1, 2, 3, 4, 5, earthworm - points = 0 - throw = choices {at} {random} - {print} 'you threw' throw - {if} throw {is} earthworm points = points + 5 {else} points = points + throw - {print} 'those are' points ' point' + opcions = 1, 2, 3, 4, 5, cuc + punts= 0 + tirada = opcions {at} {random} + {print} "Has tirat " tirada + {if} tirada {is} cuc punts = punts+ 5 {else} punts = punts + tirada + {print} "Això són " punts " punts " ``` example_code_2: | - Did you manage to calculate the score for 8 dice? That required a lot of cutting and pasting, right? We are going to make that easier in level 7! + Has aconseguit calcular la puntuació per a 8 daus? Segur que això ha fet que el copy-paste tregui fum, oi? Ara ho farem més fàcil que al nivell 7! 7: story_text: | - You can also make a die again in level 5. With the `{repeat}` code you can easily roll a whole hand of dice. - Try to finish the sample code! The dashes should contain multiple commands and characters. + També pots fer un dau en aquest nivell. Amb la comanda`{repeat}` pots tirar fàcilment múltiples daus. - But maybe you want to make a completely different die. Of course you can! + ### Exercici + Prova d'acabar el codi d'exemple! **Extra** Pensa en un joc que coneguis que impliqui un dau i programa'l utilitzant un `{repeat}`. example_code: | ``` - choices = 1, 2, 3, 4, 5, earthworm - {repeat} _ _ {print} _ _ _ + opcions = 1, 2, 3, 4, 5, 6 + _ _ _ _ _ _ _ ``` 10: story_text: | - Is everybody taking too long throwing the dice? In this level you can let Hedy throw all the dice at once! - Can you fill in the correct line of code on the blanks? + ### Exercici + Està tothom trigant massa a llençar els daus? En aquest nivell pots deixar que Hedy llenci tots els daus alhora! + Canvia els noms pels noms dels teus amics o familiars i completa el codi. example_code: | ``` - players = Ann, John, Jesse - choices = 1, 2, 3, 4, 5, 6 - _ - {print} player ' throws ' choices {at} {random} + jugadors = Ann, John, Jesse + opcions = 1, 2, 3, 4, 5, 6 + _ _ _ _ + {print} jugador ' tira ' opcions {at} {random} {sleep} ``` 15: @@ -1619,9 +1606,9 @@ adventures: {print} 'Yes! You have thrown 6 in ' tries ' tries.' ``` dishes: - name: Dishes? - default_save_name: Dishes - description: Use the computer to see who does the dishes (Start at level 2) + name: Plats? + default_save_name: Plats + description: Utilitza l'ordinador per veure qui renta els plats. levels: 3: story_text: | @@ -1630,8 +1617,8 @@ adventures: You first make a list of the members of your family. Then choose `{at} {random}` from the list. example_code: | ``` - people {is} mom, dad, Emma, Sophie - {print} people {at} {random} + gent {is} mama, papa, Emma, Sofia + {print} gent {at} {random} li toca rentar plats ``` story_text_2: | Don't feel like doing the dishes yourself? Hack the program by removing your name from the list with the `{remove}` `{from}` command. @@ -1645,10 +1632,10 @@ adventures: Tip: Don't forget the quotation marks! example_code: | ``` - people {is} mom, dad, Emma, Sophie - {print} _ the dishes are done by _ + gent {is} mama, papa, Emma, Sofia + {print} _ els plats son rentats per _ {sleep} - {print} people {at} _ + {print} gent {at} _ ``` 5: story_text: | @@ -1656,50 +1643,56 @@ adventures: Can you finish the code so that it prints 'too bad' when it is your turn and otherwise 'yes!'? Don't forget the quotes! - example_code: "```\npeople {is} mom, dad, Emma, Sophie\ndishwasher {is} people {at} {random}\n{if} dishwasher {is} Sophie {print} _ too bad I have to do the dishes _ \n{else} {print} 'luckily no dishes because' _ 'is already washing up'\n```\n" + example_code: "```\ngent {is} mama, papa, Emma, Sofia\nnetejador {is} gent {at} {random}\n_ netejador {is} Sofia {print} _ Pffff... em toca rentar plats _\n_ {print} 'per sort no hi ha plats perquè ' _ ' ja els està rentant'\n```\n" 6: story_text: | How often is everyone going to do the dishes? Is that fair? You can count it in this level. example_code: | ``` - people = mom, dad, Emma, Sophie - emma_washes = 0 - dishwasher = people {at} {random} - {print} 'The dishwasher is' dishwasher - {if} dishwasher {is} Emma emma_washes = emma_washes + 1 - {print} 'Emma will do the dishes this week' emma_washes 'times' + persones = mama, papa, Emma, Sofia + emma_renta = 0 + netejadora = persones {at} {random} + {print} 'Li toca rentar plats a ' netejadora + {if} rentadora {is} Emma emma_renta = emma_renta + 1 + {print} 'Emma farà els plats aquesta setmana' emma_renta 'vegades' ``` - Now you can copy lines 3 to 5 a few times (e.g. 7 times for a whole week) to calculate for a whole week again. - Do you make the code for the whole week? + Ara pots copiar de la línia 3 a la 5 unes quantes vegades (pex. 7 vegades per fer una setmana). + Pots fer el codi per calcular tota una setmana? story_text_2: | - If you are extremely unlucky the previous program might choose you to to the dishes for the whole week! That's not fair! - To create a fairer system you can use the `{remove}` command to remove the chosen person from the list. This way you don't have to do the dishes again untill everybody has had a turn. + Si tens molta mala sort, el programa anterior podria triar-te per a rentar plats de tota la setmana! I això no és just! + Per crear un sistema més just, pots utilitzar l'ordre `{remove}` per eliminar la persona escollida de la llista. D'aquesta manera no haureu de tornar a rentar els plats fins que tothom hagi tingut el seu torn. - Monday and tuesday are ready for you! Can you add the rest of the week? - And... can you come up with a solution for when your list is empty? + Dilluns i dimarts ja estan preparats per a tu! Pots afegir la resta de la setmana? + I... pots trobar una solució per a quan la llista estigui buida? example_code_2: | ``` - people = mom, dad, Emma, Sophie - dishwasher = people {at} {random} - {print} 'Monday the dishes are done by: ' dishwasher - {remove} dishwasher {from} people - dishwasher = people {at} {random} - {print} 'Tuesday the dishes are done by: ' dishwasher - {remove} dishwasher {from} people - dishwasher = people {at} {random} + gent = mama, papa, Emma, Sofia + netejador = gent {at} {random} + {print} "Dilluns renta: " netejador + {remove} netejador {from} gent + netejador = gent {at} {random} + {print} "Dimarts renta:: " netejador + {remove} netejador {from} gent ``` 7: story_text: | - With the `{repeat}` you can repeat pieces of code. You can use this to calculate who will be washing dishes for the entire week. + Amb el `{repeat}` pots repetir fragments de codi. Pots utilitzar-ho per calcular qui rentarà els plats durant diversos dies! + ### Exercici + Utilitza l'ordre `{repeat}` per decidir qui ha de rentar els plats durant una setmana sencera. Cada espai en blanc s'ha d'omplir amb una comanda o número! + **Extra** Pots pensar en altres tasques de la casa? Adapta el codi perquè decideixi sobre tres tasques domèstiques. No oblidis imprimir de quines tasques es refereix! example_code: | ``` - people = mom, dad, Emma, Sophie - {repeat} _ _ {print} 'the dishwasher is' _ + gent = mama, papa, Emma, Sofia + {repeat} _ _ {print} 'Rentar plats li toca a ' _ _ _ ``` 10: story_text: | - In this level you could make an even better dish washing shedule. + En aquest nivell pots fer un horari per a tota la setmana d'una manera fàcil! + + ### Exercici + Afegeix-hi una segona tasca, com passar l'aspiradora o endreçar, i assegura't que també estigui dividida durant tota la setmana. +
**Extra** El programa no és just, pots tenir mala sort i haver de rentar durnat tota la setmana. Com pots fer el programa més just? example_code: | ``` days = Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday @@ -1709,8 +1702,8 @@ adventures: ``` elif_command: name: '{elif}' - default_save_name: elif - description: elif + default_save_name: sino + description: '{elif}' levels: 17: story_text: | @@ -2610,7 +2603,7 @@ adventures: is_command: name: '{is}' default_save_name: comanda_es - description: Introducció a la comanda és + description: Introducció a la comanda {is} levels: 2: story_text: | @@ -3139,7 +3132,7 @@ adventures: parrot: name: Lloro default_save_name: Parrot - description: Create your own online pet parrot that will copy you! + description: Crea el teu lloro i fes que repeteixi el que li dius! levels: 1: story_text: | @@ -3162,7 +3155,8 @@ adventures: {echo} 2: story_text: | - Create your own online pet parrot that will copy you! + En el nivell anterior has fet un lloro que repetia el que li deies. En aquest nivell farem que el lloro sigui interactiu utilitzant una variable i la comanda `{ask}` . + També farem el lloro sigui més real afegint la comanda `{sleep}` després de dir una cosa. example_code: | ``` {print} Im Hedy the parrot @@ -4389,14 +4383,14 @@ adventures: Hint: Not all lines need indentation. example_code: | ``` - _ actions = 'clap your hands', 'stomp your feet', 'shout Hurray!' - _ {for} action {in} actions + _ accions = "pica de mans", "pica de peus", "crida Hurra!" + _ {for} accio {in} accions _ {for} i {in} {range} 1 {to} 2 - _ {print} 'if youre happy and you know it' - _ {print} action - _ {print} 'if youre happy and you know it and you really want to show it' - _ {print} 'if youre happy and you know it' - _ {print} action + _ {print} "si ets feliç i ho saps" + _ {print} accio + _ {print} "si ets feliç i ho saps, i ho vols fer saber a tothom" + _ {print} "si ets feliç i ho saps" + _ {print} accio ``` 13: story_text: | diff --git a/content/adventures/es.yaml b/content/adventures/es.yaml index 4d635c0af85..52aa368cbb2 100644 --- a/content/adventures/es.yaml +++ b/content/adventures/es.yaml @@ -625,7 +625,7 @@ adventures: ¿Puedes completar la línea 10 para hacer que el código funcione? ### Ejercicio 2 - Dale al jugador información cuando introduzcan una pregunta, por ejemplo `{print} '¡Correcto!'` o `{print} '¡Error! la respuesta correcta era ' respuesta_correcta` + Dale al jugador información cuando introduzcan una pregunta, por ejemplo `{print}` '¡Correcto!' o `{print}` '¡Incorrecto! La respuesta correcta es ' respuesta_correcta example_code: "```\npuntuación = 0\n{repeat} 10 {times}\n números = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n número_1 = números {at} {random}\n número_2 = números {at} {random}\n respuesta_correcta = numero_1 * numero_2\n {print} '¿Cuánto es 'número_1' multiplicado por 'número_2'?'\n respuesta = {ask} 'Escriba su respuesta aquí...'\n {print} 'Tu respuesta es ' respuesta\n {if}_{is}_ \n puntuación = puntuación + 1\n{print} '¡Buen trabajo! Tu puntuación es... 'puntuación' sobre 10!'\n```\n" 10: story_text: | @@ -1009,7 +1009,7 @@ adventures: Ten en cuenta que tienes que probar tu código con mucho cuidado para el mes de febrero, porque la cantidad de días de este mes cambia en los años bisiestos. example_code: | - **¡Atención! Este código necesita ser depurado. + **¡Atención! ¡Este código necesita ser depurado!** ``` {print} 'Calendario Hedy' meses_con_31_dias = Enero, Marzo, Mayo, Julio, Septiembre, Octubre, Diciembre @@ -1027,8 +1027,7 @@ adventures: {else} días = 28 - {print} 'Aquí están todos los días de ' - mes + {print} 'Aquí están todos los días de ' mes {for} i {in} {range} 1 {to} días {print} mes i ``` @@ -1126,36 +1125,36 @@ adventures: ### Ejercicio Depura este cuento infantil al azar. ¡Buena suerte! example_code: | - **¡Atención! ¡Este código necesita ser depurado!** + **¡Atención! Este código necesita ser depurado. ``` - nombres = 'Tanya', 'Romy', 'Kayla', 'Aldrin', 'Ali' - verbos='caminar', 'saltar', 'pedalear', 'conducir', 'correr' - ubicaciones = 'en la cima de una montaña', 'en el supermercado', 'en la piscina' - escondites = 'detrás de un arbol', 'bajo una mesa', 'en una caja' - sonidos = 'a trumpet', 'a car crash', 'thunder' - causas_de_ruido = 'una televisión', 'un niño con petardos', 'un elefante mágico', 'un sueño' - - nombre_ elegido = nombres {at} {random} - verbo_elegido = verbos {at} {random} - ubicacion_elegida = 'ubicaciones {at} {random}' - sonidos_elegidos = ruidos {at} {random} - lugar_elegido = escondites {at} {random} - causas_elegidas = causas_de_ruido {at} {random} - - {print} nombre_elegido ' fue ' verbo_elegido ' ' ubicacion_elegida - {print} 'cuando de repente escucharon un sonido de ' sonidos {at} {random} - {print} nombre_elegido ' miró alrededor, pero no pudieron descubrir de donde provenía el sonido' - {print} nombre_elegido ' se escondió en ' lugar_elegido' - {print} 'Miraron alrededor, pero no pudieron ver nada allí' + names = 'Tanya', 'Romy', 'Kayla', 'Aldrin', 'Ali' + verbs='caminar', 'saltar', 'montar en bici', 'conducir', 'correr' + locations = 'en la cima de una montaña', 'en el supermercado', 'a la piscina' + escondites = «detrás de un árbol», «debajo de una mesa», «en una caja». + sonidos = «una trompeta», «un accidente de coche», «un trueno + causas_del_ruido = 'un televisor', 'un niño con petardos', 'un elefante mágico', 'un sueño' + + chosen_name = nombres {at} {random} + chosen_verb = verbos {at} {random} + chosen_location = 'lugares {at} {random}' + chosen_sounds = ruidos {at} {random} + chosen_spot = hiding_spots {random} + chosen_causes = causes_of_noise {at} {random} + + {print} chosen_name ' era ' verbo_elegido ' chosen_spot + {print} 'cuando de repente oyeron un sonido como ' sonidos {at} {random} + {print} chosen_name ' miraron a su alrededor, pero no pudieron descubrir de dónde procedía el ruido' + {print} chosen_name ' escondieron ' punto_elegido' + {print} 'Intentaron mirar alrededor, pero no pudieron ver nada desde allí' oculto = 'sí' {while} oculto = 'sí' - {print} nombre_elegido 'todavía no ven nada' - respuesta = {ask} '¿Se ha movido ' nombre_elegido ' de su escondite?' + {print} chosen_name 'seguían sin ver nada' + respuesta = {ask} «¿se mueve ' chosen_name ' de su escondite? {if} respuesta = 'sí' oculto == 'no' - {print} 'nombre_elegido se movió de ' lugar_elegido - {print} 'Y entonces vieron que sólo era ' causas_elegidas - {print} nombre_elegido 'se rió y siguieron con su día' + {print} 'chosen_name se movió de' chosen_spot + {print} 'Y entonces vieron que era sólo' chosen_cause + {print} chosen_name 'se rieron y siguieron con su día' {print} Fin ``` 16: @@ -1244,18 +1243,19 @@ adventures: levels: 1: story_text: | - ¡Bienvenido a Hedy! Aquí puedes aprender a cómo programar paso a paso. + ¡Bienvenido a Hedy! Aquí puedes aprender a cómo programar paso a paso. ¡Prueba el código por ti mismo! El botón amarillo copia el código de ejemplo a tu bloque de programación. + Después pulsa el botón verde 'Ejecutar código' debajo del campo de programación para ejecutar el código. ¿Preparado? ¡Entonces ve a la siguiente pestaña para hacer tus propios códigos! example_code: | ``` - {print} Hola Mundo! + {print} ¡Hola Mundo! ``` 2: story_text: | - ¡Enhorabuena! Has alcanzado el nivel 2. ¡Espero que ya hayas hecho algunos códigos increíbles! + ¡Enhorabuena! ¡Has alcanzado el nivel 2! ¡Espero que ya hayas hecho algunos códigos increíbles! Quizás te has dado cuenta en el primer nivel que el comando `{echo}` sólo puede guardar un bit de información cada vez. Por ejemplo en la aventura del restaurante, puedes imprimir lo que el cliente quiere comer, o que quiere de beber, pero no ambas en una misma frase. @@ -1606,7 +1606,7 @@ adventures: Haz tu propia versión del programa. Primero haz una lista de los miembros de tu familia. Luego piensa en una tarea que tenga que ser hecha, y deja que la computadora decida quien debe hacer la tarea con el comando `{at} {random}`. - **Extra** ¿No quieres lavar los platos por ti mismo? Hackea el programa quitando tu nombre de la lista con `{remove} {from}`. + **Extra** ¿No quieres lavar los platos por ti mismo? Hackea el programa quitando tu nombre de la lista con el comando `{remove}` `{from}`. 4: story_text: | Usando comillas puedes hacer más interesante tu programa. @@ -1919,11 +1919,10 @@ adventures: levels: 12: story_text: | - En este nivel aprenderás a usar **funciones**. Una función es un bloque de código que se puede utilizar fácilmente varias veces. Usar funciones nos ayuda a organizar piezas de código que podamos usar de forma repetida. - - Para crear una función, usa `{define}` que da a la función un nombre. Luego pon todas las líneas que desees en la función en un bloque con sangría bajo la línea `{define}`. + En este nivel aprenderás a usar **funciones**. Una función es un bloque de código que se puede utilizar fácilmente varias veces. Usar funciones nos ayuda a organizar piezas de código que podamos usar de forma repetida. Para crear una función, usa `{define}` que da a la función un nombre. Luego pon todas las líneas que desees en la función en un bloque con sangría bajo la línea `{define}`. Deja una línea vacía en tu código para que parezca agradable y limpio. Y ya está, ¡Gran trabajo! ¡Has creado una función! + ¡Ahora, cuando necesitemos ese bloque de código, solo usamos {call} con el nombre de la función para llamarlo! No tenemos que volver a escribir ese bloque de código. Echa un vistazo a este código de ejemplo de un juego de Twister. La función 'turno' contiene un bloque de código que elige qué miembro debe ir donde. @@ -3507,7 +3506,7 @@ adventures: levels: 7: story_text: | - ## ¡Repite! ¡Repite! ¡Repetir! + ## ¡Repetir! ¡Repetir! ¡Repetir! El nivel 7 añade el comando `{repeat}`. `{repeat}` se puede utilizar para ejecutar una línea de código varias veces. Así: ### Ejercicio @@ -5074,14 +5073,9 @@ adventures: Primero, define una función **por cada forma** que quieras usar en el brazalete. Después, añade las formas al brazalete como este: - Programa de Diseño de Brazalete example_code: | - Sugerencia: Programa para diseñar pulsera - - - Primero, define una función **para cada forma** que quieras usar en tu pulsera. Después, añade las formas a la pulsera tal que así: - + Hint Bracelet Programa de diseño ``` {define} dibujar_un_cuadrado _ @@ -5092,13 +5086,13 @@ adventures: {turn} 180 {for} i {in} {range} 1 {to} 5 - {color} gris - {forward} 100 - forma = {ask} '¿Qué tipo de forma quieres en el siguiente brazalete?' - color_elegido = {ask} '¿En qué color?' - {color} color_elegido - {if} forma = 'cuadrado' - {call} dibujar_un_cuadrado + {color} gris + {forward} 100 + forma= {ask} '¿Qué tipo de forma le gustaría a continuación en el brazalete?' + color_elegido = {ask} '¿En qué color?' + {color} color_elegido + {if} forma = 'cuadrado' + {call} dibujar_un_cuadrado ``` 13: story_text: | @@ -5124,21 +5118,22 @@ adventures: {define} dibuja_una_casa {with} color_elegido _ ``` - Hint Snow Storm + + Tormenta de la Pista de Nieve ``` - {define} draw_snowflake {with} length, color - _ + {define} dibujar_copo_nieve {with} longitud, color + _ - numbers = 10, 20, 30 - colors = _ + números= 10, 20, 30 + colores = _ {for} i {in} {range} 1 {to} 5 - random_number = _ - random_color = _ - {call} draw_snowflake {with} random_number, random_color - {color} white - {turn} random_number * 5 - {forward} 80 + número_aleatorio = _ + color_aleatorio = _ + {call} dibujar_copo_nieve {with} número_aleatorio , color_aleatorio + {color} blanco + {turn} número_aleatorio * 5 + {forward} 80 ``` 14: diff --git a/content/cheatsheets/fi.yaml b/content/cheatsheets/fi.yaml index d45d034bd76..b9c4e0868b0 100644 --- a/content/cheatsheets/fi.yaml +++ b/content/cheatsheets/fi.yaml @@ -35,7 +35,7 @@ väri {is} {ask} Mikä on lempivärisi? {print} väri on lempivärisi! - name: '{sleep}' - explanation: '`{sleep}` anna Hedyn pitää (muutama) sekunti taukoa.' + explanation: '`{sleep}`:lla voit antaa Hedyn pysähtyä pariksi sekunniksi.' demo_code: |- {print} Annas kun ajattelen sekunnin... {sleep} @@ -104,8 +104,8 @@ väri {is} {ask} 'Mikä on lempivärisi?' {if} väri {in} hienot_värit {print} 'hieno!' {else} {print} 'plääh' - name: '{pressed}' - explanation: Check whether a given key on the keyboard is `{pressed}`. - demo_code: '{if} a {is} {pressed} {print} ''You pressed A!'' {else} {print} ''You pressed another key!''' + explanation: Tarkista, onko näppäimistön tietty näppäin `{pressed}`. + demo_code: '{if} a {is} {pressed} {print} ''Painoit A!'' {else} {print} "Painoit toista näppäintä!"' 6: - name: '{print}' explanation: Tulosta tarkasti käyttäen heittomerkkejä. @@ -115,7 +115,7 @@ demo_code: |- vastaus = {ask} 'Paljonko on 10 plus 10?' {if} vastaus {is} 20 {print} 'Kyllä!' {else} {print} 'Oho' -- name: '{ask} ja {if} kilpikonnan kanssa' +- name: '`{ask}` ja `{if}` kilpikonnan kanssa' explanation: Ask the user how many angles they want. demo_code: |- angles = {ask} 'How many angles?' @@ -159,12 +159,12 @@ {turn} 90 {forward} 50 - name: '{pressed}' - explanation: Check whether a given key on the keyboard is `{pressed}`. + explanation: Tarkista, onko näppäimistön tietty näppäin `{pressed}`. demo_code: |- {if} a {is} {pressed} - {print} 'You pressed A!' + {print} 'Painoit A!' {else} - {print} 'You pressed another key!' + {print} 'Painoit toista näppäintä!' 9: - name: '{if} monelle riville' explanation: The answer of a sum of questions with `{ask}` and see if it is correct. Now we print out two lines. @@ -220,7 +220,7 @@ demo_code: |- nimi = 'Hedy robotti' {print} 'Hei ' nimi -- name: heittomerkit {if} vertailun jälkeen +- name: heittomerkit `{if}` vertailun jälkeen explanation: Teksti lainausmerkeissä komennon `{if}` jälkeen. demo_code: |- nimi = {ask} 'Kuka olet?' @@ -316,7 +316,7 @@ firstfruit = fruit[1] {print} firstfruit - name: Get a random item from a list - explanation: To get a random item from a list we use [random] so fruit[random] means, get a random fruit from the list! + explanation: Saadaksesi satunnaisen kohteen luettelosta käytämme [{random}], joten hedelmä[{random}] tarkoittaa, että ota satunnainen hedelmä luettelosta! demo_code: |- fruit = ['banana', 'apple', 'cherry'] random_fruit = fruit[{random}] diff --git a/content/client-messages/ca.yaml b/content/client-messages/ca.yaml index e33a10eeefa..977de95e3ef 100644 --- a/content/client-messages/ca.yaml +++ b/content/client-messages/ca.yaml @@ -1,4 +1,4 @@ -CheckInternet: Mireu si la vostra connexió a Internet funciona correctament. +CheckInternet: Mireu si la teva connexió a Internet funciona correctament. Connection_error: No hem pogut arribar al servidor. Empty_output: Aquest codi funciona, però no imprimeix res. Afegiu una comanda d'impressió al vostre codi o utilitzeu la tortuga per obtenir la sortida. Errors_found: Has comès un error! No et preocupis, encara podem executar el programa diff --git a/content/pages/es.yaml b/content/pages/es.yaml index e1dcd7c926b..937f7eb850c 100644 --- a/content/pages/es.yaml +++ b/content/pages/es.yaml @@ -302,11 +302,11 @@ teacher-guide: text: |- Cada nivel contiene diferentes aventuras que puedes encontrar en las pestañas rosas. La primera pestaña rosa explica los nuevos comandos de este nivel. Las siguientes pestañas son aventuras que los alumnos pueden probar y hacer suyas. - Las aventuras están ordenadas de la más fácil a la más difícil, por lo que recomendamos empezar por la izquierda e ir avanzando hacia la derecha. - La última pestaña, "qué sigue", ofrece un pequeño adelanto de lo que aprenderás en el siguiente nivel. Por supuesto, puedes seleccionar las aventuras que quieres que tus alumnos hagan en cada nivel. + Las aventuras están ordenadas de la más fácil a la más difícil, así que te recomendamos que empieces por la izquierda y sigas hacia la derecha. + La última pestaña, «qué sigue», ofrece un pequeño adelanto de lo que aprenderás en el siguiente nivel. Por supuesto, puedes seleccionar las aventuras que quieres que tus alumnos hagan en cada nivel. No siempre tienen que hacer todas las aventuras. Cada aventura contiene un código de ejemplo, que los alumnos pueden probar con el botón verde. El código de ejemplo se copia en el campo de trabajo, donde los alumnos pueden probar el código y ajustarlo para hacerlo suyo. - Estimule a sus alumnos para que conviertan los códigos de ejemplo en sus propios proyectos, añadiendo sus propias ideas y creando su propia variación de la aventura. + Estimule a sus alumnos para que conviertan el código de ejemplo en sus propios proyectos, añadiendo sus propias ideas y creando su propia variación de la aventura. - title: Concursos y rompecabezas text: |- Para evaluar si tus alumnos han aprendido toda la nueva información en el nivel, puedes permitirles que hagan un cuestionario. @@ -419,9 +419,7 @@ teacher-guide: - title: Errores frecuentes key: errores_comunes intro: |- - Tu puedes aprender de tus errores, especialmente programando! - Errar es inevitable y una gran oportunidad para aprender, pero para los profesores puede ser difícil encontrar la solución correcta a un error! - Especialmente mientras el código crece junto a al progreso de los niveles. Es por esto que hemos hecho una lista de los errores frecuentes en cada nivel y sus soluciones. + De los errores se aprende, sobre todo en programación. Cometer errores es inevitable y una gran oportunidad para aprender, pero para los profesores puede ser un reto encontrar la solución correcta a un error. Sobre todo porque los programas son cada vez más largos a medida que los alumnos avanzan de nivel. Por eso hemos elaborado una lista con los errores más frecuentes en cada nivel y sus soluciones. levels: - level: '1' sections: @@ -465,7 +463,7 @@ teacher-guide: error_code: |- {forward} 300 {turn} 90 - solution_text: En el ejemplo, los alumnos tienden a pensar que el comando girar no funciona. Aunque sí funciona, no se puede ver que sucede fuera de la pantalla. Utiliza números más pequeños para evitar que esto ocurra. + solution_text: En el ejemplo, los estudiantes tienden a pensar que el comando de giro falló, a pesar de que hizo lo que se suponía que debía hacer. Lo que ocurrió es que la tortuga sobrepasó los límites de la pantalla. Utiliza números más pequeños para evitar que esto ocurra. solution_code: |- {forward} 100 {turn} 90 @@ -645,7 +643,7 @@ teacher-guide: estado_animo {is} {ask} '¿Cómo estás?' - title: Los alumnos utilizan las comillas equivocadas example: - error_text: Es importante empezar tu clase comprobando si los alumnos saben como usar las comillas adecuadamente. Sino podrían usar las "comillas dobles" o las `torcidas`. + error_text: Es importante empezar la clase comprobando si los alumnos saben escribir correctamente las comillas. En Hedy, los alumnos pueden utilizar comillas simples ('') y dobles («»). Por otro lado, los puntos suspensivos no se consideran comillas válidas (``). error_code: |- {print} `Bienvenido al restaurante` comida {is} {ask} "¿Qué te gustaría pedir?" @@ -687,7 +685,7 @@ teacher-guide: {else} {print} '¡no mola tanto!' - title: Los estudiantes aún olvidan las comillas en ambos lados example: - error_text: Los códigos que usan el comando `if` pueden extenderse mucho y los alumnos tienden a olvidar usar comillas. + error_text: El uso del comando `if` puede hacer que las líneas de código sean muy largas y los alumnos tienden a olvidar el uso de las comillas. error_code: |- {if} nombre {is} Hedy {print} divertido {else} {print} '¡meh! @@ -705,16 +703,16 @@ teacher-guide: solution_code: |- {if} nombre {is} Hedy {print} 'divertido' {else} {print} '¡meh! - - title: Los estudiantes usan nombres largos para las variables que contienen dos palabras + - title: Los alumnos utilizan nombres de variables largos que contienen dos o más palabras example: - error_text: Una variable debería llamarse con una palabra. Puedes usar un guion bajo para conectar dos palabras. Eso cuenta como una. + error_text: Las variables en Hedy no pueden contener espacios, por lo que, con el fin de utilizar juntos varias palabras, los estudiantes necesitan para conectarlos utilizando guiones bajos (_) error_code: puerta elegida es preguntar ¿Qué puerta eliges? solution_text: Añade un guion bajo. solution_code: puerta_elegida {is} {ask} '¿qué puerta eliges?' - title: Los alumnos quieren varias respuestas correctas example: - error_text: Por ejemplo este alumno Hedy le dice a todos sus amigos que son divertidos, pero a otros compañeros les diría que no lo son. - error_code: "{if} nombre {is} Jesse, David, Souf imprimir Eres divertido {else} {print} 'No eres divertido'" + error_text: Por ejemplo, este alumno quiere que Hedy diga a todos sus amigos que son graciosos, mientras que a otros compañeros debería decirles que no lo son. + error_code: "{if} nombre {is} Jesse, David, Souf {print} 'Eres divertido' {else} {print} 'No eres divertido'" solution_text: |- Puedes usar el comando `{in}` para eso. Se explica en un nivel superior, pero ya funciona en el nivel 5. Otra solución es usar varios comandos `{if}` y no comando `{else}`. La desventaja es que no le dirá a los otros compañeros que no son divertidos. @@ -793,7 +791,7 @@ teacher-guide: {print} bebida - title: Los alumnos hacen programas que tardan demasiado en ejecutar example: - error_text: En este nivel es muy fácil hacer códigos extensos. Los alumnos no tienen permitido hacer programas que tarden mucho en cargar (para proteger nuestros servidores). + error_text: En este nivel es muy fácil hacer programas que tarden mucho en completarse. Si el programa tarda demasiado, se detendrá, esto con la intención de evitar forzar la máquina al alumno. error_code: "{repeat} 100 {times} {print} '¿Cuántas veces puedo repetir esto?'" solution_text: Asegúrate que el código no tarda mucho en ejecutarse solution_code: "{repeat} 20 {times} {print} 'Esto es suficiente'" @@ -801,7 +799,7 @@ teacher-guide: sections: - title: Los alumnos usan la sangría mal example: - error_text: La sangría es un nuevo concepto de este nivel, es complicada de usar para algunos alumnos. Asegúrate que practican algunos códigos sencillos antes de hacer un programa entero con ella. + error_text: La sangría es un concepto nuevo en este nivel, y para algunos alumnos puede resultar difícil de aprender. Asegúrate de que practiquen algunos ejemplos sencillos antes de hacer un programa completo con ella. error_code: |- {repeat} 3 {times} {print} 'hola' @@ -842,7 +840,7 @@ teacher-guide: {print} '¡Hip Hip Hurra!' - title: Los alumnos hacen programas que tardan demasiado en ejecutar example: - error_text: En este nivel es muy fácil hacer códigos extensos. Los alumnos no tienen permitido hacer programas que tarden mucho en cargar (para proteger nuestros servidores). + error_text: En este nivel es muy fácil hacer programas que tarden mucho en completarse. Si el programa tarda demasiado, se detendrá, esto con la intención de evitar forzar la máquina al alumno. error_code: |- {repeat} 100 {times} {print} '¿Cuántas veces puedo repetir esto?' @@ -853,9 +851,9 @@ teacher-guide: - title: Los alumnos usan el comando `{if}` para comprobar si el valor de la variable es el mismo que el nombre de la variable example: error_text: |- - Hemos visto este error por algunos de nuestros alumnos. Hacen una contraseña para su ordenador, pero llaman a la contraseña 'contraseña'. - En la línea 2 se pide al ordenador comprobar si la variable contraseña es la misma que la variable contraseña, por lo que sí. Lo que significa que la respuesta siempre es sí. - Así que con este código la respuesta siempre será 'Puedes entrar' sin importar lo que el jugador ponga. + Hemos observado un error común entre nuestros alumnos: intentan crear un programa que compruebe si hay una contraseña, pero hacen que la contraseña sea 'password'. + En la línea 2 se pide al ordenador que compruebe si la variable contraseña es la misma que la variable contraseña, por lo tanto sí. Lo que significa que la respuesta es siempre sí. + Así que con este código la respuesta siempre será 'Puedes entrar' sin importar lo que el jugador rellene. error_code: |- contraseña {is} {ask} '?Cuál es la contraseña?' {if} contraseña {is} contraseña diff --git a/content/parsons/ca.yaml b/content/parsons/ca.yaml index fdb749847ac..cf205fd844c 100644 --- a/content/parsons/ca.yaml +++ b/content/parsons/ca.yaml @@ -139,11 +139,11 @@ levels: {repeat} 3 {times} {print} 'Daddy shark tututututudu' {print} 'Daddy shark' 2: - story: Crea la cançó "Les rodes de l'autobús fan voltes i voltes" + story: Crea la cançó "Les rodes de l'autobús van girant" code: |- - {print} "les rodes de l'autobús van" - {repeat} 3 {times} {print} "volt i rodó" - {print} "les rodes de l'autobús fan voltes" + {print} "les rodes de l'autobús girant" + {repeat} 3 {times} {print} "van rodant" + {print} "les rodes de l'autobús girant, van rodant, van rodant" {print} "per tota la ciutat" 8: 1: @@ -177,8 +177,8 @@ levels: 10: 1: story: |- - Ajuda aquesta família creant un calendari per saber qui està cuinant i què li toca a fer a cadascú aquesta setmana. Les comandes d'eliminació s'asseguren que ningú ha de cuinar dues vegades i per garantir un sopar diferent cada dia. - **Atenció!** l'ordre de les variables hauria de ser primer dies, després persones i finalment opcions_sopar. Això també convé a les línies amb ordres d'eliminació. + Ajuda aquesta família creant un calendari per saber qui està cuinant i què li toca a fer a cadascú aquesta setmana. Amb la comanda `{remove}` assegurem que ningú ha de cuinar dues vegades i per garantir un sopar diferent cada dia. + **Atenció!** L'ordre de les variables hauria de ser primer dies, després persones i finalment opcions_sopar. Això també implica a les línies amb la comanda `{remove}`. code: |- dies = dilluns, dimarts, dimecres, dijous, divendres persones = la mare, el pare, en Martí, l'Anna, la Júlia @@ -215,7 +215,7 @@ levels: 2: story: |- Crea un programa que ens expliqui els resultats finals de la fira de la ciència. Primer defineix la variable concursants, després la variable lloc. - **Pista** La línia 5 hauria de ser la comanda sleep (dorm), i hauríeu d'acabar dient felicitats. + **Pista** La línia 5 hauria de tenir la comanda sleep (dorm), i hauries d'acabar amb un text de felicitació. code: |- {print} 'And now we will reveal the results of the science fair' contestants = Vivienne, Paul, Trixy, Bianca, Katya @@ -228,7 +228,7 @@ levels: 12: 1: story: |- - Sing the song 'What shall we do with the drunken sailor'. In case you don't know it, the song goed like this: + Canta la cançó 'What shall we do with the drunken sailor' (Què farem amb el mariner borratxo). Si no la saps va així: What will we do with the drunken sailor What will we do with the drunken sailor @@ -239,16 +239,16 @@ levels: Way hey and up she rises Early in the morning code: |- - verses = 'What will we do with the drunken sailor', 'Way hey and up she rises' - {for} verse {in} verses + versos = 'What will we do with the drunken sailor', 'Way hey and up she rises' + {for} vers {in} versos {for} count {in} {range} 1 {to} 3 - {print} verse + {print} vers {print} 'Early in the morning' 2: - story: Play a game of Twister with us! First define the variable people, then limbs, then colors. + story: Juga al Twister amb nosaltres! Primer defineix la variable persones, després les extremitats i en acabat els colors. code: |- - people = 'Jess', 'Nick', 'Winston' - limbs = 'left hand', 'left foot', 'right hand', 'right foot' - colors = 'red', 'blue', 'green', 'yellow' - {for} person {in} people - {print} person ', put your ' limbs {at} {random} ' on ' colors {at} {random} + gent = "Jordi", "Clark", "Omar" + extremitats = "mà esquerre", "peu esquerre", "mà dret", "peu dret" + colors = "red", "blue", "green", "yellow" + {for} person {in} gent + {print} person ", posa el/la " extremitats {at} {random} " a " colors {at} {random} diff --git a/content/quizzes/ca.yaml b/content/quizzes/ca.yaml index 231aac44b92..4a4e1bc3d6e 100644 --- a/content/quizzes/ca.yaml +++ b/content/quizzes/ca.yaml @@ -1393,32 +1393,32 @@ levels: 6: question_text: What will be the output from this code? code: |- - {print} 'The wheels on the bus go' - {repeat} 3 {times} {print} ' round and round' + {print} 'Les rodes de l'autobús van girant' + {repeat} 3 {times} {print} ' van rodant' mp_choice_options: - option: |- - the wheels on the bus go - round and round + Les rodes de l'autobús van girant + van rodant feedback: Only the second line is repeated 3 times - option: |- - the wheels on the bus go - the wheels on the bus go - the wheels on the bus go - round and round + les rodes de l'autobus van girant + les rodes de l'autobus van girant + les rodes de l'autobus van girant + van rodant feedback: Only the second line is repeated 3 times - option: |- - the wheels on the bus go - round and round - the wheels on the bus go - round and round - the wheels on the bus go - round and round + les rodes de l'autobús van girant + van rodant + les rodes de l'autobús van girant + van rodan + les rodes de l'autobús van girant + van rodan feedback: Only the second line is repeated 3 times - option: |- - the wheels on the bus go - round and round - round and round - round and round + les rodes de l'autobús van girant + van rodant + van rodant + van rodant feedback: All though the town! Perfect! hint: Only 'round and round' is repeated 3 times. correct_answer: D @@ -1569,10 +1569,10 @@ levels: feedback: This is not in the right order. - option: |- ``` - {repeat} 4 {times} 'if youre happy and you know it' - {repeat} 2 times 'clap your hands' - {print} 'and you really want to show it' - {print} 'clap your hands' + {repeat} 4 {times} 'si ets feliç i ho saps' + {repeat} 2 times 'pica de mans' + {print} 'i ho vols fer saber a tothom' + {print} 'pica de mans' ``` feedback: This is not in the right order. hint: Mind the order of the sentences. @@ -2892,14 +2892,16 @@ levels: 10: question_text: Which line of code should be filled in at the ??? to complete the song ? code: |- - actions = 'clap your hands', 'stomp your feet', 'shout Hurray!' - ??? - for i in range 0 to 1 - print 'if youre happy and you know it' - print action - print 'if youre happy and you know it and you really want to show it' - print 'if youre happy and you know it' - print action + ``` + accions = "pica de mans", "pica de peus", "crida Hurra!" + _ + {for} i {in} {range} 0 {to} 1 + {print} "si ets feliç i ho saps" + {print} accio + {print} "si ets feliç i ho saps, i ho vols fer saber a tothom" + {print} "si ets feliç i ho saps" + {print} accio + ``` mp_choice_options: - option: for i in range 1 to 3 feedback: This is a hard one! All the actions on the list must be in the song. diff --git a/static/js/appbundle.js b/static/js/appbundle.js index fd0151ab085..d6ffbfed1e5 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -60806,7 +60806,7 @@ ${o3}` : i3; "unsaved_class_changes": "There are unsaved changes, are you sure you want to leave this page?" }, "ca": { - "CheckInternet": "Mireu si la vostra connexi\xF3 a Internet funciona correctament.", + "CheckInternet": "Mireu si la teva connexi\xF3 a Internet funciona correctament.", "Connection_error": "No hem pogut arribar al servidor.", "Empty_output": "Aquest codi funciona, per\xF2 no imprimeix res. Afegiu una comanda d'impressi\xF3 al vostre codi o utilitzeu la tortuga per obtenir la sortida.", "Errors_found": "Has com\xE8s un error! No et preocupis, encara podem executar el programa", @@ -61139,28 +61139,28 @@ ${o3}` : i3; "Transpile_success": "\xA1Buen trabajo!\n\xA1Increible!\n\xA1Bien hecho!\n\xA1Excelente!\n\xA1Lo hiciste genial!", "Transpile_warning": "\xA1Cuidado!", "Unsaved_Changes": "Tu programa no se ha guardado. \xBFDeseas irte sin guardarlo?", - "adventures_completed": "Adventures completed: {number_of_adventures}", + "adventures_completed": "Aventuras completadas: {number_of_adventures}", "adventures_restored": "Se han restaurado las aventuras por defecto.", - "adventures_tried": "Adventures tried", + "adventures_tried": "Aventuras intentadas", "copy_link_to_share": "Copiar enlace para compartir", "customization_deleted": "Personalizaci\xF3n eliminada.", "dice": "\u{1F3B2}", "directly_available": "Directamente abierto", "disabled": "Deshabilitado", - "errors": "Errors", + "errors": "Errores", "fortune": "\u{1F52E}, \u2728", - "graph_title": "Errors per adventure completed on level {level}", + "graph_title": "Errores por aventura completada en el nivel {level}", "haunted": "\u{1F987}, \u{1F47B}, \u{1F383}", "level_title": "Nivel", "multiple_keywords_warning": "Est\xE1 intentando utilizar la palabra clave {orig_keyword}, pero esta palabra clave puede tener varios significados. Por favor, elija la que est\xE1 intentando utilizar de esta lista y c\xF3piela y p\xE9guela en su c\xF3digo, llaves incluidas: {keyword_list}", - "number_of_errors": "Number of errors: {number_of_errors}", - "one_level_error": "You need to select at least one level.", + "number_of_errors": "N\xFAmero de errores: {number_of_errors}", + "one_level_error": "Debes seleccionar al menos un nivel.", "restaurant": "\u{1F363}, \u{1F355}, \u{1F354}", "rock": "\u2702\uFE0F, \u{1F4DC}, \u{1F5FB}", "select_all": "Seleccionar todo", "selected": "Seleccionado", "songs": "\u{1F3B5},\u{1F3B6}", - "successful_runs": "Successful runs: {successful_runs}", + "successful_runs": "Ejecuciones exitosas: {successful_runs}", "teacher_welcome": "\xA1Bienvenido/a a Hedy! Tu cuenta es de tipo profesor, por lo que puedes crear clases e invitar estudiantes.", "turtle": "\u{1F422}", "unsaved_class_changes": "Hay cambios sin guardar, \xBFest\xE1s seguro de que quieres abandonar esta p\xE1gina?" diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index 80639035e6e..9ce478da3bc 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", "comm.ts", "auth.ts", "local-save-warning.ts", "user-activity.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(/