diff --git a/content/adventures/ru.yaml b/content/adventures/ru.yaml index ea50156c26a..743d33ba088 100644 --- a/content/adventures/ru.yaml +++ b/content/adventures/ru.yaml @@ -31,12 +31,12 @@ adventures: Затем вы можете поместить это имя в любое место в предложении. example_code: |- ``` - name {is} {ask} What is the name of the main character? - {print} name is now going to run in the woods - {print} name is a bit scared - {print} Suddenly she hears a crazy noise... + имя {is} {ask} Какое имя главного героя? + {print} имя собирается погулять по лесу + {print} имя немного напуган(а) + {print} Повсюду слышно страшный шум... {sleep} - {print} name is afraid this is a haunted forest + {print} имя боится, что это лес с привидениями ``` story_text_2: | ### Упражение @@ -183,13 +183,13 @@ adventures: ### Задание Посмотрите на рассказ если вы его не видели раньше и убедитесь что ваш рассказ напечатан так же как и в книге. - example_code: "```\nanimals = _ , _ , _ \n{print} 'Brown bear, Brown bear'\n{print} 'What do you see?'\n```\n" + example_code: "```\nживотные = _ , _ , _ \n{print} 'Бурый мишка, Бурый мишка'\n{print} 'Что ты видишь?'\n```\n" 12: story_text: На этом уровне вы можете использовать кавычки для сохранения нескольких слов в переменной. example_code: | ``` - name = 'The Queen of England' - {print} name ' was eating a piece of cake, when suddenly...' + имя = 'Королева Англии' + {print} имя ' ела кусочек торта, когда вдруг...' ``` 13: story_text: | @@ -238,17 +238,17 @@ adventures: {print}('Добро пожаловать в историю!') ``` story_text_2: | - ### Exercise 2 - We have already prepared an `{input}` for you. First, use the `name` variable in your story. - Then add a second `{ask}` and use that variable as well. - Tip: Remember the commas in a `{print}` between text and variables! + ### Упражнение 2 + Мы уже подготовили `{input}` для тебя. Для начала, используй `name` переменную в своей истории. + Затем добавь еще один `{ask}` и используй эту переменную снова. + Совет: Не забывй про запятые в `{print}` между текстом и переменными! example_code_2: | ``` - naam = {input}("What's your name?") - {print}('Welcome to this story!') + имя = {input}("Как вас зовут?") + {print}('Добро пожаловать в эту историю!') ``` add_remove_command: - name: '{add} {to} & {remove} {from}' + name: '{add} {to_list} & {remove} {from}' default_save_name: add_remove_command description: introducing add to and remove from levels: diff --git a/content/client-messages/bg.yaml b/content/client-messages/bg.yaml index 585f52e4cd6..697c2aa1e73 100644 --- a/content/client-messages/bg.yaml +++ b/content/client-messages/bg.yaml @@ -1,7 +1,7 @@ CheckInternet: Провери дали имаш връзка с интернет. Connection_error: Изгубихме връзка със сървъра. Empty_output: Кодът работи, но няма нищо за принтиране. -Errors_found: You made a mistake! Don't worry, Hedy is trying to find the mistakes +Errors_found: Допусна грешка! Не се тревожи, ние успяхме да изпълним програмата Execute_error: Нещо се обърка при изпълнението на програмата. Other_error: Ой! Май имаме някаква грешка в кода. Program_repair: This could be the correct code, can you fix it? diff --git a/content/keywords/ru.yaml b/content/keywords/ru.yaml index 0adad017c52..6d80c20ad12 100644 --- a/content/keywords/ru.yaml +++ b/content/keywords/ru.yaml @@ -5,7 +5,7 @@ at: в black: чёрный blue: синий brown: коричневый -call: call +call: вызвать clear: очистить color: цвет comma: ',' @@ -20,12 +20,12 @@ d7: '7' d8: '8' d9: '9' def: def -define: define +define: определить echo: повторить elif: иначе, если else: иначе -'false': 'false' -'False': 'False' +'false': 'ложь' +'False': 'Ложь' for: для forward: вперёд from: из @@ -47,21 +47,21 @@ print: печатать purple: пурпурный quote: '''' random: случайном -range: промежуток +range: диапазон red: красный remove: удалить repeat: повторить -return: return +return: вернуть right: направо sleep: заснуть step: шаг times: раз to: до to_list: в -'true': 'true' -'True': 'True' +'true': 'истина' +'True': 'Истина' turn: повернуть while: пока white: белый -with: with +with: с yellow: жёлтый diff --git a/content/pages/ru.yaml b/content/pages/ru.yaml index 5c98eca5afd..58f4151fda9 100644 --- a/content/pages/ru.yaml +++ b/content/pages/ru.yaml @@ -1,4 +1,4 @@ -title: Hedy documentation +title: Документация Hedy home-sections: - title: Текстовое программирование стало проще! text: |- @@ -12,35 +12,33 @@ home-sections: 2. Hedy является постепенным, поэтому вы можете изучать одну концепцию и ее синтаксис за раз. 3. Hedy создан для работы в классе, что позволяет учителям полностью адаптировать опыт своих учеников. - title: Многоязычное программирование - text: В то время как почти все текстовые языки программирования имеют ключевые слова на английском языке, такие как `for` или `repeat`, Hedy можно использовать на любом языке! В настоящее время мы поддерживаем 39 различных языков, включая испанский, арабский, упрощенный китайский и хинди. Если ваш язык недоступен, вы всегда можете начать новый перевод. + text: В то время как почти все текстовые языки программирования имеют ключевые слова на английском языке, такие как `for` или `repeat`, Hedy можно использовать на любом языке! В настоящее время мы поддерживаем 47 различных языков, включая голландский, испанский, арабский, турецкий, упрощенный китайский и хинди. Если ваш язык недоступен, вы всегда можете начать новый перевод. - title: Пошаговое обучение text: Изучение языка программирования может оказаться непосильной задачей, поскольку учащимся приходится одновременно изучать концепции (например, if-else или циклы) и синтаксис (например, кавычки или круглые скобки). В Hedy понятия сначала вводятся с небольшим количеством синтаксиса, а затем совершенствуются. Научно доказанный способ обучения! -- title: Создан для классной комнаты +- title: Создан для работы в классе text: |- Hedy предназначен для детей в возрасте от 10 лет и старше и разработан для использования в классе. Учителя могут использовать наши бесплатные встроенные планы уроков, а также создавать собственные уроки и загружать их в пользовательский интерфейс Hedy. - title: Программирование в контексте text: Hedy демонстрирует программирование в самом широком смысле и может быть использован различными увлекательными способами. Hedy позволяет создавать цифровые и интерактивные истории, красочные рисунки, которые можно не только показывать на экране, но и рисовать пером или вышивать на рубашке, а также использовать для создания игр или приложений с кнопками и действиями на клавиатуре. -- title: Понадобится ли мне опыт программирования? +- title: Бесплатен ли Hedy? text: |- Да! Hedy имеет "открытый исходный код", что означает, что каждый может помочь нам сделать Hedy лучше. Вы можете найти наш код на Github. Если вам нравится Hedy и вы хотите внести свой вклад, мы принимаем (и очень благодарны за это) пожертвования! -- title: Бесплатен ли Хэди? +- title: Нужно ли что-то устанавливать? text: |- - Да! Это так благодаря Лейденскому университету в Нидерландах. Более того, Хэди — язык с открытым исходным кодом. Это значит, что любой, кто умеет программировать, может помочь нам в его разработке. - Исходный код Хэди доступен на [GitHub](https://github.com/hedyorg/hedy). - Если вам нравится Хэди и вы готовы помочь, мы будем очень благодарны [пожертвованиям](https://github.com/sponsors/hedyorg). -- title: Нужно ли мне что-то устанавливать? - text: Нет. Хэди работает в браузере — в той же программе, в которой вы сейчас видите эту страницу. Вероятно, это Chrome, Edge или Firefox. Хэди также работает на телефонах и планшетах. + Нет. Hedy работает в браузере — в той же программе, в которой вы сейчас видите эту страницу. Вероятно, это Chrome, Edge или Firefox. Hedy также работает на телефонах и планшетах. +- title: Обязательно ли уметь программировать чтобы учить с помощью Hedy? + text: "Нет, это не обязательно. Все концепты объясняются через слайды и интерфейс для учеников.\nЕсли вы создадите бесплатный учительский аккаунт, вы также получите доступ к руководству по преподаванию, которое ещё содержит\nинформацию о часто допускаемых ошибках." join-sections: -- title: Поддержка Хеди - text: "# There are three ways in which you can support Hedy!" -- title: Improving the language +- title: Поддержка Hedy + text: "# Есть три способа поддержать Hedy!" +- title: Улучшение языка text: |- The gradual and multi-lingual nature of Hedy create a lot of interesting technical challenges. Find those issues on [Github](https://github.com/hedyorg/hedy/issues?q=is%3Aopen+is%3Aissue+label%3Alanguage). -- title: Translating Hedy +- title: Перевод Hedy text: |- Не программист? Нет проблем! Еще один способ поддержать Hedy - это перевод ключевых слов, сообщений об ошибках, приключений и прочего контента. Это текущее состояние, помогите нам завершить работу над языком или добавить новый! @@ -63,15 +61,31 @@ learn-more-sections: - title: Hedy в новостях text: |- - Самый простой способ — помочь нам [с переводом Хэди](https://github.com/hedyorg/hedy/wiki/Hedy-Translation-Tutorial) - - Вот текущий статус перевода. Помогите нам закончить перевод на русский или другой язык, или добавьте новый язык, которого нет в списке. - - Translation status + Некоторые сайты и новостные журналы написали о Hedy с момента релиза в начал 2020 года. Вот список: + * [Java Magazine 04.2023](images/Hedy_Javamagazine2023.pdf) + * [Tech Optimism - A Solution to the IT Shortage (Dutch), August 2022](https://pom.show/2022/08/12/een-oplossing-voor-het-it-tekort/) + * [Codeweek Podcast, July 2022](https://codeweek.eu/podcast/26) + * [Heise.de (German), Januari 2022](https://www.heise.de/news/Hedy-die-mitwachsende-Programmiersprache-6336264.html) + * [Strumenta, November 2021](https://tomassetti.me/teaching-programming-with-hedy/) + * [Vives (Dutch), CodeWeek Special October 2021](images/Vives-174-Codeweek.pdf) + * [CodeWeek.eu - Haunted House Challenge, September 2021](https://codeweek.eu/2021/challenges/haunted-house) + * [Opensource.com, April 2021](https://opensource.com/article/21/4/hedy-teach-code) + * [IO Magazine, April 2021](https://ict-research.nl/wordpress/wp-content/uploads/2021/04/IO-magazine-NR1-2021_web.pdf) + * [Ingeniería De Software (Spanish), February 2021](https://ingenieriadesoftware.es/hedy-mejor-lenguaje-ensenar-programacion-ninos/) + * [Hello World Magazine, February 2021](images/Hello_World_15_Hedy.pdf) + * [Discoro, January 2021](https://discoro.wordpress.com/2021/01/09/hedy-gradually-learning-a-programming-language/) + * [Felienne wins the Dutch award for ICT research for Hedy, January 2021](https://www.nwo.nl/en/news/felienne-hermans-receives-dutch-prize-ict-research-2021) + * [SlashDot, August 2020](https://news.slashdot.org/story/20/08/17/024248/scientist-proposes-a-new-programming-language-for-teaching-coding-and-python) + * [GenBeta (Spanish), August 2020](https://www.genbeta.com/desarrollo/nuevo-lenguaje-para-ensenar-programacion-a-ninos-como-se-ensena-a-leer-escribir-forma-gradual-niveles) + * [Developpez (French), August 2020](https://programmation.developpez.com/actu/308095/Une-scientifique-propose-un-nouveau-langage-de-programmation-pour-enseigner-aux-enfants-le-codage-informatique-au-travers-d-une-approche-graduelle-implementee-en-Python-sur-13-paliers/) + * [Vives (Dutch), October 2020](images/artikel_vives.pdf) "Met Hedy stap voor stap leren programmeren" + * [Leiden University, April 2020](https://www.universiteitleiden.nl/en/news/2020/03/looking-to-distract-the-kids-while-you-work-from-home-get-them-programming) + * [Mare (Dutch), April 2020](https://www.mareonline.nl/cultuur/computercode-voor-de-kids/) + * [AG Connect (Dutch), April 2020](https://www.agconnect.nl/artikel/stapsgewijs-python-leren-programmeren-met-nieuwe-taal-hedy) start-sections: -- title: Getting started with Hedy +- title: Начать с Hedy text: "*Something about teachers accounts, slides etc*" -- title: What other teachers say +- title: Учителя о Hedy text: |- A while ago we ran a few short Hedy teachers surveys. The questions span between suggestions of improvement and Hedy’s best features. @@ -112,59 +126,59 @@ start-sections: teacher-guide: -- title: Introduction - key: intro +- title: Введение + key: интро subsections: - - title: What's Hedy? + - title: Что такое Hedy? text: |- - Hedy is a textual programming language, specifically developed for (pre-)teens (10 to 15 years old). - In contrast to programming languages for kids, like Scratch, Hedy doesn't use code blocks but textual code. - So with Hedy you'll learn how to type code like the real programmers do, but in small steps with playful exercises. - This way Hedy can function as a stepping stone to real programming languages like Python in an accessible and mostly fun way! - If you want to know more, you can watch this video about the development of Hedy as a programming language. - - title: Target audience + Hedy — это текстовый язык программирования, специально разработанный для детей и подростков. (10 to 15 years old). + В отличие от языков программирования для детей, таких как Scratch, Hedy использует не блоки кода, а текстовый код. + С Hedy вы научитесь писать код как настоящие программисты, но маленькими шагами с игровыми упражнениями. + Таким образом, Hedy может служить трамплином к настоящим языкам программирования, таким как Python, в доступной и в основном увлекательной форме! + Если вы хотите узнать больше, вы можете посмотреть это видео о развитии Hedy как языка программирования. + - title: Целевая аудитория text: |- - Hedy is developed with middle school and junior high school students in mind (ages 10 - 15). - It's important for the students to be able to read well. We recommend not to start with Hedy before the students have achieved at least a 3rd grade reading level. - Students (and teachers!) don't need any programming experience before starting with Hedy. - - title: How does Hedy work? + Hedy разработана для учащихся средних и младших классов (10 - 15 лет). + Важно, чтобы ученики умели хорошо читать. Мы не рекомендуем начинать работу с Hedy, пока ученики не достигнут уровня чтения хотя бы 3-го класса. + Ученикам (и учителям!) не нужен опыт программирования перед началом работы с Hedy. + - title: Как работает Hedy? text: |- - Hedy is divided into levels, in which new commands are taught. Each level contains a variety of adventures to practice the newly learned commands. - As a teacher, you get to decide which adventures are available for your students. Will they be making a restaurant, a calculator or a haunted house this level? Within each level, the adventures are arranged from easiest to hardest. - So your students keep getting challenged. The adventures can be done by the students individually, or you can use them in a classical instruction. + Хеди разделена на уровни, в которых изучаются новые команды. Каждый уровень содержит множество приключений, в которых можно отработать только что выученные команды. + Как учитель, вы сами решаете, какие приключения будут доступны вашим ученикам. Будут ли они на этом уровне делать ресторан, калькулятор или дом с привидениями? Внутри каждого уровня приключения расположены от самого простого к самому сложному. + Таким образом, ваши ученики постоянно сталкиваются с трудностями. Приключения могут выполняться учениками индивидуально, или вы можете использовать их в классическом обучении. - The adventures also include a code example, to make sure the less digitally informed teachers are able to use Hedy too! - Of course Hedy also caters to the creative teachers that love to make their own lessonplans and adventures! + Приключения также включают в себя пример кода, чтобы менее осведомленные в цифровых технологиях учителя тоже могли использовать Hedy! + Конечно же, Хеди также предназначена для творческих учителей, которые любят создавать свои собственные планы уроков и приключений! - After programming all the adventures of a certain level, your students can test their knowledge in the quiz. - You can track your students' work and their progress on the class page. - - title: Devices + После программирования всех приключений определенного уровня ваши ученики могут проверить свои знания в викторине. + Вы можете отслеживать работу учеников и их прогресс на странице класса. + - title: Устройства text: |- - Hedy работает через Интернет, что означает, что он работает на любом устройстве с браузером (Google Chrome, Firefox, Edge и т.д.), поэтому ноутбуки, Chromebook, планшеты и даже смартфоны подходят для использования Hedy. + Hedy работает через Интернет, что означает, что он работает на любом устройстве с браузером (Google Chrome, Firefox, Edge и т.д.), поэтому ноутбуки, хромбуки, планшеты и даже смартфоны подходят для использования Hedy. Перед работой с Hedy не нужно ничего скачивать, просто зайдите на сайт, и всё! - - title: The Hedy Community + - title: Сообщество Hedy text: |- - Приглашаем всех учителей, программистов и других поклонников Хеди присоединиться к нашему серверу Discord. Это идеальное место для общения о Hedy: у нас есть каналы, где вы можете показать свои классные проекты и уроки, каналы для сообщения об ошибках и каналы для общения с другими учителями и командой Hedy. + Приглашаем всех учителей, программистов и других поклонников Hedy присоединиться к нашему Discord серверу. Это идеальное место для общения о Hedy: у нас есть каналы, где вы можете показать свои классные проекты и уроки, каналы для сообщения об ошибках и каналы для общения с другими учителями и командой Hedy. Здесь вы можете найти видео о том, как присоединиться к сообществу Discord. - - title: Hedy and the GDPR + - title: Hedy и GDPR text: |- - Organizations in the EU have to comply with the GDPR (General Data Protection Regulation) when processing personal data. - Because this is a complex issue for many schools, you can use all Hedy programming functionalities without sharing personal data. - The easiest way to do this is to use Hedy without creating accounts for the teacher and students. Without accounts, all functionality is available, with the exception of personalizing levels, saving students' programs and viewing their progress. That is limiting, but there are schools that use Hedy in that way. + Организации в ЕС должны соблюдать GDPR (General Data Protection Regulation) при обработке персональных данных. + Поскольку этот вопрос является сложным для многих школ, вы можете использовать все функциональные возможности программирования Hedy без предоставления персональных данных. + Самый простой способ сделать это - использовать Hedy без создания учетных записей для учителя и учеников. Без учетных записей доступны все функции, за исключением персонализации уровней, сохранения программ учеников и просмотра их прогресса. Это ограничение, но есть школы, которые используют Hedy именно таким образом. - A second way is for a teacher to create an account with an email address without personal data, for example "docent25@email.com". Apart from an email address, which is only required to reset your password, you do not need to share any information when you create a teacher account. - With a teacher account, you can create anonymous accounts for students, e.g. rainbow-student1, rainbow-student2, etc (See 'Teaching preparations' for a detailed manual). This way you can use all functionality of Hedy, including saving progress, without sharing personal data of yourself or your students. + Второй способ - это создание учителем учетной записи с адресом электронной почты без персональных данных, например «docent25@email.com». Кроме адреса электронной почты, который требуется только для сброса пароля, при создании учетной записи учителя вам не нужно сообщать никакой информации. + С помощью учетной записи учителя вы можете создавать анонимные учетные записи для учеников, например rainbow-student1, rainbow-student2 и т. д. (подробное руководство см. в разделе «Преподавательская подготовка»). Таким образом, вы сможете пользоваться всеми функциями Hedy, включая сохранение прогресса, не сообщая личных данных о себе и своих учениках. - If the above is not sufficient for your context, we can sign a processing agreement for the processing of your personal data. -- title: Tutorial - key: tutorial + Если вышеуказанного недостаточно для вашего контекста, мы можем подписать соглашение об обработке ваших персональных данных. +- title: Туториал + key: туториал subsections: - - title: Tutorial - text: Вы хотите пройти учебник (еще раз)? Нажмите здесь. + - title: Туториал + text: Вы хотите пройти туториал (еще раз)? Нажмите здесь. - title: Teaching preparations key: preparations subsections: - - title: For teachers + - title: Для учителей text: You can prepare your classes at the For Teachers page. On this page you'll find everything you'll need to teach with Hedy, like your classes, your adventures and slides. All the functionalities of the for teachers page are explained below. - title: Creating a Class text: |- diff --git a/content/quizzes/pl.yaml b/content/quizzes/pl.yaml index f67dcf6c199..6905e9ff561 100644 --- a/content/quizzes/pl.yaml +++ b/content/quizzes/pl.yaml @@ -22,7 +22,7 @@ levels: feedback: '`{echo}` wyświetla odpowiedź do zadanego wcześniej pytania.' - option: '`{print}`' feedback: Zgadza się! - - option: '`witaj`' + - option: '`hello`' feedback: '''witaj'' nie jest komendą.' - option: '`{ask}`' feedback: Za pomocą `{ask}` możesz zadać pytanie. @@ -610,14 +610,26 @@ levels: 1: question_text: Which of these is true? mp_choice_options: - - option: '`{print}` and `{ask}` now need quotation marks' + - option: '``` + + {print} ''Jestem bardzo podekscytowany tym quizem!'' + + ```' feedback: That's right - - option: Only `{print}` needs quotation marks - feedback: '`{ask}` needs quotation marks too!' - - option: '`{at} {random}` doesn''t work anymore in level 4' + - option: "```\n{print}Jestem bardzo podekscytowany tym quizem!\n```" + feedback: '{print} potrzebuje teraz cudzysłowu!' + - option: '``` + + {print} ''Jestem bardzo podekscytowany tym quizem!'' + + ```' feedback: '`{at} {random}` still works' - - option: '`{at} {random}` now needs quotation marks' - feedback: No, but 2 other commands do. + - option: '``` + + {print} ''Jestem bardzo podekscytowany tym quizem! + + ```' + feedback: ostrożnie, używając cudzysłowów i apostrofu hint: In level 4 you need quotation marks for 2 commands. correct_answer: A question_score: '10' @@ -638,7 +650,7 @@ levels: ``` {print} hello ``` - feedback: There are no quotation marks here!. + feedback: Nie ma tutaj cudzysłowu! - option: |- ``` {print} ,hello, @@ -664,7 +676,7 @@ levels: ``` '{print} Hi Im Hedy' ``` - feedback: The first quotation mark should be behind the word {print} + feedback: Pierwszy znak cudzysłowu powinien znajdować się za słowem `{print}` - option: |- ``` {print} 'Hi Im Hedy' @@ -737,7 +749,7 @@ levels: {print} 'You win... prices {at} {random}' ``` feedback: Hedy will literally print 'prices {at} {random}'' - hint: 'Think carefully: what is a variable and should be outside of the quotation marks? And what are normal words that should be inside?.' + hint: 'Zastanów się: jaka jest zmienna i czy powinna znajdować się poza cudzysłowami? A jakie normalne słowa powinny być w środku?' correct_answer: A question_score: '10' 7: @@ -832,14 +844,14 @@ levels: _?_ {print} 'My lucky number is 5!' mp_choice_options: - option: In level 5 `{print}` works differently than in level 4 - feedback: '`{print}` is still the same' + feedback: 'Istnieje już polecenie `{print}`.' - option: In level 5 `{ask}` works differently than in level 4 - feedback: '`{ask}` is still the same' + feedback: 'Polecenie `{if}` jest używane w powyższym wierszu.' - option: In level 5 `{ask}` and `{print}` work differently than in level 4 - feedback: '`No these commands remain the same' + feedback: 'To nie to!' - option: In level 5 `{ask}` and `{print}` work the same as in level 4 feedback: Correct! - hint: We have only learned a new command in level 5. + hint: Który idzie w parze z poleceniem `{if}`? correct_answer: D question_score: '10' 2: @@ -954,24 +966,16 @@ levels: {else} _?_ 'Unfortunately... No big money for you.' mp_choice_options: - option: |- - ``` - {if} - ``` + `{if}` feedback: '`{if}` is in the line above.' - option: |- - ``` - {at} {random} - ``` + `{at}``{random}` feedback: No, you don't need `{at} {random}`. - option: |- - ``` - {else} - ``` + `{else}` feedback: There already is an `{else}` command - option: |- - ``` - {print} - ``` + `{print}` feedback: Awesome! hint: After `{else}` a `{print}` command follows correct_answer: D @@ -994,14 +998,10 @@ levels: ``` feedback: Great job! - option: |- - ``` - {if} - ``` + `{if}` feedback: '`{if}` is already there' - option: |- - ``` - {print} - ``` + `{print}` feedback: No, that's not it. hint: What the variable name? correct_answer: B @@ -1302,19 +1302,13 @@ levels: ``` feedback: That's right! - option: |- - ``` - {print} - ``` + `{print}` feedback: '`{print}` is spelled correctly' - option: |- - ``` - {repeat} - ``` + `{repeat}` feedback: '`{repeat}` is spelled correctly' - option: |- - ``` - {times} - ``` + `{times}` feedback: '`{times}` is spelled correctly' hint: I'm is wrong, you can't use apostrophes correct_answer: A @@ -1451,7 +1445,7 @@ levels: {print} 'Help !' {repeat} 3 {times} {print} 'Please help me !' ``` - feedback: Je herhaalt de verkeerde regel + feedback: Twój powtórzony wiersz jest niepoprawny. - option: |- ``` {print} 'Batman was flying through Gotham.' @@ -1459,7 +1453,7 @@ levels: {repeat} 3 {times} 'Help !' {print} 'Please help me !' ``` - feedback: Het commando `{print}` mist op regel 3 + feedback: W wierszu 3 brakuje polecenia `{print}`. - option: |- ``` {print} Batman was flying through Gotham. @@ -1558,7 +1552,7 @@ levels: mp_choice_options: - option: This should be only one line, not 2. feedback: No it should be 2 lines. - - option: This `{print}` command has to go + - option: To polecenie `{print}` musi zostać usunięte. feedback: No, you need it. - option: There is a spelling mistake in the `{repeat}` command. feedback: Nee, repeat is de goede spelling @@ -1597,8 +1591,8 @@ levels: Baby shark Baby shark Baby shark - feedback: What is being repeated and what isn't. - hint: What is being repeated and what is not?. + feedback: Co się powtarza, a co nie? + hint: Co się powtarza, a co nie? correct_answer: C question_score: '10' 4: @@ -1696,9 +1690,9 @@ levels: {print} 'That you for your order' mp_choice_options: - option: Nothing this code is correct! - feedback: Something is wrong!. + feedback: Coś jest nie tak! - option: You're not allowed to use an `{if}` command after an `{ask}` command. - feedback: You are!. + feedback: Ty jesteś! - option: You don't have to use indentation twice. Only in the first `{if}` command. feedback: You always have to use indentation. - option: The indentation is wrong in the first `{if}` command. @@ -1805,9 +1799,9 @@ levels: {print} 'That you for your order' mp_choice_options: - option: Nothing this code is correct! - feedback: That's right!. + feedback: Zgadza się! - option: You're not allowed to use an `{if}` command after an `{ask}` command. - feedback: You are!. + feedback: Ty jesteś! - option: You don't have to use indentation twice. feedback: You always have to use indentation. - option: The indentation is wrong in the last `{if}` command. @@ -1997,7 +1991,7 @@ levels: {if} drink {is} coke price = price - 2 ``` - feedback: Try again + feedback: Dwa kolejno następujące po sobie polecenia `{if}` nigdy nie są poprawne. - option: |- ``` {if} food {is} pizza @@ -2311,19 +2305,13 @@ levels: ``` feedback: 'No' - option: |- - ``` - {range} - ``` + `{range}` feedback: Correct - option: |- - ``` - {if} - ``` + `{if}` feedback: 'No' - option: |- - ``` - {for} - ``` + `{for}` feedback: 'No' hint: What did you learn in this level? correct_answer: B @@ -2428,7 +2416,7 @@ levels: {print} 10 - i ``` feedback: That's right! - hint: It has to be a calculation... + hint: To musi być obliczenie… correct_answer: D question_score: '10' 5: @@ -2639,7 +2627,7 @@ levels: feedback: Correct! - option: The quotation marks aren't used correctly in line 2 feedback: That's not true - - option: You can't use the = sign when using an ask command + - option: Nie można używać znaku = podczas korzystania z polecenia {ask} feedback: That's not true - option: Nothing is wrong. feedback: That's not true @@ -3505,13 +3493,13 @@ levels: 9: question_text: What will the diet app say if you have eaten 1600 calories today? code: |- - chocolate = {ask} 'How many calories have you eaten today?' - {while} calories <= 1000 - {print} 'You could eat some more' - {while} calories > 1000 and calories =< 2000 - {print} 'That is alright' - {while} calories > 2000 - {print} 'You have had enough for today' + czekolada = {ask} 'Ile kalorii zjadłeś dzisiaj?' + {while} kalorie <= 1000 + {print} 'Możesz zjeść trochę więcej' + {while} kalorie > 1000 i kalorie =< 2000 + {print} 'W porządku' + {while} kalorie > 2000 + {print} 'Zjadłeś dzisiaj już wystarczająco dużo' mp_choice_options: - option: Nothing. 1600 is not programmed into the app. feedback: 'No' @@ -3661,11 +3649,11 @@ levels: mp_choice_options: - option: noises = ['moo', 'woof', 'neigh'] feedback: Mind the variable name and the order of the sounds. - - option: sounds = '[woof], [moo], [neigh]'. + - option: "```\n dźwięk = '[woof], [moo], [neigh]'\n```" feedback: Look at line one to see how brackets are supposed to be used. - option: sounds = [woof, moo, neigh] feedback: Don't forget the quotation marks! - - option: sounds = ['woof', 'moo', 'neigh'] + - option: "```\n dźwięki = ['woof', 'moo', 'neigh']\n```" feedback: Great job! hint: Look at line 1 to see proper use of brackets and quotation marks. correct_answer: D diff --git a/content/workbooks/docentenuitleg.md b/content/workbooks/docentenuitleg.md new file mode 100644 index 00000000000..304196aeb74 --- /dev/null +++ b/content/workbooks/docentenuitleg.md @@ -0,0 +1,8 @@ + + +Note to self: functies staan hier: https://slides.com/felienne/python-klas-2-module-1-les-8/edit + +En: + +sudo npm uninstall -g markdown-pdf +sudo npm install -g markdown-pdf --unsafe-perm <--- alleen zo installeren werkte voor mij diff --git a/content/workbooks/lesson0/les0a-autogenerated.md b/content/workbooks/lesson0/les0a-autogenerated.md new file mode 100644 index 00000000000..4e060349bfa --- /dev/null +++ b/content/workbooks/lesson0/les0a-autogenerated.md @@ -0,0 +1,70 @@ +# Hedy - Warming Up Les + +[Teacher] Het doel van deze les is om leerlingen een beeld te geven van wat er zoals met programmeren kan. Ze denken vaak aan games en soms aan apps maar er kan nog veel meer! [/Teacher] + +## Wat is programmeren? + +Aan het einde van de les weet jij: + +* Wat programmeren is +* Welke programmeertalen er zijn +* Wat je met programmeren kan maken + +#### Opdracht 1: Wat is programmeren? + +In deze lessen gaan we je soms vragen geven waarop geen goed of fout antwoord is. Je mag gewoon opschrijven wat je denkt. +Bij zo'n opdracht staat altijd een vraagteken. + +**? Vraag**: Wat denk jij dat programmeren is?
+Er is dus geen goed of fout antwoord!
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +#### Opdracht 2: Ken jij al programmeertalen? + +**? Vraag**: Ken jij al programmeertalen? Vul ze hier in.
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ + +#### Opdracht 3: Wat kan je maken met programmeren? + +**? Vraag**: Wat voor dingen kan je met programmeren maken, denk jij?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +#### Opdracht 4: Wat wil je maken met programmeren? + +**✍️ Vraag**: Welke dingen zou je willen maken? Noem minstens 3 dingen. Niet alles kan, maar misschien lukken sommige van deze dingen jou wel in de komende weken, maanden of jaren!
+ +1. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+2. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+3. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+4. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+5. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +#### Opdracht 5: Bekijk een programma, opdracht 1 + +**✍️ Vraag**: Voor deze opdracht mag je je laptop pakken. Open Magister op je laptop. Maak dan een lijst van de opties die Magister biedt. Schrijf per optie in 1 zin op wat die optie doet.
+Voorbeeld: Eén van de opties is 'Berichten'. Bij Berichten kan je je docenten berichten sturen en nieuwe berichten lezen.
+1. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+2. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+3. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+4. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+5. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+6. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+7. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+8. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+9. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+10. ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ diff --git a/content/workbooks/lesson0/les0a-generated.md b/content/workbooks/lesson0/les0a-generated.md new file mode 100644 index 00000000000..596fd3c19f0 --- /dev/null +++ b/content/workbooks/lesson0/les0a-generated.md @@ -0,0 +1,65 @@ +# Hedy - Warming Up Les + +## Wat is programmeren? + +Aan het einde van de les weet jij: + +* Wat programmeren is +* Welke programmeertalen er zijn +* Wat je met programmeren kan maken + +#### Opdracht 1: Wat is programmeren? + +In deze lessen gaan we je soms vragen geven waarop geen goed of fout antwoord is. Je mag gewoon opschrijven wat je denkt. +Bij zo'n opdracht staat altijd een vraagteken. + +**❓Vraag**: Wat denk jij dat programmeren is?
+Er is dus geen goed of fout antwoord!
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+ + +#### Opdracht 2: Ken jij al programmeertalen? + +**❓Vraag**: Ken jij al programmeertalen? Vul ze hier in.
+Ook hier geldt: er is geen goed of fout antwoord!
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+ +
+ +#### Opdracht 3: Wat kan je maken met programmeren? + +**❓Vraag**: Wat voor dingen kan je met programmeren maken, denk jij?
+____________________________________________________________________________________________________
+____________________________________________________________________________________________________
+____________________________________________________________________________________________________
+ + +#### Opdracht 4: Wat wil je maken met programmeren? + + +**❓Vraag**: Welke dingen zou je willen maken? Noem minstens 3 dingen. Niet alles kan, maar misschien lukken sommige van deze dingen jou wel in de komende weken, maanden of jaren!
+1. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+2. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+3. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+ + +#### Opdracht 5: Bekijk een programma, opdracht 1 + +**❓Vraag**: Voor deze opdracht mag je je laptop pakken. Open Magister op je laptop en maak een lijst van de opties die Magister biedt. Schrijf per optie in 1 zin op wat die optie doet, en vul **minstens** 5 regel in.
+**Voorbeeld:** Eén van de opties is 'Berichten'. Bij Berichten kan je je docenten berichten sturen en nieuwe berichten lezen. " + +V. Optie: Berichten. Daar kan je: je je docenten berichten sturen en nieuwe berichten lezen. +1. Optie: Kalender. Daar kan je: __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+2. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+3. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+4. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+5. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+6. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+7. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+8. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+9. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+10. ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
diff --git a/content/workbooks/lesson0/les0a-generated.pdf b/content/workbooks/lesson0/les0a-generated.pdf new file mode 100644 index 00000000000..a16496be0cd Binary files /dev/null and b/content/workbooks/lesson0/les0a-generated.pdf differ diff --git a/content/workbooks/lesson0/les0a.md b/content/workbooks/lesson0/les0a.md new file mode 100644 index 00000000000..7212b293251 --- /dev/null +++ b/content/workbooks/lesson0/les0a.md @@ -0,0 +1,68 @@ +# Hedy - Warming Up Les + +[Teacher] Het doel van deze les is om leerlingen een beeld te geven van wat er zoals met programmeren kan. Ze denken vaak aan games en soms aan apps maar er kan nog veel meer! [/Teacher] + +## Wat is programmeren? + +Aan het einde van de les weet jij: + +* Wat programmeren is +* Welke programmeertalen er zijn +* Wat je met programmeren kan maken + +#### Opdracht 1: Wat is programmeren? + +In deze lessen gaan we je soms vragen geven waarop geen goed of fout antwoord is. Je mag gewoon opschrijven wat je denkt. +Bij zo'n opdracht staat altijd een vraagteken. + +{ + "assignment": "text", + "icon" : "?", + "question" : "Wat denk jij dat programmeren is?", + "note" : "Er is dus geen goed of fout antwoord!", + "lines" : 3, + "answer" : "Programmeren betekent de computer opdrachten geven, in de taal van de computer." +} + +#### Opdracht 2: Ken jij al programmeertalen? + +{ + "assignment": "text", + "icon" : "?", + "question" : "Ken jij al programmeertalen? Vul ze hier in.", + "lines" : 3, + "answer" : "Bijvoorbeeld Scratch, Python, HTML, Swift" +} + + +#### Opdracht 3: Wat kan je maken met programmeren? + +{ + "assignment": "text", + "icon" : "?", + "question" : "Wat voor dingen kan je met programmeren maken, denk jij?", + "lines" : 3, + "answer" : "Apps, games, spelletjes, maar ook tekeningen, een bestelcomputer zoals bij de Mac of de Dunkin Donuts, een rekenmachine, een quiz, een overhoorprogramma en nog veel meer." +} + +#### Opdracht 4: Wat wil je maken met programmeren? + +{ + "assignment": "text", + "icon" : "✍️", + "numbered" : "yes", + "question" : "Welke dingen zou je willen maken? Noem minstens 3 dingen. Niet alles kan, maar misschien lukken sommige van deze dingen jou wel in de komende weken, maanden of jaren!", + "lines" : 5 +} + +#### Opdracht 5: Bekijk een programma, opdracht 1 + +{ + "assignment": "text", + "icon" : "✍️", + "numbered" : "yes", + "question" : "Voor deze opdracht mag je je laptop pakken. Open Magister op je laptop. Maak dan een lijst van de opties die Magister biedt. Schrijf per optie in 1 zin op wat die optie doet.", + "note" : "Voorbeeld: Eén van de opties is 'Berichten'. Bij Berichten kan je je docenten berichten sturen en nieuwe berichten lezen.", + "lines" : 10 +} + diff --git a/content/workbooks/lesson1/les1a-autogenerated.md b/content/workbooks/lesson1/les1a-autogenerated.md new file mode 100644 index 00000000000..933c0cb36e9 --- /dev/null +++ b/content/workbooks/lesson1/les1a-autogenerated.md @@ -0,0 +1,278 @@ +# Hedy - Les 1a + +[Teacher] Het doel van deze les is om de vijf codes uit level 1 van Hedy te leren kennen: `print`, `echo` en `ask` voor tekst en `forward` en `turn` voor het tekenen. [/Teacher] + +## Printen en invoer + +Aan het einde van de les kun jij: + +* Code schrijven die tekst print +* Een verhaal met invoer maken + +### Opdrachten +Een computer doet niet zomaar zelf iets, je moet een computer altijd een opdracht geven. Zo'n opdracht heet commando. Om code uit te printen, gebruiken we de code `print`. + +### Tekst printen + +Je hebt net op het bord de `print` opdracht gezien. +Een `print` opdracht print een woord uit, als het tussen aanhalingstekens staat. Bijvoorbeeld zo: + +```hedy +print Hallo allemaal +``` + +#### Opdracht 1: Voorspel de uitvoer + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +print Hallo allemaal __________________________ + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +print goedemorgen __________________________ + +``` + + + +#### Opdracht 2: Foutje? +Soms sluipt er een foutje in je code. Dat is niet erg, maar Hedy kan je code dan niet goed lezen. +Welke van deze code zijn fout, denk jij? + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +prnt Hallo allemaal! +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +print print +``` +Antwoord:
〇 Goed
〇 Fout + + + +### Invoer vragen + +Alleen tekst is een beetje saai. Je kan in Hedy ook om _invoer_ vragen. Invoer is tekst die je aan de computer geeft. +De computer onthoudt die tekst en kan die later weer aan jou laten zien. +Deze code toont de vraag 'Hoe heet jij?' + +```hedy +ask Hoe heet jij? +``` + +### Invoer laten zien + +Alleen een ask slaat het antwoord op, maar laat het niet zien. Daarvoor heb je de opdracht `echo` nodig. Die laat het antwoord zien op het einde van de zin. +Bijvoorbeeld zo: + +```hedy +ask Hoe heet jij? +echo dus jij heet: +``` + +Als iemand die Maan heet deze code zou gebruiken, dan wordt de uitvoer: + +``` +dus jij heet: Maan +``` + +Let op, het komt precies zo in beeld als het er staat, dus met hetzelfde hoofdlettergebruik en de dubbele punt erbij! + + +#### Opdracht 3: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Doe alsof je je eigen naam hebt ingevuld. + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +ask Hoe heet jij? __________________________ +echo dus jij heet: __________________________ + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +ask Hoe heet jij? __________________________ +echo Leuk om je te ontmoeten, __________________________ + +``` + + +#### Opdracht 4: Programmeer-woorden + +Iedere les gaan we nieuwe woorden leren, deze les ook. Weet jij wat deze termen betekenen? Leg het uit je eigen woorden. + +**📖 Vraag**: Wat betekent commando? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent invoer? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent uitvoer? +Antwoord: ____________________________________________________________________________________________________
+ +#### Opdracht 5: Codes + +We hebben tot nu toe 3 codes geleerd: `print`, `ask` en `echo`. Wat doen die? Leg het uit in je eigen woorden. + +**📖 Vraag**: Wat doet het commando `print`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `ask`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `echo`? +Antwoord: ____________________________________________________________________________________________________
+ +## Op naar de computer! + +Je mag nu Hedy openen door naar www.hedy.org te gaan. Daar staan een aantal tabbladen klaar. +In ieder tabblad staat uitleg, en een **opdracht**. Lees de opdracht goed en voer die uit. + +## Tekenen + + +#### Opdracht 6: Programmeer-woorden + +Weet jij wat deze termen betekenen? Leg het uit je eigen woorden. + +**📖 Vraag**: Wat betekent tabblad? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent turtle (bij programmeren)? +Antwoord: ____________________________________________________________________________________________________
+ +#### Opdracht 7: Codes + +We hebben weer 2 nieuwe codes geleerd. Wat doen die? Leg het uit in je eigen woorden. + +**📖 Vraag**: Wat doet het commando `forward`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `turn`? +Antwoord: ____________________________________________________________________________________________________
+ + +#### Opdracht 8: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Dat is bij de turtle of tekenschildpad natuurlijk een tekening. + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +forward 100 +turn left +forward 100 +turn left +forward 100 +turn left +forward 100 +turn left + + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +forward 100 +turn left +forward 100 +turn right +forward 100 +turn left +forward 100 +turn right + + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +forward 100 +turn right +forward 5 +turn right +forward 100 +turn right +forward 5 +turn right + + +``` + + +#### Opdracht 9: Schrijf de code + +We draaien het nu om! Je krijg een uitvoer en jij moet de code erbij schrijven. + +**🧑‍💻 Vraag**: Welke code hoort bij deze uitvoer?
+Code: Uitvoer: +```hedy +________________________________________ _ +________________________________________ | +________________________________________ |_________ +________________________________________ +________________________________________ +________________________________________ + +``` + + +**🧑‍💻 Vraag**: Welke code hoort bij deze uitvoer?
+Code: Uitvoer: +```hedy +________________________________________ ---------- +________________________________________ | | +________________________________________ | | +________________________________________ | | +________________________________________ | | +________________________________________ --------- +________________________________________ + +``` + + + +### Wat vond jij? + +**✍️ Vraag**: Wat was de leukste opdracht van level 1?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +**✍️ Vraag**: Waarom vond je juist die opdracht leuk?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +**✍️ Vraag**: Welke opdracht was het minst leuk?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +**✍️ Vraag**: Waarom vond je juist die opdracht niet leuk?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ + +`` diff --git a/content/workbooks/lesson1/les1a-autogenerated.pdf b/content/workbooks/lesson1/les1a-autogenerated.pdf new file mode 100644 index 00000000000..0828815111e Binary files /dev/null and b/content/workbooks/lesson1/les1a-autogenerated.pdf differ diff --git a/content/workbooks/lesson1/les1a-generated.md b/content/workbooks/lesson1/les1a-generated.md new file mode 100644 index 00000000000..1f44a348626 --- /dev/null +++ b/content/workbooks/lesson1/les1a-generated.md @@ -0,0 +1,134 @@ +# Hedy - Les 1a: Printen en invoer + +Aan het einde van de les kun jij: + +* Code schrijven die tekst print +* Een verhaal met invoer maken + +### Opdrachten +Een computer doet niet zomaar zelf iets, je moet een computer altijd een opdracht geven, een commando. Om code uit te printen, gebruiken we de code `print`. + +### Tekst printen + +Je hebt net op het bord de `print` opdracht gezien. +Een `print` opdracht print een woord uit, als het tussen aanhalingstekens staat. Zo: + +```hedy +print Hallo allemaal +``` + +#### Opdracht 1: Uitvoer + + +**💻 Vraag**: Wat is de uitvoer van deze code? + +Code: Uitvoer: + +```hedy +print Hallo klas H1C! ___________________________________ +``` + +**💻 Vraag**: Wat is de uitvoer van deze code? + +Code: Uitvoer: + +```hedy +print goedemorgen ___________________________________ +``` +
+ +#### Opdracht 2: Foutje? + +Soms sluipt er een foutje in je code. Dat is niet erg, maar Hedy kan je code dan niet goed lezen. +Welke van deze code zijn fout, denk jij? + +**🔤 Vraag**: Is deze code goed of fout? + +```hedy +prnt Hallo allemaal! +``` + +Deze code is: O Goed O Fout + +**🔤 Vraag**: Is deze code goed of fout? + +```hedy +print print +``` + +Deze code is: O Goed O Fout + +### Invoer vragen + +Alleen tekst is een beetje saai. Je kan in Hedy ook om _invoer_ vragen. Invoer is tekst die je aan de computer geeft. +De computer onthoudt die tekst en kan die later weer aan jou laten zien. + + +### Invoer laten zien + +Alleen een ask slaat het antwoord op, maar laat het niet zien. Daarvoor heb je de opdracht `echo` nodig. Die laat het antwoord zien op het einde van de zin. +Bijvoorbeeld zo: + +```hedy +ask Hoe heet jij? +echo dus jij heet: +``` + +Als iemand die Maan heet deze code zou gebruiken, dan wordt de uitvoer: + +``` +dus jij heet: Maan +``` + +Let op, het komt precies zo in beeld als het er staat, dus met hetzelfde hoofdlettergebruik en de dubbele punt erbij! + +#### Opdracht 3: Voorspel de uitvoer + +**💻 Vraag**: Wat is de uitvoer van deze code? Doe alsof je je eigen naam hebt ingevuld. + +Code: Uitvoer: + +```hedy +ask Hoe heet jij? ___________________________________ +echo dus jij heet: ___________________________________ +``` + + + +**💻 Vraag**: Wat is de uitvoer van deze code? + +```hedy +ask Hoe heet jij? ___________________________________ +echo Leuk om je te ontmoeten, ___________________________________ +``` + + + +#### Opdracht 4: Programmeer-woorden + +Iedere les gaan we nieuwe woorden leren, deze les ook. Weet jij wat deze termen betekenen? Leg het uit je eigen woorden. + + +**📖 Vraag**: Wat betekent commando? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent invoer? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent uitvoer? +Antwoord: ____________________________________________________________________________________________________
+ + +#### Opdracht 5: Codes + +We hebben tot nu toe 3 codes geleerd: print, ask en echo. Wat doen die? Leg het uit in je eigen woorden. + +**📖 Vraag**: Wat doet het commando `print`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `ask`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `echo`? +Antwoord: ____________________________________________________________________________________________________
+ diff --git a/content/workbooks/lesson1/les1a-generated.pdf b/content/workbooks/lesson1/les1a-generated.pdf new file mode 100644 index 00000000000..6ae154026c5 Binary files /dev/null and b/content/workbooks/lesson1/les1a-generated.pdf differ diff --git a/content/workbooks/lesson1/les1a.md b/content/workbooks/lesson1/les1a.md new file mode 100644 index 00000000000..f930d419853 --- /dev/null +++ b/content/workbooks/lesson1/les1a.md @@ -0,0 +1,315 @@ +# Hedy - Les 1a + +[Teacher] Het doel van deze les is om de vijf codes uit level 1 van Hedy te leren kennen: `print`, `echo` en `ask` voor tekst en `forward` en `turn` voor het tekenen. [/Teacher] + +## Printen en invoer + +Aan het einde van de les kun jij: + +* Code schrijven die tekst print +* Een verhaal met invoer maken + +### Opdrachten +Een computer doet niet zomaar zelf iets, je moet een computer altijd een opdracht geven. Zo'n opdracht heet commando. Om code uit te printen, gebruiken we de code `print`. + +### Tekst printen + +Je hebt net op het bord de `print` opdracht gezien. +Een `print` opdracht print een woord uit, als het tussen aanhalingstekens staat. Bijvoorbeeld zo: + +```hedy +print Hallo allemaal +``` + +#### Opdracht 1: Voorspel de uitvoer + +{ + "assignment": "output", + "icon" : "💻", + "code" : "print Hallo allemaal", + "answer" : "Hallo allemaal", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "print goedemorgen", + "answer" : "goedemorgen", + "lines" : 1 +} + + + +#### Opdracht 2: Foutje? +Soms sluipt er een foutje in je code. Dat is niet erg, maar Hedy kan je code dan niet goed lezen. +Welke van deze code zijn fout, denk jij? + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "prnt Hallo allemaal!", + "answer" : "Fout" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "print print", + "answer" : "Goed" +} + + + +### Invoer vragen + +Alleen tekst is een beetje saai. Je kan in Hedy ook om _invoer_ vragen. Invoer is tekst die je aan de computer geeft. +De computer onthoudt die tekst en kan die later weer aan jou laten zien. +Deze code toont de vraag 'Hoe heet jij?' + +```hedy +ask Hoe heet jij? +``` + +### Invoer laten zien + +Alleen een ask slaat het antwoord op, maar laat het niet zien. Daarvoor heb je de opdracht `echo` nodig. Die laat het antwoord zien op het einde van de zin. +Bijvoorbeeld zo: + +```hedy +ask Hoe heet jij? +echo dus jij heet: +``` + +Als iemand die Maan heet deze code zou gebruiken, dan wordt de uitvoer: + +``` +dus jij heet: Maan +``` + +Let op, het komt precies zo in beeld als het er staat, dus met hetzelfde hoofdlettergebruik en de dubbele punt erbij! + + +#### Opdracht 3: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Doe alsof je je eigen naam hebt ingevuld. + +{ + "assignment": "output", + "icon" : "💻", + "code" : "ask Hoe heet jij?\necho dus jij heet:", + "answer" : "dus jij heet: **naam**", + "lines" : 2 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "ask Hoe heet jij?\necho Leuk om je te ontmoeten,", + "answer" : "Leuk om je te ontmoeten, **naam**", + "lines" : 2 +} + + +#### Opdracht 4: Programmeer-woorden + +Iedere les gaan we nieuwe woorden leren, deze les ook. Weet jij wat deze termen betekenen? Leg het uit je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent commando?", + "lines" : 1, + "answer" : "Een opdracht die je aan de computer geeft, bijv print." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent invoer?", + "lines" : 1, + "answer" : "Wat je intikt, als Hedy een ask venster laat zien." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent uitvoer?", + "lines" : 1, + "answer" : "Wat Hedy op het scherm zet als je op Uitvoeren drukt, in het rechterscherm." +} + +#### Opdracht 5: Codes + +We hebben tot nu toe 3 codes geleerd: `print`, `ask` en `echo`. Wat doen die? Leg het uit in je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `print`?", + "lines" : 1, + "answer" : "Zet tekst op het scherm." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `ask`?", + "lines" : 1, + "answer" : "Vraag om invoer van de gebruiker." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `echo`?", + "lines" : 1, + "answer" : "Herhaalt de invoer van de gebruiker." +} + +## Op naar de computer! + +Je mag nu Hedy openen door naar www.hedy.org te gaan. Daar staan een aantal tabbladen klaar. +In ieder tabblad staat uitleg, en een **opdracht**. Lees de opdracht goed en voer die uit. + +## Tekenen + + +#### Opdracht 6: Programmeer-woorden + +Weet jij wat deze termen betekenen? Leg het uit je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent tabblad?", + "lines" : 1, + "answer" : "Een digitaal mapje waar een opdracht in zit." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent turtle (bij programmeren)?", + "lines" : 1, + "answer" : "De optie om te tekenen met code." +} + +#### Opdracht 7: Codes + +We hebben weer 2 nieuwe codes geleerd. Wat doen die? Leg het uit in je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `forward`?", + "lines" : 1, + "answer" : "Beweegt de tekenschildpad vooruit" +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `turn`?", + "lines" : 1, + "answer" : "Draait de tekenschildpad links of rechts" +} + + +#### Opdracht 8: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Dat is bij de turtle of tekenschildpad natuurlijk een tekening. + +{ + "assignment": "output", + "icon" : "💻", + "type" : "turtle", + "code" : "forward 100\nturn left\nforward 100\nturn left\nforward 100\nturn left\nforward 100\nturn left\n", + "answer" : "een vierkant", + "lines" : 5 +} + +{ + "assignment": "output", + "icon" : "💻", + "type" : "turtle", + "code" : "forward 100\nturn left\nforward 100\nturn right\nforward 100\nturn left\nforward 100\nturn right\n", + "answer" : "een trapje (zonder onderkant)", + "lines" : 5 +} + +{ + "assignment": "output", + "icon" : "💻", + "type" : "turtle", + "code" : "forward 100\nturn right\nforward 5\nturn right\nforward 100\nturn right\nforward 5\nturn right\n", + "answer" : "een hele smalle vierkant", + "lines" : 6 +} + + +#### Opdracht 9: Schrijf de code + +We draaien het nu om! Je krijg een uitvoer en jij moet de code erbij schrijven. + +{ + "assignment": "input", + "icon" : "🧑‍💻", + "output" : "_\n |\n |_________", + "answer" : "forward 5\nturn right\nforward 10\nturn left\nforward 50\n", + "lines" : 5 +} + + +{ + "assignment": "input", + "icon" : "🧑‍💻", + "output" : " +----------\n +| |\n +| |\n +| |\n +| |\n +---------\n", + "answer" : "forward 50\nturn left\nforward 50\nturn left\nforward 50\nturn left\n", + "lines" : 8 +} + + + +### Wat vond jij? + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Wat was de leukste opdracht van level 1?", + "lines" : 1 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Waarom vond je juist die opdracht leuk?", + "lines" : 5 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Welke opdracht was het minst leuk?", + "lines" : 1 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Waarom vond je juist die opdracht niet leuk?", + "lines" : 5 +} + + +`` diff --git a/content/workbooks/lesson2/les2a-autogenerated.md b/content/workbooks/lesson2/les2a-autogenerated.md new file mode 100644 index 00000000000..52a3cefa6bd --- /dev/null +++ b/content/workbooks/lesson2/les2a-autogenerated.md @@ -0,0 +1,181 @@ +# Hedy - Les 2a + +[Teacher] In level 2 leren leerlingen de codes `is` en `is ask` [/Teacher] + +## Variabelen + +Aan het einde van de les kun jij: + +* Iets opslaan in een variabele +* Een verhaal en tekening maken waarin je een variabele gebruikt + +### Variabelen + +Je hebt net op het bord de `is` opdracht gezien. +Een `is` opdracht slaat iets op in de computer, en geeft het een naam. We noemen dat een variabelen. +Wat in de variabele is opgeslagen noemen we de waarde van de variabele. + +```hedy +naam is Mo +print naam +``` + +#### Opdracht 1: Omcirkel het juiste stukje code + +**◯ Opdracht**: Omcirkel alle variabelen in deze code. +```hedy +naam is Hedy +print Hallo naam +leeftijd is 17 +print Jij bent leeftijd jaar oud +``` + +**◯ Opdracht**: Omcirkel nu de stukken code waarin een variabele **wordt ingesteld.** +```hedy +naam is Hedy +print Hallo naam +leeftijd is 17 +print Jij bent leeftijd jaar oud +``` + +**◯ Opdracht**: Omcirkel nu de stukken code waarin de waarde van een variabele **wordt gebruikt.** +```hedy +naam is Hedy +print Hallo naam +leeftijd is 17 +print Jij bent leeftijd jaar oud +``` + + + +#### Opdracht 2: Voorspel de uitvoer + +Tip: Vind je het lastig om de uitvoer te voorspellen? Gebruik dan dit stappenplan: + +1. Omcirkel de plek waar een variabele wordt ingesteld +2. Omcirkel de plek waar de variabele wordt gebruikt +3. Trek een lijn tussen deze plekken +4. Zet de waarde (aan de rechterkant van de `is` op de plek van het gebruik). + +Voorbeeld: + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +naam is Mo __________________________ +print Goed bezig naam! + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +naam is Mo __________________________ +print Goed bezig Mo! + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +voornaam is Layla __________________________ +print Goedemorgen naam! + +``` + + +#### Opdracht 3: Foutje? +Lees de codes goed! Welke zijn er goed of fout. + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +achternaam is Jansen +print Goedemorgen naam! +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +naam is +print Goedemorgen naam! +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +naam is Jansen +print Goedemorgen meneer naam! +print Hallo meneer naam! +``` +Antwoord:
〇 Goed
〇 Fout + + +### Invoer vragen + +Alleen tekst opslaan is nog niet krachtig. In level 1 hebben we de code `ask` gezien. +Die code mag je nu combineren met een `is`. Dat gaat zo: + +```hedy +naam is ask Hoe heet jij? +``` + +### Invoer laten zien + +Je kan nu gewoon met een `print` het antwoord laten zien, zonder `echo`. + +```hedy +naam is ask Hoe heet jij? +print dus jij heet: naam +``` + +Als iemand die Maan heet deze code zou gebruiken, dan wordt de uitvoer: + +``` +dus jij heet: Maan +``` + +#### Opdracht 4: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Doe alsof je je eigen naam hebt ingevuld. + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +naam is ask Hoe heet jij? __________________________ +print dus jij heet: naam + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +toestand is ask Hoe gaat het met jou? __________________________ +print Dus het gaat toestand met jou + +``` + + +#### Opdracht 5: Programmeer-woorden + +We hebben deze les weer nieuwe woorden geleerd! Leg ze uit je eigen woorden. + +**📖 Vraag**: Wat betekent variabele? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent waarde? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent instellen? +Antwoord: ____________________________________________________________________________________________________
+ + +#### Opdracht 6: Codes + +We hebben nieuwe codes geleerd: `is`, `is ask` samen. Wat doen die? Leg het uit in je eigen woorden. + +**📖 Vraag**: Wat doet het commando `is`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `is ask`? +Antwoord: ____________________________________________________________________________________________________
+ diff --git a/content/workbooks/lesson2/les2a.md b/content/workbooks/lesson2/les2a.md new file mode 100644 index 00000000000..ec72175b697 --- /dev/null +++ b/content/workbooks/lesson2/les2a.md @@ -0,0 +1,213 @@ +# Hedy - Les 2a + +[Teacher] In level 2 leren leerlingen de codes `is` en `is ask` [/Teacher] + +## Variabelen + +Aan het einde van de les kun jij: + +* Iets opslaan in een variabele +* Een verhaal en tekening maken waarin je een variabele gebruikt + +### Variabelen + +Je hebt net op het bord de `is` opdracht gezien. +Een `is` opdracht slaat iets op in de computer, en geeft het een naam. We noemen dat een variabelen. +Wat in de variabele is opgeslagen noemen we de waarde van de variabele. + +```hedy +naam is Mo +print naam +``` + +#### Opdracht 1: Omcirkel het juiste stukje code + +{ + "assignment": "element selection", + "question" : "Omcirkel alle variabelen in deze code.", + "icon" : "◯", + "code" : "naam is Hedy\nprint Hallo naam\nleeftijd is 17\nprint Jij bent leeftijd jaar oud", + "answer" : "Op alle regels" +} + +{ + "assignment": "element selection", + "question" : "Omcirkel nu de stukken code waarin een variabele **wordt ingesteld.**", + "icon" : "◯", + "code" : "naam is Hedy\nprint Hallo naam\nleeftijd is 17\nprint Jij bent leeftijd jaar oud", + "answer" : "Op regel 1 en 3" +} + +{ + "assignment": "element selection", + "question" : "Omcirkel nu de stukken code waarin de waarde van een variabele **wordt gebruikt.**", + "icon" : "◯", + "code" : "naam is Hedy\nprint Hallo naam\nleeftijd is 17\nprint Jij bent leeftijd jaar oud", + "answer" : "Op regel 2 en 4" +} + + + +#### Opdracht 2: Voorspel de uitvoer + +Tip: Vind je het lastig om de uitvoer te voorspellen? Gebruik dan dit stappenplan: + +1. Omcirkel de plek waar een variabele wordt ingesteld +2. Omcirkel de plek waar de variabele wordt gebruikt +3. Trek een lijn tussen deze plekken +4. Zet de waarde (aan de rechterkant van de `is` op de plek van het gebruik). + +Voorbeeld: + +{TODO + +{ + "assignment": "output", + "icon" : "💻", + "code" : "naam is Mo\nprint Goed bezig naam!", + "answer" : "Goed bezig Mo!", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "naam is Mo\nprint Goed bezig Mo!", + "answer" : "Goed bezig Mo!", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "voornaam is Layla\nprint Goedemorgen naam!", + "answer" : "Goedemorgen naam!", + "lines" : 1 +} + + +#### Opdracht 3: Foutje? +Lees de codes goed! Welke zijn er goed of fout. + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "achternaam is Jansen\nprint Goedemorgen naam!", + "answer" : "Goed" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "naam is\nprint Goedemorgen naam!", + "answer" : "Fout" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "naam is Jansen\nprint Goedemorgen meneer naam!\nprint Hallo meneer naam!", + "answer" : "Goed" +} + + +### Invoer vragen + +Alleen tekst opslaan is nog niet krachtig. In level 1 hebben we de code `ask` gezien. +Die code mag je nu combineren met een `is`. Dat gaat zo: + +```hedy +naam is ask Hoe heet jij? +``` + +### Invoer laten zien + +Je kan nu gewoon met een `print` het antwoord laten zien, zonder `echo`. + +```hedy +naam is ask Hoe heet jij? +print dus jij heet: naam +``` + +Als iemand die Maan heet deze code zou gebruiken, dan wordt de uitvoer: + +``` +dus jij heet: Maan +``` + +#### Opdracht 4: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Doe alsof je je eigen naam hebt ingevuld. + +{ + "assignment": "output", + "icon" : "💻", + "code" : "naam is ask Hoe heet jij?\nprint dus jij heet: naam", + "answer" : "dus jij heet: **naam**", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "toestand is ask Hoe gaat het met jou?\nprint Dus het gaat toestand met jou", + "answer" : " Dus het gaat **goed** met jou", + "lines" : 1 +} + + +#### Opdracht 5: Programmeer-woorden + +We hebben deze les weer nieuwe woorden geleerd! Leg ze uit je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent variabele?", + "lines" : 1, + "answer" : "Een naam die je geeft aan iets, bijv voornaam of leeftijd." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent waarde?", + "lines" : 1, + "answer" : "Wat je opslaat in een variabele, bijv Henk of 12." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent instellen?", + "lines" : 1, + "answer" : "Een programma waarbij een gebruiker invoer kan geven." +} + + +#### Opdracht 6: Codes + +We hebben nieuwe codes geleerd: `is`, `is ask` samen. Wat doen die? Leg het uit in je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `is`?", + "lines" : 1, + "answer" : "Waarde (rechts van de is) opslaan in een variabele (links van de is)" +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `is ask`?", + "lines" : 1, + "answer" : "Vraag om invoer van de gebruiker en die opslaan in de variabele links van de is." +} + diff --git a/content/workbooks/lesson3/les3a-autogenerated.md b/content/workbooks/lesson3/les3a-autogenerated.md new file mode 100644 index 00000000000..b1c080cd766 --- /dev/null +++ b/content/workbooks/lesson3/les3a-autogenerated.md @@ -0,0 +1,241 @@ +# Hedy - Les 3a + +## Lijsten en willekeurigheid + +Aan het einde van de les kun jij: + +* Meerdere dingen opslaan in een variabele, zo'n variabele heet een lijst. +* Een verhaal maken waarin willekeurige dingen gebeuren. +* Een tekening maken waarin willekeurige dingen verschijnen. + +### Variabelen + +Je hebt net op het bord de `is` opdracht gezien met een lijst. +Met als bij een gewone variabele, slaan we iets op in een lijst met `is`. + +```hedy +vrienden is Mo, Layla, Denny +print Ik ga vandaag naar vrienden at random +``` + +#### Opdracht 1: Omcirkel het juiste stukje code + +**◯ Opdracht**: Omcircel alle lijsten in deze code +```hedy +vandaag is maandag +klassen is 1HC, 1HB, 1HA +lokalen is 011, 304, 305, OLC +``` + +**◯ Opdracht**: Op welke plek in de code wordt er tekst uit een lijst gebruikt? +```hedy +klassen is 1HC, 1HB, 1HA +print vandaag heeft klassen at random vrij! +``` + +#### Opdracht 2: Voorspel de uitvoer + +Vind je het lastig? Gebruik dan weer het stappenplan om variabele-uitvoer te voorspellen. + +1. Omcirkel de plek waar de lijst wordt ingesteld +2. Omcirkel de plek waar de lijst wordt gebruikt +3. Trek een lijn tussen deze plekken +4. Bij een `at` `random` mag je zelf willekeurig iets uit de lijst kiezen. + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +docenten is Hermans, Merbis, Bagci, Senkal __________________________ +print Vandaag les van docenten at random! + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +docenten is Hermans, Merbis, Bagci, Senkal __________________________ +print De docent vandaag is Hermans. + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +weer is zonnig, regen, wolken, onweer __________________________ +print Wat is het lekker weer vandaag! + +``` + +#### Opdracht 3: Foutje? +Lees de codes goed! Welke zijn er goed of fout. + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +weer is zonnig, regen, wolken, onweer +print Bah! De computer loopt weer vast. +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +docenten is Hermans +print Vandaag alweer docenten at random +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +docenten is onweer, regen, ijzel +print Vandaag alweer docenten at random! +``` +Antwoord:
〇 Goed
〇 Fout + +### Avonturen + +Dit is een goed moment voor deze avonturen: +Introductie +willekeurig +Dobbelsteen +Steen, papier, schaar +Muziek +Waarzegger +Restaurant +Spookhuis +Afwas? + +### Lijsten aanpassen + +Tot nu toe hebben we lijsten steeds aan het begin van het programma ingesteld. + +```hedy +antwoorden is ja, nee, misschien +print Het antwoord is antwoorden at random +``` + +Maar soms wil je dat de gebruiker van een programma ook opties kan toevoegen. +Dat doe je met een `add` en een `to` commando. + +``` +dieren is 🐿, 🦔, 🦇, 🦉 +dier is ask Wat zou het kunnen zijn? +add dier to dieren +print het was een dieren op willekeurig +``` + +Je kan ook iets uit een lijst verwijderen, met `remove` en `from`. + +#### Opdracht 4: Goed of fout? + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +letters is a,b,c,d +remove a to letters +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +eten is pizza, friet, kapsalon +remove kroket from eten +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +eten is pizza, friet, kapsalon +add pizza to eten +``` +Antwoord:
〇 Goed
〇 Fout + + +#### Opdracht 5: Schrijf de code + +Kijk goed naar de uitvoer, en schrijf er een passende code bij. +**Zorg ervoor dat er steeds minstens een willekeurige keuze in je programma zit, dus niet alleen een print!** + +**🧑‍💻 Vraag**: Welke code hoort bij deze uitvoer?
+Code: Uitvoer: +```hedy +________________________________________ Welkom bij de bingoavond +________________________________________ De drie geluksnummers zijn: +________________________________________ 5 en 3 en 10 +________________________________________ + +``` + + +**🧑‍💻 Vraag**: Welke code hoort bij deze uitvoer?
+Code: Uitvoer: +```hedy +________________________________________ We gaan vanavond naar de film. +________________________________________ We kiezen: Inside Out +________________________________________ + +``` + + +#### Opdracht 6: Programmeerwoorden + +We hebben deze les weer nieuwe programmeerwoorden geleerd! Leg ze uit je eigen woorden. + +**📖 Vraag**: Wat betekent lijst? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent willekeurig? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent toevoegen? +Antwoord: ____________________________________________________________________________________________________
+ + +#### Opdracht 7: Codes + +De code `is` is in dit leven veranderd, en we hebben ook nieuwe codes geleerd. +Wat doen die? Leg het uit in je eigen woorden. + +**📖 Vraag**: Wat doet het commando `is`? (Let op: `is` kan dus meerdere dingen doen!) +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `add to`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `remove from`? +Antwoord: ____________________________________________________________________________________________________
+ + +**📖 Vraag**: Wat doet het commando `at random`? +Antwoord: ____________________________________________________________________________________________________
+ + +### Wat vond jij? + +**✍️ Vraag**: Wat was de leukste opdracht van dit level?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +**✍️ Vraag**: Waarom vond je juist die opdracht leuk?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +**✍️ Vraag**: Welke opdracht was het minst leuk?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ +**✍️ Vraag**: Waarom vond je juist die opdracht niet leuk?
+ +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
+
+ + +`` diff --git a/content/workbooks/lesson3/les3a-autogenerated.pdf b/content/workbooks/lesson3/les3a-autogenerated.pdf new file mode 100644 index 00000000000..b5cc7c33a32 Binary files /dev/null and b/content/workbooks/lesson3/les3a-autogenerated.pdf differ diff --git a/content/workbooks/lesson3/les3a.md b/content/workbooks/lesson3/les3a.md new file mode 100644 index 00000000000..e92d5c3868f --- /dev/null +++ b/content/workbooks/lesson3/les3a.md @@ -0,0 +1,291 @@ +# Hedy - Les 3a + +[Teacher] In level 3 leren leerlingen werken met lijsten. Die worden ingesteld zoals een variabele, met `is`, en kan je uitlezen met `at random`. [/Teacher] + +## Lijsten en willekeurigheid + +Aan het einde van de les kun jij: + +* Meerdere dingen opslaan in een variabele, zo'n variabele heet een lijst. +* Een verhaal maken waarin willekeurige dingen gebeuren. +* Een tekening maken waarin willekeurige dingen verschijnen. + +### Variabelen + +Je hebt net op het bord de `is` opdracht gezien met een lijst. +Met als bij een gewone variabele, slaan we iets op in een lijst met `is`. + +```hedy +vrienden is Mo, Layla, Denny +print Ik ga vandaag naar vrienden at random +``` + +#### Opdracht 1: Omcirkel het juiste stukje code + +{ + "assignment": "element selection", + "question" : "Omcircel alle lijsten in deze code", + "icon" : "◯", + "code" : "vandaag is maandag\nklassen is 1HC, 1HB, 1HA\nlokalen is 011, 304, 305, OLC", + "answer" : "klassen en lokalen" +} + +{ + "assignment": "element selection", + "question" : "Op welke plek in de code wordt er tekst uit een lijst gebruikt?", + "icon" : "◯", + "code" : "klassen is 1HC, 1HB, 1HA\nprint vandaag heeft klassen at random vrij!", + "answer" : "Op het einde van regel 2" +} + +#### Opdracht 2: Voorspel de uitvoer + +Vind je het lastig? Gebruik dan weer het stappenplan om variabele-uitvoer te voorspellen. + +1. Omcirkel de plek waar de lijst wordt ingesteld +2. Omcirkel de plek waar de lijst wordt gebruikt +3. Trek een lijn tussen deze plekken +4. Bij een `at` `random` mag je zelf willekeurig iets uit de lijst kiezen. + +{ + "assignment": "output", + "icon" : "💻", + "code" : "docenten is Hermans, Merbis, Bagci, Senkal\nprint Vandaag les van docenten at random!", + "answer" : "Vandaag les van **keuze uit docenten**", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "docenten is Hermans, Merbis, Bagci, Senkal\nprint De docent vandaag is Hermans.", + "answer" : "De docent vandaag is Hermans", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "weer is zonnig, regen, wolken, onweer\nprint Wat is het lekker weer vandaag!", + "answer" : "Fout! Je kan een lijst niet printen", + "lines" : 1 +} + +#### Opdracht 3: Foutje? +Lees de codes goed! Welke zijn er goed of fout. + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "weer is zonnig, regen, wolken, onweer\nprint Bah! De computer loopt weer vast.", + "answer" : "Fout. Je kan een lijst niet printen" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "docenten is Hermans\nprint Vandaag alweer docenten at random", + "answer" : "Fout, docenten is geen lijst" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "docenten is onweer, regen, ijzel\nprint Vandaag alweer docenten at random!", + "answer" : "Goed, de naam hoeft niet te kloppen voor de computer." +} + +### Avonturen + +[Teacher] Dit zijn alle avonturen zonder `add to` en `remove from`.[/Teacher] +Dit is een goed moment voor deze avonturen: +Introductie +willekeurig +Dobbelsteen +Steen, papier, schaar +Muziek +Waarzegger +Restaurant +Spookhuis +Afwas? + +### Lijsten aanpassen + +Tot nu toe hebben we lijsten steeds aan het begin van het programma ingesteld. + +```hedy +antwoorden is ja, nee, misschien +print Het antwoord is antwoorden at random +``` + +Maar soms wil je dat de gebruiker van een programma ook opties kan toevoegen. +Dat doe je met een `add` en een `to` commando. + +``` +dieren is 🐿, 🦔, 🦇, 🦉 +dier is ask Wat zou het kunnen zijn? +add dier to dieren +print het was een dieren op willekeurig +``` + +Je kan ook iets uit een lijst verwijderen, met `remove` en `from`. + +#### Opdracht 4: Goed of fout? + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "letters is a,b,c,d\nremove a to letters", + "answer" : "Fout. Bij remove hoort from, niet to." +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "eten is pizza, friet, kapsalon\nremove kroket from eten", + "answer" : "Goed, je mag iets verwijderen dat niet in de lijst zit." +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "eten is pizza, friet, kapsalon\nadd pizza to eten", + "answer" : "Goed, je mag iets toevoegen dat al in de lijst zit." +} + + +#### Opdracht 5: Schrijf de code + +Kijk goed naar de uitvoer, en schrijf er een passende code bij. +**Zorg ervoor dat er steeds minstens een willekeurige keuze in je programma zit, dus niet alleen een print!** + +{ + "assignment": "input", + "icon" : "🧑‍💻", + "output" : "Welkom bij de bingoavond\nDe drie geluksnummers zijn:\n5 en 3 en 10", + "answer" : "getallen is 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nprint Welkom bij de bingoavond\nprint De drie geluksnummers zijn:\nprint nummers at random en print nummers at random en print nummers at random", + "lines" : 4 +} + + +{ + "assignment": "input", + "icon" : "🧑‍💻", + "output" : "We gaan vanavond naar de film.\nWe kiezen: Inside Out", + "answer" : "films is Avengers, Barbie, Inside Out\nprint We gaan vanavond naar de film.\nWe kiezen: films at random", + "lines" : 2 +} + + +#### Opdracht 6: Programmeerwoorden + +We hebben deze les weer nieuwe programmeerwoorden geleerd! Leg ze uit je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent lijst?", + "lines" : 1, + "answer" : "Een variabele waarin meerdere waardes kunnen worden opgeslagen" +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent willekeurig?", + "lines" : 1, + "answer" : "Iets dat door de computer wordt uitgekozen." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent toevoegen?", + "lines" : 1, + "answer" : "Iets in een lijst erbij zetten" +} + + +#### Opdracht 7: Codes + +De code `is` is in dit leven veranderd, en we hebben ook nieuwe codes geleerd. +Wat doen die? Leg het uit in je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `is`? (Let op: `is` kan dus meerdere dingen doen!)", + "lines" : 1, + "answer" : "Waarde (rechts van de is) opslaan in een variabele of lijst (links van de is)" +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `add to`?", + "lines" : 1, + "answer" : "Voeg iets aan een lijst toe. Het element om toe te voegen staat tussen `add` en `to`, en de lijst staat erachter." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `remove from`?", + "lines" : 1, + "answer" : "Verwijdert iets uit een lijst. Het element om te verwijderen staat tussen `add` en `to`, en de lijst staat erachter." +} + + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `at random`?", + "lines" : 1, + "answer" : "Kiest een willekeurig element uit de lijst." +} + + +### Wat vond jij? + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Wat was de leukste opdracht van dit level?", + "lines" : 1 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Waarom vond je juist die opdracht leuk?", + "lines" : 5 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Welke opdracht was het minst leuk?", + "lines" : 1 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Waarom vond je juist die opdracht niet leuk?", + "lines" : 5 +} + + +`` diff --git a/content/workbooks/lesson4/lesson4a.md b/content/workbooks/lesson4/lesson4a.md new file mode 100644 index 00000000000..ea160b111a7 --- /dev/null +++ b/content/workbooks/lesson4/lesson4a.md @@ -0,0 +1,292 @@ +# Hedy - Les 4a + +[Teacher] In level 4 leren leerlingen aanhalingstekens gebruiken in code. Dat is niet altijd de meest leuke les maar goed oefenen is wel nodig om latere frustratie te voorkomen. +Om het leuker te maken kan je in deze les andere features aanbieden, zoals `clear` of een muziekopdracht.[/Teacher] + +## Aanhalingstekens + +Aan het einde van de les: + +* snap jij waarom aanhalingstekens nodig zijn in programmeren. +* Een verhaal maken waarin willekeurige dingen gebeuren. +* Een tekening maken waarin willekeurige dingen verschijnen. + +### Variabelen + +Je hebt net op het bord de `is` opdracht gezien met een lijst. +Met als bij een gewone variabele, slaan we iets op in een lijst met `is`. + +```hedy +vrienden is Mo, Layla, Denny +print Ik ga vandaag naar vrienden at random +``` + +#### Opdracht 1: Omcirkel het juiste stukje code + +{ + "assignment": "element selection", + "question" : "Omcircel alle lijsten in deze code", + "icon" : "◯", + "code" : "vandaag is maandag\nklassen is 1HC, 1HB, 1HA\nlokalen is 011, 304, 305, OLC", + "answer" : "klassen en lokalen" +} + +{ + "assignment": "element selection", + "question" : "Op welke plek in de code wordt er tekst uit een lijst gebruikt?", + "icon" : "◯", + "code" : "klassen is 1HC, 1HB, 1HA\nprint vandaag heeft klassen at random vrij!", + "answer" : "Op het einde van regel 2" +} + +#### Opdracht 2: Voorspel de uitvoer + +Vind je het lastig? Gebruik dan weer het stappenplan om variabele-uitvoer te voorspellen. + +1. Omcirkel de plek waar de lijst wordt ingesteld +2. Omcirkel de plek waar de lijst wordt gebruikt +3. Trek een lijn tussen deze plekken +4. Bij een `at` `random` mag je zelf willekeurig iets uit de lijst kiezen. + +{ + "assignment": "output", + "icon" : "💻", + "code" : "docenten is Hermans, Merbis, Bagci, Senkal\nprint Vandaag les van docenten at random!", + "answer" : "Vandaag les van **keuze uit docenten**", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "docenten is Hermans, Merbis, Bagci, Senkal\nprint De docent vandaag is Hermans.", + "answer" : "De docent vandaag is Hermans", + "lines" : 1 +} + +{ + "assignment": "output", + "icon" : "💻", + "code" : "weer is zonnig, regen, wolken, onweer\nprint Wat is het lekker weer vandaag!", + "answer" : "Fout! Je kan een lijst niet printen", + "lines" : 1 +} + +#### Opdracht 3: Foutje? +Lees de codes goed! Welke zijn er goed of fout. + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "weer is zonnig, regen, wolken, onweer\nprint Bah! De computer loopt weer vast.", + "answer" : "Fout. Je kan een lijst niet printen" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "docenten is Hermans\nprint Vandaag alweer docenten at random", + "answer" : "Fout, docenten is geen lijst" +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "docenten is onweer, regen, ijzel\nprint Vandaag alweer docenten at random!", + "answer" : "Goed, de naam hoeft niet te kloppen voor de computer." +} + +### Avonturen + +[Teacher] Dit zijn alle avonturen zonder `add to` en `remove from`.[/Teacher] +Dit is een goed moment voor deze avonturen: +Introductie +willekeurig +Dobbelsteen +Steen, papier, schaar +Muziek +Waarzegger +Restaurant +Spookhuis +Afwas? + +### Lijsten aanpassen + +Tot nu toe hebben we lijsten steeds aan het begin van het programma ingesteld. + +```hedy +antwoorden is ja, nee, misschien +print Het antwoord is antwoorden at random +``` + +Maar soms wil je dat de gebruiker van een programma ook opties kan toevoegen. +Dat doe je met een `add` en een `to` commando. + +``` +dieren is 🐿, 🦔, 🦇, 🦉 +dier is ask Wat zou het kunnen zijn? +add dier to dieren +print het was een dieren op willekeurig +``` + +Je kan ook iets uit een lijst verwijderen, met `remove` en `from`. + +#### Opdracht 4: Goed of fout? + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "letters is a,b,c,d\nremove a to letters", + "answer" : "Fout. Bij remove hoort from, niet to." +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "eten is pizza, friet, kapsalon\nremove kroket from eten", + "answer" : "Goed, je mag iets verwijderen dat niet in de lijst zit." +} + +{ + "assignment": "MC-code", + "options" : ["Goed" , "Fout"], + "question" : "Is deze code goed of fout?", + "icon" : "🤔", + "code" : "eten is pizza, friet, kapsalon\nadd pizza to eten", + "answer" : "Goed, je mag iets toevoegen dat al in de lijst zit." +} + + +#### Opdracht 5: Schrijf de code + +Kijk goed naar de uitvoer, en schrijf er een passende code bij. +**Zorg ervoor dat er steeds minstens een willekeurige keuze in je programma zit, dus niet alleen een print!** + +{ + "assignment": "input", + "icon" : "🧑‍💻", + "output" : "Welkom bij de bingoavond\nDe drie geluksnummers zijn:\n5 en 3 en 10", + "answer" : "getallen is 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nprint Welkom bij de bingoavond\nprint De drie geluksnummers zijn:\nprint nummers at random en print nummers at random en print nummers at random", + "lines" : 4 +} + + +{ + "assignment": "input", + "icon" : "🧑‍💻", + "output" : "We gaan vanavond naar de film.\nWe kiezen: Inside Out", + "answer" : "films is Avengers, Barbie, Inside Out\nprint We gaan vanavond naar de film.\nWe kiezen: films at random", + "lines" : 2 +} + + +#### Opdracht 6: Programmeerwoorden + +We hebben deze les weer nieuwe programmeerwoorden geleerd! Leg ze uit je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent lijst?", + "lines" : 1, + "answer" : "Een variabele waarin meerdere waardes kunnen worden opgeslagen" +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent willekeurig?", + "lines" : 1, + "answer" : "Iets dat door de computer wordt uitgekozen." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat betekent toevoegen?", + "lines" : 1, + "answer" : "Iets in een lijst erbij zetten" +} + + +#### Opdracht 7: Codes + +De code `is` is in dit leven veranderd, en we hebben ook nieuwe codes geleerd. +Wat doen die? Leg het uit in je eigen woorden. + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `is`? (Let op: `is` kan dus meerdere dingen doen!)", + "lines" : 1, + "answer" : "Waarde (rechts van de is) opslaan in een variabele of lijst (links van de is)" +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `add to`?", + "lines" : 1, + "answer" : "Voeg iets aan een lijst toe. Het element om toe te voegen staat tussen `add` en `to`, en de lijst staat erachter." +} + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `remove from`?", + "lines" : 1, + "answer" : "Verwijdert iets uit een lijst. Het element om te verwijderen staat tussen `add` en `to`, en de lijst staat erachter." +} + + +{ + "assignment": "define", + "icon" : "📖", + "question" : "Wat doet het commando `at random`?", + "lines" : 1, + "answer" : "Kiest een willekeurig element uit de lijst." +} + + +### Wat vond jij? + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Wat was de leukste opdracht van dit level?", + "lines" : 1 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Waarom vond je juist die opdracht leuk?", + "lines" : 5 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Welke opdracht was het minst leuk?", + "lines" : 1 +} + +{ + "assignment": "text", + "icon" : "✍️", + "question" : "Waarom vond je juist die opdracht niet leuk?", + "lines" : 5 +} + + +`` diff --git a/content/workbooks/rewrite_all_workbooks.py b/content/workbooks/rewrite_all_workbooks.py new file mode 100644 index 00000000000..a5045822900 --- /dev/null +++ b/content/workbooks/rewrite_all_workbooks.py @@ -0,0 +1,16 @@ +import os +from workbook_rewriter import process_workbook + +current_directory = os.path.dirname(os.path.abspath(__file__)) + +max_lesson = 3 + +for lesson in range(1, max_lesson): + json_data = process_workbook(lesson, current_directory) + print() + + output_path = f"/lesson{lesson}/les{lesson}a-autogenerated.md" + + f = open(current_directory+output_path, "w") + f.write(json_data) + f.close() diff --git a/content/workbooks/workbook_rewriter.py b/content/workbooks/workbook_rewriter.py new file mode 100644 index 00000000000..58edd7536f0 --- /dev/null +++ b/content/workbooks/workbook_rewriter.py @@ -0,0 +1,161 @@ +import json + +# TODO: +# teacher content/answers +# schildpadje in de uitvoer zetten ipv regels + +templates = { + 'text': '''**{icon} Vraag**: {question}
+{note} +{lines}
+''', + 'output': '''**{icon} Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +{textfields} +``` +''', + 'define': '''**{icon} Vraag**: {question} +Antwoord: ____________________________________________________________________________________________________
+''', + 'MC': '''**{icon} Vraag**: {question} +Antwoord: {options} +''', + 'MC-code': '''**{icon} Vraag**: {question} +```hedy +{code} +``` +Antwoord: {options} +''', + 'input': '''**{icon} Vraag**: Welke code hoort bij deze uitvoer?
+Code: Uitvoer: +```hedy +{textfields} +``` +''', + 'element selection': '''**{icon} Opdracht**: {question} +```hedy +{code} +``` +''', +} + + +line = '_' * 292 + '
\n' + + +def convert_json(json): + assignment_type = json['assignment'] + template = templates[assignment_type] + + if 'lines' in json.keys(): + number_of_lines = json['lines'] + + numbered = 'numbered' in json.keys() + if numbered: + # replace the number of lines with actual lines + json['lines'] = ''.join([str(x) + '. ' + line for x in range(1, number_of_lines+1)]) + else: + # replace the number of lines with actual lines + json['lines'] = line * number_of_lines + + if 'note' in json.keys(): + json['note'] += '
' # add a newline if we have a note + else: + json['note'] = '' + + if assignment_type == 'output': + textfields = '' + turtle = 'type' in json.keys() and json['type'] == 'turtle' + code_lines = json['code'].split('\n') + number_of_input_lines = len(code_lines) + number_of_output_lines = number_of_lines + + for i in range(max(number_of_input_lines, number_of_output_lines)): + output_line = '' + if i < number_of_input_lines: + output_line = code_lines[i] + output_line = output_line.ljust(50, ' ') + if i < number_of_output_lines and not turtle: + if i == 0 and turtle: + output_line += '🐢' + output_line = output_line.ljust(76, '_') + + textfields += output_line + '\n' + + json['textfields'] = textfields + + # # todo: add more empty lines if we need more (not an issue till we get to loops) + + if assignment_type == 'input': + textfields = '' + number_of_input_lines = len(json['answer'].split('\n'))+1 + output_lines = json['output'].split('\n') + number_of_output_lines = len(output_lines) + + for i in range(max(number_of_input_lines, number_of_output_lines)-1): + newline = '' + if i < number_of_input_lines: + newline += '_' * 40 + + if i < number_of_output_lines: + output_line = output_lines[i] + newline += ' ' * 10 + output_line + + textfields += newline + '\n' + + json['textfields'] = textfields + + if 'options' in json.keys(): + all = json['options'] + json['options'] = '
〇 ' + '
〇 '.join(all) + + return template.format(**json) + + +def process_workbook(lesson, current_directory): + file_path = current_directory + f"/lesson{lesson}/les{lesson}a.md" + workbook_output = '' + json_found = '' + inside_json = False + + try: + with open(file_path, 'r') as file: + for line in file: + line = line.strip() # Strip leading and trailing whitespace + + if not line.startswith('{'): + if inside_json: + json_found += line # Add line to the buffer + else: + # this is not JSON, but markdown, just output + workbook_output += line + '\n' + + # Start of a JSON object + else: + inside_json = True + json_found = line # Start buffering JSON content + + # End of JSON + if line.endswith('}'): + inside_json = False + # Try to parse the buffered content as JSON + try: + json_part = json.loads(json_found) + workbook_output += convert_json(json_part) + # print(workbook_output) + f = open(current_directory + 'tester.md', "w") + f.write(workbook_output) + f.close() + + except json.JSONDecodeError as E: + # Skip the buffer if it's not valid JSON + print(E) + print(json_part) + finally: + json_found = "" # Reset buffer after attempting to parse + + except FileNotFoundError: + print(f"File {file_path} not found.") + + return workbook_output diff --git a/content/workbooktester.md b/content/workbooktester.md new file mode 100644 index 00000000000..bbda68032df --- /dev/null +++ b/content/workbooktester.md @@ -0,0 +1,180 @@ +# Hedy - Les 2a + +[Teacher] In level 2 leren leerlingen de codes `is` en `is ask` [/Teacher] + +## Variabelen + +Aan het einde van de les kun jij: + +* Iets opslaan in een variabele +* Een verhaal en tekening maken waarin je een variabele gebruikt + +### Variabelen + +Je hebt net op het bord de `is` opdracht gezien. +Een `is` opdracht slaat iets op in de computer, en geeft het een naam. We noemen dat een variabelen. +Wat in de variabele is opgeslagen noemen we de waarde van de variabele. + +```hedy +naam is Mo +print naam +``` + +#### Opdracht 1: Omcirkel het juiste stukje code + +**◯ Opdracht**: Omcirkel alle variabelen in deze code. +```hedy +naam is Hedy +print Hallo naam +leeftijd is 17 +print Jij bent leeftijd jaar oud +``` + +**◯ Opdracht**: Omcirkel nu de stukken code waarin een variabele **wordt ingesteld.** +```hedy +naam is Hedy +print Hallo naam +leeftijd is 17 +print Jij bent leeftijd jaar oud +``` + +**◯ Opdracht**: Omcirkel nu de stukken code waarin de waarde van een variabele **wordt gebruikt.** +```hedy +naam is Hedy +print Hallo naam +leeftijd is 17 +print Jij bent leeftijd jaar oud +``` + + + +#### Opdracht 2: Voorspel de uitvoer + +Tip: Vind je het lastig om de uitvoer te voorspellen? Gebruik dan dit stappenplan: + +1. Omcirkel de plek waar een variabele wordt ingesteld +2. Omcirkel de plek waar de variabele wordt gebruikt +3. Trek een lijn tussen deze plekken +4. Zet de waarde (aan de rechterkant van de `is` op de plek van het gebruik). + +Voorbeeld: + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +naam is Mo __________________________ +print Goed bezig naam! + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +naam is Mo __________________________ +print Goed bezig Mo! + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +voornaam is Layla __________________________ +print Goedemorgen naam! + +``` + + +#### Opdracht 3: Foutje? +Lees de codes goed! Welke zijn er goed of fout. + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +achternaam is Jansen +print Goedemorgen naam! +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +naam is +print Goedemorgen naam! +``` +Antwoord:
〇 Goed
〇 Fout + +**🤔 Vraag**: Is deze code goed of fout? +```hedy +naam is Jansen +print Goedemorgen meneer naam! +print Hallo meneer naam! +``` +Antwoord:
〇 Goed
〇 Fout + + +### Invoer vragen + +Alleen tekst opslaan is nog niet krachtig. In level 1 hebben we de code `ask` gezien. +Die code mag je nu combineren met een `is`. Dat gaat zo: + +```hedy +naam is ask Hoe heet jij? +``` + +### Invoer laten zien + +Je kan nu gewoon met een `print` het antwoord laten zien, zonder `echo`. + +```hedy +naam is ask Hoe heet jij? +print dus jij heet: naam +``` + +Als iemand die Maan heet deze code zou gebruiken, dan wordt de uitvoer: + +``` +dus jij heet: Maan +``` + +#### Opdracht 4: Voorspel de uitvoer + +Voorspel wat de uitvoer van deze codes is. Doe alsof je je eigen naam hebt ingevuld. + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +naam is ask Hoe heet jij? __________________________ +print dus jij heet: naam + +``` + +**💻 Vraag**: Wat is de uitvoer van deze code?
+Code: Uitvoer: +```hedy +toestand is ask Hoe gaat het met jou? __________________________ +print Dus het gaat toestand met jou + +``` + + +#### Opdracht 5: Programmeer-woorden + +We hebben deze les weer nieuwe woorden geleerd! Leg ze uit je eigen woorden. + +**📖 Vraag**: Wat betekent variabele? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent waarde? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat betekent instellen? +Antwoord: ____________________________________________________________________________________________________
+ + +#### Opdracht 6: Codes + +We hebben nieuwe codes geleerd: `is`, `is ask` samen. Wat doen die? Leg het uit in je eigen woorden. + +**📖 Vraag**: Wat doet het commando `is`? +Antwoord: ____________________________________________________________________________________________________
+ +**📖 Vraag**: Wat doet het commando `is ask`? +Antwoord: ____________________________________________________________________________________________________
diff --git a/grammars/keywords-ru.lark b/grammars/keywords-ru.lark index ee985271994..783fcc8bc49 100644 --- a/grammars/keywords-ru.lark +++ b/grammars/keywords-ru.lark @@ -1,8 +1,8 @@ -_DEFINE: ("define" | "define") _SPACE? -_CALL: ("call" | "call") _SPACE? -_WITH: ("with" | "with") _SPACE? +_DEFINE: ("определить" | "define") _SPACE? +_CALL: ("вызвать" | "call") _SPACE? +_WITH: ("с" | "with") _SPACE? _DEF: ("def" | "def") _SPACE? -_RETURN: ("return" | "return") _SPACE? +_RETURN: ("вернуть" | "return") _SPACE? _PRINT: ("печатать" | "print") _SPACE? _PLAY: ("play" | "play") _SPACE _ASK: ("запросить" | "ask") @@ -39,7 +39,7 @@ _AND: _SPACE? ("и" | "and") _SPACE _REPEAT: ("повторить" | "repeat") _SPACE _TIMES: _SPACE ("раз" | "times") _FOR: ("для" | "for") _SPACE -_RANGE: ("промежуток" | "range") _SPACE? +_RANGE: ("диапазон" | "range") _SPACE? _TO: _SPACE ("до" | "to") _SPACE _STEP: "шаг" | "step" _ELIF: _SPACE? ("иначе, если" | "elif") _SPACE @@ -50,5 +50,5 @@ _LENGTH: "длина" | "length" _COLOR : ("цвет" | "color") _SPACE? _PRESSED: ("нажмите" | "pressed") _SPACE? clear: ("очистить" | "clear") _SPACE? -TRUE: ("true" | "True" | "true" | "True") _SPACE? -FALSE: ("false" | "False" | "false" | "False") _SPACE? +TRUE: ("истина" | "Истина" | "true" | "True") _SPACE? +FALSE: ("ложь" | "Ложь" | "false" | "False") _SPACE? diff --git a/highlighting/highlighting-trad.json b/highlighting/highlighting-trad.json index a0d111f1c8a..197fd169ec3 100644 --- a/highlighting/highlighting-trad.json +++ b/highlighting/highlighting-trad.json @@ -2360,8 +2360,8 @@ "DIGIT": "0123456789" }, "ru": { - "False": "False", - "True": "True", + "False": "Ложь|False", + "True": "Истина|True", "add": "добавить|add", "and": "и|and", "ask": "запросить|ask", @@ -2369,16 +2369,16 @@ "black": "чёрный|black", "blue": "синий|blue", "brown": "коричневый|brown", - "call": "call", + "call": "вызвать|call", "clear": "очистить|clear", "color": "цвет|color", "comma": ",", "def": "def", - "define": "define", + "define": "определить|define", "echo": "повторить|echo", "elif": "иначе, если|elif", "else": "иначе|else", - "false": "false", + "false": "ложь|false", "for": "для|for", "forward": "вперёд|forward", "from": "из|from", @@ -2399,22 +2399,22 @@ "print": "печатать|print", "purple": "пурпурный|purple", "random": "случайном|random", - "range": "промежуток|range", + "range": "диапазон|range", "red": "красный|red", "remove": "удалить|remove", "repeat": "повторить|repeat", - "return": "return", + "return": "вернуть|return", "right": "направо|right", "sleep": "заснуть|sleep", "step": "шаг|step", "times": "раз|times", "to": "до|to", "to_list": "в|to", - "true": "true", + "true": "истина|true", "turn": "повернуть|turn", "while": "пока|while", "white": "белый|white", - "with": "with", + "with": "с|with", "yellow": "жёлтый|yellow", "DIGIT": "0123456789" }, diff --git a/static/js/appbundle.js b/static/js/appbundle.js index fcdab0a44a6..890006e2038 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -60574,7 +60574,7 @@ ${o3}` : i3; "CheckInternet": "\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0434\u0430\u043B\u0438 \u0438\u043C\u0430\u0448 \u0432\u0440\u044A\u0437\u043A\u0430 \u0441 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442.", "Connection_error": "\u0418\u0437\u0433\u0443\u0431\u0438\u0445\u043C\u0435 \u0432\u0440\u044A\u0437\u043A\u0430 \u0441\u044A\u0441 \u0441\u044A\u0440\u0432\u044A\u0440\u0430.", "Empty_output": "\u041A\u043E\u0434\u044A\u0442 \u0440\u0430\u0431\u043E\u0442\u0438, \u043D\u043E \u043D\u044F\u043C\u0430 \u043D\u0438\u0449\u043E \u0437\u0430 \u043F\u0440\u0438\u043D\u0442\u0438\u0440\u0430\u043D\u0435.", - "Errors_found": "You made a mistake! Don't worry, Hedy is trying to find the mistakes", + "Errors_found": "\u0414\u043E\u043F\u0443\u0441\u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0430! \u041D\u0435 \u0441\u0435 \u0442\u0440\u0435\u0432\u043E\u0436\u0438, \u043D\u0438\u0435 \u0443\u0441\u043F\u044F\u0445\u043C\u0435 \u0434\u0430 \u0438\u0437\u043F\u044A\u043B\u043D\u0438\u043C \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430\u0442\u0430", "Execute_error": "\u041D\u0435\u0449\u043E \u0441\u0435 \u043E\u0431\u044A\u0440\u043A\u0430 \u043F\u0440\u0438 \u0438\u0437\u043F\u044A\u043B\u043D\u0435\u043D\u0438\u0435\u0442\u043E \u043D\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430\u0442\u0430.", "Other_error": "\u041E\u0439! \u041C\u0430\u0439 \u0438\u043C\u0430\u043C\u0435 \u043D\u044F\u043A\u0430\u043A\u0432\u0430 \u0433\u0440\u0435\u0448\u043A\u0430 \u0432 \u043A\u043E\u0434\u0430.", "Program_repair": "This could be the correct code, can you fix it?", @@ -98901,8 +98901,8 @@ def note_with_error(value, err): DIGIT: "0123456789" }; var ru = { - False: "False", - True: "True", + False: "\u041B\u043E\u0436\u044C|False", + True: "\u0418\u0441\u0442\u0438\u043D\u0430|True", add: "\u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C|add", and: "\u0438|and", ask: "\u0437\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u044C|ask", @@ -98910,16 +98910,16 @@ def note_with_error(value, err): black: "\u0447\u0451\u0440\u043D\u044B\u0439|black", blue: "\u0441\u0438\u043D\u0438\u0439|blue", brown: "\u043A\u043E\u0440\u0438\u0447\u043D\u0435\u0432\u044B\u0439|brown", - call: "call", + call: "\u0432\u044B\u0437\u0432\u0430\u0442\u044C|call", clear: "\u043E\u0447\u0438\u0441\u0442\u0438\u0442\u044C|clear", color: "\u0446\u0432\u0435\u0442|color", comma: ",", def: "def", - define: "define", + define: "\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C|define", echo: "\u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C|echo", elif: "\u0438\u043D\u0430\u0447\u0435, \u0435\u0441\u043B\u0438|elif", else: "\u0438\u043D\u0430\u0447\u0435|else", - false: "false", + false: "\u043B\u043E\u0436\u044C|false", for: "\u0434\u043B\u044F|for", forward: "\u0432\u043F\u0435\u0440\u0451\u0434|forward", from: "\u0438\u0437|from", @@ -98940,22 +98940,22 @@ def note_with_error(value, err): print: "\u043F\u0435\u0447\u0430\u0442\u0430\u0442\u044C|print", purple: "\u043F\u0443\u0440\u043F\u0443\u0440\u043D\u044B\u0439|purple", random: "\u0441\u043B\u0443\u0447\u0430\u0439\u043D\u043E\u043C|random", - range: "\u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A|range", + range: "\u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D|range", red: "\u043A\u0440\u0430\u0441\u043D\u044B\u0439|red", remove: "\u0443\u0434\u0430\u043B\u0438\u0442\u044C|remove", repeat: "\u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C|repeat", - return: "return", + return: "\u0432\u0435\u0440\u043D\u0443\u0442\u044C|return", right: "\u043D\u0430\u043F\u0440\u0430\u0432\u043E|right", sleep: "\u0437\u0430\u0441\u043D\u0443\u0442\u044C|sleep", step: "\u0448\u0430\u0433|step", times: "\u0440\u0430\u0437|times", to: "\u0434\u043E|to", to_list: "\u0432|to", - true: "true", + true: "\u0438\u0441\u0442\u0438\u043D\u0430|true", turn: "\u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u044C|turn", while: "\u043F\u043E\u043A\u0430|while", white: "\u0431\u0435\u043B\u044B\u0439|white", - with: "with", + with: "\u0441|with", yellow: "\u0436\u0451\u043B\u0442\u044B\u0439|yellow", DIGIT: "0123456789" }; diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index c84d553f6ac..a87ac1c053f 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 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 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) {\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 = stringToLowerCase(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])) {\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 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(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nexport const ERB_EXPR = seal(/<%[\\s\\S]*|[\\s\\S]*%>/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);\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 stringIndexOf,\n stringTrim,\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 });\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 typeof implementation.createHTMLDocument !== 'undefined' &&\n documentMode !== 9;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\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 const 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 /* 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 /* 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 let SANITIZE_DOM = true;\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 /* 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 /* 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 /* Set configuration parameters */\n ALLOWED_TAGS =\n 'ALLOWED_TAGS' in cfg\n ? addToSet({}, cfg.ALLOWED_TAGS)\n : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR =\n 'ALLOWED_ATTR' in cfg\n ? addToSet({}, cfg.ALLOWED_ATTR)\n : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES =\n 'ADD_URI_SAFE_ATTR' in cfg\n ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR)\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS =\n 'ADD_DATA_URI_TAGS' in cfg\n ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS)\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS =\n 'FORBID_CONTENTS' in cfg\n ? addToSet({}, cfg.FORBID_CONTENTS)\n : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};\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 SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\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 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 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 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 ? (x) => x\n : stringToLowerCase;\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);\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);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);\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);\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 'desc',\n 'title',\n 'annotation-xml',\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: HTML_NAMESPACE,\n tagName: 'template',\n };\n }\n\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\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 // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erronously deleted from\n // HTML namespace.\n const commonSvgAndHTMLElements = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script',\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 (commonSvgAndHTMLElements[tagName] || !ALL_SVG_TAGS[tagName])\n );\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 or MathML). 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 (PARSER_MEDIA_TYPE === 'application/xhtml+xml') {\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 ? '' : 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 NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT,\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.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 );\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 (stringMatch(currentNode.nodeName, /[\\u0080-\\uFFFF]/)) {\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 !_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(/