From 290ef826230f8e441e7e95c80208f7d4b7d724b8 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Fri, 24 Nov 2023 17:56:16 +0100 Subject: [PATCH 01/15] Translated using Weblate (Indonesian) Currently translated at 97.5% (562 of 576 strings) Translated using Weblate (Spanish) Currently translated at 98.0% (565 of 576 strings) Translated using Weblate (Hebrew) Currently translated at 26.7% (214 of 800 strings) Translated using Weblate (Frisian) Currently translated at 29.7% (238 of 800 strings) Translated using Weblate (Arabic) Currently translated at 39.8% (319 of 800 strings) Translated using Weblate (Hindi) Currently translated at 32.1% (257 of 800 strings) Translated using Weblate (Indonesian) Currently translated at 53.8% (431 of 800 strings) Translated using Weblate (Hungarian) Currently translated at 35.7% (286 of 800 strings) Co-authored-by: Prefill add-on Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/ar/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/fy/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/he/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/hi/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/hu/ Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/id/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/es/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/id/ Translation: Hedy/Adventures Translation: Hedy/Texts --- content/adventures/ar.yaml | 37 +-- content/adventures/fy.yaml | 5 +- content/adventures/he.yaml | 8 +- content/adventures/hi.yaml | 8 +- content/adventures/hu.yaml | 14 +- content/adventures/id.yaml | 45 +-- translations/es/LC_MESSAGES/messages.po | 391 ++++++++++++++++++------ translations/id/LC_MESSAGES/messages.po | 335 +++++++++++++++----- 8 files changed, 600 insertions(+), 243 deletions(-) diff --git a/content/adventures/ar.yaml b/content/adventures/ar.yaml index d06f3f8fa75..3d6b92b25c1 100644 --- a/content/adventures/ar.yaml +++ b/content/adventures/ar.yaml @@ -77,8 +77,7 @@ adventures: story_text: | ربما لاحظت أنه لا زال هناك مشكلة في المستويات السابقة عند محاولة طباعة جملة تحتوي على كلمة -الاسم-؟ مثل: `{print}` الاسم هو الاسم. ستتمكن من حل هذه المشكلة في هذا المستوى. يجب أن تضع علامات الاقتباس حول أي نص تريد طباعته. - example_code: "```\nالاسم {is} حسن \n{print} _الاسم الأول للشخصية الرئيسية في القصة هو_ الاسم\n{print} الاسم _ذاهبٌ الآن للسير في الغابة_\n{print} الاسم _خائفٌ قليلًا_\nالحيوانات {is} \U0001F994, \U0001F43F, \U0001F989, \U0001F987\n{print} _لقد سمع صوت_ الحيوانات {at} {random}\n{print}\ - \ الاسم _خائفٌ أن تكون هذه الغابة مسكونة_\n```\n" + example_code: "```\nالاسم {is} حسن \n{print} _الاسم الأول للشخصية الرئيسية في القصة هو_ الاسم\n{print} الاسم _ذاهبٌ الآن للسير في الغابة_\n{print} الاسم _خائفٌ قليلًا_\nالحيوانات {is} 🦔, 🐿, 🦉, 🦇\n{print} _لقد سمع صوت_ الحيوانات {at} {random}\n{print} الاسم _خائفٌ أن تكون هذه الغابة مسكونة_\n```\n" start_code: '{print} ''Your story will be printed here!''' 5: story_text: | @@ -527,6 +526,7 @@ adventures: يمكنك أيضاً ترك الكومبيوتر يختار لك أرقام عشوائياً بإستخدام الأمر بشكل عشوائي. يوضح هذا المثال كيفية إختيار رقم من الجداول للتدريب، و بذلك تحصل على أرقام مختلفة دائماً لتتمرن على ناتج الضرب: start_code: '{print} "أهلاً بكم في هذه الآلة الحاسبة!"' + example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | لقد تعلمت صنع آلة حاسبة في المستويات السابقة. يمكنك الآن أن تطور البرنامج وتحوله للعبة حسابية. هكذا ... @@ -1374,7 +1374,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1425,7 +1425,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -1455,8 +1455,7 @@ adventures: بامكانك اظهار/طباعة الكلام على الشاشة من خلال استعمال الأمر `{print}` . start_code: '{print} مرحبا أيها العالم!' 2: - story_text: "في المستوى 2 نتعلم الأوامر الجديدة `{is}` و `{sleep}`.\nيمكنك أن تعطي اسما لشيء ما باستخدام `{is}`. هذا ما يسمى ب \"متغير\". في المثال الموجود قمنا بانشاء متغير يسمى الاسم ومتغير آخر يسمى العمر. يمكنك أن تستخدم كلمة الاسم في أي مكان في البرنامج الخاص بك وسيتم استبدالها ب هيدي،\ - \ كما في المثال التوضيحي: \n\nبهذا الشكل لم تعد الان بحاجة للأمر `{echo}`.\n" + story_text: "في المستوى 2 نتعلم الأوامر الجديدة `{is}` و `{sleep}`.\nيمكنك أن تعطي اسما لشيء ما باستخدام `{is}`. هذا ما يسمى ب \"متغير\". في المثال الموجود قمنا بانشاء متغير يسمى الاسم ومتغير آخر يسمى العمر. يمكنك أن تستخدم كلمة الاسم في أي مكان في البرنامج الخاص بك وسيتم استبدالها ب هيدي، كما في المثال التوضيحي: \n\nبهذا الشكل لم تعد الان بحاجة للأمر `{echo}`.\n" example_code: | ``` الاسم {is} هيدي @@ -1554,8 +1553,7 @@ adventures: {else} {print} "البيتزا أفضل" 10: - story_text: في هذا المستوى نتعلم أمراً جديداً وهو الأمر `{for}`. باستخدام الأمر`{for}`يمكننا المرور على كل العناصر الموجودة في قائمة. `{for}` تقوم بخلق مجموعة من الأوامر تختها كما في الأوامر `{repeat}`و`{if}` لذلك يجب علينا ان نستخدم الإزاحة (نضع الفراغات) للسطور البرمجية التي نريد كتابتها - مع الأمر `{for}`. + story_text: في هذا المستوى نتعلم أمراً جديداً وهو الأمر `{for}`. باستخدام الأمر`{for}`يمكننا المرور على كل العناصر الموجودة في قائمة. `{for}` تقوم بخلق مجموعة من الأوامر تختها كما في الأوامر `{repeat}`و`{if}` لذلك يجب علينا ان نستخدم الإزاحة (نضع الفراغات) للسطور البرمجية التي نريد كتابتها مع الأمر `{for}`. example_code: | ``` حيواناتي_المفضلة {is} الكلب، الزرافة، السلحفاة @@ -1586,8 +1584,7 @@ adventures: {print} "نستطيع الان كتابة الأرقام العشرية باستخدام النقطة كفاصل بين العدد الصحيح والكسور" {print} ٢.٥ + ٢.٥ 13: - story_text: 'سنتعلم الان عن استعمال الأوامر `{and}` و `{or}`! اذا كنا نريد فحص أمرين في نفس الوقت لسنا بحاجة الى استعمال الأمر "اذا" مرتين، بل يمكننا أن نستعمل `{and}` و `{or}`. اذا استعملنا الأمر `{and}` بين الفحصين: يجب أن يكون كلا الفحصين (على اليمين واليسار) صحيحين من أجل تنفيذ الكود - المتضمن في الأمر "اذا". أما اذا استعملنا الأمر `{or}` بين الفحصين: عندها يكفي أن يكون فحص واحد منهم صحيحاً لتنفيذ الكود المتضمن في الأمر "اذا".' + story_text: 'سنتعلم الان عن استعمال الأوامر `{and}` و `{or}`! اذا كنا نريد فحص أمرين في نفس الوقت لسنا بحاجة الى استعمال الأمر "اذا" مرتين، بل يمكننا أن نستعمل `{and}` و `{or}`. اذا استعملنا الأمر `{and}` بين الفحصين: يجب أن يكون كلا الفحصين (على اليمين واليسار) صحيحين من أجل تنفيذ الكود المتضمن في الأمر "اذا". أما اذا استعملنا الأمر `{or}` بين الفحصين: عندها يكفي أن يكون فحص واحد منهم صحيحاً لتنفيذ الكود المتضمن في الأمر "اذا".' example_code: | ``` اسمك = {ask} "ما اسمك؟" @@ -1621,8 +1618,7 @@ adventures: {else} {print} "أنت أكبر مني!" 15: - story_text: "سنتعلم نوعا جديداً من دورات التكرار، التكرار باستخدام الأمر `{while}`! يستمر تنفيذ الكود طالما لا تزال نتيجة الفحص الذي نقوم به صالحة/صحيحة. \n لذلك يجب علينا ألا ننسى أن نغير قيمة المتغير الذي نفحصه في داخل دورة التكرار. \n\nفي المثال التوضيحي، يستمر الكود في التنفيذ (سؤال\ - \ نتيجة الضرب) حتى نحصل على اجابة صحيحة.\nاذا لم يتم اعطاء اجابة صحيحة فتستمر دورة التكرار (والبرنامج ككل) في التتنفيذ الى الأبد!" + story_text: "سنتعلم نوعا جديداً من دورات التكرار، التكرار باستخدام الأمر `{while}`! يستمر تنفيذ الكود طالما لا تزال نتيجة الفحص الذي نقوم به صالحة/صحيحة. \n لذلك يجب علينا ألا ننسى أن نغير قيمة المتغير الذي نفحصه في داخل دورة التكرار. \n\nفي المثال التوضيحي، يستمر الكود في التنفيذ (سؤال نتيجة الضرب) حتى نحصل على اجابة صحيحة.\nاذا لم يتم اعطاء اجابة صحيحة فتستمر دورة التكرار (والبرنامج ككل) في التتنفيذ الى الأبد!" example_code: "```\nالاجابة = ٠ \n{while} الاجابة != ٢٥\n الاجابة = {ask} \"ما ناتج ٥ ضرب ٥؟\"\n{print} \"تم الاجابة بشكل صحيح\"\n```\n" start_code: |- الاجابة = ٠ @@ -1630,8 +1626,7 @@ adventures: الاجابة = {ask} "ما ناتج ٥ ضرب ٥؟" {print} "تم الاجابة بشكل صحيح" 16: - story_text: "سنتعلم الان كيفية كتابة القائمة باستخدام طريقة لغة البرمجة بايثون (python) عن طريق احاطة القائمة بالأقواس المربعة (أو المعقوفتان)! نستمر بوضع علامات الاقتباس حول كل عنصر نصي (كلمة اواسم مثلا) كما في المستويات السابقة. \nيمكننا استخدام الأقواس المربعة أيضا للاشارة الى مكان\ - \ محدد في القائمة." + story_text: "سنتعلم الان كيفية كتابة القائمة باستخدام طريقة لغة البرمجة بايثون (python) عن طريق احاطة القائمة بالأقواس المربعة (أو المعقوفتان)! نستمر بوضع علامات الاقتباس حول كل عنصر نصي (كلمة اواسم مثلا) كما في المستويات السابقة. \nيمكننا استخدام الأقواس المربعة أيضا للاشارة الى مكان محدد في القائمة." example_code: | ``` صديقي = ["أحمد"، "علاء"، "سامر"] @@ -1982,8 +1977,7 @@ adventures: الان هيدي العرافة تستطيع الإجابة بنعم، لا او ربما فقط. هل يمكنك أن تعطيها خيارات لإجابات أخرى مثل "بالتأكيد" او "{ask} مرة أخرى". start_code: '# اكتب الكود الخاص بك هنا' 4: - story_text: "في هذا المستوى لن تتعلم أوامر جديدة، لكنك ستتدرب على استخدام علامات الاقتباس. \nتستطيع إعادة كتابة الكود الخاص بك في المستوى الثالث، ولا تنسَ أن تضع علامات الاقتباس في الأماكن الصحيحة.\n\nفي المستوى الثالث, لم نستطع استخدام كلمة ’السؤال‘ اسمًا للمتغير وإعادة استخدامها في النص\ - \ مرة أخرى ككلمة عادية.\nلا تقلق! علامات الاقتباس ستجعل هذا الأمر ممكنًا!\n" + story_text: "في هذا المستوى لن تتعلم أوامر جديدة، لكنك ستتدرب على استخدام علامات الاقتباس. \nتستطيع إعادة كتابة الكود الخاص بك في المستوى الثالث، ولا تنسَ أن تضع علامات الاقتباس في الأماكن الصحيحة.\n\nفي المستوى الثالث, لم نستطع استخدام كلمة ’السؤال‘ اسمًا للمتغير وإعادة استخدامها في النص مرة أخرى ككلمة عادية.\nلا تقلق! علامات الاقتباس ستجعل هذا الأمر ممكنًا!\n" example_code: | ```{print} 'انا العرافة هيدي!' السؤال {is} {ask} 'ماذا تريد ان تعرف ؟' @@ -2293,8 +2287,7 @@ adventures: اذا اخترت الباب الصحيح سوف تنجو، والا سيمسك بك وحش مخيف و ..... في المستوى ١ سنبدأ لعبة بيت الأشباح بسرد قصة وسؤال اللاعب عن الشبح الذي سيراه في البيت المسكون. - example_code: "```\n{print} ما الذي جاء بي الى هنا؟\n{print} اتذكر ان صديقي اخبرني ان اتي الي هذا القصر القديم...\n{print} ولكن فجأة اصبح كل شيء اسود.\n{print} كيف انتهى بي المطاف في هذا الطابق..؟\n{print} رأسي تؤلمني كثيرًا.. كأنه تم ضربي بمضرب كبير!\n{print} ما هذا الصوت؟؟\n{print} يا\ - \ الهي! اعتقد انني لست الوحيد في هذا القصر!\n{print} يجب علي الخروج من هنا!\n{print} هناك ٣ ابواب امامي..\n{ask} ما الباب الذي علي اختباره للخروج؟\n{echo} اختار الباب \n{print} ...؟\n```\n" + example_code: "```\n{print} ما الذي جاء بي الى هنا؟\n{print} اتذكر ان صديقي اخبرني ان اتي الي هذا القصر القديم...\n{print} ولكن فجأة اصبح كل شيء اسود.\n{print} كيف انتهى بي المطاف في هذا الطابق..؟\n{print} رأسي تؤلمني كثيرًا.. كأنه تم ضربي بمضرب كبير!\n{print} ما هذا الصوت؟؟\n{print} يا الهي! اعتقد انني لست الوحيد في هذا القصر!\n{print} يجب علي الخروج من هنا!\n{print} هناك ٣ ابواب امامي..\n{ask} ما الباب الذي علي اختباره للخروج؟\n{echo} اختار الباب \n{print} ...؟\n```\n" story_text_2: | هل يمكنك تكملة القصة المخيفة هذه؟ او ابتكار قصتك الخاصة لبيت الأشباح؟ start_code: '{print} كيف وصلت الى هنا؟' @@ -2367,8 +2360,7 @@ adventures: في هذا المستوى ، يمكنك الفوز باللعبة فقط باختيار نفس الباب الذي اختاره هيدي عشوائيًا. هل يمكنك العثور على الكلمات الأربع المفقودة لإكمال الكود؟ - example_code: "```\n{print} 'اهرب من بيت الأشباح !'\n{print} 'أمامك 3 أبواب ...'\nالأبواب {is} ۱ ، ۲، ۳ \nالوحوش {is} مستذئب، مومياء، مصاص دماء، زومبي\n الباب_الذي_إخترته {is} {ask} 'أي باب تختار؟'\n{print} 'انت إخترت باب ..' الباب_الذي_إخترته\n{sleep}\nالباب_الصحيح {is} الأبواب {at}\ - \ {random}\n____ {print} 'رائعة! لقد نجوت!'\n{else} {print} 'أوه لا! لقد تم أكلك من قبل ... \"الوحوش {at} {random}\n```\n" + example_code: "```\n{print} 'اهرب من بيت الأشباح !'\n{print} 'أمامك 3 أبواب ...'\nالأبواب {is} ۱ ، ۲، ۳ \nالوحوش {is} مستذئب، مومياء، مصاص دماء، زومبي\n الباب_الذي_إخترته {is} {ask} 'أي باب تختار؟'\n{print} 'انت إخترت باب ..' الباب_الذي_إخترته\n{sleep}\nالباب_الصحيح {is} الأبواب {at} {random}\n____ {print} 'رائعة! لقد نجوت!'\n{else} {print} 'أوه لا! لقد تم أكلك من قبل ... \"الوحوش {at} {random}\n```\n" start_code: '# place your code here' 9: story_text: | @@ -3330,7 +3322,7 @@ adventures: 1: story_text: | في المستوى ١ ستتمكن من صنع مطعم افتراضي وتأخذ طلبات الطعام الخاصة بضيوفك. - example_code: "```{print} \U0001F35F اهلاً بكم في مطعم هيدي \n{ask} ماذا تود ان تطلب؟\n{echo} اذاً، طلبك هو \n{print} شكرًا لطلبكم من مطعمنا!\n{print} طلبك في طريقه إليك!\n ```\n" + example_code: "```{print} 🍟 اهلاً بكم في مطعم هيدي \n{ask} ماذا تود ان تطلب؟\n{echo} اذاً، طلبك هو \n{print} شكرًا لطلبكم من مطعمنا!\n{print} طلبك في طريقه إليك!\n ```\n" story_text_2: | هل يمكنك التفكير في عدة سطور اخرى تضيفها لتطور كود مطعمك؟ على سبيل المثال، هل يمكنك استخدام `{ask}` لسؤال الضيوف ماذا يفضلون كشراب بجانب وجبتهم، وبعد ذلك اخبارهم بسعر طلبهم، و ان تتمنى لهم وجبة هنيئة؟ start_code: '# اكتب الكود الخاص بك هنا' @@ -4433,8 +4425,7 @@ adventures: الجواب {is} {ask} كم عدد الخطوات التي يجب أن يتقدمها الرسام؟ {forward} الجواب ``` - story_text_2: "بالاضافة الى ذلك، الرسام لم يكن قادراً إلا على الاستدارة الى اليمن أو اليسار. هذا ممل بعض الشيء! \nفي المستوى الثاني يمكننا الاإستدارة في كل الإتجاهات!\n\nاستعمل ٩٠ للإستدارة بمقدار ربع دائرة. هذا ما نسميه بالدرجات. استدارة كاملة تساوي ٣٦٠ درجة.\nهل تستطيع أن ترسم شكلاً\ - \ معينا باستخدام هذا الكود؟ ربما مثلث أو دائرة؟\n" + story_text_2: "بالاضافة الى ذلك، الرسام لم يكن قادراً إلا على الاستدارة الى اليمن أو اليسار. هذا ممل بعض الشيء! \nفي المستوى الثاني يمكننا الاإستدارة في كل الإتجاهات!\n\nاستعمل ٩٠ للإستدارة بمقدار ربع دائرة. هذا ما نسميه بالدرجات. استدارة كاملة تساوي ٣٦٠ درجة.\nهل تستطيع أن ترسم شكلاً معينا باستخدام هذا الكود؟ ربما مثلث أو دائرة؟\n" example_code_2: | ``` {print} رسم الأشكال diff --git a/content/adventures/fy.yaml b/content/adventures/fy.yaml index ac8f7eb0402..70adc7fd295 100644 --- a/content/adventures/fy.yaml +++ b/content/adventures/fy.yaml @@ -542,6 +542,7 @@ adventures: story_text_3: | You can also let the computer do random calculations on its own using {random}. start_code: '{print} ''Welcome to this calculator!''' + example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | In previous levels you've learned how to make a calculator, in this level you can expand that code and make it into a little maths game. Like this... @@ -1389,7 +1390,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1440,7 +1441,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] diff --git a/content/adventures/he.yaml b/content/adventures/he.yaml index 0e976825091..646dd6f3fdd 100644 --- a/content/adventures/he.yaml +++ b/content/adventures/he.yaml @@ -543,6 +543,7 @@ adventures: story_text_3: | You can also let the computer do random calculations on its own using {random}. start_code: '{print} ''Welcome to this calculator!''' + example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | In previous levels you've learned how to make a calculator, in this level you can expand that code and make it into a little maths game. Like this... @@ -1391,7 +1392,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1442,7 +1443,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -1464,8 +1465,7 @@ adventures: description: הסבר שלב levels: 1: - story_text: "בשלב 1 תוכלו להשתמש בפקודות `{print}`, `{ask}` ו-`{echo}`.\n הקלידו את הקוד שלכם בשדה התכנות. או לחצו על הכפתור הירוק בבלוק הקוד לדוגמה, והקוד יוקלד עבורכם!\nנסו את הקוד בעצמכם בעזרת הכפתור הירוק 'הרץ קוד' מתחת לשדה התכנות.\n\nתוכלו להדפיס טקסט למסך בעזרת הפקודה `{print}`.\ - \ \n" + story_text: "בשלב 1 תוכלו להשתמש בפקודות `{print}`, `{ask}` ו-`{echo}`.\n הקלידו את הקוד שלכם בשדה התכנות. או לחצו על הכפתור הירוק בבלוק הקוד לדוגמה, והקוד יוקלד עבורכם!\nנסו את הקוד בעצמכם בעזרת הכפתור הירוק 'הרץ קוד' מתחת לשדה התכנות.\n\nתוכלו להדפיס טקסט למסך בעזרת הפקודה `{print}`. \n" start_code: '{print} שלום עולם!' 2: story_text: | diff --git a/content/adventures/hi.yaml b/content/adventures/hi.yaml index 9f1be5ada88..156dac212dc 100644 --- a/content/adventures/hi.yaml +++ b/content/adventures/hi.yaml @@ -542,6 +542,7 @@ adventures: story_text_3: | You can also let the computer do random calculations on its own using {random}. start_code: '{print} ''Welcome to this calculator!''' + example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | In previous levels you've learned how to make a calculator, in this level you can expand that code and make it into a little maths game. Like this... @@ -1389,7 +1390,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1440,7 +1441,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -1632,8 +1633,7 @@ adventures: {print} 'दशमलव संख्याओं को अब एक बिंदु का उपयोग करने की आवश्यकता है' {print} 2.5 + 2.5 13: - story_text: अब हम `{and}` और `{or}` सीखने जा रहे हैं! यदि आप दो कथनों की जाँच करना चाहते हैं, तो आपको दो if's का उपयोग करने की आवश्यकता नहीं है, लेकिन `{and}` और `{or}` का उपयोग कर सकते हैं। यदि आप `{and}` का उपयोग करते हैं, तो `{and}` के बाएं और दाएं दोनों कथन सत्य होने चाहिए। हम `या` - का भी उपयोग कर सकते हैं। तब केवल एक कथन सही होना चाहिए। + story_text: अब हम `{and}` और `{or}` सीखने जा रहे हैं! यदि आप दो कथनों की जाँच करना चाहते हैं, तो आपको दो if's का उपयोग करने की आवश्यकता नहीं है, लेकिन `{and}` और `{or}` का उपयोग कर सकते हैं। यदि आप `{and}` का उपयोग करते हैं, तो `{and}` के बाएं और दाएं दोनों कथन सत्य होने चाहिए। हम `या` का भी उपयोग कर सकते हैं। तब केवल एक कथन सही होना चाहिए। example_code: | ``` name = ask 'what is your name?' diff --git a/content/adventures/hu.yaml b/content/adventures/hu.yaml index 6199041d9ac..efbae64979b 100644 --- a/content/adventures/hu.yaml +++ b/content/adventures/hu.yaml @@ -546,6 +546,7 @@ adventures: story_text_3: | You can also let the computer do random calculations on its own using {random}. start_code: print 'Üdvözlünk a számológépnél!' + example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: A 6. szinten megtanultad a számológép készítését, a 7. szinten kibővítheted ezt a kódot, és egy kis matematikai játékot készíthetsz belőle. Mint ez... example_code: |- @@ -1392,7 +1393,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1443,7 +1444,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -1465,8 +1466,7 @@ adventures: description: Szint magyarázat levels: 1: - story_text: "Az első szinten a `{print}`, `{ask}` és `{echo}` parancsokat használhatod.\nÍrd a kódodat a programozási ablakba, vagy nyomd meg a gombot a példa programok mellett, hogy bemásold!\nPróbáld ki a kódot a zöld 'Kód futtatása' gomb megnyomásával a programozási ablak alatt!\n\n\ - Szöveget írhatsz a képernyőre a `{print}` paranccsal. \n" + story_text: "Az első szinten a `{print}`, `{ask}` és `{echo}` parancsokat használhatod.\nÍrd a kódodat a programozási ablakba, vagy nyomd meg a gombot a példa programok mellett, hogy bemásold!\nPróbáld ki a kódot a zöld 'Kód futtatása' gomb megnyomásával a programozási ablak alatt!\n\nSzöveget írhatsz a képernyőre a `{print}` paranccsal. \n" start_code: '{print} Helló világ!' 2: story_text: | @@ -1618,8 +1618,7 @@ adventures: {print} 'a tizedes törtek pontot használnak' {print} 2.5 + 2.5 13: - story_text: Most megtanuljuk az `{and}` és `{or}` kifejezések használatát! Ha két állítást szeretnél ellenőrizni, akkor nem kell kettő {if} parancsot használnod, használhatod az `{and}` és `{or}` parancsokat. Ha az `{and}` parancsot használod, akkor az `{and}` bal és jobb oldalán mindkét - állításnak igaznak kell lennie. `{or}` esetén csak egy állításnak kell helyesnek lennie. + story_text: Most megtanuljuk az `{and}` és `{or}` kifejezések használatát! Ha két állítást szeretnél ellenőrizni, akkor nem kell kettő {if} parancsot használnod, használhatod az `{and}` és `{or}` parancsokat. Ha az `{and}` parancsot használod, akkor az `{and}` bal és jobb oldalán mindkét állításnak igaznak kell lennie. `{or}` esetén csak egy állításnak kell helyesnek lennie. example_code: | ``` név = {ask} "Hogy hívnak?" @@ -3525,8 +3524,7 @@ adventures: ``` start_code: '# place your code here' 4: - story_text: "A 3. szinten idézőjeleket fogunk alkalmazni, amikor a `print` parancsot használjuk.\nTudod-e idézőjelek hozzáadásával működtetni a 2. szintű kódodat a 3. szinten?\n\nLégy óvatos! A 2. szinten aposztrófokat engedélyeztek a szövegben, de a 3. szinten Hedy összetéveszti őket\ - \ idézőjelekkel, és a kód nem fog működni!\nTehát ahelyett, hogy beírnád a `print ma pizzát szolgálunk fel` kifejezést, írd be a `print` \n ma pizzát szolgálunk fel` parancsot." + story_text: "A 3. szinten idézőjeleket fogunk alkalmazni, amikor a `print` parancsot használjuk.\nTudod-e idézőjelek hozzáadásával működtetni a 2. szintű kódodat a 3. szinten?\n\nLégy óvatos! A 2. szinten aposztrófokat engedélyeztek a szövegben, de a 3. szinten Hedy összetéveszti őket idézőjelekkel, és a kód nem fog működni!\nTehát ahelyett, hogy beírnád a `print ma pizzát szolgálunk fel` kifejezést, írd be a `print` \n ma pizzát szolgálunk fel` parancsot." example_code: |- ``` print 'Üdvözlünk a Hedy Étteremben!' diff --git a/content/adventures/id.yaml b/content/adventures/id.yaml index 03785775a6c..28b93517d4d 100644 --- a/content/adventures/id.yaml +++ b/content/adventures/id.yaml @@ -550,6 +550,7 @@ adventures: nomor_2 = {ask} 'Isi angka kedua:' jawaban_benar = nomor_1 * nomor_2 {print} nomor_1 ' dikalikan ' nomor_2 ' adalah 'jawaban_benar + example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | Di level 6 Anda membuat kalkulator, di level ini Anda dapat memperluas kode tersebut sehingga menanyakan banyak pertanyaan. @@ -1414,7 +1415,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1465,7 +1466,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -1487,12 +1488,10 @@ adventures: description: Penjelasan level levels: 1: - story_text: "Pada level 1 kamu dapat menggunakan perintah `{print}`, `{ask}` dan `{echo}`.\nTulis kodingan kamu di bagian tampilan kode. Atau tekan tombol hijau di contoh kode, dan kode akan dituliskan sendiri!\nCoba jalankan kodenya dengan menekan tombol 'Run code' di bawah tampilan kode.\n\ - \nAnda dapat print text di tampilan dengan menggunakan perintah `{print}` . \n" + story_text: "Pada level 1 kamu dapat menggunakan perintah `{print}`, `{ask}` dan `{echo}`.\nTulis kodingan kamu di bagian tampilan kode. Atau tekan tombol hijau di contoh kode, dan kode akan dituliskan sendiri!\nCoba jalankan kodenya dengan menekan tombol 'Run code' di bawah tampilan kode.\n\nAnda dapat print text di tampilan dengan menggunakan perintah `{print}` . \n" start_code: '{print} hallo dunia!' 2: - story_text: "Pada level 2 kita akan belajar perintah baru yaitu: `{is}` dan `{sleep}`.\nKamu bisa menamakan kata dengan `{is}`. Ini disebut dengan variabel. Dalam contoh variabel yang kami buat, variabel nama dan variabel umur. Kamu bisa gunakan kata nama dimana saja dalam kode kamu dan\ - \ mengganti kata Hedy, seperti ini \n\nDisini kamu tidak perlu lagi menggunakan perintah `{echo}`\n" + story_text: "Pada level 2 kita akan belajar perintah baru yaitu: `{is}` dan `{sleep}`.\nKamu bisa menamakan kata dengan `{is}`. Ini disebut dengan variabel. Dalam contoh variabel yang kami buat, variabel nama dan variabel umur. Kamu bisa gunakan kata nama dimana saja dalam kode kamu dan mengganti kata Hedy, seperti ini \n\nDisini kamu tidak perlu lagi menggunakan perintah `{echo}`\n" example_code: | ``` nama {is} Hedy @@ -1530,9 +1529,7 @@ adventures: ``` start_code: '{print} ''Halo dunia''' 5: - story_text: "Perintah `ask` dan `print` tetap sama seperti pada level 4.\n \nPada level 5, ada hal baru, `if`! Dengan `if` kamu bisa memilih antara dua pilihan.\n\n```\nnama is ask 'siapa nama kamu?'\nif nama is Hedy print 'keren' else print 'boo'\n```\n\nKode ini menampilkan keren jika\ - \ kamu memasukkan Hedy sebagai nama, dan boo jika kamu memasukkan yang lain.\n\nTerkadang kode dengan `if` bisa menjadi sangat panjang dan tidak cukup menggunakan satu baris
\nKamu dapat memisah kodenya menjadi dua baris; baris kedua dimulai dengan `else` seperti ini:\n```\nnama\ - \ is ask 'siapa nama kamu?'\n if nama is Hedy print 'keren' \nelse print 'boo'\n```\n\n\nPada level 5, tugas-tugas yang ada pada tab-tab terlampir akan menjadi makin kompleks semakin posisi tabnya ke kanan. Jadi, pastikan untuk mengerjakan mulai dari kiri ke kanan." + story_text: "Perintah `ask` dan `print` tetap sama seperti pada level 4.\n \nPada level 5, ada hal baru, `if`! Dengan `if` kamu bisa memilih antara dua pilihan.\n\n```\nnama is ask 'siapa nama kamu?'\nif nama is Hedy print 'keren' else print 'boo'\n```\n\nKode ini menampilkan keren jika kamu memasukkan Hedy sebagai nama, dan boo jika kamu memasukkan yang lain.\n\nTerkadang kode dengan `if` bisa menjadi sangat panjang dan tidak cukup menggunakan satu baris
\nKamu dapat memisah kodenya menjadi dua baris; baris kedua dimulai dengan `else` seperti ini:\n```\nnama is ask 'siapa nama kamu?'\n if nama is Hedy print 'keren' \nelse print 'boo'\n```\n\n\nPada level 5, tugas-tugas yang ada pada tab-tab terlampir akan menjadi makin kompleks semakin posisi tabnya ke kanan. Jadi, pastikan untuk mengerjakan mulai dari kiri ke kanan." example_code: | ``` password {is} {ask} 'Apa kata sandi yang benar?' @@ -1578,8 +1575,7 @@ adventures: ``` start_code: repeat 3 times print 'Hedy itu menyenangkan!' 8: - story_text: "`ask` dan `print` tetap berfungsi sama seperti sebelumnya. Tapi `if` dan `repeat` berubah. \nKamu sekarang dapat mengeksekusi kumpulan kode secara bersamaan, tapi kamu harus memberikan indentasi pada kode tersebut.\n Indentasi berarti memberikan empat spasi diawal baris. Ini\ - \ juga berlaku ketika kamu hanya mau mengeksekusi satu baris kode saja.\n\n```\nrepeat 5 times\n print 'halo semua'\n print 'Ini akan ditampilkan lima kali'\n```" + story_text: "`ask` dan `print` tetap berfungsi sama seperti sebelumnya. Tapi `if` dan `repeat` berubah. \nKamu sekarang dapat mengeksekusi kumpulan kode secara bersamaan, tapi kamu harus memberikan indentasi pada kode tersebut.\n Indentasi berarti memberikan empat spasi diawal baris. Ini juga berlaku ketika kamu hanya mau mengeksekusi satu baris kode saja.\n\n```\nrepeat 5 times\n print 'halo semua'\n print 'Ini akan ditampilkan lima kali'\n```" example_code: | Ini adalah cara perintah `{repeat}` bekerja: ``` @@ -1691,8 +1687,7 @@ adventures: if name is 'Hedy' and age is 2 print 'You are the real Hedy!' 14: - story_text: 'Kita akan mulai belajar untuk menggunakan banyak hal baru! Kamu mungkin sudah tahu hal-hal ini dari matematika: simbol `<` dan `>`. Simbol `<` mengecek apakah angka pertama lebih kecil daripada angka kedua, seperti `4 < 5`. Simbol `>` mengecek apakah angka pertama lebih besar - daripada angka kedua, seperti `6 > 5`.' + story_text: 'Kita akan mulai belajar untuk menggunakan banyak hal baru! Kamu mungkin sudah tahu hal-hal ini dari matematika: simbol `<` dan `>`. Simbol `<` mengecek apakah angka pertama lebih kecil daripada angka kedua, seperti `4 < 5`. Simbol `>` mengecek apakah angka pertama lebih besar daripada angka kedua, seperti `6 > 5`.' example_code: | ``` age = {ask} 'How old are you?' @@ -1706,8 +1701,7 @@ adventures: else print 'Kamu lebih tua daripada aku!' 15: - story_text: Kita akan belajar tentang jenis pengulangan baru, pengulangan `while`! Kita akan melakukan pengulangan tersebut terus-menerus selama kondisinya dipenuhi. Jadi di contoh tersebut, kita terus melakukan pengulangan hingga jawaban benar telah diberikan. Jika jawaban benar tidak - diberikan, pengulangan tidak akan pernah berakhir! + story_text: Kita akan belajar tentang jenis pengulangan baru, pengulangan `while`! Kita akan melakukan pengulangan tersebut terus-menerus selama kondisinya dipenuhi. Jadi di contoh tersebut, kita terus melakukan pengulangan hingga jawaban benar telah diberikan. Jika jawaban benar tidak diberikan, pengulangan tidak akan pernah berakhir! example_code: | ``` answer = 0 @@ -1905,8 +1899,7 @@ adventures: ``` start_code: print 'Siapa yang mencuci piring?' 5: - story_text: "Dengan `if` kamu bisa melakukan banyak hal menyenangkan dalam pengambilan pilihan dalam program tersebut. Kamu dapat membuat program kamu merespon pilihan yang sudah diberikan oleh komputer.\n\nDapatkah kamu melengkapi kode ini agar menampilkan 'Yahh' ketika yang dipilih adalah\ - \ giliranmu dan 'Yeah!' untuk yang lainnya. \nJangan lupakan tanda kutip satu!" + story_text: "Dengan `if` kamu bisa melakukan banyak hal menyenangkan dalam pengambilan pilihan dalam program tersebut. Kamu dapat membuat program kamu merespon pilihan yang sudah diberikan oleh komputer.\n\nDapatkah kamu melengkapi kode ini agar menampilkan 'Yahh' ketika yang dipilih adalah giliranmu dan 'Yeah!' untuk yang lainnya. \nJangan lupakan tanda kutip satu!" example_code: | ``` orang is ibu, ayah, Emma, Sophie @@ -2057,8 +2050,7 @@ adventures: Di level mendatang, Anda dapat mempelajari cara membuat mesin peramal sendiri! Di level 1 Anda dapat memulai dengan mudah dengan membiarkan Hedy memperkenalkan dirinya sebagai peramal dan membiarkannya `{echo}` jawaban para pemain. Seperti ini: - example_code: "```\nprint Halo, aku Hedy sang peramal!\nask Siapa kamu?\nprint Ijinkan aku melihat bola kristal ku\nprint Aku lihat... Aku lihat...\necho Nama kamu adalah \n```\n\nHedy sekarang hanya memberitahukan nama kamu. Dapatkah kamu membuat Hedy dapat memberitahukan hal-hal lain\ - \ tentang masa depan kamu?\n\nTentu saja, Hedy bukan peramal yang baik, karena dia hanya bisa mengulang jawaban yang diberikan oleh pengguna!\nLihatlah level 2 dan tingkatkan kemampuan peramal kamu.\n" + example_code: "```\nprint Halo, aku Hedy sang peramal!\nask Siapa kamu?\nprint Ijinkan aku melihat bola kristal ku\nprint Aku lihat... Aku lihat...\necho Nama kamu adalah \n```\n\nHedy sekarang hanya memberitahukan nama kamu. Dapatkah kamu membuat Hedy dapat memberitahukan hal-hal lain tentang masa depan kamu?\n\nTentu saja, Hedy bukan peramal yang baik, karena dia hanya bisa mengulang jawaban yang diberikan oleh pengguna!\nLihatlah level 2 dan tingkatkan kemampuan peramal kamu.\n" story_text_2: | ### Exercise Hedy now only tells you your name. Can you expand the code so that Hedy can predict more things about you? @@ -2146,10 +2138,7 @@ adventures: start_code: print 'Halo, aku Hedy sang peramal!' 7: story_text: Pada level 6 kamu dapat menggunakan perintah `repeat` untuk membuat mesin kamu meramal beberapa kali - example_code: "```\nprint 'Aku Hedy sang peramal!'\nprint 'Kamu dapat bertanya 3 pertanyaan!'\nrepeat 3 times pertanyaan is ask 'Apa yang ingin kamu tahu?'\njawaban {is} ya, tidak, mungkin\nrepeat 3 times print 'Bola kristal saya mengatakan... 'jawaban {at} {random}\n```\n\nSeperti yang\ - \ kamu lihat, pertanyaan-pertanyaan yang diberikan tidak ditampilkan pada contoh. Ini karena variabel 'pertanyaan' telah diulang tiga kali.\nSetiap kali pemain memberikan pertanyaan baru, Hedy menimpa pertanyaan sebelumnya. \nArtinya kamu tidak bisa menanyakan dengan cara seperti ini.\n\ - \nDengan menggunakan tiga variabel (misal 'pertanyaan1', 'pertanyaan2' dan 'pertanyaan3') kamu dapat memecahkan masalah ini dan menampilkan semua pertanyaan.\nIni berarti kamu hanya dapat menggunakan perintah `repeat` untuk jawaban. Kamu harus menanyakan dan menampilkan semua pertanyaan\ - \ secara terpisah.\nDapatkah kamu melakukannya?\n\nPada level 7 tampilan perintah `repeat` akan berubah, memungkinkan kamu untuk mengulang beberapa baris sekaligus.\n" + example_code: "```\nprint 'Aku Hedy sang peramal!'\nprint 'Kamu dapat bertanya 3 pertanyaan!'\nrepeat 3 times pertanyaan is ask 'Apa yang ingin kamu tahu?'\njawaban {is} ya, tidak, mungkin\nrepeat 3 times print 'Bola kristal saya mengatakan... 'jawaban {at} {random}\n```\n\nSeperti yang kamu lihat, pertanyaan-pertanyaan yang diberikan tidak ditampilkan pada contoh. Ini karena variabel 'pertanyaan' telah diulang tiga kali.\nSetiap kali pemain memberikan pertanyaan baru, Hedy menimpa pertanyaan sebelumnya. \nArtinya kamu tidak bisa menanyakan dengan cara seperti ini.\n\nDengan menggunakan tiga variabel (misal 'pertanyaan1', 'pertanyaan2' dan 'pertanyaan3') kamu dapat memecahkan masalah ini dan menampilkan semua pertanyaan.\nIni berarti kamu hanya dapat menggunakan perintah `repeat` untuk jawaban. Kamu harus menanyakan dan menampilkan semua pertanyaan secara terpisah.\nDapatkah kamu melakukannya?\n\nPada level 7 tampilan perintah `repeat` akan berubah, memungkinkan kamu untuk mengulang beberapa baris sekaligus.\n" start_code: print 'Halo, aku Hedy sang peramal!' 8: story_text: |- @@ -2380,9 +2369,7 @@ adventures: Jika kamu memilih pintu yang benar kamu akan bertahan hidup, tapi kalau tidak seekor monster akan... Pada level 1 kita memulai permainan rumah berhantu dengan membuat cerita menyeramkan dan menanyakan monster apa yang pemain akan lihat di rumah berhantu. - example_code: "```\nprint Kenapa aku ada disini?\nprint Aku ingat temanku menyarankan untuk tidak ke rumah besar tua itu...\nprint dan tiba-tiba semuanya menjadi gelap.\nprint Tapi bagaimana caranya aku tergeletak di lantai...?\nprint Kepalaku sakit seperti telah dipukul dengan tongkat\ - \ pemukul basebal!\nprint Suara apa itu?\nprint Oh tidak! Aku merasa kalau aku tidak sendiri di rumah ini!\nprint Aku perlu keluar dari sini!\nprint Ada 3 pintu didepanku...\n{ask} Pintu mana yang harus kupilih?\necho Aku memilih pintu \nprint ...?\n ```\n\nDapatkah kamu menyelesaikan\ - \ cerita menyeramkan ini dengan menanyakan monster apa yang akan muncul? Atau membuat cerita rumah berhantu milik kamu sendiri?\n" + example_code: "```\nprint Kenapa aku ada disini?\nprint Aku ingat temanku menyarankan untuk tidak ke rumah besar tua itu...\nprint dan tiba-tiba semuanya menjadi gelap.\nprint Tapi bagaimana caranya aku tergeletak di lantai...?\nprint Kepalaku sakit seperti telah dipukul dengan tongkat pemukul basebal!\nprint Suara apa itu?\nprint Oh tidak! Aku merasa kalau aku tidak sendiri di rumah ini!\nprint Aku perlu keluar dari sini!\nprint Ada 3 pintu didepanku...\n{ask} Pintu mana yang harus kupilih?\necho Aku memilih pintu \nprint ...?\n ```\n\nDapatkah kamu menyelesaikan cerita menyeramkan ini dengan menanyakan monster apa yang akan muncul? Atau membuat cerita rumah berhantu milik kamu sendiri?\n" story_text_2: | ### Exercise Can you finish the scary story? Or make up your own haunted house story? @@ -3826,10 +3813,8 @@ adventures: Apakah kamu bisa melengkapi kode berikut dengan memasukkan perintah atau karakter yang benar sebagai pengganti garis bawah? start_code: print 'Selamat datang di permainan batu guning kertas mu sendiri!' 5: - story_text: "Pada level 4 kamu bisa menentukan siapa yang menang. \nUntuk hal itu, kamu memerlukan perintah `if`\n\nSimpan pilihan kamu dengan sebuah nama favoritmu dan pilihan komputer dengan nama pilihan komputer.\nLalu kamu bisa menggunakan `if` untuk melihat apakah kedua pilihan tersebut\ - \ sama atau berbeda.\nDapatkah kamu menyelesaikan kode ini?" - example_code: "```\npilihan is batu, gunting, kertas\npil_komputer is _\n pil_kamu is ask Apa yang kamu pilih?\nprint 'kamu memilih ' _\nprint 'komputer memilih ' _\nif _ is _ print 'seri' else print 'tidak seri'\nif pil_kamu is batu and pil_komputer is kertas print 'komputer menang'\n\ - ```\n\nPertama-tama, kamu perlu mengisi kotak kosong yang tersedia dengan kode yang benar untuk melihat apakah hasil permainan seri. \n" + story_text: "Pada level 4 kamu bisa menentukan siapa yang menang. \nUntuk hal itu, kamu memerlukan perintah `if`\n\nSimpan pilihan kamu dengan sebuah nama favoritmu dan pilihan komputer dengan nama pilihan komputer.\nLalu kamu bisa menggunakan `if` untuk melihat apakah kedua pilihan tersebut sama atau berbeda.\nDapatkah kamu menyelesaikan kode ini?" + example_code: "```\npilihan is batu, gunting, kertas\npil_komputer is _\n pil_kamu is ask Apa yang kamu pilih?\nprint 'kamu memilih ' _\nprint 'komputer memilih ' _\nif _ is _ print 'seri' else print 'tidak seri'\nif pil_kamu is batu and pil_komputer is kertas print 'komputer menang'\n```\n\nPertama-tama, kamu perlu mengisi kotak kosong yang tersedia dengan kode yang benar untuk melihat apakah hasil permainan seri. \n" start_code: print 'Selamat datang di permainan batu guning kertas mu sendiri!' 9: story_text: | diff --git a/translations/es/LC_MESSAGES/messages.po b/translations/es/LC_MESSAGES/messages.po index 8effc0e1f30..a7bb7b2f5ac 100644 --- a/translations/es/LC_MESSAGES/messages.po +++ b/translations/es/LC_MESSAGES/messages.po @@ -20,91 +20,154 @@ msgstr "" "Generated-By: Babel 2.11.0\n" msgid "Access Before Assign" -msgstr "Has intentado usar la variable {name} en la línea {access_line_number}, pero ya la has definido en la línea {definition_line_number}. Define una variable antes de usarla." +msgstr "" +"Has intentado usar la variable {name} en la línea {access_line_number}, pero " +"ya la has definido en la línea {definition_line_number}. Define una variable " +"antes de usarla." msgid "Cyclic Var Definition" -msgstr "Debes declarar la variable {variable} antes de poder usarla en el lado derecho del comando {is}." +msgstr "" +"Debes declarar la variable {variable} antes de poder usarla en el lado " +"derecho del comando {is}." msgid "Has Blanks" -msgstr "Tu código es incompleto. Contiene huecos que debes reemplazar con código." +msgstr "" +"Tu código es incompleto. Contiene huecos que debes reemplazar con código." msgid "Incomplete" -msgstr "¡Oops! ¡Has olvidado una parte de código! En la línea {line_number}, debes agregar texto después de {incomplete_command}." +msgstr "" +"¡Oops! ¡Has olvidado una parte de código! En la línea {line_number}, debes " +"agregar texto después de {incomplete_command}." msgid "Incomplete Repeat" -msgstr "Parece que has olvidado usar un comando con el comando {repeat} que usaste en la línea {line_number}." +msgstr "" +"Parece que has olvidado usar un comando con el comando {repeat} que usaste " +"en la línea {line_number}." msgid "Invalid" -msgstr "{invalid_command} no es un comando de Hedy en nivel {level}. ¿Querías decir {guessed_command}?" +msgstr "" +"{invalid_command} no es un comando de Hedy en nivel {level}. ¿Querías decir " +"{guessed_command}?" msgid "Invalid Argument" -msgstr "No puedes usar el comando {command} con {invalid_argument}. Intenta cambiar {invalid_argument} a {allowed_types}." +msgstr "" +"No puedes usar el comando {command} con {invalid_argument}. Intenta cambiar " +"{invalid_argument} a {allowed_types}." msgid "Invalid Argument Type" -msgstr "No puedes usar {command} con {invalid_argument} porque es {invalid_type}. Intenta cambiar {invalid_argument} a {allowed_types}." +msgstr "" +"No puedes usar {command} con {invalid_argument} porque es {invalid_type}. " +"Intenta cambiar {invalid_argument} a {allowed_types}." msgid "Invalid At Command" -msgstr "El comando {at} no puede utilizarse a partir del nivel 16. Puedes usar corchetes para usar un elemento de una lista, por ejemplo `amigos[i]`, `números_de_suerte[{random}]`." +msgstr "" +"El comando {at} no puede utilizarse a partir del nivel 16. Puedes usar " +"corchetes para usar un elemento de una lista, por ejemplo `amigos[i]`, " +"`números_de_suerte[{random}]`." msgid "Invalid Space" -msgstr "¡Oops! Has comenzado una línea con un espacio en la línea {line_number}. Los espacios confunden a los ordenadores, ¿podrías quitarlos?" +msgstr "" +"¡Oops! Has comenzado una línea con un espacio en la línea {line_number}. Los " +"espacios confunden a los ordenadores, ¿podrías quitarlos?" msgid "Invalid Type Combination" -msgstr "No puedes usar {invalid_argument} y {invalid_argument_2} con {command} porque uno es {invalid_type} y el otro es {invalid_type_2}. Intenta cambiar {invalid_argument} a {invalid_type_2} o {invalid_argument_2} a {invalid_type}." +msgstr "" +"No puedes usar {invalid_argument} y {invalid_argument_2} con {command} " +"porque uno es {invalid_type} y el otro es {invalid_type_2}. Intenta cambiar " +"{invalid_argument} a {invalid_type_2} o {invalid_argument_2} a " +"{invalid_type}." msgid "Locked Language Feature" -msgstr "¡Estás usando {concept}! Es genial, pero ¡{concept} todavía no está desbloqueado! Se desbloqueará en un nivel posterior." +msgstr "" +"¡Estás usando {concept}! Es genial, pero ¡{concept} todavía no está " +"desbloqueado! Se desbloqueará en un nivel posterior." msgid "Lonely Echo" -msgstr "Has utilizado un {echo} antes de un {ask}, o un {echo} sin un {ask}. Coloca un {ask} antes del {echo}." +msgstr "" +"Has utilizado un {echo} antes de un {ask}, o un {echo} sin un {ask}. Coloca " +"un {ask} antes del {echo}." msgid "Lonely Text" -msgstr "Parece que olvidaste usar un comando con el texto que pusiste en la línea {line_number}" +msgstr "" +"Parece que olvidaste usar un comando con el texto que pusiste en la línea " +"{line_number}" msgid "Missing Command" msgstr "Parece que has olvidado de usar un comando en la línea {line_number}." msgid "Missing Inner Command" -msgstr "Parece que has olvidad usar un comando en el {command} que has usado en la línea {line_number}." +msgstr "" +"Parece que has olvidad usar un comando en el {command} que has usado en la " +"línea {line_number}." +#, fuzzy msgid "Misspelled At Command" msgstr "" +"It looks like you might have misspelled the {command} command, instead you " +"wrote {invalid_argument} in line {line_number}." msgid "No Indentation" -msgstr "Has utilizado demasiado pocos espacios en la línea {line_number}. Has usado {leading_spaces} espacios, lo que es insuficiente. Empieza cada nuevo bloque con {indent_size} espacios más que la línea anterior." +msgstr "" +"Has utilizado demasiado pocos espacios en la línea {line_number}. Has usado " +"{leading_spaces} espacios, lo que es insuficiente. Empieza cada nuevo bloque " +"con {indent_size} espacios más que la línea anterior." msgid "Parse" -msgstr "El servidor no puede traducir este programa de Hedy. Hay un error en la línea {location[0]}, carácter {location[1]}. Tu has ingresado {character_found}, pero eso no está permitido." +msgstr "" +"El servidor no puede traducir este programa de Hedy. Hay un error en la " +"línea {location[0]}, carácter {location[1]}. Tu has ingresado " +"{character_found}, pero eso no está permitido." msgid "Pressit Missing Else" -msgstr "Olvidaste añadir qué pasa cuando pulsas una tecla diferente, añade un {else} a tu código" +msgstr "" +"Olvidaste añadir qué pasa cuando pulsas una tecla diferente, añade un {else} " +"a tu código" msgid "Too Big" -msgstr "¡Guau! ¡Tu programa tiene un impresionante número de {lines_of_code} líneas de código! Pero solo podemos procesar {max_lines} líneas en este nivel. Haz tu programa más pequeño e inténtalo de nuevo." +msgstr "" +"¡Guau! ¡Tu programa tiene un impresionante número de {lines_of_code} líneas " +"de código! Pero solo podemos procesar {max_lines} líneas en este nivel. Haz " +"tu programa más pequeño e inténtalo de nuevo." msgid "Unexpected Indentation" -msgstr "Has utilizado demasiados espacios en la línea {line_number}. Has usado {leading_spaces} espacios, lo que es insuficiente. Empieza cada nuevo bloque con {indent_size} espacios más que la línea anterior." +msgstr "" +"Has utilizado demasiados espacios en la línea {line_number}. Has usado " +"{leading_spaces} espacios, lo que es insuficiente. Empieza cada nuevo bloque " +"con {indent_size} espacios más que la línea anterior." msgid "Unquoted Assignment" -msgstr "A partir de este nivel, debes colocar el texto a la derecha de {is} entre comillas. Olvidaste eso para el texto {text}." +msgstr "" +"A partir de este nivel, debes colocar el texto a la derecha de {is} entre " +"comillas. Olvidaste eso para el texto {text}." msgid "Unquoted Equality Check" -msgstr "¡Si quieres comprobar si una variable es igual a varias palabras, las palabras deben estar rodeadas por comillas!" +msgstr "" +"¡Si quieres comprobar si una variable es igual a varias palabras, las " +"palabras deben estar rodeadas por comillas!" msgid "Unquoted Text" -msgstr "¡Ten cuidado! Si {ask} o {print} algo, el texto debe estar rodeado de comillas. Has olvidado eso para el texto {unquotedtext}." +msgstr "" +"¡Ten cuidado! Si {ask} o {print} algo, el texto debe estar rodeado de " +"comillas. Has olvidado eso para el texto {unquotedtext}." msgid "Unsupported Float" -msgstr "Números no enteros no se soportan pero estarán disponibles en unos niveles. De momento, cambia {value} a un entero." +msgstr "" +"Números no enteros no se soportan pero estarán disponibles en unos niveles. " +"De momento, cambia {value} a un entero." msgid "Unsupported String Value" msgstr "El texto no puede contener {invalid_value}." msgid "Var Undefined" -msgstr "Intentaste usar la variable {name}, pero no la estableciste. También es posible que estés intentando usar la palabra {name} pero olvidaste las comillas." +msgstr "" +"Intentaste usar la variable {name}, pero no la estableciste. También es " +"posible que estés intentando usar la palabra {name} pero olvidaste las " +"comillas." msgid "Wrong Level" -msgstr "Ese código es correcto, pero no pertenece al nivel correcto. Has escrito código {offending_keyword} para el nivel {working_level}.Tip: {tip}" +msgstr "" +"Ese código es correcto, pero no pertenece al nivel correcto. Has escrito " +"código {offending_keyword} para el nivel {working_level}.Tip: {tip}" msgid "account_overview" msgstr "Resumen de cuenta" @@ -113,7 +176,13 @@ msgid "accounts_created" msgstr "Las cuentas han sido creadas con éxito." msgid "accounts_intro" -msgstr "En esta página puede crear cuentas para varios estudiantes a la vez. Estos se agregan automáticamente a la clase actual, ¡así que asegúrese de que la clase que se muestra arriba sea la correcta! Cada nombre de usuario debe ser único en todo el sistema Hedy. Puede usar 'Postfix classname' para agregar su nombre de clase a todas las cuentas. Si ingresa manualmente las contraseñas, estas deben tener al menos 6 caracteres." +msgstr "" +"En esta página puede crear cuentas para varios estudiantes a la vez. Estos " +"se agregan automáticamente a la clase actual, ¡así que asegúrese de que la " +"clase que se muestra arriba sea la correcta! Cada nombre de usuario debe ser " +"único en todo el sistema Hedy. Puede usar 'Postfix classname' para agregar " +"su nombre de clase a todas las cuentas. Si ingresa manualmente las " +"contraseñas, estas deben tener al menos 6 caracteres." msgid "achievement_earned" msgstr "¡Has conseguido un logro!" @@ -152,13 +221,23 @@ msgid "adventure_empty" msgstr "¡No has introducido un nombre de aventura!" msgid "adventure_exp_1" -msgstr "Escoge tu aventura a la derecha. Tras crear tu aventura, puedes incluirla en una de tus clases bajo \"Configuración\". Si quieres incluir un comando en tu aventura, usa anclas de código tal que así:" +msgstr "" +"Escoge tu aventura a la derecha. Tras crear tu aventura, puedes incluirla en " +"una de tus clases bajo \"Configuración\". Si quieres incluir un comando en " +"tu aventura, usa anclas de código tal que así:" msgid "adventure_exp_2" -msgstr "Si deseas mostrar fragmentos de código reales, por ejemplo, para darle al alumno una plantilla o un ejemplo del código. Utiliza anclas previas como esta:" +msgstr "" +"Si deseas mostrar fragmentos de código reales, por ejemplo, para darle al " +"alumno una plantilla o un ejemplo del código. Utiliza anclas previas como " +"esta:" msgid "adventure_exp_3" -msgstr "Asegúrate de rodear siempre las palabras clave con { } para que se reconozcan correctamente. Puedes usar el botón de \"vista previa\" para ver una versión con estilo de tu aventura. Para ver la aventura en una página dedicada, selecciona \"ver\" en la página de profesores." +msgstr "" +"Asegúrate de rodear siempre las palabras clave con { } para que se " +"reconozcan correctamente. Puedes usar el botón de \"vista previa\" para ver " +"una versión con estilo de tu aventura. Para ver la aventura en una página " +"dedicada, selecciona \"ver\" en la página de profesores." msgid "adventure_id_invalid" msgstr "Esta aventura no es válida." @@ -200,7 +279,8 @@ msgid "all" msgstr "Todo/as" msgid "all_class_highscores" -msgstr "Todos los estudiantes visibles en las puntuaciones más altas de la clase" +msgstr "" +"Todos los estudiantes visibles en las puntuaciones más altas de la clase" msgid "already_account" msgstr "¿Ya tienes una cuenta?" @@ -227,7 +307,9 @@ msgid "are_you_sure" msgstr "¿Estás segura/o? No puedes revertir esta acción." msgid "ask_needs_var" -msgstr "A partir del nivel 2, {ask} debe utilizarse con una variable. Ejemplo: nombre {is} {ask} ¿Cómo te llamas?" +msgstr "" +"A partir del nivel 2, {ask} debe utilizarse con una variable. Ejemplo: " +"nombre {is} {ask} ¿Cómo te llamas?" msgid "back_to_class" msgstr "Volver a la clase" @@ -251,10 +333,14 @@ msgid "cant_parse_exception" msgstr "No se ha podido analizar el programa" msgid "catch_index_exception" -msgstr "Intentaste acceder a la lista {list_name} pero está vacía o el índice no está allí." +msgstr "" +"Intentaste acceder a la lista {list_name} pero está vacía o el índice no " +"está allí." msgid "catch_value_exception" -msgstr "Mientras ejecutábamos tu programa, el comando {command} recibió el valor {value}, pero eso no está permitido. {suggestion}." +msgstr "" +"Mientras ejecutábamos tu programa, el comando {command} recibió el valor " +"{value}, pero eso no está permitido. {suggestion}." msgid "certificate" msgstr "Certificado de Finalización" @@ -292,23 +378,31 @@ msgstr "Por favor, introduce le nombre de la nueva clase" msgid "class_overview" msgstr "Resumen de la clase" +#, fuzzy msgid "class_survey_description" msgstr "" +"We would like to get a better overview of our Hedy users. By providing these " +"answers, you would help improve Hedy. Thank you!" +#, fuzzy msgid "class_survey_later" -msgstr "" +msgstr "Remind me tomorrow" +#, fuzzy msgid "class_survey_question1" -msgstr "" +msgstr "What is the age range in your class?" +#, fuzzy msgid "class_survey_question2" -msgstr "" +msgstr "What is the spoken language in your class?" +#, fuzzy msgid "class_survey_question3" -msgstr "" +msgstr "What is the gender balance in your class?" +#, fuzzy msgid "class_survey_question4" -msgstr "" +msgstr "What distinguishes your students from others?" msgid "close" msgstr "Cerrar" @@ -329,7 +423,9 @@ msgid "common_errors" msgstr "Errores comunes" msgid "congrats_message" -msgstr "¡Felicitaciones, {username}, has alcanzado los siguientes resultados con Hedy!" +msgstr "" +"¡Felicitaciones, {username}, has alcanzado los siguientes resultados con " +"Hedy!" msgid "content_invalid" msgstr "Esta aventura no es válida." @@ -398,7 +494,9 @@ msgid "create_teacher_account" msgstr "Crear cuenta de profesor" msgid "create_teacher_account_explanation" -msgstr "Con una cuenta de profesor, puedes guardar tus programas y ver los resultados de tus estudiantes." +msgstr "" +"Con una cuenta de profesor, puedes guardar tus programas y ver los " +"resultados de tus estudiantes." msgid "creator" msgstr "Creador" @@ -467,7 +565,9 @@ msgid "disabled" msgstr "Deshabilitado" msgid "disabled_button_quiz" -msgstr "Tu puntuación en el cuestionario está por debajo del umbral, ¡inténtalo de nuevo!" +msgstr "" +"Tu puntuación en el cuestionario está por debajo del umbral, ¡inténtalo de " +"nuevo!" msgid "discord_server" msgstr "Servidor Discord" @@ -482,7 +582,8 @@ msgid "download" msgstr "Descargar" msgid "download_login_credentials" -msgstr "¿Quieres descargar las credenciales de login tras la creación de cuentas?" +msgstr "" +"¿Quieres descargar las credenciales de login tras la creación de cuentas?" msgid "duplicate" msgstr "Duplicar" @@ -491,7 +592,10 @@ msgid "echo_and_ask_mismatch_exception" msgstr "Desajuste entre eco y pregunta" msgid "echo_out" -msgstr "A partir del nivel 2, `{echo}` ya no es necesario. Ahora puedes repetir una respuesta con `{ask}` y `{print}`. Ejemplo: `nombre {is} {ask} ¿Cómo te llamas? {print} hola nombre`" +msgstr "" +"A partir del nivel 2, `{echo}` ya no es necesario. Ahora puedes repetir una " +"respuesta con `{ask}` y `{print}`. Ejemplo: `nombre {is} {ask} ¿Cómo te " +"llamas? {print} hola nombre`" msgid "edit_code_button" msgstr "Editar código" @@ -542,7 +646,15 @@ msgid "expiration_date" msgstr "Fecha de expiración" msgid "explore_explanation" -msgstr "En esta página puedes consultar los programas creados por otros usuarios de Hedy. Puedes filtrar tanto por nivel de Hedy como por aventura. Haz clic en \"Ver programa\" para abrir un programa y ejecutarlo. Los programas con un encabezado rojo contienen un error. Todavía puedes abrir el programa, pero ejecutarlo resultará en un error. ¡Por supuesto que puedes intentar arreglarlo! Si el creador tiene un perfil público, puedes hacer clic en su nombre de usuario para visitar su perfil. ¡Allí encontrarás todos sus programas compartidos y mucho más!" +msgstr "" +"En esta página puedes consultar los programas creados por otros usuarios de " +"Hedy. Puedes filtrar tanto por nivel de Hedy como por aventura. Haz clic en " +"\"Ver programa\" para abrir un programa y ejecutarlo. Los programas con un " +"encabezado rojo contienen un error. Todavía puedes abrir el programa, pero " +"ejecutarlo resultará en un error. ¡Por supuesto que puedes intentar " +"arreglarlo! Si el creador tiene un perfil público, puedes hacer clic en su " +"nombre de usuario para visitar su perfil. ¡Allí encontrarás todos sus " +"programas compartidos y mucho más!" msgid "explore_programs" msgstr "Explorar programas" @@ -680,10 +792,15 @@ msgid "highest_quiz_score" msgstr "Puntuación más alta en el cuestionario" msgid "highscore_explanation" -msgstr "En esta página puedes ver las puntuaciones más altas actuales, según la cantidad de logros obtenidos. Clasifica para todos los usuarios, por país o por clase. Haga clic en un nombre de usuario para ver su perfil público." +msgstr "" +"En esta página puedes ver las puntuaciones más altas actuales, según la " +"cantidad de logros obtenidos. Clasifica para todos los usuarios, por país o " +"por clase. Haga clic en un nombre de usuario para ver su perfil público." msgid "highscore_no_public_profile" -msgstr "No tienes un perfil público, por lo que no estás en la lista de puntuaciones más altas. ¿Deseas crear uno?" +msgstr "" +"No tienes un perfil público, por lo que no estás en la lista de puntuaciones " +"más altas. ¿Deseas crear uno?" msgid "highscores" msgstr "Puntuaciones" @@ -725,19 +842,25 @@ msgid "invalid_command_exception" msgstr "Comando no válido" msgid "invalid_keyword_language_comment" -msgstr "# La palabra clave para el idioma proporcionada no es válida, la palabra clave idioma se establece en Inglés" +msgstr "" +"# La palabra clave para el idioma proporcionada no es válida, la palabra " +"clave idioma se establece en Inglés" msgid "invalid_language_comment" -msgstr "# El idioma proporcionado no es válido, el idioma está configurado en inglés" +msgstr "" +"# El idioma proporcionado no es válido, el idioma está configurado en inglés" msgid "invalid_level_comment" -msgstr "# El nivel proporcionado no es válido, el nivel se establece en el nivel 1" +msgstr "" +"# El nivel proporcionado no es válido, el nivel se establece en el nivel 1" msgid "invalid_program_comment" msgstr "# El programa proporcionado no es válido, por favor inténtelo de nuevo" msgid "invalid_teacher_invitation_code" -msgstr "El código de instructor es inválido. Para ser instructor, por favor mande un mensaje a hello@hedy.org." +msgstr "" +"El código de instructor es inválido. Para ser instructor, por favor mande un " +"mensaje a hello@hedy.org." msgid "invalid_tutorial_step" msgstr "Paso de tutorial inválido" @@ -764,10 +887,13 @@ msgid "join_class" msgstr "Unirse a la clase" msgid "join_prompt" -msgstr "Debes estar registrado para unirte a una clase. ¿Deseas entrar a tu cuenta?" +msgstr "" +"Debes estar registrado para unirte a una clase. ¿Deseas entrar a tu cuenta?" msgid "keyword_language_invalid" -msgstr "Por favor, selecciona un idioma para palabras clave (selecciona Inglés o tu propio idioma)." +msgstr "" +"Por favor, selecciona un idioma para palabras clave (selecciona Inglés o tu " +"propio idioma)." msgid "language" msgstr "Idioma" @@ -853,13 +979,16 @@ msgstr "Programa más largo" msgid "mail_change_password_body" msgstr "" "Tu contraseña de Hedy ha cambiado. Si lo has hecho tú, no te preocupes.\n" -"Si no has cambiado tu contraseña, por favor contáctanos inmediatamente contestando a este email." +"Si no has cambiado tu contraseña, por favor contáctanos inmediatamente " +"contestando a este email." msgid "mail_change_password_subject" msgstr "Tu contraseña de Hedy ha sido cambiada" msgid "mail_error_change_processed" -msgstr "Algo salió mal al enviar un correo de validación, los cambios aún se procesan correctamente." +msgstr "" +"Algo salió mal al enviar un correo de validación, los cambios aún se " +"procesan correctamente." msgid "mail_goodbye" msgstr "" @@ -871,16 +1000,20 @@ msgstr "¡Hola, {username}!" msgid "mail_recover_password_body" msgstr "" -"Al hacer click en este enlace, puedes cambiar tu contraseña. Este enlace es válido durante 4 horas.\n" -"Si no has pedido restablecer tu contraseña, por favor ignora este email. {link}" +"Al hacer click en este enlace, puedes cambiar tu contraseña. Este enlace es " +"válido durante 4 horas.\n" +"Si no has pedido restablecer tu contraseña, por favor ignora este email. " +"{link}" msgid "mail_recover_password_subject" msgstr "Restablecer contraseña." msgid "mail_reset_password_body" msgstr "" -"Tu contraseña de Hedy ha cambiado a una nueva. Si lo has hecho tú, no te preocupes.\n" -"Si no has cambiado tu contraseña, por favor contáctanos inmediatamente contestando a este email." +"Tu contraseña de Hedy ha cambiado a una nueva. Si lo has hecho tú, no te " +"preocupes.\n" +"Si no has cambiado tu contraseña, por favor contáctanos inmediatamente " +"contestando a este email." msgid "mail_reset_password_subject" msgstr "Tu contraseña de Hedy ha sido reseteada" @@ -888,23 +1021,41 @@ msgstr "Tu contraseña de Hedy ha sido reseteada" msgid "mail_welcome_teacher_body" msgstr "" "¡Bienvenido/a!\n" -"Felicidades por tu nueva cuenta de profesor Hedy. ¡Bienvenido a la comunidad mundial de profesores de Hedy!\n" +"Felicidades por tu nueva cuenta de profesor Hedy. ¡Bienvenido a la comunidad " +"mundial de profesores de Hedy!\n" "\n" "Qué pueden hacer las cuentas de profesor\n" "Ahora tienes disponibles una serie de opciones adicionales.\n" "\n" -"1. En el manual del profesor encontrarás explicaciones adicionales.\n" -"2. Con tu cuenta de profesor, puedes crear clases. Tus estudiantes pueden unirse a tus clases y puedes ver su progreso. Las clases se crean y se gestionan a través de la página para profesores.\n" -"3. ¡Puedes personalizar completamente tus clases, por ejemplo, puedes abrir y cerrar niveles, habilitar o deshabilitar aventuras y crear tus propias aventuras!\n" +"1. En el manual del " +"profesor encontrarás explicaciones adicionales.\n" +"2. Con tu cuenta de profesor, puedes crear clases. Tus estudiantes pueden " +"unirse a tus clases y puedes ver su progreso. Las clases se crean y se " +"gestionan a través de la página para profesores.\n" +"3. ¡Puedes personalizar completamente tus clases, por ejemplo, puedes abrir " +"y cerrar niveles, habilitar o deshabilitar aventuras y crear tus propias " +"aventuras!\n" "\n" "¡Únete a nuestra comunidad en línea!\n" -"Todos los profesores de Hedy, programadores y demás fans están invitados a unirse a nuestro servidor de Discord. Este es el lugar perfecto para charlar sobre Hedy: tenemos canales donde puedes mostrar tus proyectos y lecciones interesantes, canales para reportar errores y canales para chatear con otros profesores y con el equipo de Hedy.\n" +"Todos los profesores de Hedy, programadores y demás fans están invitados a " +"unirse a nuestro servidor de " +"Discord. Este es el lugar perfecto para charlar sobre Hedy: tenemos " +"canales donde puedes mostrar tus proyectos y lecciones interesantes, canales " +"para reportar errores y canales para chatear con otros profesores y con el " +"equipo de Hedy.\n" "\n" "Cómo solicitar ayuda\n" -"Si tienes dudas, puedes hacérnoslas saber en Discord o enviarnos un correo electrónico.\n" +"Si tienes dudas, puedes hacérnoslas saber en Discord o enviarnos un correo electrónico.\n" "\n" "Cómo reportar errores\n" -"En Discord, tenemos un canal para reportar errores, llamado #bugs. Ese es el lugar perfecto para hacernos saber sobre problemas con los que te encuentres. Si sabes cómo usar GitHub, también puedes crear un problema allí.\n" +"En Discord, tenemos un canal para reportar errores, llamado #bugs. Ese es el " +"lugar perfecto para hacernos saber sobre problemas con los que te " +"encuentres. Si sabes cómo usar GitHub, también puedes crear un problema " +"allí.\n" msgid "mail_welcome_teacher_subject" msgstr "Tu cuenta de Hedy está lista" @@ -912,7 +1063,8 @@ msgstr "Tu cuenta de Hedy está lista" msgid "mail_welcome_verify_body" msgstr "" "Tu cuenta de Hedy ha sido creada con éxito. ¡Bienvenido/a!\n" -"Haz clic en este enlace para verificar su dirección de correo electrónico: {link}" +"Haz clic en este enlace para verificar su dirección de correo electrónico: " +"{link}" msgid "mail_welcome_verify_subject" msgstr "Bienvenido/a a Hedy" @@ -927,7 +1079,9 @@ msgid "main_title" msgstr "Hedy" msgid "make_sure_you_are_done" -msgstr "¡Asegúrate de que has terminado! Ya no podrás cambiar tu programa después de hacer clic en \"Entregar\"." +msgstr "" +"¡Asegúrate de que has terminado! Ya no podrás cambiar tu programa después de " +"hacer clic en \"Entregar\"." msgid "male" msgstr "Masculino" @@ -1002,7 +1156,9 @@ msgid "no_certificate" msgstr "Este usuario no ha conseguido el Certificado Hedy de Finalización" msgid "no_more_flat_if" -msgstr "A partir del nivel 8, el código tras {if} tiene que ponerse en la siguiente línea y debe empezar con 4 espacios." +msgstr "" +"A partir del nivel 8, el código tras {if} tiene que ponerse en la siguiente " +"línea y debe empezar con 4 espacios." msgid "no_programs" msgstr "Todavía no tienes programas guardados." @@ -1098,7 +1254,9 @@ msgid "other_text" msgstr "Otro lenguaje basado en texto" msgid "overwrite_warning" -msgstr "Ya tienes un programa con este nombre, guardar este programa reemplazará al anterior. ¿Estás seguro/a?" +msgstr "" +"Ya tienes un programa con este nombre, guardar este programa reemplazará al " +"anterior. ¿Estás seguro/a?" msgid "page" msgstr "página" @@ -1128,7 +1286,9 @@ msgid "password_repeat" msgstr "Repetir contraseña" msgid "password_resetted" -msgstr "Tu contraseña ha sido cambiada exitosamente. Ya puedes entrar nuevamente a tu cuenta usando la nueva contraseña." +msgstr "" +"Tu contraseña ha sido cambiada exitosamente. Ya puedes entrar nuevamente a " +"tu cuenta usando la nueva contraseña." msgid "password_six" msgstr "La contraseña debe contener al menos seis caracteres." @@ -1143,7 +1303,9 @@ msgid "pending_invites" msgstr "Invitaciones pendientes" msgid "people_with_a_link" -msgstr "Otras personas con un enlace pueden ver este programa. También se puede encontrar en la página \"Explorar\"." +msgstr "" +"Otras personas con un enlace pueden ver este programa. También se puede " +"encontrar en la página \"Explorar\"." msgid "percentage" msgstr "porcentaje" @@ -1236,7 +1398,10 @@ msgid "public_profile" msgstr "Perfil público" msgid "public_profile_info" -msgstr "Al seleccionar esta casilla, hago que mi perfil sea visible para todos. Tenga cuidado de no compartir información personal como su nombre o dirección de su casa, ¡porque todos podrán verla!" +msgstr "" +"Al seleccionar esta casilla, hago que mi perfil sea visible para todos. " +"Tenga cuidado de no compartir información personal como su nombre o " +"dirección de su casa, ¡porque todos podrán verla!" msgid "public_profile_updated" msgstr "Perfil público actualizado, la página se recargará." @@ -1278,7 +1443,8 @@ msgid "remove_customization" msgstr "Eliminar configuración" msgid "remove_customizations_prompt" -msgstr "¿Estás seguro de que quieres eliminar esta clase de sus personalizaciones?" +msgstr "" +"¿Estás seguro de que quieres eliminar esta clase de sus personalizaciones?" msgid "remove_student_prompt" msgstr "¿Estás seguro de que quieres eliminar al estudiante de la clase?" @@ -1350,10 +1516,13 @@ msgid "save" msgstr "Guardar" msgid "save_parse_warning" -msgstr "Tu programa contiene un error. ¿Estás seguro/a de que quieres guardarlo?" +msgstr "" +"Tu programa contiene un error. ¿Estás seguro/a de que quieres guardarlo?" msgid "save_prompt" -msgstr "Debes estar registrado para guardar tu programa. ¿Deseas entrar ahora a tu cuenta?" +msgstr "" +"Debes estar registrado para guardar tu programa. ¿Deseas entrar ahora a tu " +"cuenta?" msgid "save_success_detail" msgstr "Tu programa se ha guardado correctamente." @@ -1395,7 +1564,9 @@ msgid "sent_by" msgstr "Esta invitación ha sido mandada por" msgid "sent_password_recovery" -msgstr "Pronto recibirás un correo electrónico con instrucciones sobre cómo restablecer tu contraseña." +msgstr "" +"Pronto recibirás un correo electrónico con instrucciones sobre cómo " +"restablecer tu contraseña." msgid "settings" msgstr "Mi configuración personal" @@ -1428,7 +1599,9 @@ msgid "social_media" msgstr "Redes sociales" msgid "something_went_wrong_keyword_parsing" -msgstr "Hay un problema en tu aventura, ¿están todas las palabras clave correctamente rodeadas por { }?" +msgstr "" +"Hay un problema en tu aventura, ¿están todas las palabras clave " +"correctamente rodeadas por { }?" msgid "space" msgstr "un espacio" @@ -1517,11 +1690,13 @@ msgstr "Intenta cambiar el valor a un número" msgid "surname" msgstr "Nombre" +#, fuzzy msgid "survey_skip" -msgstr "" +msgstr "Don't show this again" +#, fuzzy msgid "survey_submit" -msgstr "" +msgstr "Submit" msgid "tag_in_adventure" msgstr "" @@ -1545,7 +1720,9 @@ msgid "teacher_invalid" msgstr "Tu valor de profesor no es válido." msgid "teacher_invitation_require_login" -msgstr "Para configurar tu perfil como profesor, necesitamos que te autentifiques. Si no tienes una cuenta, crea una." +msgstr "" +"Para configurar tu perfil como profesor, necesitamos que te autentifiques. " +"Si no tienes una cuenta, crea una." msgid "teacher_manual" msgstr "Manual de profesor" @@ -1557,7 +1734,9 @@ msgid "teacher_tutorial_logo_alt" msgstr "Icono de tutorial de profesor" msgid "teacher_welcome" -msgstr "¡Bienvenido/a a Hedy! Tu cuenta es de tipo profesor, por lo que puedes crear clases e invitar estudiantes." +msgstr "" +"¡Bienvenido/a a Hedy! Tu cuenta es de tipo profesor, por lo que puedes crear " +"clases e invitar estudiantes." msgid "teachers" msgstr "Profesores" @@ -1647,7 +1826,9 @@ msgid "token_invalid" msgstr "Tu token no es válido." msgid "translate_error" -msgstr "Algo salió mal al traducir el código. Intenta ejecutar el código para ver si tiene un error. El código con errores no se puede traducir." +msgstr "" +"Algo salió mal al traducir el código. Intenta ejecutar el código para ver si " +"tiene un error. El código con errores no se puede traducir." msgid "translating_hedy" msgstr "Traducción de Hedy" @@ -1682,7 +1863,8 @@ msgid "unlock_thresholds" msgstr "Desbloquear umbrales de nivel" msgid "unsaved_class_changes" -msgstr "Hay cambios sin guardar, ¿estás seguro de que quieres abandonar esta página?" +msgstr "" +"Hay cambios sin guardar, ¿estás seguro de que quieres abandonar esta página?" msgid "unshare" msgstr "Dejar de compartir" @@ -1838,28 +2020,52 @@ msgstr "Tu programa" #~ msgstr "Nivel de aventuras disponibles" #~ msgid "customize_class_exp_1" -#~ msgstr "¡Hola! En esta página puedes configurar tu clase. Puedes seleccionar qué niveles y aventuras pueden ver tus estudiantes. También puedes añadir tus propias aventuras a niveles. Todos los niveles y aventuras por defecto serán seleccionadas por defecto. Nota ¡No todas las aventuras están disponibles para cada nivel! La configuración es como sigue:" +#~ msgstr "" +#~ "¡Hola! En esta página puedes configurar tu clase. Puedes seleccionar qué " +#~ "niveles y aventuras pueden ver tus estudiantes. También puedes añadir tus " +#~ "propias aventuras a niveles. Todos los niveles y aventuras por defecto " +#~ "serán seleccionadas por defecto. Nota ¡No todas las aventuras " +#~ "están disponibles para cada nivel! La configuración es como sigue:" #~ msgid "customize_class_exp_2" -#~ msgstr "Siempre puede cambiar esta configuración más adelante. Por ejemplo, puedes hacer que estén disponibles aventuras o niveles específicos mientras impartes una clase. De esta manera, es fácil determinar en qué nivel y aventuras trabajarán sus alumnos. Si quieres que todo esté disponible para tu clase, es más fácil eliminar la personalización por completo." +#~ msgstr "" +#~ "Siempre puede cambiar esta configuración más adelante. Por ejemplo, " +#~ "puedes hacer que estén disponibles aventuras o niveles específicos " +#~ "mientras impartes una clase. De esta manera, es fácil determinar en qué " +#~ "nivel y aventuras trabajarán sus alumnos. Si quieres que todo esté " +#~ "disponible para tu clase, es más fácil eliminar la personalización por " +#~ "completo." #~ msgid "customize_class_step_1" -#~ msgstr "Selecciona niveles para su clase presionando los \"botones de nivel\"" +#~ msgstr "" +#~ "Selecciona niveles para su clase presionando los \"botones de nivel\"" #~ msgid "customize_class_step_2" -#~ msgstr "Puede seleccionar el nivel que desea editar en el menú desplegable \"Seleccionar un nivel\"" +#~ msgstr "" +#~ "Puede seleccionar el nivel que desea editar en el menú desplegable " +#~ "\"Seleccionar un nivel\"" #~ msgid "customize_class_step_3" -#~ msgstr "Ordena las aventuras como quieras que aparezcan en el nivel. El menú desplegable \"Aventuras disponibles\" contiene las aventuras que no se han incluido en este nivel." +#~ msgstr "" +#~ "Ordena las aventuras como quieras que aparezcan en el nivel. El menú " +#~ "desplegable \"Aventuras disponibles\" contiene las aventuras que no se " +#~ "han incluido en este nivel." #~ msgid "customize_class_step_4" -#~ msgstr "El menú desplegable \"Aventuras disponibles\" también tiene tus propias aventuras. Una vez que las añadas, podrás moverlas junto a las demás aventuras." +#~ msgstr "" +#~ "El menú desplegable \"Aventuras disponibles\" también tiene tus propias " +#~ "aventuras. Una vez que las añadas, podrás moverlas junto a las demás " +#~ "aventuras." #~ msgid "customize_class_step_5" -#~ msgstr "Puedes eliminar una aventura haciendo clic en el botón x y aparecerá en el menú desplegable \"Aventuras disponibles\"" +#~ msgstr "" +#~ "Puedes eliminar una aventura haciendo clic en el botón x y aparecerá en " +#~ "el menú desplegable \"Aventuras disponibles\"" #~ msgid "customize_class_step_6" -#~ msgstr "Seleccionando una fecha de apertura para cada nivel (también puedes dejarlo vacío)" +#~ msgstr "" +#~ "Seleccionando una fecha de apertura para cada nivel (también puedes " +#~ "dejarlo vacío)" #~ msgid "customize_class_step_7" #~ msgstr "Selección de otros ajustes" @@ -1911,4 +2117,3 @@ msgstr "Tu programa" #~ msgid "tag_deleted" #~ msgstr "This tag was successfully deleted." - diff --git a/translations/id/LC_MESSAGES/messages.po b/translations/id/LC_MESSAGES/messages.po index 87bbd262ea6..a117a16a39e 100644 --- a/translations/id/LC_MESSAGES/messages.po +++ b/translations/id/LC_MESSAGES/messages.po @@ -35,88 +35,149 @@ msgstr "" "Generated-By: Babel 2.11.0\n" msgid "Cyclic Var Definition" -msgstr "Nama {variable} perlu disetel sebelum Anda dapat menggunakannya di sisi kanan perintah {is}." +msgstr "" +"Nama {variable} perlu disetel sebelum Anda dapat menggunakannya di sisi " +"kanan perintah {is}." msgid "Has Blanks" -msgstr "Kode Anda tidak lengkap. Ini berisi bagian kosong yang harus Anda ganti dengan kode." +msgstr "" +"Kode Anda tidak lengkap. Ini berisi bagian kosong yang harus Anda ganti " +"dengan kode." msgid "Incomplete" -msgstr "Ups! Anda sedikit lupa kodenya! Pada baris {line_number}, Anda perlu memasukkan teks di belakang {incomplete_command}." +msgstr "" +"Ups! Anda sedikit lupa kodenya! Pada baris {line_number}, Anda perlu " +"memasukkan teks di belakang {incomplete_command}." msgid "Incomplete Repeat" -msgstr "Sepertinya Anda lupa menggunakan perintah dengan perintah {repeat} yang Anda gunakan pada baris {line_number}." +msgstr "" +"Sepertinya Anda lupa menggunakan perintah dengan perintah {repeat} yang Anda " +"gunakan pada baris {line_number}." msgid "Invalid" -msgstr "{invalid_command} bukan perintah {level} level Hedy. Apakah maksud Anda {guessed_command}?" +msgstr "" +"{invalid_command} bukan perintah {level} level Hedy. Apakah maksud Anda " +"{guessed_command}?" msgid "Invalid Argument" -msgstr "Anda tidak dapat menggunakan perintah {command} dengan {invalid_argument}. Coba ubah {invalid_argument} menjadi {allowed_types}." +msgstr "" +"Anda tidak dapat menggunakan perintah {command} dengan {invalid_argument}. " +"Coba ubah {invalid_argument} menjadi {allowed_types}." msgid "Invalid Argument Type" -msgstr "Anda tidak dapat menggunakan {command} dengan {invalid_argument} karena {invalid_type}. Coba ubah {invalid_argument} menjadi {allowed_types}." +msgstr "" +"Anda tidak dapat menggunakan {command} dengan {invalid_argument} karena " +"{invalid_type}. Coba ubah {invalid_argument} menjadi {allowed_types}." msgid "Invalid At Command" -msgstr "Perintah {at} tidak boleh digunakan mulai level 16 dan seterusnya. Anda dapat menggunakan tanda kurung siku untuk menggunakan elemen dari daftar, misalnya `teman[i]`, `angka_keberuntungan[{random}]`." +msgstr "" +"Perintah {at} tidak boleh digunakan mulai level 16 dan seterusnya. Anda " +"dapat menggunakan tanda kurung siku untuk menggunakan elemen dari daftar, " +"misalnya `teman[i]`, `angka_keberuntungan[{random}]`." msgid "Invalid Space" -msgstr "Ups! kamu memulai baris dengan sebuah spasi pada baris {line_number}. Spasi membingungkan komputer, dapatkah kamu membuangnya?" +msgstr "" +"Ups! kamu memulai baris dengan sebuah spasi pada baris {line_number}. Spasi " +"membingungkan komputer, dapatkah kamu membuangnya?" msgid "Invalid Type Combination" -msgstr "Anda tidak dapat menggunakan {invalid_argument} dan {invalid_argument_2} dengan {command} karena yang satu adalah {invalid_type} dan yang lainnya adalah {invalid_type_2}. Coba ubah {invalid_argument} menjadi {invalid_type_2} atau {invalid_argument_2} menjadi {invalid_type}." +msgstr "" +"Anda tidak dapat menggunakan {invalid_argument} dan {invalid_argument_2} " +"dengan {command} karena yang satu adalah {invalid_type} dan yang lainnya " +"adalah {invalid_type_2}. Coba ubah {invalid_argument} menjadi " +"{invalid_type_2} atau {invalid_argument_2} menjadi {invalid_type}." msgid "Locked Language Feature" -msgstr "Anda menggunakan {concept}! Itu luar biasa, tapi {concept} belum dibuka! Ini akan dibuka di level selanjutnya." +msgstr "" +"Anda menggunakan {concept}! Itu luar biasa, tapi {concept} belum dibuka! Ini " +"akan dibuka di level selanjutnya." msgid "Lonely Echo" -msgstr "Anda menggunakan {echo} sebelum {ask}, atau {echo} tanpa {ask}. Tempatkan {ask} sebelum {echo}." +msgstr "" +"Anda menggunakan {echo} sebelum {ask}, atau {echo} tanpa {ask}. Tempatkan " +"{ask} sebelum {echo}." msgid "Lonely Text" -msgstr "Sepertinya Anda lupa menggunakan perintah dengan teks yang Anda gunakan di baris {line_number}" +msgstr "" +"Sepertinya Anda lupa menggunakan perintah dengan teks yang Anda gunakan di " +"baris {line_number}" msgid "Missing Command" msgstr "Sepertinya Anda lupa menggunakan perintah pada baris {line_number}." msgid "Missing Inner Command" -msgstr "Sepertinya Anda lupa menggunakan perintah dengan pernyataan {command} yang Anda gunakan pada baris {line_number}." +msgstr "" +"Sepertinya Anda lupa menggunakan perintah dengan pernyataan {command} yang " +"Anda gunakan pada baris {line_number}." +#, fuzzy msgid "Misspelled At Command" msgstr "" +"It looks like you might have misspelled the {command} command, instead you " +"wrote {invalid_argument} in line {line_number}." msgid "No Indentation" -msgstr "Anda menggunakan terlalu sedikit spasi pada baris {line_number}. Anda menggunakan {leading_spaces} spasi, dan itu tidak cukup. Mulailah setiap blok baru dengan spasi {indent_size} lebih banyak dari baris sebelumnya." +msgstr "" +"Anda menggunakan terlalu sedikit spasi pada baris {line_number}. Anda " +"menggunakan {leading_spaces} spasi, dan itu tidak cukup. Mulailah setiap " +"blok baru dengan spasi {indent_size} lebih banyak dari baris sebelumnya." msgid "Parse" -msgstr "Kode yang kamu masukan bukan kode Hedy yang valid. Ada kesalahan pada baris {location[0]}, pada posisi {location[1]}. Kamu menuliskan {character_found}, tapi itu tidak diperbolehkan." +msgstr "" +"Kode yang kamu masukan bukan kode Hedy yang valid. Ada kesalahan pada baris " +"{location[0]}, pada posisi {location[1]}. Kamu menuliskan {character_found}, " +"tapi itu tidak diperbolehkan." msgid "Pressit Missing Else" -msgstr "Anda lupa menambahkan apa yang terjadi bila Anda menekan tombol lain, tambahkan {else} ke kode Anda" +msgstr "" +"Anda lupa menambahkan apa yang terjadi bila Anda menekan tombol lain, " +"tambahkan {else} ke kode Anda" msgid "Too Big" -msgstr "Wow! Program Anda memiliki {lines_of_code} baris kode yang mengesankan! Namun kami hanya dapat memproses {max_lines} baris di level ini. Buat program Anda lebih kecil dan coba lagi." +msgstr "" +"Wow! Program Anda memiliki {lines_of_code} baris kode yang mengesankan! " +"Namun kami hanya dapat memproses {max_lines} baris di level ini. Buat " +"program Anda lebih kecil dan coba lagi." msgid "Unexpected Indentation" -msgstr "Anda menggunakan terlalu banyak spasi pada baris {line_number}. Anda menggunakan spasi {leading_spaces}, dan itu terlalu banyak. Mulailah setiap blok baru dengan spasi {indent_size} lebih banyak dari baris sebelumnya." +msgstr "" +"Anda menggunakan terlalu banyak spasi pada baris {line_number}. Anda " +"menggunakan spasi {leading_spaces}, dan itu terlalu banyak. Mulailah setiap " +"blok baru dengan spasi {indent_size} lebih banyak dari baris sebelumnya." msgid "Unquoted Assignment" -msgstr "Dari level ini, Anda perlu menempatkan teks di sebelah kanan {is} di antara tanda kutip. Anda lupa itu untuk teks {text}." +msgstr "" +"Dari level ini, Anda perlu menempatkan teks di sebelah kanan {is} di antara " +"tanda kutip. Anda lupa itu untuk teks {text}." msgid "Unquoted Equality Check" -msgstr "Jika Anda ingin memeriksa apakah suatu variabel sama dengan beberapa kata, kata-kata tersebut harus diapit oleh tanda kutip!" +msgstr "" +"Jika Anda ingin memeriksa apakah suatu variabel sama dengan beberapa kata, " +"kata-kata tersebut harus diapit oleh tanda kutip!" msgid "Unquoted Text" -msgstr "Hati-hati. Jika Anda {ask} atau {print} sesuatu, teks harus diawali dan diakhiri dengan tanda kutip. Anda lupa untuk teks {unquotedtext}." +msgstr "" +"Hati-hati. Jika Anda {ask} atau {print} sesuatu, teks harus diawali dan " +"diakhiri dengan tanda kutip. Anda lupa untuk teks {unquotedtext}." msgid "Unsupported Float" -msgstr "Angka non-integer belum didukung namun akan ada dalam beberapa level. Untuk saat ini ubah {value} menjadi bilangan bulat." +msgstr "" +"Angka non-integer belum didukung namun akan ada dalam beberapa level. Untuk " +"saat ini ubah {value} menjadi bilangan bulat." msgid "Unsupported String Value" msgstr "Nilai teks tidak boleh berisi {invalid_value}." msgid "Var Undefined" -msgstr "Kamu mencoba untuk menampilkan variabel {name}, tapi kamu belum mengisinya dengan nilai. Ada kemungkinan bahwa kamu sedang mencoba untuk menampilkan kata {name} tapi melupakan tanda kutip." +msgstr "" +"Kamu mencoba untuk menampilkan variabel {name}, tapi kamu belum mengisinya " +"dengan nilai. Ada kemungkinan bahwa kamu sedang mencoba untuk menampilkan " +"kata {name} tapi melupakan tanda kutip." msgid "Wrong Level" -msgstr "Itu adalah kode Hedy yang benar, namun tidak pada level yang tepat. Kamu menulis kode {offending_keyword} untuk level {working_level}. Tip: {tip}" +msgstr "" +"Itu adalah kode Hedy yang benar, namun tidak pada level yang tepat. Kamu " +"menulis kode {offending_keyword} untuk level {working_level}. Tip: {tip}" msgid "account_overview" msgstr "Ikhtisar akun" @@ -125,7 +186,13 @@ msgid "accounts_created" msgstr "Akun yang berhasil dibuat." msgid "accounts_intro" -msgstr "Di halaman ini Anda dapat membuat akun untuk beberapa siswa sekaligus. Ini secara otomatis ditambahkan ke kelas saat ini, jadi pastikan kelas yang ditampilkan di atas adalah kelas yang benar! Setiap nama pengguna harus unik di seluruh sistem Hedy. Anda dapat menggunakan 'Nama kelas Postfix' untuk menambahkan nama kelas Anda ke semua akun. Jika Anda memasukkan sandi secara manual, sandi tersebut harus setidaknya 6 karakter." +msgstr "" +"Di halaman ini Anda dapat membuat akun untuk beberapa siswa sekaligus. Ini " +"secara otomatis ditambahkan ke kelas saat ini, jadi pastikan kelas yang " +"ditampilkan di atas adalah kelas yang benar! Setiap nama pengguna harus unik " +"di seluruh sistem Hedy. Anda dapat menggunakan 'Nama kelas Postfix' untuk " +"menambahkan nama kelas Anda ke semua akun. Jika Anda memasukkan sandi secara " +"manual, sandi tersebut harus setidaknya 6 karakter." msgid "achievement_earned" msgstr "Anda telah memperoleh prestasi!" @@ -164,13 +231,24 @@ msgid "adventure_empty" msgstr "Anda tidak memasukkan nama petualangan!" msgid "adventure_exp_1" -msgstr "Ketik petualangan pilihan Anda di sisi kanan. Setelah membuat petualangan Anda, Anda dapat memasukkannya ke dalam salah satu kelas Anda di bawah \"penyesuaian\". Jika Anda ingin memasukkan perintah dalam petualangan Anda, silakan gunakan kode jangkar seperti ini:" +msgstr "" +"Ketik petualangan pilihan Anda di sisi kanan. Setelah membuat petualangan " +"Anda, Anda dapat memasukkannya ke dalam salah satu kelas Anda di bawah " +"\"penyesuaian\". Jika Anda ingin memasukkan perintah dalam petualangan Anda, " +"silakan gunakan kode jangkar seperti ini:" msgid "adventure_exp_2" -msgstr "Jika Anda ingin menampilkan cuplikan kode sebenarnya, misalnya untuk memberikan template atau contoh kode kepada siswa. Silakan gunakan pra jangkar seperti ini:" +msgstr "" +"Jika Anda ingin menampilkan cuplikan kode sebenarnya, misalnya untuk " +"memberikan template atau contoh kode kepada siswa. Silakan gunakan pra " +"jangkar seperti ini:" msgid "adventure_exp_3" -msgstr "Pastikan Anda selalu mengapit kata kunci dengan { }, agar kata kunci tersebut dikenali dengan benar. Anda dapat menggunakan tombol \"pratinjau\" untuk melihat versi gaya petualangan Anda. Untuk melihat petualangan di halaman khusus, pilih \"lihat\" dari halaman guru." +msgstr "" +"Pastikan Anda selalu mengapit kata kunci dengan { }, agar kata kunci " +"tersebut dikenali dengan benar. Anda dapat menggunakan tombol \"pratinjau\" " +"untuk melihat versi gaya petualangan Anda. Untuk melihat petualangan di " +"halaman khusus, pilih \"lihat\" dari halaman guru." msgid "adventure_id_invalid" msgstr "ID petualangan ini tidak valid." @@ -218,7 +296,8 @@ msgid "already_account" msgstr "Sudah memiliki akun?" msgid "already_program_running" -msgstr "Sudah ada program yang sedang berjalan, selesaikan dulu program tersebut." +msgstr "" +"Sudah ada program yang sedang berjalan, selesaikan dulu program tersebut." msgid "already_teacher" msgstr "Anda sudah memiliki akun guru." @@ -239,7 +318,9 @@ msgid "are_you_sure" msgstr "Apakah kamu yakin? Kamu tidak dapat membatalkan aksi ini." msgid "ask_needs_var" -msgstr "Mulai level 2, {ask} perlu digunakan dengan variabel. Contoh: nama {is} {ask} Siapa namamu?" +msgstr "" +"Mulai level 2, {ask} perlu digunakan dengan variabel. Contoh: nama {is} " +"{ask} Siapa namamu?" msgid "back_to_class" msgstr "Kembali ke kelas" @@ -263,10 +344,15 @@ msgid "cant_parse_exception" msgstr "Tidak dapat menguraikan program" msgid "catch_index_exception" -msgstr "Anda mencoba mengakses daftar {list_name} tetapi daftar itu kosong atau indeksnya tidak ada." +msgstr "" +"Anda mencoba mengakses daftar {list_name} tetapi daftar itu kosong atau " +"indeksnya tidak ada." +#, fuzzy msgid "catch_value_exception" msgstr "" +"While running your program the command {command} received the value {value} " +"which is not allowed. {suggestion}." msgid "certificate" msgstr "Sertifikat Penyelesaian" @@ -304,23 +390,31 @@ msgstr "Silakan masukan nama dari kelas" msgid "class_overview" msgstr "Ikhtisar kelas" +#, fuzzy msgid "class_survey_description" msgstr "" +"We would like to get a better overview of our Hedy users. By providing these " +"answers, you would help improve Hedy. Thank you!" +#, fuzzy msgid "class_survey_later" -msgstr "" +msgstr "Remind me tomorrow" +#, fuzzy msgid "class_survey_question1" -msgstr "" +msgstr "What is the age range in your class?" +#, fuzzy msgid "class_survey_question2" -msgstr "" +msgstr "What is the spoken language in your class?" +#, fuzzy msgid "class_survey_question3" -msgstr "" +msgstr "What is the gender balance in your class?" +#, fuzzy msgid "class_survey_question4" -msgstr "" +msgstr "What distinguishes your students from others?" msgid "close" msgstr "Menutup" @@ -410,7 +504,9 @@ msgid "create_teacher_account" msgstr "Buat akun guru" msgid "create_teacher_account_explanation" -msgstr "Dengan akun guru, Anda dapat menyimpan program Anda dan melihat hasil siswa Anda." +msgstr "" +"Dengan akun guru, Anda dapat menyimpan program Anda dan melihat hasil siswa " +"Anda." msgid "creator" msgstr "Pencipta" @@ -503,7 +599,10 @@ msgid "echo_and_ask_mismatch_exception" msgstr "Echo dan tanyakan ketidakcocokan" msgid "echo_out" -msgstr "Memulai di level 2 `{echo}` tidak diperlukan lagi. Anda dapat mengulang jawaban dengan `{ask}` dan `{print}` sekarang. Contoh: `nama {is} {ask} Kamu dipanggil apa? {print} halo nama`" +msgstr "" +"Memulai di level 2 `{echo}` tidak diperlukan lagi. Anda dapat mengulang " +"jawaban dengan `{ask}` dan `{print}` sekarang. Contoh: `nama {is} {ask} Kamu " +"dipanggil apa? {print} halo nama`" msgid "edit_code_button" msgstr "Ubah kode" @@ -554,7 +653,15 @@ msgid "expiration_date" msgstr "Tanggal habis tempo" msgid "explore_explanation" -msgstr "Di halaman ini Anda dapat melihat program yang dibuat oleh pengguna Hedy lainnya. Anda dapat memfilter level Hedy dan petualangan. Klik \"Lihat program\" untuk membuka program dan menjalankannya. Program dengan header berwarna merah mengandung kesalahan. Anda masih dapat membuka program tersebut, tetapi menjalankannya akan menghasilkan kesalahan. Anda tentu saja dapat mencoba memperbaikinya! Jika pembuatnya memiliki profil publik, Anda dapat mengeklik nama penggunanya untuk mengunjungi profilnya. Di sana Anda akan menemukan semua program bersama mereka dan banyak lagi!" +msgstr "" +"Di halaman ini Anda dapat melihat program yang dibuat oleh pengguna Hedy " +"lainnya. Anda dapat memfilter level Hedy dan petualangan. Klik \"Lihat " +"program\" untuk membuka program dan menjalankannya. Program dengan header " +"berwarna merah mengandung kesalahan. Anda masih dapat membuka program " +"tersebut, tetapi menjalankannya akan menghasilkan kesalahan. Anda tentu saja " +"dapat mencoba memperbaikinya! Jika pembuatnya memiliki profil publik, Anda " +"dapat mengeklik nama penggunanya untuk mengunjungi profilnya. Di sana Anda " +"akan menemukan semua program bersama mereka dan banyak lagi!" msgid "explore_programs" msgstr "Jelajahi program" @@ -692,10 +799,16 @@ msgid "highest_quiz_score" msgstr "Skor kuis tertinggi" msgid "highscore_explanation" -msgstr "Di halaman ini Anda dapat melihat Skor Tertinggi saat ini, berdasarkan jumlah pencapaian yang dikumpulkan. Lihat peringkat untuk semua pengguna, negara atau kelas Anda. Klik pada nama pengguna untuk melihat profil publiknya." +msgstr "" +"Di halaman ini Anda dapat melihat Skor Tertinggi saat ini, berdasarkan " +"jumlah pencapaian yang dikumpulkan. Lihat peringkat untuk semua pengguna, " +"negara atau kelas Anda. Klik pada nama pengguna untuk melihat profil " +"publiknya." msgid "highscore_no_public_profile" -msgstr "Anda tidak memiliki profil publik dan oleh karena itu tidak terdaftar di skor tertinggi. Apakah Anda ingin membuatnya?" +msgstr "" +"Anda tidak memiliki profil publik dan oleh karena itu tidak terdaftar di " +"skor tertinggi. Apakah Anda ingin membuatnya?" msgid "highscores" msgstr "Nilai tinggi" @@ -737,7 +850,9 @@ msgid "invalid_command_exception" msgstr "Perintah tidak valid" msgid "invalid_keyword_language_comment" -msgstr "# Bahasa kata kunci yang diberikan tidak valid, bahasa kata kunci disetel ke bahasa Inggris" +msgstr "" +"# Bahasa kata kunci yang diberikan tidak valid, bahasa kata kunci disetel ke " +"bahasa Inggris" msgid "invalid_language_comment" msgstr "# Bahasa yang diberikan tidak valid, bahasa disetel ke bahasa Inggris" @@ -749,7 +864,8 @@ msgid "invalid_program_comment" msgstr "# Program yang disediakan tidak valid, silakan coba lagi" msgid "invalid_teacher_invitation_code" -msgstr "Kode undangan guru tidak valid. Untuk menjadi guru, hubungi hello@hedy.org." +msgstr "" +"Kode undangan guru tidak valid. Untuk menjadi guru, hubungi hello@hedy.org." msgid "invalid_tutorial_step" msgstr "Langkah tutorial tidak valid" @@ -776,10 +892,14 @@ msgid "join_class" msgstr "Gabung kelas" msgid "join_prompt" -msgstr "Kamu memerlukan akun untuk bergabung ke kelas. Apakah kamu ingin masuk dengan akun kamu sekarang?" +msgstr "" +"Kamu memerlukan akun untuk bergabung ke kelas. Apakah kamu ingin masuk " +"dengan akun kamu sekarang?" msgid "keyword_language_invalid" -msgstr "Silakan pilih bahasa kata kunci yang valid (pilih bahasa Inggris atau bahasa Anda sendiri)." +msgstr "" +"Silakan pilih bahasa kata kunci yang valid (pilih bahasa Inggris atau bahasa " +"Anda sendiri)." msgid "language" msgstr "Bahasa" @@ -864,14 +984,18 @@ msgstr "Program terpanjang" msgid "mail_change_password_body" msgstr "" -"Password Hedy kamu sudah berhasil diubah. Jika kamu melakukan ini, tidak ada masalah.\n" -"Jika kamu tidak melakukan ini, mohon segera kontak kami dengan cara membalas email ini." +"Password Hedy kamu sudah berhasil diubah. Jika kamu melakukan ini, tidak ada " +"masalah.\n" +"Jika kamu tidak melakukan ini, mohon segera kontak kami dengan cara membalas " +"email ini." msgid "mail_change_password_subject" msgstr "Password Hedy kamu sudah berhasil diubah" msgid "mail_error_change_processed" -msgstr "Ada yang salah saat mengirim email validasi, perubahan masih diproses dengan benar." +msgstr "" +"Ada yang salah saat mengirim email validasi, perubahan masih diproses dengan " +"benar." msgid "mail_goodbye" msgstr "" @@ -883,16 +1007,20 @@ msgstr "Hai {username}!" msgid "mail_recover_password_body" msgstr "" -"Dengan mengklik tautan ini, kamu dapat men-set password Hedy baru. Tautan ini berlaku selama 4 jam.\n" -"Jika kamu tidak membutuhkan set ulang password, mohon abaikan email ini: {link}" +"Dengan mengklik tautan ini, kamu dapat men-set password Hedy baru. Tautan " +"ini berlaku selama 4 jam.\n" +"Jika kamu tidak membutuhkan set ulang password, mohon abaikan email ini: " +"{link}" msgid "mail_recover_password_subject" msgstr "Set ulang password Hedy kamu." msgid "mail_reset_password_body" msgstr "" -"Password Hedy kamu sudah di-set ke yang baru. Jika kamu melakukan ini, tidak masalah.\n" -"Jika kamu tidak mengganti password, segera kontak kami dengan membalas email ini." +"Password Hedy kamu sudah di-set ke yang baru. Jika kamu melakukan ini, tidak " +"masalah.\n" +"Jika kamu tidak mengganti password, segera kontak kami dengan membalas email " +"ini." msgid "mail_reset_password_subject" msgstr "Password Hedy kamu sudah berhasil di-set ulang" @@ -900,23 +1028,41 @@ msgstr "Password Hedy kamu sudah berhasil di-set ulang" msgid "mail_welcome_teacher_body" msgstr "" "Selamat datang!\n" -"Selamat atas akun guru Hedy yang baru. Selamat datang di komunitas guru Hedy di seluruh dunia!\n" +"Selamat atas akun guru Hedy yang baru. Selamat datang di komunitas guru Hedy " +"di seluruh dunia!\n" "\n" "Apa yang dapat dilakukan akun guru\n" "Ada sejumlah opsi tambahan yang terbuka untuk Anda sekarang.\n" "\n" -"1. Penjelasan tambahan tersedia di teacher's manual.\n" -"2. Dengan akun guru Anda, Anda dapat membuat kelas. Siswa Anda dapat bergabung dengan kelas Anda dan Anda dapat melihat kemajuan mereka. Kelas dibuat dan dikelola melalui teacher's page.\n" -"3. Anda dapat sepenuhnya menyesuaikan kelas Anda, misalnya Anda dapat membuka dan menutup level, mengaktifkan atau menonaktifkan petualangan, dan menulis petualangan Anda sendiri!\n" +"1. Penjelasan tambahan tersedia di teacher's manual.\n" +"2. Dengan akun guru Anda, Anda dapat membuat kelas. Siswa Anda dapat " +"bergabung dengan kelas Anda dan Anda dapat melihat kemajuan mereka. Kelas " +"dibuat dan dikelola melalui teacher's page.\n" +"3. Anda dapat sepenuhnya menyesuaikan kelas Anda, misalnya Anda dapat " +"membuka dan menutup level, mengaktifkan atau menonaktifkan petualangan, dan " +"menulis petualangan Anda sendiri!\n" "\n" "Bergabunglah dengan komunitas online kami!\n" -"Semua guru Hedy, pemrogram, dan penggemar lainnya dipersilakan untuk bergabung dengan Discord server kami. Ini adalah tempat yang ideal untuk mengobrol tentang Hedy: kami memiliki saluran tempat Anda dapat menunjukkan proyek dan pelajaran keren Anda, saluran untuk melaporkan bug, dan saluran untuk mengobrol dengan guru lain dan tim Hedy.\n" +"Semua guru Hedy, pemrogram, dan penggemar lainnya dipersilakan untuk " +"bergabung dengan Discord server kami. Ini adalah tempat yang ideal untuk mengobrol tentang Hedy: kami " +"memiliki saluran tempat Anda dapat menunjukkan proyek dan pelajaran keren " +"Anda, saluran untuk melaporkan bug, dan saluran untuk mengobrol dengan guru " +"lain dan tim Hedy.\n" "\n" "Cara meminta bantuan \n" -"Jika ada yang kurang jelas, Anda dapat memberi tahu kami di Discord, atau kirim email kepada kami.\n" +"Jika ada yang kurang jelas, Anda dapat memberi tahu kami di Discord, atau kirim email kepada kami.\n" "\n" "Cara melaporkan bug\n" -"Di Discord, kami memiliki saluran untuk melaporkan bug, yang disebut #bugs. Itu adalah tempat yang tepat untuk memberi tahu kami tentang masalah yang Anda hadapi. Jika Anda tahu cara menggunakan GitHub, Anda dapat membuat issue di sana.\n" +"Di Discord, kami memiliki saluran untuk melaporkan bug, yang disebut #bugs. " +"Itu adalah tempat yang tepat untuk memberi tahu kami tentang masalah yang " +"Anda hadapi. Jika Anda tahu cara menggunakan GitHub, Anda dapat membuat issue di " +"sana.\n" msgid "mail_welcome_teacher_subject" msgstr "Akun guru Hedy Anda sudah siap" @@ -939,7 +1085,9 @@ msgid "main_title" msgstr "Hedy" msgid "make_sure_you_are_done" -msgstr "Pastikan Anda sudah selesai! Anda tidak akan dapat mengubah program Anda lagi setelah Anda mengklik \"Serahkan\"." +msgstr "" +"Pastikan Anda sudah selesai! Anda tidak akan dapat mengubah program Anda " +"lagi setelah Anda mengklik \"Serahkan\"." msgid "male" msgstr "Laki-laki" @@ -1014,7 +1162,9 @@ msgid "no_certificate" msgstr "Pengguna ini belum mendapatkan Sertifikat Penyelesaian Hedy" msgid "no_more_flat_if" -msgstr "Mulai dari level 8, kode setelah {if} perlu ditempatkan pada baris berikutnya dan dimulai dengan 4 spasi." +msgstr "" +"Mulai dari level 8, kode setelah {if} perlu ditempatkan pada baris " +"berikutnya dan dimulai dengan 4 spasi." msgid "no_programs" msgstr "Kamu belum memiliki program." @@ -1110,7 +1260,9 @@ msgid "other_text" msgstr "Bahasa teks lainnya" msgid "overwrite_warning" -msgstr "Anda sudah mempunyai program dengan nama ini, menyimpan program ini akan menggantikan program lama. Apa kamu yakin?" +msgstr "" +"Anda sudah mempunyai program dengan nama ini, menyimpan program ini akan " +"menggantikan program lama. Apa kamu yakin?" msgid "page" msgstr "halaman" @@ -1155,7 +1307,9 @@ msgid "pending_invites" msgstr "Undangan yang tertunda" msgid "people_with_a_link" -msgstr "Orang lain yang memiliki tautan dapat melihat program ini. Itu juga dapat ditemukan di halaman \"Jelajahi\"." +msgstr "" +"Orang lain yang memiliki tautan dapat melihat program ini. Itu juga dapat " +"ditemukan di halaman \"Jelajahi\"." msgid "percentage" msgstr "persentase" @@ -1248,7 +1402,10 @@ msgid "public_profile" msgstr "Profil publik" msgid "public_profile_info" -msgstr "Dengan memilih kotak ini saya membuat profil saya terlihat oleh semua orang. Berhati-hatilah untuk tidak membagikan informasi pribadi seperti nama atau alamat rumah Anda, karena semua orang dapat melihatnya!" +msgstr "" +"Dengan memilih kotak ini saya membuat profil saya terlihat oleh semua orang. " +"Berhati-hatilah untuk tidak membagikan informasi pribadi seperti nama atau " +"alamat rumah Anda, karena semua orang dapat melihatnya!" msgid "public_profile_updated" msgstr "Profil publik diperbarui, halaman akan dimuat ulang." @@ -1362,10 +1519,13 @@ msgid "save" msgstr "Menyimpan" msgid "save_parse_warning" -msgstr "Program ini mengandung kesalahan, apakah Anda yakin ingin menyimpannya?" +msgstr "" +"Program ini mengandung kesalahan, apakah Anda yakin ingin menyimpannya?" msgid "save_prompt" -msgstr "Kamu harus memiliki akun untuk menyimpan program. Apakah kamu mau masuk dengan akunmu sekarang?" +msgstr "" +"Kamu harus memiliki akun untuk menyimpan program. Apakah kamu mau masuk " +"dengan akunmu sekarang?" msgid "save_success_detail" msgstr "Program tersimpan dengan sukses." @@ -1407,7 +1567,9 @@ msgid "sent_by" msgstr "Undangan ini dikirim oleh" msgid "sent_password_recovery" -msgstr "Kamu harusnya akan segera menerima email dengan instruksi terkait bagaimana memulihkan password kamu." +msgstr "" +"Kamu harusnya akan segera menerima email dengan instruksi terkait bagaimana " +"memulihkan password kamu." msgid "settings" msgstr "Pengaturan pribadi saya" @@ -1416,7 +1578,9 @@ msgid "share" msgstr "Bagikan" msgid "share_by_giving_link" -msgstr "Tunjukkan program Anda kepada orang lain dengan memberi mereka tautan di bawah ini:" +msgstr "" +"Tunjukkan program Anda kepada orang lain dengan memberi mereka tautan di " +"bawah ini:" msgid "share_confirm" msgstr "Apakah kamu yakin ingin membuat program kamu publik?" @@ -1440,7 +1604,9 @@ msgid "social_media" msgstr "Media sosial" msgid "something_went_wrong_keyword_parsing" -msgstr "Ada kesalahan dalam petualangan Anda, apakah semua kata kunci diapit oleh { } dengan benar?" +msgstr "" +"Ada kesalahan dalam petualangan Anda, apakah semua kata kunci diapit oleh " +"{ } dengan benar?" msgid "space" msgstr "spasi" @@ -1520,20 +1686,24 @@ msgstr "Langganan" msgid "subscribe_newsletter" msgstr "Berlangganan ke buletin" +#, fuzzy msgid "suggestion_color" -msgstr "" +msgstr "Try using another color" +#, fuzzy msgid "suggestion_number" -msgstr "" +msgstr "Try changing the value to a number" msgid "surname" msgstr "Nama Depan" +#, fuzzy msgid "survey_skip" -msgstr "" +msgstr "Don't show this again" +#, fuzzy msgid "survey_submit" -msgstr "" +msgstr "Submit" msgid "tag_in_adventure" msgstr "" @@ -1557,7 +1727,9 @@ msgid "teacher_invalid" msgstr "Nilai guru Anda tidak valid." msgid "teacher_invitation_require_login" -msgstr "Untuk mengatur profil Anda sebagai guru, kami mengharuskan Anda masuk. Jika Anda belum memiliki akun, silakan buat akun." +msgstr "" +"Untuk mengatur profil Anda sebagai guru, kami mengharuskan Anda masuk. Jika " +"Anda belum memiliki akun, silakan buat akun." msgid "teacher_manual" msgstr "Panduan guru" @@ -1569,7 +1741,9 @@ msgid "teacher_tutorial_logo_alt" msgstr "Ikon tutorial guru" msgid "teacher_welcome" -msgstr "Selamat datang di Hedy! Anda sekarang bangga menjadi pemilik akun guru yang memungkinkan Anda membuat kelas dan mengundang siswa." +msgstr "" +"Selamat datang di Hedy! Anda sekarang bangga menjadi pemilik akun guru yang " +"memungkinkan Anda membuat kelas dan mengundang siswa." msgid "teachers" msgstr "Guru-guru" @@ -1659,7 +1833,10 @@ msgid "token_invalid" msgstr "Token Anda tidak valid." msgid "translate_error" -msgstr "Ada yang tidak beres saat menerjemahkan kode. Coba jalankan kode untuk melihat apakah ada kesalahan. Kode dengan kesalahan tidak dapat diterjemahkan." +msgstr "" +"Ada yang tidak beres saat menerjemahkan kode. Coba jalankan kode untuk " +"melihat apakah ada kesalahan. Kode dengan kesalahan tidak dapat " +"diterjemahkan." msgid "translating_hedy" msgstr "Menerjemahkan Hedy" @@ -1694,7 +1871,8 @@ msgid "unlock_thresholds" msgstr "Buka kunci ambang batas level" msgid "unsaved_class_changes" -msgstr "Ada perubahan yang belum disimpan, yakin ingin meninggalkan halaman ini?" +msgstr "" +"Ada perubahan yang belum disimpan, yakin ingin meninggalkan halaman ini?" msgid "unshare" msgstr "Berhenti berbagi" @@ -1929,4 +2107,3 @@ msgstr "Program Anda" #~ msgid "tag_deleted" #~ msgstr "This tag was successfully deleted." - From 882861dd9dfcac969dcf8f3ad18a26cb48997d14 Mon Sep 17 00:00:00 2001 From: Andrii Kurdiumov Date: Fri, 24 Nov 2023 17:56:16 +0100 Subject: [PATCH 02/15] Translated using Weblate (Ukrainian) Currently translated at 100.0% (44 of 44 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (24 of 24 strings) Translated using Weblate (Ukrainian) Currently translated at 99.4% (188 of 189 strings) Translated using Weblate (Ukrainian) Currently translated at 32.1% (257 of 800 strings) Co-authored-by: Andrii Kurdiumov Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/uk/ Translate-URL: https://hosted.weblate.org/projects/hedy/client-messages/uk/ Translate-URL: https://hosted.weblate.org/projects/hedy/commands/uk/ Translate-URL: https://hosted.weblate.org/projects/hedy/tutorials/uk/ Translation: Hedy/Adventures Translation: Hedy/Cheatsheets Translation: Hedy/Tutorials Translation: Hedy/client-messages --- content/adventures/uk.yaml | 15 ++++++--------- content/cheatsheets/uk.yaml | 6 +++--- content/client-messages/uk.yaml | 12 ++++++------ content/tutorials/uk.yaml | 2 +- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/content/adventures/uk.yaml b/content/adventures/uk.yaml index ee47b978629..870486a11b8 100644 --- a/content/adventures/uk.yaml +++ b/content/adventures/uk.yaml @@ -52,7 +52,7 @@ adventures: Цей код не працюватиме у цьому рівні, оскільки ви ще не використовували змінні. Змініть команди `{ask}` та `{echo}` у вашому коді на правильну форму, яку ви вивчили у цьому рівні. - **Додатково** Додайте до коду команду sleep, щоб створити напругу у вашій історії. + **Додатково** Додайте до коду команду `{sleep}`, щоб створити напругу у вашій історії. start_code: '{print} Твоя історія' 3: story_text: | @@ -174,8 +174,7 @@ adventures: ``` start_code: '# розмістіть свій код тут' 9: - story_text: "У цьому рівні ви можете використовувати команди `{if}` і `{repeat}` всередині інших команд `{if}` і `{repeat}`. \nЦе дає вам багато можливостей і дійсно допомагає зробити вашу історію інтерактивною.\n\n### Вправа 1\n Закінчіть код, щоб `{if}` працював коректно.\n\n### Вправа\ - \ 2\nДодайте `{if}` та `{else}` для тієї частини історії, де Робін також повертається додому.\n \n### Вправа 3\nПоверніться до своєї історії 8-го рівня і використайте принаймні два `{if}` всередині іншого `{if}`.\n" + story_text: "У цьому рівні ви можете використовувати команди `{if}` і `{repeat}` всередині інших команд `{if}` і `{repeat}`. \nЦе дає вам багато можливостей і дійсно допомагає зробити вашу історію інтерактивною.\n\n### Вправа 1\n Закінчіть код, щоб `{if}` працював коректно.\n\n### Вправа 2\nДодайте `{if}` та `{else}` для тієї частини історії, де Робін також повертається додому.\n \n### Вправа 3\nПоверніться до своєї історії 8-го рівня і використайте принаймні два `{if}` всередині іншого `{if}`.\n" example_code: | ``` {print} 'Робін йде центром міста' @@ -1417,7 +1416,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1468,7 +1467,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -1490,8 +1489,7 @@ adventures: description: Пояснення рівнів levels: 1: - story_text: "На першому рівні ви можете використовувати команди `{print}`, `{ask}` та `{echo}`.\nНаберіть свій код у полі для програмування. Або натисніть зелену кнопку в блоці прикладу коду, і код буде набраний за вас!\nСпробуйте код самостійно, натиснувши зелену кнопку \"Запустити код\"\ - \ під полем програмування.\n \nВивести текст на екран можна за допомогою команди `{print}`. \n" + story_text: "На першому рівні ви можете використовувати команди `{print}`, `{ask}` та `{echo}`.\nНаберіть свій код у полі для програмування. Або натисніть зелену кнопку в блоці прикладу коду, і код буде набраний за вас!\nСпробуйте код самостійно, натиснувши зелену кнопку \"Запустити код\" під полем програмування.\n \nВивести текст на екран можна за допомогою команди `{print}`. \n" start_code: '{print} привіт світе!' 2: story_text: | @@ -1643,8 +1641,7 @@ adventures: {print} 'decimal numbers now need to use a dot' {print} 2.5 + 2.5 13: - story_text: "Зараз ми будемо вивчати `{and}` та `{or}`! Якщо ви хочете перевірити два оператори, вам не обов'язково використовувати два `{if}`, ви можете використовувати `{and}` і `{or}`. \n\nЯкщо ви використовуєте `{and}`, обидва оператори, зліва і справа від `{and}`, повинні бути істинними.\ - \ Ми також можемо використовувати `{or}`. Тоді лише одне твердження має бути правильним." + story_text: "Зараз ми будемо вивчати `{and}` та `{or}`! Якщо ви хочете перевірити два оператори, вам не обов'язково використовувати два `{if}`, ви можете використовувати `{and}` і `{or}`. \n\nЯкщо ви використовуєте `{and}`, обидва оператори, зліва і справа від `{and}`, повинні бути істинними. Ми також можемо використовувати `{or}`. Тоді лише одне твердження має бути правильним." example_code: | ``` name = {ask} 'what is your name?' diff --git a/content/cheatsheets/uk.yaml b/content/cheatsheets/uk.yaml index 8c9be8b60f7..05ce9a22dcb 100644 --- a/content/cheatsheets/uk.yaml +++ b/content/cheatsheets/uk.yaml @@ -35,7 +35,7 @@ колір {is} {ask} Який твій улюблений колір? {print} колір твій улюблений! - name: '{sleep}' - explanation: '`{sleep}` робить так, що Hedy затримується на секунду, або на кілька секунд.' + explanation: 'Із `{sleep}` , ви можете змусити Hedy затримуватися на секунду, або на кілька секунд.' demo_code: |- {print} Одну секунду, дайте подумати... {sleep} @@ -101,7 +101,7 @@ explanation: Перевір елементи командою `{in}`. demo_code: |- красиві_кольори {is} зелений, жовтий - колір {is} {ask} 'Який {is} твій улюблений колір?' + колір {is} {ask} 'Який твій улюблений колір?' {if} колір {in} красиві_кольори {print} 'красивий!' {else} {print} 'пф' - name: '{pressed}' explanation: Перевірте, чи дана клавіша на клавіатурі `{pressed}`. @@ -309,7 +309,7 @@ першийфрукт = фрукти[1] {print} першийфрукт - name: Отримати випадковий елемент зі списку - explanation: Для отримання випадкового елемента зі списку ми використовуємо [випадковий], тому фрукти[випадковий] означає, отримати випадковий фрукт зі списку! + explanation: Для отримання випадкового елемента зі списку ми використовуємо [{випадковий}], тому фрукти[{випадковий}] означає, отримати довільний фрукт зі списку! demo_code: |- фрукти = ['банан', 'яблуко', 'вишня'] випадковий_фрукт = фрукти[{random}] diff --git a/content/client-messages/uk.yaml b/content/client-messages/uk.yaml index 9759165b917..5a2d63cfd37 100644 --- a/content/client-messages/uk.yaml +++ b/content/client-messages/uk.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: Це може бути правильний код, ви можете його виправити? @@ -9,11 +9,11 @@ Program_too_long: Ваша програма виконується надто д ServerError: Ви написали програму, яку ми не очікували. Якщо ви хочете допомогти, надішліть нам електронний лист із зазначенням рівня та вашої програми на hello@hedy.org. Тим часом спробуйте щось трохи інше та ще раз подивіться на приклади. Дякую! Transpile_error: Ми не можемо запустити вашу програму. Transpile_success: -- Гарна робота! -- Дивовижно! -- Чудова робота! -- Чудово! -- Ви чудово впоралися! +- Гарна робота! +- Дивовижно! +- Чудова робота! +- Чудово! +- Ви чудово впоралися! Transpile_warning: Попередження! Unsaved_Changes: Ви маєте незбережену програму. Ви хочете вийти, не зберігши її? dice: 🎲 diff --git a/content/tutorials/uk.yaml b/content/tutorials/uk.yaml index ca9863724ed..8ba3238afa2 100644 --- a/content/tutorials/uk.yaml +++ b/content/tutorials/uk.yaml @@ -41,7 +41,7 @@ intro: text: Можеш зберегти і поширити всі свої програми з іншими користувачами Hedy. 14: title: Шпаргалка - text: Якщо ти забув команду, можеш скористатись шпаргалкою. На ній э список всіх команд які ти можеш використати на цьому рівні. + text: Якщо ти забув команду, можеш скористатись шпаргалкою. На ній э список всіх команд які ти можеш використати на цьому рівні. Ти знайдеш підказку у кнопці 🤔 15: title: Кінець! text: Натисни 'наступний крок' і почни програмувати по справжньому! From ae3ad5404d0f43cb8c119547f6c97fa1bf16ecb6 Mon Sep 17 00:00:00 2001 From: EngageIndo Date: Fri, 24 Nov 2023 17:56:16 +0100 Subject: [PATCH 03/15] Translated using Weblate (Indonesian) Currently translated at 55.2% (442 of 800 strings) Co-authored-by: EngageIndo Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/id/ Translation: Hedy/Adventures --- content/adventures/id.yaml | 267 ++++++++++++++++++------------------- 1 file changed, 133 insertions(+), 134 deletions(-) diff --git a/content/adventures/id.yaml b/content/adventures/id.yaml index 28b93517d4d..2cc501d9fab 100644 --- a/content/adventures/id.yaml +++ b/content/adventures/id.yaml @@ -543,14 +543,13 @@ adventures: {else} {print} 'Salah! Dulu ' _ ``` story_text_3: | - You can also let the computer do random calculations on its own using {random}. - This is how you choose a number of tables to practice, and from that you always get a different sum: + **Tambahan** Anda juga dapat membiarkan komputer melakukan penjumlahan acak sendiri menggunakan `{random}`. start_code: | nomor_1 = {ask} 'Isi angka pertama:' nomor_2 = {ask} 'Isi angka kedua:' jawaban_benar = nomor_1 * nomor_2 {print} nomor_1 ' dikalikan ' nomor_2 ' adalah 'jawaban_benar - example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" + example_code_3: "angka = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nangka_1 = _\nangka_2 = _\njawaban_benar = angka_1 * angka_2\ndiberikan_jawaban = 'Berapakah 'angka_1' dikalikan 'angka_2'?'\n{if} _\n{else} _\n" 9: story_text: | Di level 6 Anda membuat kalkulator, di level ini Anda dapat memperluas kode tersebut sehingga menanyakan banyak pertanyaan. @@ -1031,123 +1030,123 @@ adventures: {print} 'Tolong, itu 'harga dolar'' ``` start_code: | - {print} 'Welcome to our sandwich shop' - amount 'How many sandwiches would you like to buy?' - {repeat} amount {times} - {ask} {is} {ask} 'What kind or bread would you like your sandwich to be?' - types_of_bread {is} white, wheat, rye, garlic, gluten free - {if} chosen_bread in types_of_bread - {print} 'Lovely!' + {print} 'Selamat datang di toko sandwich kami' + jumlah 'Berapa banyak sandwich yang ingin Anda beli?' + {repeat} jumlah {times} + {ask} {is} {ask} 'Anda ingin sandwich jenis apa atau roti apa?' + jenis_roti {is} putih, gandum, gandum hitam, bawang putih, bebas gluten + {if} roti_dipilih dalam jenis_roti_roti + {print} 'Indah sekali!' {else} - 'I'm sorry we don't sell that' - topping {is} {ask} 'What kind of topping would you like?' - sauce {is} {ask} 'What kind of sauce would you like?' - {print} One chosen_bread with topping and sauce. - price = amount * 6 - {print} 'That will be 'price dollar' please' + 'Maaf kami tidak menjualnya' + topping {is} {ask} 'Topping apa yang kamu mau?' + saus {is} {ask} 'Saus apa yang kamu mau?' + {print} Satu roti_pilihan dengan topping dan saus. + harga = jumlah * 6 + {print} 'Tolong, itu 'harga dolar'' 10: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Latihan + Perbaiki kode ini. Semoga beruntung! example_code: | - **Warning! This code needs to be debugged!** + **Peringatan! Kode ini perlu diperbaiki!** ``` - names = Muad Hasan Samira Noura - activities = fly a kite, go swimming, go hiking, catch tan in the sun - {for} name {is} names - {print} At the beach name loves to activity at random + nama = Muad Hasan Samira Noura + kegiatan = menerbangkan layang-layang, berenang, mendaki gunung, berjemur di bawah sinar matahari + {for} nama {is} nama + {print} Di pantai namanya suka beraktivitas {at} {random} ``` start_code: | - names = Muad Hasan Samira Noura - activities = fly a kite, go swimming, go hiking, catch tan in the sun - {for} name {is} names - {print} At the beach name loves to activity at random + nama-nama = Muad Hasan Samira Noura + kegiatan = menerbangkan layang-layang, berenang, mendaki gunung, berjemur di bawah sinar matahari + {for} nama {is} nama-nama + {print} Di pantai namanya suka beraktivitas sembarangan 11: story_text: |- - ### Exercise - Debug this calender program. The output of this program is supposed to look like a list of dates. - For example: + ### Latihan + Perbaiki program kalender ini. Output dari program ini seharusnya terlihat seperti daftar tanggal. + Misalnya: ``` - Hedy calender - Here are all the days of November - November 1 - November 2 - November 3 + Kalender Hedy + Ini semua hari-hari di bulan November + 1 November + 2 November + 3 November ``` - And so on. + Dan seterusnya. - Mind that you have to test your code extra carefully for the month February, because the amount of days in this month changes in leap years. + Ingatlah bahwa Anda harus menguji kode Anda dengan ekstra hati-hati untuk bulan Februari, karena jumlah hari di bulan ini berubah berdasarkan tahun kabisat. example_code: | - **Warning! This code needs to be debugged!** + **Peringatan! Kode ini perlu diperbaiki!** ``` - print 'Hedy calender' - months_with_31 days = January, March, May, July, September, October, December - months_with_30_days = April, June, August, November - month = ask 'Which month would you like to see?' - if month in months_with_31_days - days = 31 - if month in months_with30_days - days = 30 - if month = February - leap_years = 2020, 2024, 2028, 2036, 2040, 2044, 2028 - year = ask 'What year is it?' - if year in leap_years - days = 29 - else - days = 28 - - print 'Here are all the days of ' moth - for i in range 1 to days - print month i + print 'Kalender Hedy' + bulan_dengan_31 hari = Januari, Maret, Mei, Juli, September, Oktober, Desember + bulan_dengan_30_hari = April, Juni, Agustus, November + bulan = tanya 'Bulan apa yang ingin Anda lihat?' + jika bulan dalam bulan_dengan_31_hari + hari = 31 + jika bulan dalam bulan_dengan30_hari + hari = 30 + jika bulan = Februari + tahun_kabisat = 2020, 2024, 2028, 2036, 2040, 2044, 2028 + tahun = tanya 'Tahun berapa sekarang?' + jika tahun dalam tahun_kabisat + hari = 29 + kalau tidak + hari = 28 + + print 'Inilah hari-hari' ngengat + untuk i dalam rentang 1 hingga hari + cetak bulan i ``` start_code: | - print 'Hedy calender' - months_with_31 days = January, March, May, July, September, October, December - months_with_30_days = April, June, August, November - month = ask 'Which month would you like to see?' - if month in months_with_31_days - days = 31 - if month in months_with30_days - days = 30 - if month = February - leap_years = 2020, 2024, 2028, 2036, 2040, 2044, 2028 - year = ask 'What year is it?' - if year in leap_years - days = 29 - else - days = 28 - - print 'Here are all the days of ' moth - for i in range 1 to days - print month i + print 'Kalender Hedy' + bulan_dengan_31 hari = Januari, Maret, Mei, Juli, September, Oktober, Desember + bulan_dengan_30_hari = April, Juni, Agustus, November + bulan = tanya 'Bulan apa yang ingin Anda lihat?' + jika bulan dalam bulan_dengan_31_hari + hari = 31 + jika bulan dalam bulan_dengan30_hari + hari = 30 + jika bulan = Februari + tahun_kabisat = 2020, 2024, 2028, 2036, 2040, 2044, 2028 + tahun = tanya 'Tahun berapa sekarang?' + jika tahun dalam tahun_kabisat + hari = 29 + kalau tidak + hari = 28 + + print 'Inilah hari-hari' ngengat + untuk i dalam rentang 1 hingga hari + cetak bulan i 12: story_text: |- - ### Exercise - Debug this code. Good luck! + ### Latihan + Perbaiki kode ini. Semoga beruntung! example_code: | - **Warning! This code needs to be debugged!** + **Peringatan! Kode ini perlu diperbaiki!** ``` - define greet - greetings = 'Hello', 'Hi there', 'Goodevening' - print greetings at random - - define take_order - food = ask 'What would you like to eat?' - print 'One food' - drink = 'What would you like to drink?' - print 'One ' drink - more = ask 'Would you like anything else?' - if more is 'no' - print 'Alright' - else - print 'And ' more - print 'Thank you' - - print 'Welcome to our restaurant' - people = ask 'How many people are in your party tonight?' - for i in range 0 to people - call greet_costumer + mendefinisikan salam + salam = 'Halo', 'Halo', 'Selamat malam' + cetak salam secara acak + + tentukan mengambil_pesanan + makanan = tanya 'Kamu mau makan apa?' + print 'Satu makanan' + minum = 'Kamu ingin minum apa?' + print minuman 'Satu' + more = tanya 'Apakah Anda ingin yang lain?' + jika lebih berarti 'tidak' + cetak 'Baiklah' + kalau tidak + print 'Dan' lagi + print 'Terima kasih' + + ptint 'Selamat datang di restoran kami' + people = tanya 'Berapa orang yang ada di pestamu malam ini?' + untuk saya dalam rentang 0 hingga orang + hubungi salam_pelanggan ``` start_code: | define greet @@ -1417,33 +1416,33 @@ adventures: ``` start_code: |2 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1468,20 +1467,20 @@ adventures: ``` start_code: |2 - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Pengantar default_save_name: intro From 17ae835191266b83c172f5206dfee3a71fb92425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Pelay?= Date: Fri, 24 Nov 2023 17:56:16 +0100 Subject: [PATCH 04/15] Translated using Weblate (Spanish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 98.9% (570 of 576 strings) Co-authored-by: Jesús Pelay Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/es/ Translation: Hedy/Texts --- translations/es/LC_MESSAGES/messages.po | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/translations/es/LC_MESSAGES/messages.po b/translations/es/LC_MESSAGES/messages.po index a7bb7b2f5ac..2982a59b17e 100644 --- a/translations/es/LC_MESSAGES/messages.po +++ b/translations/es/LC_MESSAGES/messages.po @@ -3,20 +3,20 @@ # This file is distributed under the same license as the PROJECT project. # FIRST AUTHOR , 2023. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2023-11-23 12:10-0400\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: es\n" +"POT-Creation-Date: 2023-11-23 22:22+0000\n" +"PO-Revision-Date: 2023-11-24 14:12+0000\n" +"Last-Translator: Jesús Pelay \n" "Language-Team: es \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2.1-rc\n" "Generated-By: Babel 2.11.0\n" msgid "Access Before Assign" @@ -100,11 +100,8 @@ msgstr "" "Parece que has olvidad usar un comando en el {command} que has usado en la " "línea {line_number}." -#, fuzzy msgid "Misspelled At Command" -msgstr "" -"It looks like you might have misspelled the {command} command, instead you " -"wrote {invalid_argument} in line {line_number}." +msgstr "Parece que haz escrito incorrectamente el comando {command}, en su lugar escribiste {invalid_argument} en la línea {line_number}." msgid "No Indentation" msgstr "" @@ -378,15 +375,11 @@ msgstr "Por favor, introduce le nombre de la nueva clase" msgid "class_overview" msgstr "Resumen de la clase" -#, fuzzy msgid "class_survey_description" -msgstr "" -"We would like to get a better overview of our Hedy users. By providing these " -"answers, you would help improve Hedy. Thank you!" +msgstr "Nos gustaría obtener una mejor visión general de nuestros usarios de Hedy. Respondiendo estas preguntas nos ayudarías a mejorar. ¡Gracias!" -#, fuzzy msgid "class_survey_later" -msgstr "Remind me tomorrow" +msgstr "Recuérdame mañana" #, fuzzy msgid "class_survey_question1" From b2b7463c70bf5145cfd091c8be9aab2102726343 Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 24 Nov 2023 17:56:16 +0100 Subject: [PATCH 05/15] Translated using Weblate (Dutch) Currently translated at 94.8% (759 of 800 strings) Co-authored-by: Leo Translate-URL: https://hosted.weblate.org/projects/hedy/adventures/nl/ Translation: Hedy/Adventures --- content/adventures/nl.yaml | 145 ++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 82 deletions(-) diff --git a/content/adventures/nl.yaml b/content/adventures/nl.yaml index 87e7f27148f..dc3d1da03ba 100644 --- a/content/adventures/nl.yaml +++ b/content/adventures/nl.yaml @@ -155,9 +155,7 @@ adventures: ``` start_code: '{repeat} 5 {times} {print} ''Help!''' 8: - story_text: "In dit level kun jij jouw verhaal écht interactief maken! In dit level is het `{if}` commando namelijk veranderd, waardoor je er meerdere regels mee kunt printen. Zo kun je de lezer van je verhaal een keuze laten maken. Na de keuze gaat het verhaal verder op basis van die\ - \ keuze. Kijk maar naar het voorbeeld.\n\n### Opdracht 1\nIn de voorbeeldcode zie je hoe je twee verschillende verhalen kunt maken; eentje waarbij je op het geluid afgaat en eentje waarbij jij je verstopt. \nVul zelf lege plekken in! \n**Extra** Maak het verhaal nog langer. Wat gebeurt\ - \ er verder? Je kan ook een tweede `{ask}` toevoegen met een tweede keuze.\n\n### Opdracht 2\nOefen met het inspringen. Ga terug naar level 5, zoek je verhaalprogramma op. Maak dan je goede én slechte einde ieder minstens drie regels.\n" + story_text: "In dit level kun jij jouw verhaal écht interactief maken! In dit level is het `{if}` commando namelijk veranderd, waardoor je er meerdere regels mee kunt printen. Zo kun je de lezer van je verhaal een keuze laten maken. Na de keuze gaat het verhaal verder op basis van die keuze. Kijk maar naar het voorbeeld.\n\n### Opdracht 1\nIn de voorbeeldcode zie je hoe je twee verschillende verhalen kunt maken; eentje waarbij je op het geluid afgaat en eentje waarbij jij je verstopt. \nVul zelf lege plekken in! \n**Extra** Maak het verhaal nog langer. Wat gebeurt er verder? Je kan ook een tweede `{ask}` toevoegen met een tweede keuze.\n\n### Opdracht 2\nOefen met het inspringen. Ga terug naar level 5, zoek je verhaalprogramma op. Maak dan je goede én slechte einde ieder minstens drie regels.\n" example_code: | ``` hoofdpersoon = {ask} 'Hoe heet de hoofdpersoon in dit verhaal?' @@ -173,8 +171,7 @@ adventures: ``` start_code: '# Schrijf jouw code hier' 9: - story_text: "In dit level kun je `{if}` and `{repeat}` commando's in andere `{if}` en `{repeat}` commando's stoppen. \nHierdoor krijg je nog meer mogelijkheden om je verhaal echt interactief te maken!\n\n### Opdracht 1\nMaak de code af op de streepjes zodat de `{if}` het doet.\n\n### Opdracht\ - \ 2\nVoeg een `{if}` en een `{else}` toe aan het gedeelte van het verhaal waar Robin naar huis gaat.\n\n### Opdracht 3\nGa terug naar je verhaal van level 8 en gebruik ook minstens twee keer een `{if}` in een `{if}`.\n" + story_text: "In dit level kun je `{if}` and `{repeat}` commando's in andere `{if}` en `{repeat}` commando's stoppen. \nHierdoor krijg je nog meer mogelijkheden om je verhaal echt interactief te maken!\n\n### Opdracht 1\nMaak de code af op de streepjes zodat de `{if}` het doet.\n\n### Opdracht 2\nVoeg een `{if}` en een `{else}` toe aan het gedeelte van het verhaal waar Robin naar huis gaat.\n\n### Opdracht 3\nGa terug naar je verhaal van level 8 en gebruik ook minstens twee keer een `{if}` in een `{if}`.\n" example_code: | ``` {print} 'Robin loopt door de stad' @@ -192,8 +189,7 @@ adventures: ``` start_code: '# Schrijf jouw code hier' 10: - story_text: "In dit level kun je het commando `{for}` in je verhaal gebruiken. Op deze manier kun je gemakkelijk het kinderboek 'Beertje bruin, wat zie jij daar?' programmeren.\n\n### Opdracht \n\nKijk naar het verhaal, als je het niet kent, en zorg dat dit hele verhaal wordt uitgeprint.\n" + story_text: "In dit level kun je het commando `{for}` in je verhaal gebruiken. Op deze manier kun je gemakkelijk het kinderboek 'Beertje bruin, wat zie jij daar?' programmeren.\n\n### Opdracht \n\nKijk naar het verhaal, als je het niet kent, en zorg dat dit hele verhaal wordt uitgeprint.\n" example_code: | ``` dieren = _ , _ , _ @@ -327,8 +323,7 @@ adventures: description: introduceert en / of levels: 13: - story_text: We gaan nu `{and}` en `{or}` gebruiken! Als je twee dingen wilt checken hoef je niet meer twee {if}jes in elkaar te doen maar kan je nu `{and}` en `{or}` gebruiken. Beide dingen moeten waar zijn als je een `{and}` gebruikt. We kunnen ook `{or}` gebruiken. Daarbij moet er één - van de twee waar zijn. + story_text: We gaan nu `{and}` en `{or}` gebruiken! Als je twee dingen wilt checken hoef je niet meer twee {if}jes in elkaar te doen maar kan je nu `{and}` en `{or}` gebruiken. Beide dingen moeten waar zijn als je een `{and}` gebruikt. We kunnen ook `{or}` gebruiken. Daarbij moet er één van de twee waar zijn. example_code: | ``` naam = {ask} 'hoe heet jij?' @@ -359,8 +354,7 @@ adventures: ## Het echo commando Als je wil dat de computer jouw antwoord ook herhaalt, kun je het `{echo}` commando gebruiken. Let op: Je antwoord wordt herhaald aan het einde van de zin. In het voorbeeld komt jouw antwoord dus na Hoi. example_code_2: "```\n{print} Hallo!\n{ask} Hoe heet je? \n{echo} Hoi\n```\n" - story_text_3: "### Opdracht \nProbeer het`{ask}`commando en het`{echo}` commando uit. Vul eerst een goede code in op de plek van het streepje om het programma aan de praat te krijgen.\nStel daarna nog twee vragen door het `{ask}` commando te gebruiken. Gebruik na elke `{ask}` ook een `{echo}`\ - \ om het antwoord op het scherm te tonen\n" + story_text_3: "### Opdracht \nProbeer het`{ask}`commando en het`{echo}` commando uit. Vul eerst een goede code in op de plek van het streepje om het programma aan de praat te krijgen.\nStel daarna nog twee vragen door het `{ask}` commando te gebruiken. Gebruik na elke `{ask}` ook een `{echo}` om het antwoord op het scherm te tonen\n" example_code_3: | ``` _ Hoe gaat het? @@ -385,8 +379,7 @@ adventures: leeftijd {is} {ask} Hoe oud ben je? {print} naam is leeftijd jaar oud ``` - story_text_2: "### Opdracht\nJe hebt in het vorige avontuur al geleerd hoe je variabelen kunt instellen met het`{is}` commando.\nDaar heb je minstens 3 variabelen gemaakt en ze gebruikt met een print commando.\nNu gaan we de variabelen interactief maken in plaats van ze in te stellen,\ - \ zoals we deden in ons voorbeeld. \n\nKopieer je code van het vorige avontuur en maak de variabelen interactief door `{ask}` commando's te gebruiken.\n" + story_text_2: "### Opdracht\nJe hebt in het vorige avontuur al geleerd hoe je variabelen kunt instellen met het`{is}` commando.\nDaar heb je minstens 3 variabelen gemaakt en ze gebruikt met een print commando.\nNu gaan we de variabelen interactief maken in plaats van ze in te stellen, zoals we deden in ons voorbeeld. \n\nKopieer je code van het vorige avontuur en maak de variabelen interactief door `{ask}` commando's te gebruiken.\n" example_code_2: | ``` lievelingsdier {is} {ask} Wat is je lievelingsdier? @@ -415,9 +408,7 @@ adventures: description: Probeer zo dicht mogelijk bij 21 te komen levels: 17: - story_text: "Blackjack is een simpel kaartspelletje waarbij je zo dicht mogelijk bij 21 punten moet komen. Je krijgt twee kaarten. Elke kaart is het getal waard dat erop staat, en de kaarten met plaatjes (Boer, Vrouw, Heer) zijn 10 punten waard.\nDe Aas is 1 of 11 punten waard (dat mag\ - \ je zelf kiezen). De dealer, jouw tegenstander, krijgt ook twee kaarten.\nAls je wil, mag je een derde kaart pakken en die punten worden bij jouw score opgeteld. De dealer mag ook een extra kaart pakken.\nMaar pas op dat je nooit over de 21 punten heengaat, want dan verlies je!\n\ - De speler die het dichtst bij de 21 punten komt, zonder eroverheen te gaan, wint! \n\nVeel plezier!\n" + story_text: "Blackjack is een simpel kaartspelletje waarbij je zo dicht mogelijk bij 21 punten moet komen. Je krijgt twee kaarten. Elke kaart is het getal waard dat erop staat, en de kaarten met plaatjes (Boer, Vrouw, Heer) zijn 10 punten waard.\nDe Aas is 1 of 11 punten waard (dat mag je zelf kiezen). De dealer, jouw tegenstander, krijgt ook twee kaarten.\nAls je wil, mag je een derde kaart pakken en die punten worden bij jouw score opgeteld. De dealer mag ook een extra kaart pakken.\nMaar pas op dat je nooit over de 21 punten heengaat, want dan verlies je!\nDe speler die het dichtst bij de 21 punten komt, zonder eroverheen te gaan, wint! \n\nVeel plezier!\n" example_code: | ``` {print} 'BLACKJACK' @@ -1061,63 +1052,63 @@ adventures: {print} Op het strand vindt naam het leuk om to activiteit at random 11: story_text: |- - ### Exercise - Debug this calender program. The output of this program is supposed to look like a list of dates. - For example: + ### Opdracht + Debug dit kalender-programma. De uitvoer van het programma moet eruitzien als een lijst van datums. + Bijvoorbeeld: ``` - Hedy calender - Here are all the days of November - November 1 - November 2 - November 3 + Hedy kalender + Hier zijn alle dagen van november + 1 november + 2 november + 3 november ``` - And so on. + Enzovoort. - Mind that you have to test your code extra carefully for the month February, because the amount of days in this month changes in leap years. + Let op! Test je code voor de maand februari extra goed, want het aantal dagen in deze maand verandert in schrikkeljaren. example_code: | - **Warning! This code needs to be debugged!** + **Pas op! Deze code bevat fouten!** ``` - print 'Hedy calender' - months_with_31 days = January, March, May, July, September, October, December - months_with_30_days = April, June, August, November - month = ask 'Which month would you like to see?' - if month in months_with_31_days - days = 31 - if month in months_with30_days - days = 30 - if month = February - leap_years = 2020, 2024, 2028, 2036, 2040, 2044, 2028 - year = ask 'What year is it?' - if year in leap_years - days = 29 + print 'Hedy kalender' + maanden_met_31 dagen = januari, maart, mei, juli, september, october, december + maanden_met_30_dagen = april, juni, augustus, november + maand = ask 'Welke maand wil je zien?' + if maand in maanden_met_31_dagen + dagen = 31 + if maand in maanden_met30_dagen + dagen = 30 + if maand = februari + schrikkeljaren = 2020, 2024, 2028, 2036, 2040, 2044, 2028 + jaar = ask 'Welk jaar is het?' + if jaar in schrikkeljaren + dagen = 29 else - days = 28 + dagen = 28 - print 'Here are all the days of ' moth - for i in range 1 to days - print month i + print 'Hier zijn alle dagen van ' maand + for i in range 1 to dagen + print i maand ``` start_code: | - print 'Hedy calender' - months_with_31 days = January, March, May, July, September, October, December - months_with_30_days = April, June, August, November - month = ask 'Which month would you like to see?' - if month in months_with_31_days - days = 31 - if month in months_with30_days - days = 30 - if month = February - leap_years = 2020, 2024, 2028, 2036, 2040, 2044, 2028 - year = ask 'What year is it?' - if year in leap_years - days = 29 + print 'Hedy kalender' + maanden_met_31 dagen = januari, maart, mei, juli, september, october, december + maanden_met_30_dagen = april, juni, augustus, november + maand = ask 'Welke maand wil je zien?' + if maand in maanden_met_31_dagen + dagen = 31 + if maand in maanden_met30_dagen + dagen = 30 + if maand = februari + schrikkeljaren = 2020, 2024, 2028, 2036, 2040, 2044, 2028 + jaar = ask 'Welk jaar is het?' + if jaar in schrikkeljaren + dagen = 29 else - days = 28 + dagen = 28 - print 'Here are all the days of ' moth - for i in range 1 to days - print month i + print 'Hier zijn alle dagen van ' maand + for i in range 1 to dagen + print i maand 12: story_text: |- ### Exercise @@ -1412,7 +1403,7 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |4 + start_code: |2 define food_order toppings = ask 'pepperoni, tuna, veggie or cheese?' @@ -1463,7 +1454,7 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |4 + start_code: |2 animals = ['pig', 'dog', 'cow'] sounds = ['oink', 'woof', 'moo'] @@ -2895,8 +2886,7 @@ adventures: description: Maak je eigen programma om woordjes te leren in een vreemde taal levels: 5: - story_text: "Maak een programma om woordjes mee te leren in een andere taal.\n \n### Opdracht\nVoeg minstens 3 nieuwe woorden om te leren toe aan het programma.\n **Extra** Je kunt natuurlijk ook een andere taal kiezen dan Frans. Verander de code in de taal die jij graag zou willen leren.\ - \ \n" + story_text: "Maak een programma om woordjes mee te leren in een andere taal.\n \n### Opdracht\nVoeg minstens 3 nieuwe woorden om te leren toe aan het programma.\n **Extra** Je kunt natuurlijk ook een andere taal kiezen dan Frans. Verander de code in de taal die jij graag zou willen leren. \n" example_code: | ``` {print} 'Leer Frans!' @@ -3595,8 +3585,7 @@ adventures: ``` start_code: '# Schrijf jouw code hier' 4: - story_text: "Ook in het restaurant moet je aanhalingstekens gebruiken bij de commando's `{print}` en `{ask}` .\n\n### Opdracht\nKun jij de voorbeeldcode aan de praat krijgen door aanhalingstekens toe te voegen? Let op: variabelen moeten niet binnen de aanhalingstekens staan. \nVoeg daarna\ - \ `{clear}` commando's toe om steeds maar 1 regel tekst in je uitvoerscherm te hebben.\n\n### Opdracht 2\nKopieer je eigen restaurantcode van het vorige level en zet aanhalingstekens op de juiste plaats. Voeg ook `{clear}` commando's toe.\n" + story_text: "Ook in het restaurant moet je aanhalingstekens gebruiken bij de commando's `{print}` en `{ask}` .\n\n### Opdracht\nKun jij de voorbeeldcode aan de praat krijgen door aanhalingstekens toe te voegen? Let op: variabelen moeten niet binnen de aanhalingstekens staan. \nVoeg daarna `{clear}` commando's toe om steeds maar 1 regel tekst in je uitvoerscherm te hebben.\n\n### Opdracht 2\nKopieer je eigen restaurantcode van het vorige level en zet aanhalingstekens op de juiste plaats. Voeg ook `{clear}` commando's toe.\n" example_code: | ``` _ Voeg aanhalingstekens toe aan deze code _ @@ -4024,8 +4013,7 @@ adventures: description: Maak je eigen spionnencode levels: 12: - story_text: "In dit avontuur kun je jouw eigen geheim agent code maken. Maak een bericht dat alleen de juiste agent kan ontcijferen.\nAls je vijand probeert de code te kraken krijgen ze valse informatie om hun tijd te verspillen.\n \n### Opdracht 1\nMaak je eigen code voor jouw geheime\ - \ agent. Laat beiden onderdelen zien aan de echte spion.\n### Opdracht 2\nVoeg nog een derde vraag toe en maak jouw wachtwoord langer met bijv een kledingstuk of een voorwerp! \n" + story_text: "In dit avontuur kun je jouw eigen geheim agent code maken. Maak een bericht dat alleen de juiste agent kan ontcijferen.\nAls je vijand probeert de code te kraken krijgen ze valse informatie om hun tijd te verspillen.\n \n### Opdracht 1\nMaak je eigen code voor jouw geheime agent. Laat beiden onderdelen zien aan de echte spion.\n### Opdracht 2\nVoeg nog een derde vraag toe en maak jouw wachtwoord langer met bijv een kledingstuk of een voorwerp! \n" example_code: | ``` naam = {ask} 'Hoe heet je?' @@ -4181,7 +4169,7 @@ adventures: Maak het liedje af. Zoek de tekst op als je die niet meer weet. ### Opdracht 2 - De laatste regel van het liedje is anders. Zorg dta je die regel ook print iin de `{for}`. Darr heb je een `{if}` voor nodig. + De laatste regel van het liedje is anders. Zorg dat je die regel ook print in de `{for}`. Daar heb je een `{if}` voor nodig. example_code: | ``` _ _ _ _ 10 _ 1 @@ -4327,9 +4315,7 @@ adventures: description: Speel een potje Boter Kaas en Eieren! levels: 13: - story_text: "In dit avontuur kun je het spelletje Boter Kaas en Eieren programmeren. \nJe speelt met twee personen. Kies om de beurt een plekje op het speelbord (1 - 9) waar je jouw teken op wil zetten (x of o). \nDe speler die als eerst 3 op een rij heeft (horizontaal, verticaal of diagonaal)\ - \ wint!\n\n### Opdracht 1\nDit spel doet het wel maar er zijn een paar problemen! Je kan zomaar een veld van de andere speler pakken. Kijk eerst met een `{if}` of er wel een punt staat in het gekozen veld. Zo niet, waarschuw de speler dan.\n\n ### Opdracht 2\nHet spel kan ook niet\ - \ zelf besluiten of er al een winnaar is. Kijk steeds of er al drie dezelfde tekens op een rij zijn en vertel dan wie er gewonnen heeft.\n\n### Opdracht 3 (extra)\nSpelen met een vriend(innet)je kan niet altijd! Programmeer jij een computertegenstander om tegen te spelen?\n" + story_text: "In dit avontuur kun je het spelletje Boter Kaas en Eieren programmeren. \nJe speelt met twee personen. Kies om de beurt een plekje op het speelbord (1 - 9) waar je jouw teken op wil zetten (x of o). \nDe speler die als eerst 3 op een rij heeft (horizontaal, verticaal of diagonaal) wint!\n\n### Opdracht 1\nDit spel doet het wel maar er zijn een paar problemen! Je kan zomaar een veld van de andere speler pakken. Kijk eerst met een `{if}` of er wel een punt staat in het gekozen veld. Zo niet, waarschuw de speler dan.\n\n ### Opdracht 2\nHet spel kan ook niet zelf besluiten of er al een winnaar is. Kijk steeds of er al drie dezelfde tekens op een rij zijn en vertel dan wie er gewonnen heeft.\n\n### Opdracht 3 (extra)\nSpelen met een vriend(innet)je kan niet altijd! Programmeer jij een computertegenstander om tegen te spelen?\n" example_code: | ``` speler = 'x' @@ -4473,9 +4459,7 @@ adventures: ``` start_code: '# schrijf jouw code hier' 17: - story_text: "In de vorige levels was je boter kaas en eieren spel nog vervelend om te spelen. Na elke x of o die je zette vroeg het spel namelijk of je gewonnen had of niet. \nDit maakte het spel wel speelbaar, maar erg traag. In dit level heb je het `{elif}` commando geleerd, dat dit\ - \ probleem kan oplossen. \nMet `{elif}` kun je Hedy laten checken of er een speler gewonnen heeft. Hiervoor heb je wel wat extra regels nodig.\n\nIn de voorbeeld code zie je dat we de voorwaarden om te winnen (3 op een rij)hebben toegevoegd. \nJe vindt ze op regel 46 tot 69. Je kunt\ - \ zien dat elke keer als een speler 3 op een rij heeft, het spel de variabele spel op 'uit' zet. \nDit betekent dat de `{while}` lus wordt gestopt en dat het spel stopgezet wordt.\n" + story_text: "In de vorige levels was je boter kaas en eieren spel nog vervelend om te spelen. Na elke x of o die je zette vroeg het spel namelijk of je gewonnen had of niet. \nDit maakte het spel wel speelbaar, maar erg traag. In dit level heb je het `{elif}` commando geleerd, dat dit probleem kan oplossen. \nMet `{elif}` kun je Hedy laten checken of er een speler gewonnen heeft. Hiervoor heb je wel wat extra regels nodig.\n\nIn de voorbeeld code zie je dat we de voorwaarden om te winnen (3 op een rij)hebben toegevoegd. \nJe vindt ze op regel 46 tot 69. Je kunt zien dat elke keer als een speler 3 op een rij heeft, het spel de variabele spel op 'uit' zet. \nDit betekent dat de `{while}` lus wordt gestopt en dat het spel stopgezet wordt.\n" example_code: | ``` teken = 'x' @@ -4589,8 +4573,7 @@ adventures: {turn} hoek {forward} 25 ``` - story_text_2: "Daarnaast kon je in level 1 alleen maar linksaf of rechtsaf slaan. Dat is een beetje saai!\nIn level 2 kun je de neus van de schildpad naar elke richting laten wijzen. \n\nGebruik 90 graden om een kwartslag te draaien. Een heel rondje draaien is 360 graden. \nKun jij een\ - \ figuurtje tekenen met deze code? Misschien een driehoek of een cirkel?\n" + story_text_2: "Daarnaast kon je in level 1 alleen maar linksaf of rechtsaf slaan. Dat is een beetje saai!\nIn level 2 kun je de neus van de schildpad naar elke richting laten wijzen. \n\nGebruik 90 graden om een kwartslag te draaien. Een heel rondje draaien is 360 graden. \nKun jij een figuurtje tekenen met deze code? Misschien een driehoek of een cirkel?\n" example_code_2: |- {print} Schildpaddenrace! hoek {is} 90 @@ -4712,8 +4695,7 @@ adventures: ``` start_code: '{print} ''Figuren tekenen''' 8: - story_text: "Nu we meerdere regels kunnen herhalen, kunnen we makkelijker figuren maken.\nWant we hoeven maar één keer in te stellen wat de hoek is, en die variabele steeds gebruiken in de `{repeat}`.\n\n### Opdracht 1\n De voorbeeldcode tekent een vierkant. Verander dat in een ander figuur\ - \ zoals een driehoek of zeshoek. Je moet daarvoor twee regels veranderen!\nTip: een heel rondje is 360 graden. \n\n### Opdracht 2\nMaak nu een tekening naar je eigen inzicht, met minstens twee verschillende veelhoeken.\n" + story_text: "Nu we meerdere regels kunnen herhalen, kunnen we makkelijker figuren maken.\nWant we hoeven maar één keer in te stellen wat de hoek is, en die variabele steeds gebruiken in de `{repeat}`.\n\n### Opdracht 1\n De voorbeeldcode tekent een vierkant. Verander dat in een ander figuur zoals een driehoek of zeshoek. Je moet daarvoor twee regels veranderen!\nTip: een heel rondje is 360 graden. \n\n### Opdracht 2\nMaak nu een tekening naar je eigen inzicht, met minstens twee verschillende veelhoeken.\n" example_code: | ``` hoek = 90 @@ -4753,8 +4735,7 @@ adventures: ``` start_code: '# place your code here' 10: - story_text: "In dit level kun je de teken-schildpad een figuur laten tekenen. \nDe schildpad volgt de afstanden in de lijst één voor één, waarbij de stappen steeds groter worden.\n### Opdracht 1\nVoeg een turn van 90 graden toe aan de code om een spiraal te tekenen.\nVoeg ten minste 5\ - \ getallen toe aan de lijst, zodat de spiraal steeds groter wordt.\n **(extra)** Kan jij de spiraal in een andere vorm veranderen? Probeer verschillende getallen met turn!\n### Opdracht 2\nDe spiraal wordt nu van binnen naar buiten getekend, kun jij dit omdraaien?\n" + story_text: "In dit level kun je de teken-schildpad een figuur laten tekenen. \nDe schildpad volgt de afstanden in de lijst één voor één, waarbij de stappen steeds groter worden.\n### Opdracht 1\nVoeg een turn van 90 graden toe aan de code om een spiraal te tekenen.\nVoeg ten minste 5 getallen toe aan de lijst, zodat de spiraal steeds groter wordt.\n **(extra)** Kan jij de spiraal in een andere vorm veranderen? Probeer verschillende getallen met turn!\n### Opdracht 2\nDe spiraal wordt nu van binnen naar buiten getekend, kun jij dit omdraaien?\n" example_code: | ``` {turn} 90 From 69f0321a907127eeadf392cd485e30f0f1467308 Mon Sep 17 00:00:00 2001 From: Felienne Hermans Date: Fri, 24 Nov 2023 17:56:16 +0100 Subject: [PATCH 06/15] Translated using Weblate (Dutch) Currently translated at 100.0% (50 of 50 strings) Translated using Weblate (Dutch) Currently translated at 95.1% (548 of 576 strings) Co-authored-by: Felienne Hermans Translate-URL: https://hosted.weblate.org/projects/hedy/parsons/nl/ Translate-URL: https://hosted.weblate.org/projects/hedy/web-texts/nl/ Translation: Hedy/Parsons Translation: Hedy/Texts --- content/parsons/nl.yaml | 8 +++----- translations/nl/LC_MESSAGES/messages.po | 16 +++++++--------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/content/parsons/nl.yaml b/content/parsons/nl.yaml index f0854f85886..fbff4ea3e8f 100644 --- a/content/parsons/nl.yaml +++ b/content/parsons/nl.yaml @@ -1,8 +1,7 @@ levels: 1: 1: - story: "In de sleeppuzzels zijn de regels code al voor je geschreven. Je hoeft ze alleen nog maar in de juiste volgorde te plaatsen! Sleep de regels code in je invoerscherm en voer de code uit. Kun jij het programma aan de praat krijgen?\n\n\nJe bent een klant bij bakkerij Hedy. \nJe loopt\ - \ de bakkerij binnen en wordt verwelkomd door de bakker.\nHij vraagt wat voor taart je wil bestellen en herhaalt het antwoord.\nDaarna wordt je bestelling klaargezet." + story: "In de sleeppuzzels zijn de regels code al voor je geschreven. Je hoeft ze alleen nog maar in de juiste volgorde te plaatsen! Sleep de regels code in je invoerscherm en voer de code uit. Kun jij het programma aan de praat krijgen?\n\n\nJe bent een klant bij bakkerij Hedy. \nJe loopt de bakkerij binnen en wordt verwelkomd door de bakker.\nHij vraagt wat voor taart je wil bestellen en herhaalt het antwoord.\nDaarna wordt je bestelling klaargezet." code: |- {print} Welkom bij bakkerij Hedy! {ask} Welke taart wilt u bestellen? @@ -34,8 +33,7 @@ levels: {print} Bedankt voor het winkelen bij ons! 3: 1: - story: "Het nieuwe schooljaar op Zweinstein gaat van start! \nHet is de taak van de sorteerhoed om jou in te delen in een van de afdelingen. \nBij welke afdeling zou jij willen?\nBen jij een Griffoendor, Huffelpuf, Zwadderich of Ravenklauw. \nVoordat de sorteerhoed zijn keuze bekend maakt,\ - \ kun je aangeven bij welk huis je niet terecht wil komen." + story: "Het nieuwe schooljaar op Zweinstein gaat van start! \nHet is de taak van de sorteerhoed om jou in te delen in een van de afdelingen. \nBij welke afdeling zou jij willen?\nBen jij een Griffoendor, Huffelpuf, Zwadderich of Ravenklauw. \nVoordat de sorteerhoed zijn keuze bekend maakt, kun je aangeven bij welk huis je niet terecht wil komen." code: |- {print} De sorteerhoed is er klaar voor om jou in te delen op Zweinstein. afdelingen {is} Griffoendor, Huffelpuf, Zwadderich, Ravenklauw @@ -68,7 +66,7 @@ levels: story: |- Jij bent de nieuwste Pokémon trainer Pallet Town! Maak een programma dat jouw eerste Pokémon uitkiest. - Laat het programma weer even wachten voordat hij jouw eerste pokémon onthult. + Laat het programma weer even wachten voordat hij jouw eerste Pokémon onthult. code: |- pokemons {is} Pikachu, Charmander, Bulbasaur, Squirtle {print} 'Dit wordt jouw eerste Pokémon!' diff --git a/translations/nl/LC_MESSAGES/messages.po b/translations/nl/LC_MESSAGES/messages.po index 81956f228ae..a13a7e89b6b 100644 --- a/translations/nl/LC_MESSAGES/messages.po +++ b/translations/nl/LC_MESSAGES/messages.po @@ -3,20 +3,20 @@ # This file is distributed under the same license as the PROJECT project. # FIRST AUTHOR , 2023. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2023-11-23 12:10-0400\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language: nl\n" +"POT-Creation-Date: 2023-11-23 22:22+0000\n" +"PO-Revision-Date: 2023-11-24 16:56+0000\n" +"Last-Translator: Felienne Hermans \n" "Language-Team: nl \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.2.1-rc\n" "Generated-By: Babel 2.11.0\n" msgid "Access Before Assign" @@ -67,9 +67,8 @@ msgstr "Het lijkt erop dat je vergeten bent om een commando te gebruiken op rege msgid "Missing Inner Command" msgstr "Het lijkt erop dat je vergeten bent om het {command} commando op regel {line_number} in te vullen." -#, fuzzy msgid "Misspelled At Command" -msgstr "It looks like you might have misspelled the {command} command, instead you wrote {invalid_argument} in line {line_number}." +msgstr "Je hebt {command} verkeerd geschreven, jij schreef {invalid_argument} op regel {line_number}." msgid "No Indentation" msgstr "Je hebt te weinig spaties voor regel {line_number} gebruikt. Er staan {leading_spaces} spaties, maar dat is te weinig. Begin een blok steeds met {indent_size} meer spaties dan de regel ervoor." @@ -1941,4 +1940,3 @@ msgstr "Jouw programma" #~ msgid "tag_deleted" #~ msgstr "This tag was successfully deleted." - From 4f6e2cf439ad2ca8272c5b9a26ac161241cb413a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 16:56:37 +0000 Subject: [PATCH 07/15] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- content/adventures/ar.yaml | 117 +++++++++++++++----------- content/adventures/fy.yaml | 85 ++++++++++--------- content/adventures/he.yaml | 88 +++++++++++--------- content/adventures/hi.yaml | 88 +++++++++++--------- content/adventures/hu.yaml | 94 +++++++++++---------- content/adventures/id.yaml | 125 ++++++++++++++++------------ content/adventures/nl.yaml | 142 +++++++++++++++++--------------- content/adventures/uk.yaml | 85 ++++++++++--------- content/cheatsheets/uk.yaml | 2 +- content/client-messages/uk.yaml | 10 +-- 10 files changed, 459 insertions(+), 377 deletions(-) diff --git a/content/adventures/ar.yaml b/content/adventures/ar.yaml index 3d6b92b25c1..659bc682751 100644 --- a/content/adventures/ar.yaml +++ b/content/adventures/ar.yaml @@ -77,7 +77,8 @@ adventures: story_text: | ربما لاحظت أنه لا زال هناك مشكلة في المستويات السابقة عند محاولة طباعة جملة تحتوي على كلمة -الاسم-؟ مثل: `{print}` الاسم هو الاسم. ستتمكن من حل هذه المشكلة في هذا المستوى. يجب أن تضع علامات الاقتباس حول أي نص تريد طباعته. - example_code: "```\nالاسم {is} حسن \n{print} _الاسم الأول للشخصية الرئيسية في القصة هو_ الاسم\n{print} الاسم _ذاهبٌ الآن للسير في الغابة_\n{print} الاسم _خائفٌ قليلًا_\nالحيوانات {is} 🦔, 🐿, 🦉, 🦇\n{print} _لقد سمع صوت_ الحيوانات {at} {random}\n{print} الاسم _خائفٌ أن تكون هذه الغابة مسكونة_\n```\n" + example_code: "```\nالاسم {is} حسن \n{print} _الاسم الأول للشخصية الرئيسية في القصة هو_ الاسم\n{print} الاسم _ذاهبٌ الآن للسير في الغابة_\n{print} الاسم _خائفٌ قليلًا_\nالحيوانات {is} \U0001F994, \U0001F43F, \U0001F989, \U0001F987\n{print} _لقد سمع صوت_ الحيوانات {at} {random}\n{print}\ + \ الاسم _خائفٌ أن تكون هذه الغابة مسكونة_\n```\n" start_code: '{print} ''Your story will be printed here!''' 5: story_text: | @@ -525,8 +526,15 @@ adventures: story_text_3: | يمكنك أيضاً ترك الكومبيوتر يختار لك أرقام عشوائياً بإستخدام الأمر بشكل عشوائي. يوضح هذا المثال كيفية إختيار رقم من الجداول للتدريب، و بذلك تحصل على أرقام مختلفة دائماً لتتمرن على ناتج الضرب: + example_code_3: | + numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + number_1 = _ + number_2 = _ + correct_answer = number_1 * number_2 + given_answer = 'What is ' number_1 ' times ' number_2 '?' + {if} _ + {else} _ start_code: '{print} "أهلاً بكم في هذه الآلة الحاسبة!"' - example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | لقد تعلمت صنع آلة حاسبة في المستويات السابقة. يمكنك الآن أن تطور البرنامج وتحوله للعبة حسابية. هكذا ... @@ -1374,35 +1382,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1425,22 +1433,22 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: المقدمة default_save_name: مقدمة @@ -1455,7 +1463,8 @@ adventures: بامكانك اظهار/طباعة الكلام على الشاشة من خلال استعمال الأمر `{print}` . start_code: '{print} مرحبا أيها العالم!' 2: - story_text: "في المستوى 2 نتعلم الأوامر الجديدة `{is}` و `{sleep}`.\nيمكنك أن تعطي اسما لشيء ما باستخدام `{is}`. هذا ما يسمى ب \"متغير\". في المثال الموجود قمنا بانشاء متغير يسمى الاسم ومتغير آخر يسمى العمر. يمكنك أن تستخدم كلمة الاسم في أي مكان في البرنامج الخاص بك وسيتم استبدالها ب هيدي، كما في المثال التوضيحي: \n\nبهذا الشكل لم تعد الان بحاجة للأمر `{echo}`.\n" + story_text: "في المستوى 2 نتعلم الأوامر الجديدة `{is}` و `{sleep}`.\nيمكنك أن تعطي اسما لشيء ما باستخدام `{is}`. هذا ما يسمى ب \"متغير\". في المثال الموجود قمنا بانشاء متغير يسمى الاسم ومتغير آخر يسمى العمر. يمكنك أن تستخدم كلمة الاسم في أي مكان في البرنامج الخاص بك وسيتم استبدالها ب هيدي،\ + \ كما في المثال التوضيحي: \n\nبهذا الشكل لم تعد الان بحاجة للأمر `{echo}`.\n" example_code: | ``` الاسم {is} هيدي @@ -1553,7 +1562,8 @@ adventures: {else} {print} "البيتزا أفضل" 10: - story_text: في هذا المستوى نتعلم أمراً جديداً وهو الأمر `{for}`. باستخدام الأمر`{for}`يمكننا المرور على كل العناصر الموجودة في قائمة. `{for}` تقوم بخلق مجموعة من الأوامر تختها كما في الأوامر `{repeat}`و`{if}` لذلك يجب علينا ان نستخدم الإزاحة (نضع الفراغات) للسطور البرمجية التي نريد كتابتها مع الأمر `{for}`. + story_text: في هذا المستوى نتعلم أمراً جديداً وهو الأمر `{for}`. باستخدام الأمر`{for}`يمكننا المرور على كل العناصر الموجودة في قائمة. `{for}` تقوم بخلق مجموعة من الأوامر تختها كما في الأوامر `{repeat}`و`{if}` لذلك يجب علينا ان نستخدم الإزاحة (نضع الفراغات) للسطور البرمجية التي نريد كتابتها + مع الأمر `{for}`. example_code: | ``` حيواناتي_المفضلة {is} الكلب، الزرافة، السلحفاة @@ -1584,7 +1594,8 @@ adventures: {print} "نستطيع الان كتابة الأرقام العشرية باستخدام النقطة كفاصل بين العدد الصحيح والكسور" {print} ٢.٥ + ٢.٥ 13: - story_text: 'سنتعلم الان عن استعمال الأوامر `{and}` و `{or}`! اذا كنا نريد فحص أمرين في نفس الوقت لسنا بحاجة الى استعمال الأمر "اذا" مرتين، بل يمكننا أن نستعمل `{and}` و `{or}`. اذا استعملنا الأمر `{and}` بين الفحصين: يجب أن يكون كلا الفحصين (على اليمين واليسار) صحيحين من أجل تنفيذ الكود المتضمن في الأمر "اذا". أما اذا استعملنا الأمر `{or}` بين الفحصين: عندها يكفي أن يكون فحص واحد منهم صحيحاً لتنفيذ الكود المتضمن في الأمر "اذا".' + story_text: 'سنتعلم الان عن استعمال الأوامر `{and}` و `{or}`! اذا كنا نريد فحص أمرين في نفس الوقت لسنا بحاجة الى استعمال الأمر "اذا" مرتين، بل يمكننا أن نستعمل `{and}` و `{or}`. اذا استعملنا الأمر `{and}` بين الفحصين: يجب أن يكون كلا الفحصين (على اليمين واليسار) صحيحين من أجل تنفيذ الكود + المتضمن في الأمر "اذا". أما اذا استعملنا الأمر `{or}` بين الفحصين: عندها يكفي أن يكون فحص واحد منهم صحيحاً لتنفيذ الكود المتضمن في الأمر "اذا".' example_code: | ``` اسمك = {ask} "ما اسمك؟" @@ -1618,7 +1629,8 @@ adventures: {else} {print} "أنت أكبر مني!" 15: - story_text: "سنتعلم نوعا جديداً من دورات التكرار، التكرار باستخدام الأمر `{while}`! يستمر تنفيذ الكود طالما لا تزال نتيجة الفحص الذي نقوم به صالحة/صحيحة. \n لذلك يجب علينا ألا ننسى أن نغير قيمة المتغير الذي نفحصه في داخل دورة التكرار. \n\nفي المثال التوضيحي، يستمر الكود في التنفيذ (سؤال نتيجة الضرب) حتى نحصل على اجابة صحيحة.\nاذا لم يتم اعطاء اجابة صحيحة فتستمر دورة التكرار (والبرنامج ككل) في التتنفيذ الى الأبد!" + story_text: "سنتعلم نوعا جديداً من دورات التكرار، التكرار باستخدام الأمر `{while}`! يستمر تنفيذ الكود طالما لا تزال نتيجة الفحص الذي نقوم به صالحة/صحيحة. \n لذلك يجب علينا ألا ننسى أن نغير قيمة المتغير الذي نفحصه في داخل دورة التكرار. \n\nفي المثال التوضيحي، يستمر الكود في التنفيذ (سؤال\ + \ نتيجة الضرب) حتى نحصل على اجابة صحيحة.\nاذا لم يتم اعطاء اجابة صحيحة فتستمر دورة التكرار (والبرنامج ككل) في التتنفيذ الى الأبد!" example_code: "```\nالاجابة = ٠ \n{while} الاجابة != ٢٥\n الاجابة = {ask} \"ما ناتج ٥ ضرب ٥؟\"\n{print} \"تم الاجابة بشكل صحيح\"\n```\n" start_code: |- الاجابة = ٠ @@ -1626,7 +1638,8 @@ adventures: الاجابة = {ask} "ما ناتج ٥ ضرب ٥؟" {print} "تم الاجابة بشكل صحيح" 16: - story_text: "سنتعلم الان كيفية كتابة القائمة باستخدام طريقة لغة البرمجة بايثون (python) عن طريق احاطة القائمة بالأقواس المربعة (أو المعقوفتان)! نستمر بوضع علامات الاقتباس حول كل عنصر نصي (كلمة اواسم مثلا) كما في المستويات السابقة. \nيمكننا استخدام الأقواس المربعة أيضا للاشارة الى مكان محدد في القائمة." + story_text: "سنتعلم الان كيفية كتابة القائمة باستخدام طريقة لغة البرمجة بايثون (python) عن طريق احاطة القائمة بالأقواس المربعة (أو المعقوفتان)! نستمر بوضع علامات الاقتباس حول كل عنصر نصي (كلمة اواسم مثلا) كما في المستويات السابقة. \nيمكننا استخدام الأقواس المربعة أيضا للاشارة الى مكان\ + \ محدد في القائمة." example_code: | ``` صديقي = ["أحمد"، "علاء"، "سامر"] @@ -1977,7 +1990,8 @@ adventures: الان هيدي العرافة تستطيع الإجابة بنعم، لا او ربما فقط. هل يمكنك أن تعطيها خيارات لإجابات أخرى مثل "بالتأكيد" او "{ask} مرة أخرى". start_code: '# اكتب الكود الخاص بك هنا' 4: - story_text: "في هذا المستوى لن تتعلم أوامر جديدة، لكنك ستتدرب على استخدام علامات الاقتباس. \nتستطيع إعادة كتابة الكود الخاص بك في المستوى الثالث، ولا تنسَ أن تضع علامات الاقتباس في الأماكن الصحيحة.\n\nفي المستوى الثالث, لم نستطع استخدام كلمة ’السؤال‘ اسمًا للمتغير وإعادة استخدامها في النص مرة أخرى ككلمة عادية.\nلا تقلق! علامات الاقتباس ستجعل هذا الأمر ممكنًا!\n" + story_text: "في هذا المستوى لن تتعلم أوامر جديدة، لكنك ستتدرب على استخدام علامات الاقتباس. \nتستطيع إعادة كتابة الكود الخاص بك في المستوى الثالث، ولا تنسَ أن تضع علامات الاقتباس في الأماكن الصحيحة.\n\nفي المستوى الثالث, لم نستطع استخدام كلمة ’السؤال‘ اسمًا للمتغير وإعادة استخدامها في النص\ + \ مرة أخرى ككلمة عادية.\nلا تقلق! علامات الاقتباس ستجعل هذا الأمر ممكنًا!\n" example_code: | ```{print} 'انا العرافة هيدي!' السؤال {is} {ask} 'ماذا تريد ان تعرف ؟' @@ -2287,7 +2301,8 @@ adventures: اذا اخترت الباب الصحيح سوف تنجو، والا سيمسك بك وحش مخيف و ..... في المستوى ١ سنبدأ لعبة بيت الأشباح بسرد قصة وسؤال اللاعب عن الشبح الذي سيراه في البيت المسكون. - example_code: "```\n{print} ما الذي جاء بي الى هنا؟\n{print} اتذكر ان صديقي اخبرني ان اتي الي هذا القصر القديم...\n{print} ولكن فجأة اصبح كل شيء اسود.\n{print} كيف انتهى بي المطاف في هذا الطابق..؟\n{print} رأسي تؤلمني كثيرًا.. كأنه تم ضربي بمضرب كبير!\n{print} ما هذا الصوت؟؟\n{print} يا الهي! اعتقد انني لست الوحيد في هذا القصر!\n{print} يجب علي الخروج من هنا!\n{print} هناك ٣ ابواب امامي..\n{ask} ما الباب الذي علي اختباره للخروج؟\n{echo} اختار الباب \n{print} ...؟\n```\n" + example_code: "```\n{print} ما الذي جاء بي الى هنا؟\n{print} اتذكر ان صديقي اخبرني ان اتي الي هذا القصر القديم...\n{print} ولكن فجأة اصبح كل شيء اسود.\n{print} كيف انتهى بي المطاف في هذا الطابق..؟\n{print} رأسي تؤلمني كثيرًا.. كأنه تم ضربي بمضرب كبير!\n{print} ما هذا الصوت؟؟\n{print} يا\ + \ الهي! اعتقد انني لست الوحيد في هذا القصر!\n{print} يجب علي الخروج من هنا!\n{print} هناك ٣ ابواب امامي..\n{ask} ما الباب الذي علي اختباره للخروج؟\n{echo} اختار الباب \n{print} ...؟\n```\n" story_text_2: | هل يمكنك تكملة القصة المخيفة هذه؟ او ابتكار قصتك الخاصة لبيت الأشباح؟ start_code: '{print} كيف وصلت الى هنا؟' @@ -2360,7 +2375,8 @@ adventures: في هذا المستوى ، يمكنك الفوز باللعبة فقط باختيار نفس الباب الذي اختاره هيدي عشوائيًا. هل يمكنك العثور على الكلمات الأربع المفقودة لإكمال الكود؟ - example_code: "```\n{print} 'اهرب من بيت الأشباح !'\n{print} 'أمامك 3 أبواب ...'\nالأبواب {is} ۱ ، ۲، ۳ \nالوحوش {is} مستذئب، مومياء، مصاص دماء، زومبي\n الباب_الذي_إخترته {is} {ask} 'أي باب تختار؟'\n{print} 'انت إخترت باب ..' الباب_الذي_إخترته\n{sleep}\nالباب_الصحيح {is} الأبواب {at} {random}\n____ {print} 'رائعة! لقد نجوت!'\n{else} {print} 'أوه لا! لقد تم أكلك من قبل ... \"الوحوش {at} {random}\n```\n" + example_code: "```\n{print} 'اهرب من بيت الأشباح !'\n{print} 'أمامك 3 أبواب ...'\nالأبواب {is} ۱ ، ۲، ۳ \nالوحوش {is} مستذئب، مومياء، مصاص دماء، زومبي\n الباب_الذي_إخترته {is} {ask} 'أي باب تختار؟'\n{print} 'انت إخترت باب ..' الباب_الذي_إخترته\n{sleep}\nالباب_الصحيح {is} الأبواب {at}\ + \ {random}\n____ {print} 'رائعة! لقد نجوت!'\n{else} {print} 'أوه لا! لقد تم أكلك من قبل ... \"الوحوش {at} {random}\n```\n" start_code: '# place your code here' 9: story_text: | @@ -3322,7 +3338,7 @@ adventures: 1: story_text: | في المستوى ١ ستتمكن من صنع مطعم افتراضي وتأخذ طلبات الطعام الخاصة بضيوفك. - example_code: "```{print} 🍟 اهلاً بكم في مطعم هيدي \n{ask} ماذا تود ان تطلب؟\n{echo} اذاً، طلبك هو \n{print} شكرًا لطلبكم من مطعمنا!\n{print} طلبك في طريقه إليك!\n ```\n" + example_code: "```{print} \U0001F35F اهلاً بكم في مطعم هيدي \n{ask} ماذا تود ان تطلب؟\n{echo} اذاً، طلبك هو \n{print} شكرًا لطلبكم من مطعمنا!\n{print} طلبك في طريقه إليك!\n ```\n" story_text_2: | هل يمكنك التفكير في عدة سطور اخرى تضيفها لتطور كود مطعمك؟ على سبيل المثال، هل يمكنك استخدام `{ask}` لسؤال الضيوف ماذا يفضلون كشراب بجانب وجبتهم، وبعد ذلك اخبارهم بسعر طلبهم، و ان تتمنى لهم وجبة هنيئة؟ start_code: '# اكتب الكود الخاص بك هنا' @@ -4425,7 +4441,8 @@ adventures: الجواب {is} {ask} كم عدد الخطوات التي يجب أن يتقدمها الرسام؟ {forward} الجواب ``` - story_text_2: "بالاضافة الى ذلك، الرسام لم يكن قادراً إلا على الاستدارة الى اليمن أو اليسار. هذا ممل بعض الشيء! \nفي المستوى الثاني يمكننا الاإستدارة في كل الإتجاهات!\n\nاستعمل ٩٠ للإستدارة بمقدار ربع دائرة. هذا ما نسميه بالدرجات. استدارة كاملة تساوي ٣٦٠ درجة.\nهل تستطيع أن ترسم شكلاً معينا باستخدام هذا الكود؟ ربما مثلث أو دائرة؟\n" + story_text_2: "بالاضافة الى ذلك، الرسام لم يكن قادراً إلا على الاستدارة الى اليمن أو اليسار. هذا ممل بعض الشيء! \nفي المستوى الثاني يمكننا الاإستدارة في كل الإتجاهات!\n\nاستعمل ٩٠ للإستدارة بمقدار ربع دائرة. هذا ما نسميه بالدرجات. استدارة كاملة تساوي ٣٦٠ درجة.\nهل تستطيع أن ترسم شكلاً\ + \ معينا باستخدام هذا الكود؟ ربما مثلث أو دائرة؟\n" example_code_2: | ``` {print} رسم الأشكال diff --git a/content/adventures/fy.yaml b/content/adventures/fy.yaml index 70adc7fd295..d5e71079310 100644 --- a/content/adventures/fy.yaml +++ b/content/adventures/fy.yaml @@ -541,8 +541,15 @@ adventures: ``` story_text_3: | You can also let the computer do random calculations on its own using {random}. + example_code_3: | + numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + number_1 = _ + number_2 = _ + correct_answer = number_1 * number_2 + given_answer = 'What is ' number_1 ' times ' number_2 '?' + {if} _ + {else} _ start_code: '{print} ''Welcome to this calculator!''' - example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | In previous levels you've learned how to make a calculator, in this level you can expand that code and make it into a little maths game. Like this... @@ -1390,35 +1397,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1441,22 +1448,22 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Introduction default_save_name: intro diff --git a/content/adventures/he.yaml b/content/adventures/he.yaml index 646dd6f3fdd..695b7d5aefa 100644 --- a/content/adventures/he.yaml +++ b/content/adventures/he.yaml @@ -542,8 +542,15 @@ adventures: ``` story_text_3: | You can also let the computer do random calculations on its own using {random}. + example_code_3: | + numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + number_1 = _ + number_2 = _ + correct_answer = number_1 * number_2 + given_answer = 'What is ' number_1 ' times ' number_2 '?' + {if} _ + {else} _ start_code: '{print} ''Welcome to this calculator!''' - example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | In previous levels you've learned how to make a calculator, in this level you can expand that code and make it into a little maths game. Like this... @@ -1392,35 +1399,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1443,29 +1450,30 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: הקדמה default_save_name: הקדמה description: הסבר שלב levels: 1: - story_text: "בשלב 1 תוכלו להשתמש בפקודות `{print}`, `{ask}` ו-`{echo}`.\n הקלידו את הקוד שלכם בשדה התכנות. או לחצו על הכפתור הירוק בבלוק הקוד לדוגמה, והקוד יוקלד עבורכם!\nנסו את הקוד בעצמכם בעזרת הכפתור הירוק 'הרץ קוד' מתחת לשדה התכנות.\n\nתוכלו להדפיס טקסט למסך בעזרת הפקודה `{print}`. \n" + story_text: "בשלב 1 תוכלו להשתמש בפקודות `{print}`, `{ask}` ו-`{echo}`.\n הקלידו את הקוד שלכם בשדה התכנות. או לחצו על הכפתור הירוק בבלוק הקוד לדוגמה, והקוד יוקלד עבורכם!\nנסו את הקוד בעצמכם בעזרת הכפתור הירוק 'הרץ קוד' מתחת לשדה התכנות.\n\nתוכלו להדפיס טקסט למסך בעזרת הפקודה `{print}`.\ + \ \n" start_code: '{print} שלום עולם!' 2: story_text: | diff --git a/content/adventures/hi.yaml b/content/adventures/hi.yaml index 156dac212dc..a0e44029579 100644 --- a/content/adventures/hi.yaml +++ b/content/adventures/hi.yaml @@ -541,8 +541,15 @@ adventures: ``` story_text_3: | You can also let the computer do random calculations on its own using {random}. + example_code_3: | + numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + number_1 = _ + number_2 = _ + correct_answer = number_1 * number_2 + given_answer = 'What is ' number_1 ' times ' number_2 '?' + {if} _ + {else} _ start_code: '{print} ''Welcome to this calculator!''' - example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: | In previous levels you've learned how to make a calculator, in this level you can expand that code and make it into a little maths game. Like this... @@ -1390,35 +1397,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1441,22 +1448,22 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Introduction default_save_name: intro @@ -1633,7 +1640,8 @@ adventures: {print} 'दशमलव संख्याओं को अब एक बिंदु का उपयोग करने की आवश्यकता है' {print} 2.5 + 2.5 13: - story_text: अब हम `{and}` और `{or}` सीखने जा रहे हैं! यदि आप दो कथनों की जाँच करना चाहते हैं, तो आपको दो if's का उपयोग करने की आवश्यकता नहीं है, लेकिन `{and}` और `{or}` का उपयोग कर सकते हैं। यदि आप `{and}` का उपयोग करते हैं, तो `{and}` के बाएं और दाएं दोनों कथन सत्य होने चाहिए। हम `या` का भी उपयोग कर सकते हैं। तब केवल एक कथन सही होना चाहिए। + story_text: अब हम `{and}` और `{or}` सीखने जा रहे हैं! यदि आप दो कथनों की जाँच करना चाहते हैं, तो आपको दो if's का उपयोग करने की आवश्यकता नहीं है, लेकिन `{and}` और `{or}` का उपयोग कर सकते हैं। यदि आप `{and}` का उपयोग करते हैं, तो `{and}` के बाएं और दाएं दोनों कथन सत्य होने चाहिए। हम `या` + का भी उपयोग कर सकते हैं। तब केवल एक कथन सही होना चाहिए। example_code: | ``` name = ask 'what is your name?' diff --git a/content/adventures/hu.yaml b/content/adventures/hu.yaml index efbae64979b..59acb503fe1 100644 --- a/content/adventures/hu.yaml +++ b/content/adventures/hu.yaml @@ -545,8 +545,15 @@ adventures: ``` story_text_3: | You can also let the computer do random calculations on its own using {random}. + example_code_3: | + numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + number_1 = _ + number_2 = _ + correct_answer = number_1 * number_2 + given_answer = 'What is ' number_1 ' times ' number_2 '?' + {if} _ + {else} _ start_code: print 'Üdvözlünk a számológépnél!' - example_code_3: "numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nnumber_1 = _\nnumber_2 = _\ncorrect_answer = number_1 * number_2\ngiven_answer = 'What is ' number_1 ' times ' number_2 '?'\n{if} _\n{else} _\n" 9: story_text: A 6. szinten megtanultad a számológép készítését, a 7. szinten kibővítheted ezt a kódot, és egy kis matematikai játékot készíthetsz belőle. Mint ez... example_code: |- @@ -1393,35 +1400,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1444,29 +1451,30 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Bevezető default_save_name: intro description: Szint magyarázat levels: 1: - story_text: "Az első szinten a `{print}`, `{ask}` és `{echo}` parancsokat használhatod.\nÍrd a kódodat a programozási ablakba, vagy nyomd meg a gombot a példa programok mellett, hogy bemásold!\nPróbáld ki a kódot a zöld 'Kód futtatása' gomb megnyomásával a programozási ablak alatt!\n\nSzöveget írhatsz a képernyőre a `{print}` paranccsal. \n" + story_text: "Az első szinten a `{print}`, `{ask}` és `{echo}` parancsokat használhatod.\nÍrd a kódodat a programozási ablakba, vagy nyomd meg a gombot a példa programok mellett, hogy bemásold!\nPróbáld ki a kódot a zöld 'Kód futtatása' gomb megnyomásával a programozási ablak alatt!\n\n\ + Szöveget írhatsz a képernyőre a `{print}` paranccsal. \n" start_code: '{print} Helló világ!' 2: story_text: | @@ -1618,7 +1626,8 @@ adventures: {print} 'a tizedes törtek pontot használnak' {print} 2.5 + 2.5 13: - story_text: Most megtanuljuk az `{and}` és `{or}` kifejezések használatát! Ha két állítást szeretnél ellenőrizni, akkor nem kell kettő {if} parancsot használnod, használhatod az `{and}` és `{or}` parancsokat. Ha az `{and}` parancsot használod, akkor az `{and}` bal és jobb oldalán mindkét állításnak igaznak kell lennie. `{or}` esetén csak egy állításnak kell helyesnek lennie. + story_text: Most megtanuljuk az `{and}` és `{or}` kifejezések használatát! Ha két állítást szeretnél ellenőrizni, akkor nem kell kettő {if} parancsot használnod, használhatod az `{and}` és `{or}` parancsokat. Ha az `{and}` parancsot használod, akkor az `{and}` bal és jobb oldalán mindkét + állításnak igaznak kell lennie. `{or}` esetén csak egy állításnak kell helyesnek lennie. example_code: | ``` név = {ask} "Hogy hívnak?" @@ -3524,7 +3533,8 @@ adventures: ``` start_code: '# place your code here' 4: - story_text: "A 3. szinten idézőjeleket fogunk alkalmazni, amikor a `print` parancsot használjuk.\nTudod-e idézőjelek hozzáadásával működtetni a 2. szintű kódodat a 3. szinten?\n\nLégy óvatos! A 2. szinten aposztrófokat engedélyeztek a szövegben, de a 3. szinten Hedy összetéveszti őket idézőjelekkel, és a kód nem fog működni!\nTehát ahelyett, hogy beírnád a `print ma pizzát szolgálunk fel` kifejezést, írd be a `print` \n ma pizzát szolgálunk fel` parancsot." + story_text: "A 3. szinten idézőjeleket fogunk alkalmazni, amikor a `print` parancsot használjuk.\nTudod-e idézőjelek hozzáadásával működtetni a 2. szintű kódodat a 3. szinten?\n\nLégy óvatos! A 2. szinten aposztrófokat engedélyeztek a szövegben, de a 3. szinten Hedy összetéveszti őket\ + \ idézőjelekkel, és a kód nem fog működni!\nTehát ahelyett, hogy beírnád a `print ma pizzát szolgálunk fel` kifejezést, írd be a `print` \n ma pizzát szolgálunk fel` parancsot." example_code: |- ``` print 'Üdvözlünk a Hedy Étteremben!' diff --git a/content/adventures/id.yaml b/content/adventures/id.yaml index 2cc501d9fab..30631304f26 100644 --- a/content/adventures/id.yaml +++ b/content/adventures/id.yaml @@ -544,12 +544,19 @@ adventures: ``` story_text_3: | **Tambahan** Anda juga dapat membiarkan komputer melakukan penjumlahan acak sendiri menggunakan `{random}`. + example_code_3: | + angka = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + angka_1 = _ + angka_2 = _ + jawaban_benar = angka_1 * angka_2 + diberikan_jawaban = 'Berapakah 'angka_1' dikalikan 'angka_2'?' + {if} _ + {else} _ start_code: | nomor_1 = {ask} 'Isi angka pertama:' nomor_2 = {ask} 'Isi angka kedua:' jawaban_benar = nomor_1 * nomor_2 {print} nomor_1 ' dikalikan ' nomor_2 ' adalah 'jawaban_benar - example_code_3: "angka = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\nangka_1 = _\nangka_2 = _\njawaban_benar = angka_1 * angka_2\ndiberikan_jawaban = 'Berapakah 'angka_1' dikalikan 'angka_2'?'\n{if} _\n{else} _\n" 9: story_text: | Di level 6 Anda membuat kalkulator, di level ini Anda dapat memperluas kode tersebut sehingga menanyakan banyak pertanyaan. @@ -1414,35 +1421,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1465,32 +1472,34 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Pengantar default_save_name: intro description: Penjelasan level levels: 1: - story_text: "Pada level 1 kamu dapat menggunakan perintah `{print}`, `{ask}` dan `{echo}`.\nTulis kodingan kamu di bagian tampilan kode. Atau tekan tombol hijau di contoh kode, dan kode akan dituliskan sendiri!\nCoba jalankan kodenya dengan menekan tombol 'Run code' di bawah tampilan kode.\n\nAnda dapat print text di tampilan dengan menggunakan perintah `{print}` . \n" + story_text: "Pada level 1 kamu dapat menggunakan perintah `{print}`, `{ask}` dan `{echo}`.\nTulis kodingan kamu di bagian tampilan kode. Atau tekan tombol hijau di contoh kode, dan kode akan dituliskan sendiri!\nCoba jalankan kodenya dengan menekan tombol 'Run code' di bawah tampilan kode.\n\ + \nAnda dapat print text di tampilan dengan menggunakan perintah `{print}` . \n" start_code: '{print} hallo dunia!' 2: - story_text: "Pada level 2 kita akan belajar perintah baru yaitu: `{is}` dan `{sleep}`.\nKamu bisa menamakan kata dengan `{is}`. Ini disebut dengan variabel. Dalam contoh variabel yang kami buat, variabel nama dan variabel umur. Kamu bisa gunakan kata nama dimana saja dalam kode kamu dan mengganti kata Hedy, seperti ini \n\nDisini kamu tidak perlu lagi menggunakan perintah `{echo}`\n" + story_text: "Pada level 2 kita akan belajar perintah baru yaitu: `{is}` dan `{sleep}`.\nKamu bisa menamakan kata dengan `{is}`. Ini disebut dengan variabel. Dalam contoh variabel yang kami buat, variabel nama dan variabel umur. Kamu bisa gunakan kata nama dimana saja dalam kode kamu dan\ + \ mengganti kata Hedy, seperti ini \n\nDisini kamu tidak perlu lagi menggunakan perintah `{echo}`\n" example_code: | ``` nama {is} Hedy @@ -1528,7 +1537,9 @@ adventures: ``` start_code: '{print} ''Halo dunia''' 5: - story_text: "Perintah `ask` dan `print` tetap sama seperti pada level 4.\n \nPada level 5, ada hal baru, `if`! Dengan `if` kamu bisa memilih antara dua pilihan.\n\n```\nnama is ask 'siapa nama kamu?'\nif nama is Hedy print 'keren' else print 'boo'\n```\n\nKode ini menampilkan keren jika kamu memasukkan Hedy sebagai nama, dan boo jika kamu memasukkan yang lain.\n\nTerkadang kode dengan `if` bisa menjadi sangat panjang dan tidak cukup menggunakan satu baris
\nKamu dapat memisah kodenya menjadi dua baris; baris kedua dimulai dengan `else` seperti ini:\n```\nnama is ask 'siapa nama kamu?'\n if nama is Hedy print 'keren' \nelse print 'boo'\n```\n\n\nPada level 5, tugas-tugas yang ada pada tab-tab terlampir akan menjadi makin kompleks semakin posisi tabnya ke kanan. Jadi, pastikan untuk mengerjakan mulai dari kiri ke kanan." + story_text: "Perintah `ask` dan `print` tetap sama seperti pada level 4.\n \nPada level 5, ada hal baru, `if`! Dengan `if` kamu bisa memilih antara dua pilihan.\n\n```\nnama is ask 'siapa nama kamu?'\nif nama is Hedy print 'keren' else print 'boo'\n```\n\nKode ini menampilkan keren jika\ + \ kamu memasukkan Hedy sebagai nama, dan boo jika kamu memasukkan yang lain.\n\nTerkadang kode dengan `if` bisa menjadi sangat panjang dan tidak cukup menggunakan satu baris
\nKamu dapat memisah kodenya menjadi dua baris; baris kedua dimulai dengan `else` seperti ini:\n```\nnama\ + \ is ask 'siapa nama kamu?'\n if nama is Hedy print 'keren' \nelse print 'boo'\n```\n\n\nPada level 5, tugas-tugas yang ada pada tab-tab terlampir akan menjadi makin kompleks semakin posisi tabnya ke kanan. Jadi, pastikan untuk mengerjakan mulai dari kiri ke kanan." example_code: | ``` password {is} {ask} 'Apa kata sandi yang benar?' @@ -1574,7 +1585,8 @@ adventures: ``` start_code: repeat 3 times print 'Hedy itu menyenangkan!' 8: - story_text: "`ask` dan `print` tetap berfungsi sama seperti sebelumnya. Tapi `if` dan `repeat` berubah. \nKamu sekarang dapat mengeksekusi kumpulan kode secara bersamaan, tapi kamu harus memberikan indentasi pada kode tersebut.\n Indentasi berarti memberikan empat spasi diawal baris. Ini juga berlaku ketika kamu hanya mau mengeksekusi satu baris kode saja.\n\n```\nrepeat 5 times\n print 'halo semua'\n print 'Ini akan ditampilkan lima kali'\n```" + story_text: "`ask` dan `print` tetap berfungsi sama seperti sebelumnya. Tapi `if` dan `repeat` berubah. \nKamu sekarang dapat mengeksekusi kumpulan kode secara bersamaan, tapi kamu harus memberikan indentasi pada kode tersebut.\n Indentasi berarti memberikan empat spasi diawal baris. Ini\ + \ juga berlaku ketika kamu hanya mau mengeksekusi satu baris kode saja.\n\n```\nrepeat 5 times\n print 'halo semua'\n print 'Ini akan ditampilkan lima kali'\n```" example_code: | Ini adalah cara perintah `{repeat}` bekerja: ``` @@ -1686,7 +1698,8 @@ adventures: if name is 'Hedy' and age is 2 print 'You are the real Hedy!' 14: - story_text: 'Kita akan mulai belajar untuk menggunakan banyak hal baru! Kamu mungkin sudah tahu hal-hal ini dari matematika: simbol `<` dan `>`. Simbol `<` mengecek apakah angka pertama lebih kecil daripada angka kedua, seperti `4 < 5`. Simbol `>` mengecek apakah angka pertama lebih besar daripada angka kedua, seperti `6 > 5`.' + story_text: 'Kita akan mulai belajar untuk menggunakan banyak hal baru! Kamu mungkin sudah tahu hal-hal ini dari matematika: simbol `<` dan `>`. Simbol `<` mengecek apakah angka pertama lebih kecil daripada angka kedua, seperti `4 < 5`. Simbol `>` mengecek apakah angka pertama lebih besar + daripada angka kedua, seperti `6 > 5`.' example_code: | ``` age = {ask} 'How old are you?' @@ -1700,7 +1713,8 @@ adventures: else print 'Kamu lebih tua daripada aku!' 15: - story_text: Kita akan belajar tentang jenis pengulangan baru, pengulangan `while`! Kita akan melakukan pengulangan tersebut terus-menerus selama kondisinya dipenuhi. Jadi di contoh tersebut, kita terus melakukan pengulangan hingga jawaban benar telah diberikan. Jika jawaban benar tidak diberikan, pengulangan tidak akan pernah berakhir! + story_text: Kita akan belajar tentang jenis pengulangan baru, pengulangan `while`! Kita akan melakukan pengulangan tersebut terus-menerus selama kondisinya dipenuhi. Jadi di contoh tersebut, kita terus melakukan pengulangan hingga jawaban benar telah diberikan. Jika jawaban benar tidak + diberikan, pengulangan tidak akan pernah berakhir! example_code: | ``` answer = 0 @@ -1898,7 +1912,8 @@ adventures: ``` start_code: print 'Siapa yang mencuci piring?' 5: - story_text: "Dengan `if` kamu bisa melakukan banyak hal menyenangkan dalam pengambilan pilihan dalam program tersebut. Kamu dapat membuat program kamu merespon pilihan yang sudah diberikan oleh komputer.\n\nDapatkah kamu melengkapi kode ini agar menampilkan 'Yahh' ketika yang dipilih adalah giliranmu dan 'Yeah!' untuk yang lainnya. \nJangan lupakan tanda kutip satu!" + story_text: "Dengan `if` kamu bisa melakukan banyak hal menyenangkan dalam pengambilan pilihan dalam program tersebut. Kamu dapat membuat program kamu merespon pilihan yang sudah diberikan oleh komputer.\n\nDapatkah kamu melengkapi kode ini agar menampilkan 'Yahh' ketika yang dipilih adalah\ + \ giliranmu dan 'Yeah!' untuk yang lainnya. \nJangan lupakan tanda kutip satu!" example_code: | ``` orang is ibu, ayah, Emma, Sophie @@ -2049,7 +2064,8 @@ adventures: Di level mendatang, Anda dapat mempelajari cara membuat mesin peramal sendiri! Di level 1 Anda dapat memulai dengan mudah dengan membiarkan Hedy memperkenalkan dirinya sebagai peramal dan membiarkannya `{echo}` jawaban para pemain. Seperti ini: - example_code: "```\nprint Halo, aku Hedy sang peramal!\nask Siapa kamu?\nprint Ijinkan aku melihat bola kristal ku\nprint Aku lihat... Aku lihat...\necho Nama kamu adalah \n```\n\nHedy sekarang hanya memberitahukan nama kamu. Dapatkah kamu membuat Hedy dapat memberitahukan hal-hal lain tentang masa depan kamu?\n\nTentu saja, Hedy bukan peramal yang baik, karena dia hanya bisa mengulang jawaban yang diberikan oleh pengguna!\nLihatlah level 2 dan tingkatkan kemampuan peramal kamu.\n" + example_code: "```\nprint Halo, aku Hedy sang peramal!\nask Siapa kamu?\nprint Ijinkan aku melihat bola kristal ku\nprint Aku lihat... Aku lihat...\necho Nama kamu adalah \n```\n\nHedy sekarang hanya memberitahukan nama kamu. Dapatkah kamu membuat Hedy dapat memberitahukan hal-hal lain\ + \ tentang masa depan kamu?\n\nTentu saja, Hedy bukan peramal yang baik, karena dia hanya bisa mengulang jawaban yang diberikan oleh pengguna!\nLihatlah level 2 dan tingkatkan kemampuan peramal kamu.\n" story_text_2: | ### Exercise Hedy now only tells you your name. Can you expand the code so that Hedy can predict more things about you? @@ -2137,7 +2153,10 @@ adventures: start_code: print 'Halo, aku Hedy sang peramal!' 7: story_text: Pada level 6 kamu dapat menggunakan perintah `repeat` untuk membuat mesin kamu meramal beberapa kali - example_code: "```\nprint 'Aku Hedy sang peramal!'\nprint 'Kamu dapat bertanya 3 pertanyaan!'\nrepeat 3 times pertanyaan is ask 'Apa yang ingin kamu tahu?'\njawaban {is} ya, tidak, mungkin\nrepeat 3 times print 'Bola kristal saya mengatakan... 'jawaban {at} {random}\n```\n\nSeperti yang kamu lihat, pertanyaan-pertanyaan yang diberikan tidak ditampilkan pada contoh. Ini karena variabel 'pertanyaan' telah diulang tiga kali.\nSetiap kali pemain memberikan pertanyaan baru, Hedy menimpa pertanyaan sebelumnya. \nArtinya kamu tidak bisa menanyakan dengan cara seperti ini.\n\nDengan menggunakan tiga variabel (misal 'pertanyaan1', 'pertanyaan2' dan 'pertanyaan3') kamu dapat memecahkan masalah ini dan menampilkan semua pertanyaan.\nIni berarti kamu hanya dapat menggunakan perintah `repeat` untuk jawaban. Kamu harus menanyakan dan menampilkan semua pertanyaan secara terpisah.\nDapatkah kamu melakukannya?\n\nPada level 7 tampilan perintah `repeat` akan berubah, memungkinkan kamu untuk mengulang beberapa baris sekaligus.\n" + example_code: "```\nprint 'Aku Hedy sang peramal!'\nprint 'Kamu dapat bertanya 3 pertanyaan!'\nrepeat 3 times pertanyaan is ask 'Apa yang ingin kamu tahu?'\njawaban {is} ya, tidak, mungkin\nrepeat 3 times print 'Bola kristal saya mengatakan... 'jawaban {at} {random}\n```\n\nSeperti yang\ + \ kamu lihat, pertanyaan-pertanyaan yang diberikan tidak ditampilkan pada contoh. Ini karena variabel 'pertanyaan' telah diulang tiga kali.\nSetiap kali pemain memberikan pertanyaan baru, Hedy menimpa pertanyaan sebelumnya. \nArtinya kamu tidak bisa menanyakan dengan cara seperti ini.\n\ + \nDengan menggunakan tiga variabel (misal 'pertanyaan1', 'pertanyaan2' dan 'pertanyaan3') kamu dapat memecahkan masalah ini dan menampilkan semua pertanyaan.\nIni berarti kamu hanya dapat menggunakan perintah `repeat` untuk jawaban. Kamu harus menanyakan dan menampilkan semua pertanyaan\ + \ secara terpisah.\nDapatkah kamu melakukannya?\n\nPada level 7 tampilan perintah `repeat` akan berubah, memungkinkan kamu untuk mengulang beberapa baris sekaligus.\n" start_code: print 'Halo, aku Hedy sang peramal!' 8: story_text: |- @@ -2368,7 +2387,9 @@ adventures: Jika kamu memilih pintu yang benar kamu akan bertahan hidup, tapi kalau tidak seekor monster akan... Pada level 1 kita memulai permainan rumah berhantu dengan membuat cerita menyeramkan dan menanyakan monster apa yang pemain akan lihat di rumah berhantu. - example_code: "```\nprint Kenapa aku ada disini?\nprint Aku ingat temanku menyarankan untuk tidak ke rumah besar tua itu...\nprint dan tiba-tiba semuanya menjadi gelap.\nprint Tapi bagaimana caranya aku tergeletak di lantai...?\nprint Kepalaku sakit seperti telah dipukul dengan tongkat pemukul basebal!\nprint Suara apa itu?\nprint Oh tidak! Aku merasa kalau aku tidak sendiri di rumah ini!\nprint Aku perlu keluar dari sini!\nprint Ada 3 pintu didepanku...\n{ask} Pintu mana yang harus kupilih?\necho Aku memilih pintu \nprint ...?\n ```\n\nDapatkah kamu menyelesaikan cerita menyeramkan ini dengan menanyakan monster apa yang akan muncul? Atau membuat cerita rumah berhantu milik kamu sendiri?\n" + example_code: "```\nprint Kenapa aku ada disini?\nprint Aku ingat temanku menyarankan untuk tidak ke rumah besar tua itu...\nprint dan tiba-tiba semuanya menjadi gelap.\nprint Tapi bagaimana caranya aku tergeletak di lantai...?\nprint Kepalaku sakit seperti telah dipukul dengan tongkat\ + \ pemukul basebal!\nprint Suara apa itu?\nprint Oh tidak! Aku merasa kalau aku tidak sendiri di rumah ini!\nprint Aku perlu keluar dari sini!\nprint Ada 3 pintu didepanku...\n{ask} Pintu mana yang harus kupilih?\necho Aku memilih pintu \nprint ...?\n ```\n\nDapatkah kamu menyelesaikan\ + \ cerita menyeramkan ini dengan menanyakan monster apa yang akan muncul? Atau membuat cerita rumah berhantu milik kamu sendiri?\n" story_text_2: | ### Exercise Can you finish the scary story? Or make up your own haunted house story? @@ -3812,8 +3833,10 @@ adventures: Apakah kamu bisa melengkapi kode berikut dengan memasukkan perintah atau karakter yang benar sebagai pengganti garis bawah? start_code: print 'Selamat datang di permainan batu guning kertas mu sendiri!' 5: - story_text: "Pada level 4 kamu bisa menentukan siapa yang menang. \nUntuk hal itu, kamu memerlukan perintah `if`\n\nSimpan pilihan kamu dengan sebuah nama favoritmu dan pilihan komputer dengan nama pilihan komputer.\nLalu kamu bisa menggunakan `if` untuk melihat apakah kedua pilihan tersebut sama atau berbeda.\nDapatkah kamu menyelesaikan kode ini?" - example_code: "```\npilihan is batu, gunting, kertas\npil_komputer is _\n pil_kamu is ask Apa yang kamu pilih?\nprint 'kamu memilih ' _\nprint 'komputer memilih ' _\nif _ is _ print 'seri' else print 'tidak seri'\nif pil_kamu is batu and pil_komputer is kertas print 'komputer menang'\n```\n\nPertama-tama, kamu perlu mengisi kotak kosong yang tersedia dengan kode yang benar untuk melihat apakah hasil permainan seri. \n" + story_text: "Pada level 4 kamu bisa menentukan siapa yang menang. \nUntuk hal itu, kamu memerlukan perintah `if`\n\nSimpan pilihan kamu dengan sebuah nama favoritmu dan pilihan komputer dengan nama pilihan komputer.\nLalu kamu bisa menggunakan `if` untuk melihat apakah kedua pilihan tersebut\ + \ sama atau berbeda.\nDapatkah kamu menyelesaikan kode ini?" + example_code: "```\npilihan is batu, gunting, kertas\npil_komputer is _\n pil_kamu is ask Apa yang kamu pilih?\nprint 'kamu memilih ' _\nprint 'komputer memilih ' _\nif _ is _ print 'seri' else print 'tidak seri'\nif pil_kamu is batu and pil_komputer is kertas print 'komputer menang'\n\ + ```\n\nPertama-tama, kamu perlu mengisi kotak kosong yang tersedia dengan kode yang benar untuk melihat apakah hasil permainan seri. \n" start_code: print 'Selamat datang di permainan batu guning kertas mu sendiri!' 9: story_text: | diff --git a/content/adventures/nl.yaml b/content/adventures/nl.yaml index dc3d1da03ba..8e6bd0bbff0 100644 --- a/content/adventures/nl.yaml +++ b/content/adventures/nl.yaml @@ -155,7 +155,9 @@ adventures: ``` start_code: '{repeat} 5 {times} {print} ''Help!''' 8: - story_text: "In dit level kun jij jouw verhaal écht interactief maken! In dit level is het `{if}` commando namelijk veranderd, waardoor je er meerdere regels mee kunt printen. Zo kun je de lezer van je verhaal een keuze laten maken. Na de keuze gaat het verhaal verder op basis van die keuze. Kijk maar naar het voorbeeld.\n\n### Opdracht 1\nIn de voorbeeldcode zie je hoe je twee verschillende verhalen kunt maken; eentje waarbij je op het geluid afgaat en eentje waarbij jij je verstopt. \nVul zelf lege plekken in! \n**Extra** Maak het verhaal nog langer. Wat gebeurt er verder? Je kan ook een tweede `{ask}` toevoegen met een tweede keuze.\n\n### Opdracht 2\nOefen met het inspringen. Ga terug naar level 5, zoek je verhaalprogramma op. Maak dan je goede én slechte einde ieder minstens drie regels.\n" + story_text: "In dit level kun jij jouw verhaal écht interactief maken! In dit level is het `{if}` commando namelijk veranderd, waardoor je er meerdere regels mee kunt printen. Zo kun je de lezer van je verhaal een keuze laten maken. Na de keuze gaat het verhaal verder op basis van die\ + \ keuze. Kijk maar naar het voorbeeld.\n\n### Opdracht 1\nIn de voorbeeldcode zie je hoe je twee verschillende verhalen kunt maken; eentje waarbij je op het geluid afgaat en eentje waarbij jij je verstopt. \nVul zelf lege plekken in! \n**Extra** Maak het verhaal nog langer. Wat gebeurt\ + \ er verder? Je kan ook een tweede `{ask}` toevoegen met een tweede keuze.\n\n### Opdracht 2\nOefen met het inspringen. Ga terug naar level 5, zoek je verhaalprogramma op. Maak dan je goede én slechte einde ieder minstens drie regels.\n" example_code: | ``` hoofdpersoon = {ask} 'Hoe heet de hoofdpersoon in dit verhaal?' @@ -171,7 +173,8 @@ adventures: ``` start_code: '# Schrijf jouw code hier' 9: - story_text: "In dit level kun je `{if}` and `{repeat}` commando's in andere `{if}` en `{repeat}` commando's stoppen. \nHierdoor krijg je nog meer mogelijkheden om je verhaal echt interactief te maken!\n\n### Opdracht 1\nMaak de code af op de streepjes zodat de `{if}` het doet.\n\n### Opdracht 2\nVoeg een `{if}` en een `{else}` toe aan het gedeelte van het verhaal waar Robin naar huis gaat.\n\n### Opdracht 3\nGa terug naar je verhaal van level 8 en gebruik ook minstens twee keer een `{if}` in een `{if}`.\n" + story_text: "In dit level kun je `{if}` and `{repeat}` commando's in andere `{if}` en `{repeat}` commando's stoppen. \nHierdoor krijg je nog meer mogelijkheden om je verhaal echt interactief te maken!\n\n### Opdracht 1\nMaak de code af op de streepjes zodat de `{if}` het doet.\n\n### Opdracht\ + \ 2\nVoeg een `{if}` en een `{else}` toe aan het gedeelte van het verhaal waar Robin naar huis gaat.\n\n### Opdracht 3\nGa terug naar je verhaal van level 8 en gebruik ook minstens twee keer een `{if}` in een `{if}`.\n" example_code: | ``` {print} 'Robin loopt door de stad' @@ -189,7 +192,8 @@ adventures: ``` start_code: '# Schrijf jouw code hier' 10: - story_text: "In dit level kun je het commando `{for}` in je verhaal gebruiken. Op deze manier kun je gemakkelijk het kinderboek 'Beertje bruin, wat zie jij daar?' programmeren.\n\n### Opdracht \n\nKijk naar het verhaal, als je het niet kent, en zorg dat dit hele verhaal wordt uitgeprint.\n" + story_text: "In dit level kun je het commando `{for}` in je verhaal gebruiken. Op deze manier kun je gemakkelijk het kinderboek 'Beertje bruin, wat zie jij daar?' programmeren.\n\n### Opdracht \n\nKijk naar het verhaal, als je het niet kent, en zorg dat dit hele verhaal wordt uitgeprint.\n" example_code: | ``` dieren = _ , _ , _ @@ -323,7 +327,8 @@ adventures: description: introduceert en / of levels: 13: - story_text: We gaan nu `{and}` en `{or}` gebruiken! Als je twee dingen wilt checken hoef je niet meer twee {if}jes in elkaar te doen maar kan je nu `{and}` en `{or}` gebruiken. Beide dingen moeten waar zijn als je een `{and}` gebruikt. We kunnen ook `{or}` gebruiken. Daarbij moet er één van de twee waar zijn. + story_text: We gaan nu `{and}` en `{or}` gebruiken! Als je twee dingen wilt checken hoef je niet meer twee {if}jes in elkaar te doen maar kan je nu `{and}` en `{or}` gebruiken. Beide dingen moeten waar zijn als je een `{and}` gebruikt. We kunnen ook `{or}` gebruiken. Daarbij moet er één + van de twee waar zijn. example_code: | ``` naam = {ask} 'hoe heet jij?' @@ -354,7 +359,8 @@ adventures: ## Het echo commando Als je wil dat de computer jouw antwoord ook herhaalt, kun je het `{echo}` commando gebruiken. Let op: Je antwoord wordt herhaald aan het einde van de zin. In het voorbeeld komt jouw antwoord dus na Hoi. example_code_2: "```\n{print} Hallo!\n{ask} Hoe heet je? \n{echo} Hoi\n```\n" - story_text_3: "### Opdracht \nProbeer het`{ask}`commando en het`{echo}` commando uit. Vul eerst een goede code in op de plek van het streepje om het programma aan de praat te krijgen.\nStel daarna nog twee vragen door het `{ask}` commando te gebruiken. Gebruik na elke `{ask}` ook een `{echo}` om het antwoord op het scherm te tonen\n" + story_text_3: "### Opdracht \nProbeer het`{ask}`commando en het`{echo}` commando uit. Vul eerst een goede code in op de plek van het streepje om het programma aan de praat te krijgen.\nStel daarna nog twee vragen door het `{ask}` commando te gebruiken. Gebruik na elke `{ask}` ook een `{echo}`\ + \ om het antwoord op het scherm te tonen\n" example_code_3: | ``` _ Hoe gaat het? @@ -379,7 +385,8 @@ adventures: leeftijd {is} {ask} Hoe oud ben je? {print} naam is leeftijd jaar oud ``` - story_text_2: "### Opdracht\nJe hebt in het vorige avontuur al geleerd hoe je variabelen kunt instellen met het`{is}` commando.\nDaar heb je minstens 3 variabelen gemaakt en ze gebruikt met een print commando.\nNu gaan we de variabelen interactief maken in plaats van ze in te stellen, zoals we deden in ons voorbeeld. \n\nKopieer je code van het vorige avontuur en maak de variabelen interactief door `{ask}` commando's te gebruiken.\n" + story_text_2: "### Opdracht\nJe hebt in het vorige avontuur al geleerd hoe je variabelen kunt instellen met het`{is}` commando.\nDaar heb je minstens 3 variabelen gemaakt en ze gebruikt met een print commando.\nNu gaan we de variabelen interactief maken in plaats van ze in te stellen,\ + \ zoals we deden in ons voorbeeld. \n\nKopieer je code van het vorige avontuur en maak de variabelen interactief door `{ask}` commando's te gebruiken.\n" example_code_2: | ``` lievelingsdier {is} {ask} Wat is je lievelingsdier? @@ -408,7 +415,9 @@ adventures: description: Probeer zo dicht mogelijk bij 21 te komen levels: 17: - story_text: "Blackjack is een simpel kaartspelletje waarbij je zo dicht mogelijk bij 21 punten moet komen. Je krijgt twee kaarten. Elke kaart is het getal waard dat erop staat, en de kaarten met plaatjes (Boer, Vrouw, Heer) zijn 10 punten waard.\nDe Aas is 1 of 11 punten waard (dat mag je zelf kiezen). De dealer, jouw tegenstander, krijgt ook twee kaarten.\nAls je wil, mag je een derde kaart pakken en die punten worden bij jouw score opgeteld. De dealer mag ook een extra kaart pakken.\nMaar pas op dat je nooit over de 21 punten heengaat, want dan verlies je!\nDe speler die het dichtst bij de 21 punten komt, zonder eroverheen te gaan, wint! \n\nVeel plezier!\n" + story_text: "Blackjack is een simpel kaartspelletje waarbij je zo dicht mogelijk bij 21 punten moet komen. Je krijgt twee kaarten. Elke kaart is het getal waard dat erop staat, en de kaarten met plaatjes (Boer, Vrouw, Heer) zijn 10 punten waard.\nDe Aas is 1 of 11 punten waard (dat mag\ + \ je zelf kiezen). De dealer, jouw tegenstander, krijgt ook twee kaarten.\nAls je wil, mag je een derde kaart pakken en die punten worden bij jouw score opgeteld. De dealer mag ook een extra kaart pakken.\nMaar pas op dat je nooit over de 21 punten heengaat, want dan verlies je!\n\ + De speler die het dichtst bij de 21 punten komt, zonder eroverheen te gaan, wint! \n\nVeel plezier!\n" example_code: | ``` {print} 'BLACKJACK' @@ -1051,21 +1060,8 @@ adventures: {for} naam {is} namen {print} Op het strand vindt naam het leuk om to activiteit at random 11: - story_text: |- - ### Opdracht - Debug dit kalender-programma. De uitvoer van het programma moet eruitzien als een lijst van datums. - Bijvoorbeeld: - - ``` - Hedy kalender - Hier zijn alle dagen van november - 1 november - 2 november - 3 november - ``` - Enzovoort. - - Let op! Test je code voor de maand februari extra goed, want het aantal dagen in deze maand verandert in schrikkeljaren. + story_text: "### Opdracht\nDebug dit kalender-programma. De uitvoer van het programma moet eruitzien als een lijst van datums.\nBijvoorbeeld:\n\n```\nHedy kalender\nHier zijn alle dagen van november\n1 november \n2 november \n3 november \n```\nEnzovoort.\n\nLet op! Test je code voor de\ + \ maand februari extra goed, want het aantal dagen in deze maand verandert in schrikkeljaren." example_code: | **Pas op! Deze code bevat fouten!** ``` @@ -1403,35 +1399,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1454,22 +1450,22 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Introductie default_save_name: intro @@ -2886,7 +2882,8 @@ adventures: description: Maak je eigen programma om woordjes te leren in een vreemde taal levels: 5: - story_text: "Maak een programma om woordjes mee te leren in een andere taal.\n \n### Opdracht\nVoeg minstens 3 nieuwe woorden om te leren toe aan het programma.\n **Extra** Je kunt natuurlijk ook een andere taal kiezen dan Frans. Verander de code in de taal die jij graag zou willen leren. \n" + story_text: "Maak een programma om woordjes mee te leren in een andere taal.\n \n### Opdracht\nVoeg minstens 3 nieuwe woorden om te leren toe aan het programma.\n **Extra** Je kunt natuurlijk ook een andere taal kiezen dan Frans. Verander de code in de taal die jij graag zou willen leren.\ + \ \n" example_code: | ``` {print} 'Leer Frans!' @@ -3585,7 +3582,8 @@ adventures: ``` start_code: '# Schrijf jouw code hier' 4: - story_text: "Ook in het restaurant moet je aanhalingstekens gebruiken bij de commando's `{print}` en `{ask}` .\n\n### Opdracht\nKun jij de voorbeeldcode aan de praat krijgen door aanhalingstekens toe te voegen? Let op: variabelen moeten niet binnen de aanhalingstekens staan. \nVoeg daarna `{clear}` commando's toe om steeds maar 1 regel tekst in je uitvoerscherm te hebben.\n\n### Opdracht 2\nKopieer je eigen restaurantcode van het vorige level en zet aanhalingstekens op de juiste plaats. Voeg ook `{clear}` commando's toe.\n" + story_text: "Ook in het restaurant moet je aanhalingstekens gebruiken bij de commando's `{print}` en `{ask}` .\n\n### Opdracht\nKun jij de voorbeeldcode aan de praat krijgen door aanhalingstekens toe te voegen? Let op: variabelen moeten niet binnen de aanhalingstekens staan. \nVoeg daarna\ + \ `{clear}` commando's toe om steeds maar 1 regel tekst in je uitvoerscherm te hebben.\n\n### Opdracht 2\nKopieer je eigen restaurantcode van het vorige level en zet aanhalingstekens op de juiste plaats. Voeg ook `{clear}` commando's toe.\n" example_code: | ``` _ Voeg aanhalingstekens toe aan deze code _ @@ -4013,7 +4011,8 @@ adventures: description: Maak je eigen spionnencode levels: 12: - story_text: "In dit avontuur kun je jouw eigen geheim agent code maken. Maak een bericht dat alleen de juiste agent kan ontcijferen.\nAls je vijand probeert de code te kraken krijgen ze valse informatie om hun tijd te verspillen.\n \n### Opdracht 1\nMaak je eigen code voor jouw geheime agent. Laat beiden onderdelen zien aan de echte spion.\n### Opdracht 2\nVoeg nog een derde vraag toe en maak jouw wachtwoord langer met bijv een kledingstuk of een voorwerp! \n" + story_text: "In dit avontuur kun je jouw eigen geheim agent code maken. Maak een bericht dat alleen de juiste agent kan ontcijferen.\nAls je vijand probeert de code te kraken krijgen ze valse informatie om hun tijd te verspillen.\n \n### Opdracht 1\nMaak je eigen code voor jouw geheime\ + \ agent. Laat beiden onderdelen zien aan de echte spion.\n### Opdracht 2\nVoeg nog een derde vraag toe en maak jouw wachtwoord langer met bijv een kledingstuk of een voorwerp! \n" example_code: | ``` naam = {ask} 'Hoe heet je?' @@ -4315,7 +4314,9 @@ adventures: description: Speel een potje Boter Kaas en Eieren! levels: 13: - story_text: "In dit avontuur kun je het spelletje Boter Kaas en Eieren programmeren. \nJe speelt met twee personen. Kies om de beurt een plekje op het speelbord (1 - 9) waar je jouw teken op wil zetten (x of o). \nDe speler die als eerst 3 op een rij heeft (horizontaal, verticaal of diagonaal) wint!\n\n### Opdracht 1\nDit spel doet het wel maar er zijn een paar problemen! Je kan zomaar een veld van de andere speler pakken. Kijk eerst met een `{if}` of er wel een punt staat in het gekozen veld. Zo niet, waarschuw de speler dan.\n\n ### Opdracht 2\nHet spel kan ook niet zelf besluiten of er al een winnaar is. Kijk steeds of er al drie dezelfde tekens op een rij zijn en vertel dan wie er gewonnen heeft.\n\n### Opdracht 3 (extra)\nSpelen met een vriend(innet)je kan niet altijd! Programmeer jij een computertegenstander om tegen te spelen?\n" + story_text: "In dit avontuur kun je het spelletje Boter Kaas en Eieren programmeren. \nJe speelt met twee personen. Kies om de beurt een plekje op het speelbord (1 - 9) waar je jouw teken op wil zetten (x of o). \nDe speler die als eerst 3 op een rij heeft (horizontaal, verticaal of diagonaal)\ + \ wint!\n\n### Opdracht 1\nDit spel doet het wel maar er zijn een paar problemen! Je kan zomaar een veld van de andere speler pakken. Kijk eerst met een `{if}` of er wel een punt staat in het gekozen veld. Zo niet, waarschuw de speler dan.\n\n ### Opdracht 2\nHet spel kan ook niet\ + \ zelf besluiten of er al een winnaar is. Kijk steeds of er al drie dezelfde tekens op een rij zijn en vertel dan wie er gewonnen heeft.\n\n### Opdracht 3 (extra)\nSpelen met een vriend(innet)je kan niet altijd! Programmeer jij een computertegenstander om tegen te spelen?\n" example_code: | ``` speler = 'x' @@ -4459,7 +4460,9 @@ adventures: ``` start_code: '# schrijf jouw code hier' 17: - story_text: "In de vorige levels was je boter kaas en eieren spel nog vervelend om te spelen. Na elke x of o die je zette vroeg het spel namelijk of je gewonnen had of niet. \nDit maakte het spel wel speelbaar, maar erg traag. In dit level heb je het `{elif}` commando geleerd, dat dit probleem kan oplossen. \nMet `{elif}` kun je Hedy laten checken of er een speler gewonnen heeft. Hiervoor heb je wel wat extra regels nodig.\n\nIn de voorbeeld code zie je dat we de voorwaarden om te winnen (3 op een rij)hebben toegevoegd. \nJe vindt ze op regel 46 tot 69. Je kunt zien dat elke keer als een speler 3 op een rij heeft, het spel de variabele spel op 'uit' zet. \nDit betekent dat de `{while}` lus wordt gestopt en dat het spel stopgezet wordt.\n" + story_text: "In de vorige levels was je boter kaas en eieren spel nog vervelend om te spelen. Na elke x of o die je zette vroeg het spel namelijk of je gewonnen had of niet. \nDit maakte het spel wel speelbaar, maar erg traag. In dit level heb je het `{elif}` commando geleerd, dat dit\ + \ probleem kan oplossen. \nMet `{elif}` kun je Hedy laten checken of er een speler gewonnen heeft. Hiervoor heb je wel wat extra regels nodig.\n\nIn de voorbeeld code zie je dat we de voorwaarden om te winnen (3 op een rij)hebben toegevoegd. \nJe vindt ze op regel 46 tot 69. Je kunt\ + \ zien dat elke keer als een speler 3 op een rij heeft, het spel de variabele spel op 'uit' zet. \nDit betekent dat de `{while}` lus wordt gestopt en dat het spel stopgezet wordt.\n" example_code: | ``` teken = 'x' @@ -4573,7 +4576,8 @@ adventures: {turn} hoek {forward} 25 ``` - story_text_2: "Daarnaast kon je in level 1 alleen maar linksaf of rechtsaf slaan. Dat is een beetje saai!\nIn level 2 kun je de neus van de schildpad naar elke richting laten wijzen. \n\nGebruik 90 graden om een kwartslag te draaien. Een heel rondje draaien is 360 graden. \nKun jij een figuurtje tekenen met deze code? Misschien een driehoek of een cirkel?\n" + story_text_2: "Daarnaast kon je in level 1 alleen maar linksaf of rechtsaf slaan. Dat is een beetje saai!\nIn level 2 kun je de neus van de schildpad naar elke richting laten wijzen. \n\nGebruik 90 graden om een kwartslag te draaien. Een heel rondje draaien is 360 graden. \nKun jij een\ + \ figuurtje tekenen met deze code? Misschien een driehoek of een cirkel?\n" example_code_2: |- {print} Schildpaddenrace! hoek {is} 90 @@ -4695,7 +4699,8 @@ adventures: ``` start_code: '{print} ''Figuren tekenen''' 8: - story_text: "Nu we meerdere regels kunnen herhalen, kunnen we makkelijker figuren maken.\nWant we hoeven maar één keer in te stellen wat de hoek is, en die variabele steeds gebruiken in de `{repeat}`.\n\n### Opdracht 1\n De voorbeeldcode tekent een vierkant. Verander dat in een ander figuur zoals een driehoek of zeshoek. Je moet daarvoor twee regels veranderen!\nTip: een heel rondje is 360 graden. \n\n### Opdracht 2\nMaak nu een tekening naar je eigen inzicht, met minstens twee verschillende veelhoeken.\n" + story_text: "Nu we meerdere regels kunnen herhalen, kunnen we makkelijker figuren maken.\nWant we hoeven maar één keer in te stellen wat de hoek is, en die variabele steeds gebruiken in de `{repeat}`.\n\n### Opdracht 1\n De voorbeeldcode tekent een vierkant. Verander dat in een ander figuur\ + \ zoals een driehoek of zeshoek. Je moet daarvoor twee regels veranderen!\nTip: een heel rondje is 360 graden. \n\n### Opdracht 2\nMaak nu een tekening naar je eigen inzicht, met minstens twee verschillende veelhoeken.\n" example_code: | ``` hoek = 90 @@ -4735,7 +4740,8 @@ adventures: ``` start_code: '# place your code here' 10: - story_text: "In dit level kun je de teken-schildpad een figuur laten tekenen. \nDe schildpad volgt de afstanden in de lijst één voor één, waarbij de stappen steeds groter worden.\n### Opdracht 1\nVoeg een turn van 90 graden toe aan de code om een spiraal te tekenen.\nVoeg ten minste 5 getallen toe aan de lijst, zodat de spiraal steeds groter wordt.\n **(extra)** Kan jij de spiraal in een andere vorm veranderen? Probeer verschillende getallen met turn!\n### Opdracht 2\nDe spiraal wordt nu van binnen naar buiten getekend, kun jij dit omdraaien?\n" + story_text: "In dit level kun je de teken-schildpad een figuur laten tekenen. \nDe schildpad volgt de afstanden in de lijst één voor één, waarbij de stappen steeds groter worden.\n### Opdracht 1\nVoeg een turn van 90 graden toe aan de code om een spiraal te tekenen.\nVoeg ten minste 5\ + \ getallen toe aan de lijst, zodat de spiraal steeds groter wordt.\n **(extra)** Kan jij de spiraal in een andere vorm veranderen? Probeer verschillende getallen met turn!\n### Opdracht 2\nDe spiraal wordt nu van binnen naar buiten getekend, kun jij dit omdraaien?\n" example_code: | ``` {turn} 90 diff --git a/content/adventures/uk.yaml b/content/adventures/uk.yaml index 870486a11b8..71611c1961a 100644 --- a/content/adventures/uk.yaml +++ b/content/adventures/uk.yaml @@ -174,7 +174,8 @@ adventures: ``` start_code: '# розмістіть свій код тут' 9: - story_text: "У цьому рівні ви можете використовувати команди `{if}` і `{repeat}` всередині інших команд `{if}` і `{repeat}`. \nЦе дає вам багато можливостей і дійсно допомагає зробити вашу історію інтерактивною.\n\n### Вправа 1\n Закінчіть код, щоб `{if}` працював коректно.\n\n### Вправа 2\nДодайте `{if}` та `{else}` для тієї частини історії, де Робін також повертається додому.\n \n### Вправа 3\nПоверніться до своєї історії 8-го рівня і використайте принаймні два `{if}` всередині іншого `{if}`.\n" + story_text: "У цьому рівні ви можете використовувати команди `{if}` і `{repeat}` всередині інших команд `{if}` і `{repeat}`. \nЦе дає вам багато можливостей і дійсно допомагає зробити вашу історію інтерактивною.\n\n### Вправа 1\n Закінчіть код, щоб `{if}` працював коректно.\n\n### Вправа\ + \ 2\nДодайте `{if}` та `{else}` для тієї частини історії, де Робін також повертається додому.\n \n### Вправа 3\nПоверніться до своєї історії 8-го рівня і використайте принаймні два `{if}` всередині іншого `{if}`.\n" example_code: | ``` {print} 'Робін йде центром міста' @@ -1416,35 +1417,35 @@ adventures: print 'Thanks for ordering!' ``` - start_code: |2 + start_code: |4 - define food_order - toppings = ask 'pepperoni, tuna, veggie or cheese?' - size = ask 'big, medium or small?' - number_of_pizza = ask 'How many these pizzas would you like?' + define food_order + toppings = ask 'pepperoni, tuna, veggie or cheese?' + size = ask 'big, medium or small?' + number_of_pizza = ask 'How many these pizzas would you like?' - print 'YOU ORDERED' - print number_of_pizzas ' size ' topping ' pizza' + print 'YOU ORDERED' + print number_of_pizzas ' size ' topping ' pizza' - define drinks_order - drink = ask 'water, coke, icetea, lemonade or coffee?' - number_of_drinks = ask 'How many of these drinks would you like?' + define drinks_order + drink = ask 'water, coke, icetea, lemonade or coffee?' + number_of_drinks = ask 'How many of these drinks would you like?' - print 'YOU ORDERED' - print number_of_drinks ' ' drink + print 'YOU ORDERED' + print number_of_drinks ' ' drink - 'Welcome to Hedy pizza' - more_food = ask 'Would you like to order a pizza?' - while more_food = 'yes' - return food_order - more_food = ask 'Would you like to order a pizza?' - more_drinks = ask 'Would you like to order some drinks?' - while more_drinks == 'yes' - call drink_order - more_drinks == ask 'Would you like to order more drinks?' + 'Welcome to Hedy pizza' + more_food = ask 'Would you like to order a pizza?' + while more_food = 'yes' + return food_order + more_food = ask 'Would you like to order a pizza?' + more_drinks = ask 'Would you like to order some drinks?' + while more_drinks == 'yes' + call drink_order + more_drinks == ask 'Would you like to order more drinks?' - print 'Thanks for ordering!' + print 'Thanks for ordering!' 18: story_text: |- ### Exercise @@ -1467,29 +1468,30 @@ adventures: print 'there a ' sound print 'everywhere a ' sound sound ``` - start_code: |2 - - animals = ['pig', 'dog', 'cow'] - sounds = ['oink', 'woof', 'moo'] - for i in range 1 to 3 - animal = animals[i] - sound = sounds[i] - print 'Old McDonald had a farm' - print 'E I E I O!' - print 'and on that farm he had a ' animal - print 'E I E I O!' - print 'with a ' sound sound ' here' - print 'and a ' sound sound ' there' - print 'here a ' sound - print 'there a ' sound - print 'everywhere a ' sound sound + start_code: |4 + + animals = ['pig', 'dog', 'cow'] + sounds = ['oink', 'woof', 'moo'] + for i in range 1 to 3 + animal = animals[i] + sound = sounds[i] + print 'Old McDonald had a farm' + print 'E I E I O!' + print 'and on that farm he had a ' animal + print 'E I E I O!' + print 'with a ' sound sound ' here' + print 'and a ' sound sound ' there' + print 'here a ' sound + print 'there a ' sound + print 'everywhere a ' sound sound default: name: Вступ default_save_name: Вступ description: Пояснення рівнів levels: 1: - story_text: "На першому рівні ви можете використовувати команди `{print}`, `{ask}` та `{echo}`.\nНаберіть свій код у полі для програмування. Або натисніть зелену кнопку в блоці прикладу коду, і код буде набраний за вас!\nСпробуйте код самостійно, натиснувши зелену кнопку \"Запустити код\" під полем програмування.\n \nВивести текст на екран можна за допомогою команди `{print}`. \n" + story_text: "На першому рівні ви можете використовувати команди `{print}`, `{ask}` та `{echo}`.\nНаберіть свій код у полі для програмування. Або натисніть зелену кнопку в блоці прикладу коду, і код буде набраний за вас!\nСпробуйте код самостійно, натиснувши зелену кнопку \"Запустити код\"\ + \ під полем програмування.\n \nВивести текст на екран можна за допомогою команди `{print}`. \n" start_code: '{print} привіт світе!' 2: story_text: | @@ -1641,7 +1643,8 @@ adventures: {print} 'decimal numbers now need to use a dot' {print} 2.5 + 2.5 13: - story_text: "Зараз ми будемо вивчати `{and}` та `{or}`! Якщо ви хочете перевірити два оператори, вам не обов'язково використовувати два `{if}`, ви можете використовувати `{and}` і `{or}`. \n\nЯкщо ви використовуєте `{and}`, обидва оператори, зліва і справа від `{and}`, повинні бути істинними. Ми також можемо використовувати `{or}`. Тоді лише одне твердження має бути правильним." + story_text: "Зараз ми будемо вивчати `{and}` та `{or}`! Якщо ви хочете перевірити два оператори, вам не обов'язково використовувати два `{if}`, ви можете використовувати `{and}` і `{or}`. \n\nЯкщо ви використовуєте `{and}`, обидва оператори, зліва і справа від `{and}`, повинні бути істинними.\ + \ Ми також можемо використовувати `{or}`. Тоді лише одне твердження має бути правильним." example_code: | ``` name = {ask} 'what is your name?' diff --git a/content/cheatsheets/uk.yaml b/content/cheatsheets/uk.yaml index 05ce9a22dcb..6d4143b4904 100644 --- a/content/cheatsheets/uk.yaml +++ b/content/cheatsheets/uk.yaml @@ -35,7 +35,7 @@ колір {is} {ask} Який твій улюблений колір? {print} колір твій улюблений! - name: '{sleep}' - explanation: 'Із `{sleep}` , ви можете змусити Hedy затримуватися на секунду, або на кілька секунд.' + explanation: Із `{sleep}` , ви можете змусити Hedy затримуватися на секунду, або на кілька секунд. demo_code: |- {print} Одну секунду, дайте подумати... {sleep} diff --git a/content/client-messages/uk.yaml b/content/client-messages/uk.yaml index 5a2d63cfd37..74c7b7abe2d 100644 --- a/content/client-messages/uk.yaml +++ b/content/client-messages/uk.yaml @@ -9,11 +9,11 @@ Program_too_long: Ваша програма виконується надто д ServerError: Ви написали програму, яку ми не очікували. Якщо ви хочете допомогти, надішліть нам електронний лист із зазначенням рівня та вашої програми на hello@hedy.org. Тим часом спробуйте щось трохи інше та ще раз подивіться на приклади. Дякую! Transpile_error: Ми не можемо запустити вашу програму. Transpile_success: -- Гарна робота! -- Дивовижно! -- Чудова робота! -- Чудово! -- Ви чудово впоралися! +- Гарна робота! +- Дивовижно! +- Чудова робота! +- Чудово! +- Ви чудово впоралися! Transpile_warning: Попередження! Unsaved_Changes: Ви маєте незбережену програму. Ви хочете вийти, не зберігши її? dice: 🎲 From e577db6652a168599f80988a28a2e436a275d1d6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 16:57:32 +0000 Subject: [PATCH 08/15] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- content/parsons/nl.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/parsons/nl.yaml b/content/parsons/nl.yaml index fbff4ea3e8f..cf0177570d8 100644 --- a/content/parsons/nl.yaml +++ b/content/parsons/nl.yaml @@ -1,7 +1,8 @@ levels: 1: 1: - story: "In de sleeppuzzels zijn de regels code al voor je geschreven. Je hoeft ze alleen nog maar in de juiste volgorde te plaatsen! Sleep de regels code in je invoerscherm en voer de code uit. Kun jij het programma aan de praat krijgen?\n\n\nJe bent een klant bij bakkerij Hedy. \nJe loopt de bakkerij binnen en wordt verwelkomd door de bakker.\nHij vraagt wat voor taart je wil bestellen en herhaalt het antwoord.\nDaarna wordt je bestelling klaargezet." + story: "In de sleeppuzzels zijn de regels code al voor je geschreven. Je hoeft ze alleen nog maar in de juiste volgorde te plaatsen! Sleep de regels code in je invoerscherm en voer de code uit. Kun jij het programma aan de praat krijgen?\n\n\nJe bent een klant bij bakkerij Hedy. \nJe loopt\ + \ de bakkerij binnen en wordt verwelkomd door de bakker.\nHij vraagt wat voor taart je wil bestellen en herhaalt het antwoord.\nDaarna wordt je bestelling klaargezet." code: |- {print} Welkom bij bakkerij Hedy! {ask} Welke taart wilt u bestellen? @@ -33,7 +34,8 @@ levels: {print} Bedankt voor het winkelen bij ons! 3: 1: - story: "Het nieuwe schooljaar op Zweinstein gaat van start! \nHet is de taak van de sorteerhoed om jou in te delen in een van de afdelingen. \nBij welke afdeling zou jij willen?\nBen jij een Griffoendor, Huffelpuf, Zwadderich of Ravenklauw. \nVoordat de sorteerhoed zijn keuze bekend maakt, kun je aangeven bij welk huis je niet terecht wil komen." + story: "Het nieuwe schooljaar op Zweinstein gaat van start! \nHet is de taak van de sorteerhoed om jou in te delen in een van de afdelingen. \nBij welke afdeling zou jij willen?\nBen jij een Griffoendor, Huffelpuf, Zwadderich of Ravenklauw. \nVoordat de sorteerhoed zijn keuze bekend maakt,\ + \ kun je aangeven bij welk huis je niet terecht wil komen." code: |- {print} De sorteerhoed is er klaar voor om jou in te delen op Zweinstein. afdelingen {is} Griffoendor, Huffelpuf, Zwadderich, Ravenklauw From 06d10e36e805f545f17558bad87f3848180bf32e Mon Sep 17 00:00:00 2001 From: Rico Hermans Date: Fri, 24 Nov 2023 21:56:55 +0100 Subject: [PATCH 09/15] [FIX] Improve reliability of second teacher Cypress test (#4805) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I tried improving the reliability of the cypress tests for second teachers, because I selfishly want my own PR merged and it blocked on this 😈. I made the following changes: ### Class selection The tests used to create a new class, but then always clicked into the *first* class they could find on the teachers page instead of the class they created. Depending on what names get generated, this was not necessarily the fresh class we just generated, but could be any class left by a previous test and there's no knowing what state that class is in. Use `navigateToClass(className)`. ### Should vs contains Replace `should()` with `contains()` in most places. `contains()` is a query, meaning it *looks and waits* for elements containing that string. On the other hand, `should()` is an assertion: on the elements your query is already focused on, assert that they have this text. The difference comes up when timing comes into the picture. Here's an example: Let's say we have an element with text `teacher2`, and after we click a button `teacher3` is going to be added to the list. However, this may take a few milliseconds. ```ts cy.get('.teacher_link') // <--- (Q) .should('include.text', 'teacher3'); // <--- (A) ``` In this example, the query `Q` is "find me all elements with class `teacher_link`". If this executes *after* `teacher3` has been added to the list, then that query will match two elements, and the assertion `A` can see that, indeed, one of them has the text `teacher3`. If, on the other hand, this executes *before* `teacher3` has been added to the list, then the query is still satisified. It can still find at least one element with the class `teacher_link`, and it will move on to the assertion. Even if the `teacher3` element appears a millisecond later, it's too late: the query has stopped waiting. If we write the cypress statement like this: ```ts cy.get('.teacher_link') .contains('teacher3'); ``` Then now *both* statements are part of the query! Cypress will look and wait for an element that is BOTH a `.teacher_link` as well as has text `teacher3`. There isn't one, until there is. What won't happen, is that Cypress will settle on the wrong set of elements too early. ### DOM navigation Replace some JavaScript navigating the invite table with a selector involving `.parent()`: we find the row containing the teacher we're interested in, then use `.parent().find()` to find other elements *in the same row*. To finish the assertion, I've needed to move the test up, so that we revoke teacher3's invitation before we accept teacher2's invitation (otherwise at the end the table is altogether gone and the `cy.get()` fails). **How to test** GitHub will test for us! --- .../class_page/second_teachers_invites.cy.js | 92 +++++++++---------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/tests/cypress/e2e/for-teacher_page/class_page/second_teachers_invites.cy.js b/tests/cypress/e2e/for-teacher_page/class_page/second_teachers_invites.cy.js index 3a64e1dfe55..c8fa52f11c2 100644 --- a/tests/cypress/e2e/for-teacher_page/class_page/second_teachers_invites.cy.js +++ b/tests/cypress/e2e/for-teacher_page/class_page/second_teachers_invites.cy.js @@ -1,83 +1,81 @@ import {loginForTeacher, logout} from "../../tools/login/login.js" import { goToProfilePage } from "../../tools/navigation/nav"; -import { createClass } from "../../tools/classes/class"; +import { createClass, navigateToClass } from "../../tools/classes/class"; const secondTeachers = ["teacher2", "teacher3"] -const invitesTable = body => body.find("#invites-block table") +// NOTE: These test steps must execute in sequence. Each of them depends on the previous +// test having executed, in the order they are listed in the file. +// They cannot be made independent until https://github.com/hedyorg/hedy/issues/4804 is resolved describe("Second teachers: invitations", () => { + // Before all: create a single class + let className; before(() => { loginForTeacher(); - createClass() + className = createClass() }); it(`Invites ${secondTeachers.length} second teachers: by username`, () => { loginForTeacher(); - cy.get(".view_class").first().click(); + navigateToClass(className); for (const teacher of secondTeachers) { - cy.get("#add-second-teacher").click(); cy.get("#modal-prompt-input").type(teacher); cy.get("#modal-ok-button").click(); - - cy.get("body").then(invitesTable).then(table => { - if (table.length) { - table = cy.get("#invites-block table") - cy.get("#invites-block .username_cell") - .should('be.visible') - .and("include.text", teacher) - } else { - cy.log("Second teacher not invited.") - } - }) + } + + // Check that both invited teachers are in the table + for (const teacher of secondTeachers) { + cy.get("#invites-block table") + .contains(teacher); } }) it(`Tries duplicating ${secondTeachers[0]}'s invitation`, () => { loginForTeacher(); - cy.get(".view_class").first().click(); + navigateToClass(className); cy.get("#add-second-teacher").click(); cy.get("#modal-prompt-input").type(secondTeachers[0]); cy.get("#modal-ok-button").click(); cy.get("#modal_alert_container") - .should('be.visible') - .and("contain", "pending invitation") + .contains('pending invitation') }) - it(`Accepts invitation sent to ${secondTeachers[0]}`, () => { - loginForTeacher(secondTeachers[0]) - goToProfilePage() - cy.get("#messages").should("exist") - cy.get("#messages #join").click() - }) + it(`Deletes ${secondTeachers[1]}'s invitation`, () => { + loginForTeacher(); + navigateToClass(className); - it("Reads all second teachers", () => { - loginForTeacher() - cy.get(".view_class").first().click(); - cy.get("#second_teachers_container .username_cell").should("include.text", secondTeachers[0]) - }) + cy.get("#invites-block table") + .get('.username_cell') + .contains(secondTeachers[1]) + .parent('tr') + .find('.remove_user_invitation a') + .click(); - it(`Deletes ${secondTeachers[1]}'s invitation`, () => { + cy.get('#modal-confirm #modal-yes-button').click(); - loginForTeacher(); - cy.get(".view_class").first().click(); - cy.get("body").then(invitesTable).then(table => { - // if not, then no invitation. - if (table.length) { - table = cy.get("#invites-block table") - console.log(table) - table.should("exist") - table.get(".remove_user_invitation").first().click() - cy.get("#modal-yes-button").click(); - } else { - cy.log("Second teacher not deleted.") - } - }) - cy.get('body').then(invitesTable).then(table => - table.length && cy.get("#invites-block table").should("not.contain", secondTeachers[0])) + // This needs to come before we accept teacher2's invitation, otherwise + // after this there are no invites and so this table isn't rendered at all. + cy.get("#invites-block table") + .should("not.contain", secondTeachers[1]); + }); + + it(`Accepts invitation sent to ${secondTeachers[0]}`, () => { + cy.intercept('class/join/**').as('join'); + loginForTeacher(secondTeachers[0]); + goToProfilePage(); + cy.get("#messages #join").click(); + // Give the Ajax request that gets sent as a result of the click enough time to complete + cy.wait('@join'); }) + it(`After accepting, the teacher table now contains ${secondTeachers[0]}`, () => { + loginForTeacher(); + navigateToClass(className); + + cy.get("#second_teachers_container .username_cell").contains(secondTeachers[0]); + }) }) From 4743bc5b656e129c5ff898135676d7bd565dba2c Mon Sep 17 00:00:00 2001 From: Rico Hermans Date: Fri, 24 Nov 2023 23:47:26 +0100 Subject: [PATCH 10/15] [FIX] Check for the type of indexed fields in DynamoDB (#4798) Make sure that during local testing of a new indexing strategy, we don't accidentally depend on types that cannot actually be indexed in a real DynamoDB table. **How to test** Nothing to test, there is no new functionality. --- tests/test_dynamo.py | 8 ++++++++ website/dynamo.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tests/test_dynamo.py b/tests/test_dynamo.py index ffd6817f85d..d7bfaadd21a 100644 --- a/tests/test_dynamo.py +++ b/tests/test_dynamo.py @@ -192,6 +192,14 @@ def test_query(self): {'id': 'key', 'sort': 2, 'm': 'another'} ]) + def test_cant_use_array_for_indexed_field(self): + with self.assertRaises(ValueError): + self.table.create({'id': 'key', 'sort': 1, 'm': [1, 2, 3]}) + + def test_cant_use_array_for_partition(self): + with self.assertRaises(ValueError): + self.table.create({'id': [1, 2]}) + def test_query_with_filter(self): self.table.create({'id': 'key', 'sort': 1, 'm': 'val'}) self.table.create({'id': 'key', 'sort': 2, 'm': 'another'}) diff --git a/website/dynamo.py b/website/dynamo.py index 4b53528a411..1b965f8ea41 100644 --- a/website/dynamo.py +++ b/website/dynamo.py @@ -224,6 +224,12 @@ def __init__(self, storage: TableStorage, table_name, partition_key, sort_key=No self.storage = storage self.table_name = table_name self.indexes = indexes or [] + self.indexed_fields = set() + + all_schemas = [self.key_schema] + [i.key_schema for i in self.indexes] + for schema in all_schemas: + for field in schema.key_names: + self.indexed_fields.add(field) # Check to make sure the indexes have unique partition keys part_names = reverse_index((index.index_name, index.key_schema.partition_key) for index in self.indexes) @@ -341,6 +347,7 @@ def create(self, data): """Put a single complete record into the database.""" if not self.key_schema.fully_matches(data): raise ValueError(f"Expecting fields {self.key_schema} in create() call, got: {data}") + self._validate_indexable_fields(data, False) querylog.log_counter(f"db_create:{self.table_name}") self.storage.put(self.table_name, self.key_schema.extract(data), data) @@ -359,6 +366,7 @@ def update(self, key, updates): updates that aren't representable as plain values. """ querylog.log_counter(f"db_update:{self.table_name}") + self._validate_indexable_fields(updates, True) self._validate_key(key) return self.storage.update(self.table_name, key, updates) @@ -438,6 +446,26 @@ def _validate_key(self, key): if any(not v for v in key.values()): raise ValueError(f"key fields cannot be empty: {key}") + def _validate_indexable_fields(self, data, for_update): + """Check that all fields that have [index] keys on them in this data are either strings, ints or binaries. + + We can't validate whether the Dynamo index is properly defined, but at + least we can catch some assumptions locally. + """ + for field in self.indexed_fields: + value = data.get(field) + if value is None: + continue + + if for_update and isinstance(value, DynamoUpdate): + continue + if isinstance(value, str) or isinstance(value, numbers.Number) or isinstance(value, bytes): + continue + + raise ValueError('Trying to insert %r into table %s, but %s is a Partition or Sort Key of the table itself ' + ' or an index, so must be of type string, number or binary.' + % ({field: value}, self.table_name, field)) + DDB_SERIALIZER = TypeSerializer() DDB_DESERIALIZER = TypeDeserializer() From 3a1853ca9f28b8558579cbd85227c4288e458587 Mon Sep 17 00:00:00 2001 From: Felienne Hermans Date: Sat, 25 Nov 2023 00:26:34 +0100 Subject: [PATCH 11/15] [LANGUAGE] improve error message for unquoted string with comma (#4786) Fixes #3967 **How to test** Check the error from #3967 is improved (I have also added tests) --- grammars/level4-Additions.lark | 9 +- grammars/level5-Additions.lark | 2 +- grammars/level6-Additions.lark | 4 +- static/css/generated.css | 4516 +---------------------------- tests/test_level/test_level_04.py | 62 +- 5 files changed, 71 insertions(+), 4522 deletions(-) diff --git a/grammars/level4-Additions.lark b/grammars/level4-Additions.lark index 129fab09a37..c56618ce16a 100644 --- a/grammars/level4-Additions.lark +++ b/grammars/level4-Additions.lark @@ -1,9 +1,14 @@ // redefining it entirely since it has many order-depending rules (e.g ask_no_quotes should be after ask and before assign) -command: clear | print | ask | turtle | assign_list | add | remove | sleep | error_list_access | error_ask_no_quotes| assign | error_invalid_space | error_print_no_quotes | error_text_no_print |error_invalid | empty_line +command: clear | print | ask | turtle | assign_list | add | remove | sleep | error_list_access | error_ask_no_quotes| assign | error_invalid_space | error_print_no_quotes | error_print_one_quote_only | error_text_no_print |error_invalid | empty_line print: _PRINT (_print_argument)? -> print error_print_no_quotes: _PRINT text -> error_print_nq +textwithoutsinglequote: /([^\n']+)/ -> text +textwithoutdoublequote: /([^\n"]+)/ -> text +error_print_one_quote_only: _PRINT "'" textwithoutsinglequote -> error_print_nq | _PRINT "\"" textwithoutdoublequote -> error_print_nq | _PRINT textwithoutsinglequote "'" -> error_print_nq | _PRINT textwithoutdoublequote "\"" -> error_print_nq + + // FH, feb 2023 Shall we rename this 'var' to declare maybe? I confused myself :) ask: var _IS _ASK (_print_argument)? error_ask_no_quotes: var _IS _ASK text -> error_print_nq @@ -20,6 +25,8 @@ error_text_no_print: quoted_text textwithoutspaces: /([^\n،,,、 ]+)/ -> text + + quoted_text: (/'((?:[^\\']|\\.)*)'/ | /"((?:[^\\"]|\\.)*)"/ | /‘((?:[^\\‘]|\\.)*)’/ | /“((?:[^\\”]|\\.)*)”/ | /«((?:[^\\»]|\\.)*)»/ ) -> text //text can be between single or double quotes, but quotes may be escaped with \ diff --git a/grammars/level5-Additions.lark b/grammars/level5-Additions.lark index e86d74bbee0..39b1ca24e8f 100644 --- a/grammars/level5-Additions.lark +++ b/grammars/level5-Additions.lark @@ -42,7 +42,7 @@ nospace: /[^\n, ]/ textwithspaces: /(?:[^#\n،,,、 ]| (?!else|başka|faese|अन्यथा|否则|muuten|muidu|senão|ellers|alie|altfel|иначе|inače|altrimenti|інакше|lainnya|arall|annars|değilse|anders|ndryshe|inaczej|sinon|ไม่อย่างนั้น|sonst|లేకపోతే|sino|ورنہ|وکھرا|אחרת|وإلا))+/ -> text //anything can be parsed except for a newline and a comma for list separators //a space is allowed, but it may not be followed by an else. The part " (?!else))" means space not followed by (negative look ahead) else //That is because allowing else in strings leads to issue #303 -textwithoutspaces: /(?:[^#\n،,,、 *+\-\/eidіиలేไamfnsbअ否אو]|א(?!חרת )|و(?!إلا |کھرا |رنہ)|否(?!则 )|अ(?!न्यथा )|и(?!наче )|m(?!uidu |uuten )|d(?!eğilse )|b(?!aşka )|n(?!dryshe )|ไ(?!ม่อย่างนั้น )|l(?!ainnya )|f(?!aese )|e(?!lse |llers )|s(?!inon |enão |ino |onst )|і(?!накше )|i(?!naczej |nače )|లే (?!కపోతే )|a(?!nders |lie |ltfel |ltrimenti |nnars |rall ))+/ -> text //anything can be parsed except for spaces (plus: a newline and a comma for list separators) +textwithoutspaces: /(?:[^#\n،,,、 *+\-\/eidіиlలేไamfnsbअ否אو]|א(?!חרת )|و(?!إلا |کھرا |رنہ)|否(?!则 )|अ(?!न्यथा )|и(?!наче )|m(?!uidu |uuten )|d(?!eğilse )|b(?!aşka )|n(?!dryshe )|ไ(?!ม่อย่างนั้น )|l(?!ainnya )|f(?!aese )|e(?!lse |llers )|s(?!inon |enão |ino |onst )|і(?!накше )|i(?!naczej |nače )|లే (?!కపోతే )|a(?!nders |lie |ltfel |ltrimenti |nnars |rall ))+/ -> text //anything can be parsed except for spaces (plus: a newline and a comma for list separators) //the part e(?!lse)|i(?!f)) means e not followed by lse, and i not followed by f // this is because allowing else and if in invalid leads to ambiguity in the grammar // note that the i's look similar but are not: inaczej versus інакше! diff --git a/grammars/level6-Additions.lark b/grammars/level6-Additions.lark index d802a381c93..7e900ab5a8b 100644 --- a/grammars/level6-Additions.lark +++ b/grammars/level6-Additions.lark @@ -2,8 +2,8 @@ _print_argument: (_SPACE | quoted_text | list_access | expression | print_expres ?print_expression: var_access_print | error_unsupported_number | INT // redefining it entirely since it has many order-depending rules -command: clear | print | turtle | add | remove | sleep | error_print_no_quotes | ifpressed_else | error_ifpressed_missing_else | ifelse | ifs | ask | error_ask_no_quotes| assign_button | assign | assign_list | error_invalid_space | error_text_no_print | empty_line -_if_less_command: print | turtle | add | remove | sleep | error_print_no_quotes | ask | error_ask_no_quotes | assign_button | assign | assign_list +command: clear | print | turtle | add | remove | sleep | error_print_no_quotes | error_print_one_quote_only | ifpressed_else | error_ifpressed_missing_else | ifelse | ifs | ask | error_ask_no_quotes| assign_button | assign | assign_list | error_invalid_space | error_text_no_print | empty_line +_if_less_command: print | turtle | add | remove | sleep | error_print_no_quotes | error_print_one_quote_only | ask | error_ask_no_quotes | assign_button | assign | assign_list //splitting these commands into two rules, one for equals and one for is so they can be properly handled in the translator ask: var (_IS | _EQUALS) _ASK (_print_argument)? diff --git a/static/css/generated.css b/static/css/generated.css index 77ae3044f9a..a9b2a9bf11e 100644 --- a/static/css/generated.css +++ b/static/css/generated.css @@ -1,4515 +1 @@ -/* -! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #edf2f7; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -*/ - -html { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font family by default. -2. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-size: 1em; - /* 2 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #cbd5e0; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #cbd5e0; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden] { - display: none; -} - -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(66 153 225 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(66 153 225 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -html { - font-weight: 300; - /* https://stackoverflow.com/questions/1417934/how-to-prevent-scrollbar-from-repositioning-web-page */ - overflow-x: hidden; - margin-right: calc(-1 * (100vw - 100%)); -} - -.font-slab { - font-family: 'Balsamiq Sans', sans-serif; -} - -.dot { - height: 25px; - width: 25px; - border-radius: 50%; - display: inline-block; -} - -h1 { - font-size: 2.25rem; - font-weight: 200; -} - -h2 { - font-size: 1.5rem; - font-weight: 700; -} - -h3 { - font-size: 1.5rem; - font-weight: 700; -} - -h4 { - font-size: 1rem; - font-weight: 700; -} - -/* TB: Why do we have this? It makes it (a lot) harder to style these element within the templates... */ - -* + p, * + ul, * + ol, * + pre { - margin-top: 1rem; -} - -a { - font-weight: 600; - --tw-text-opacity: 1; - color: rgb(99 179 237 / var(--tw-text-opacity)); - text-decoration: underline; -} - -strong { - font-weight: 700; -} - -.tiny-btn { - border-bottom-width: 2px; - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.25rem; - font-size: 0.875rem; -} - -/* Container for pages which are not the main code page and not copy pages */ - -.common-page-container { - margin-left: auto; - margin-right: auto; - width: 100%; - max-width: 1536px; - padding: 2rem; -} - -/* For main page content */ - -.copy-container { - margin-left: auto; - margin-right: auto; - max-width: 1024px; -} - -.copy-container-wide { - margin-left: auto; - margin-right: auto; - max-width: 1280px; -} - -.text-display-copy, .text-business-copy { - line-height: 1.625; -} - -/* Apply somewhat fancy styles to running text (good for landing page copy) */ - -.text-display-copy h2 { - text-align: center; - font-size: 2.25rem; - --tw-text-opacity: 1; - color: rgb(213 63 140 / var(--tw-text-opacity)); -} - -.text-display-copy h3 { - font-size: 2.25rem; - --tw-text-opacity: 1; - color: rgb(213 63 140 / var(--tw-text-opacity)); -} - -.text-display-copy .columns h3 { - font-size: 1.5rem; -} - -/** - * text-business-copy - * - * For Real Business Value(tm). - */ - -.text-business-copy { -} - -.text-business-copy h3:first-child { - margin-top: 0px; -} - -.text-business-copy * + h3 { - margin-top: 2rem; -} - -.btn-shape { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; -} - -.green-btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(47 133 90 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(72 187 120 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.green-btn:disabled, .green-btn[disabled] { - --tw-border-opacity: 1; - border-color: rgb(74 85 104 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(160 174 192 / var(--tw-bg-opacity)); -} - -.stripe-colored { - border-bottom-width: 4px; - --tw-border-opacity: 1; - border-color: rgb(236 201 75 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(246 224 94 / var(--tw-bg-opacity)); -} - -.stripe-white { - border-bottom-width: 4px; -} - -.stripe-colored h2, .stripe-colored a { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.stripe-colored .column-pane a { - --tw-text-opacity: 1; - color: rgb(43 108 176 / var(--tw-text-opacity)); -} - -.stripe-colored .column-pane { - border-radius: 0.5rem; - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.heading-underline { - margin-left: auto; - margin-right: auto; - margin-top: 2rem; - margin-bottom: 2rem; - height: 0.25rem; - width: 9rem; - --tw-bg-opacity: 1; - background-color: rgb(213 63 140 / var(--tw-bg-opacity)); -} - -.stripe-colored .heading-underline { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.text-links-plain a { - color: inherit; - text-decoration: none; - font-weight: inherit; -} - -.tooltip { - position: relative; - display: inline-block; -} - -.tooltip .tooltiptext { - visibility: hidden; - position: absolute; - align-items: center; - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(229 62 62 / var(--tw-text-opacity)); - width: 130; - bottom: 150%; - left: 50%; - margin-left: -80px; -} - -.tooltip:hover .tooltiptext { - visibility: visible; -} - -.tooltip .tooltiptext::after { - position: absolute; - content: " "; - top: 100%; - /* At the bottom of the tooltip */ - left: 50%; - margin-left: -10px; - border-width: 10px; - border-style: solid; - border-color: white transparent transparent transparent; -} - -.green-btn:hover:enabled, -a.green-btn:hover { - --tw-border-opacity: 1; - border-color: rgb(72 187 120 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(104 211 145 / var(--tw-bg-opacity)); -} - -.green-btn:hover:enabled:active, -a.green-btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(47 133 90 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(47 133 90 / var(--tw-bg-opacity)); -} - -.red-btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(197 48 48 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(245 101 101 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.red-btn:hover { - --tw-border-opacity: 1; - border-color: rgb(245 101 101 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(252 129 129 / var(--tw-bg-opacity)); -} - -.red-btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(197 48 48 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(197 48 48 / var(--tw-bg-opacity)); -} - -.yellow-btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(183 121 31 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(236 201 75 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} - -.yellow-btn:hover { - --tw-border-opacity: 1; - border-color: rgb(236 201 75 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(246 224 94 / var(--tw-bg-opacity)); -} - -.yellow-btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(183 121 31 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(183 121 31 / var(--tw-bg-opacity)); -} - -.pink-btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(237 100 166 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(246 135 179 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.pink-btn:hover { - --tw-border-opacity: 1; - border-color: rgb(246 135 179 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(251 182 206 / var(--tw-bg-opacity)); -} - -.pink-btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(237 100 166 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(184 50 128 / var(--tw-bg-opacity)); -} - -.blue-btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(43 108 176 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(66 153 225 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.blue-btn:hover { - --tw-border-opacity: 1; - border-color: rgb(66 153 225 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(99 179 237 / var(--tw-bg-opacity)); -} - -.blue-btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(43 108 176 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(43 108 176 / var(--tw-bg-opacity)); -} - -.gray-btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - text-decoration-line: none; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(74 85 104 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(160 174 192 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.gray-btn:hover { - --tw-border-opacity: 1; - border-color: rgb(160 174 192 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(203 213 224 / var(--tw-bg-opacity)); -} - -.gray-btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(74 85 104 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(74 85 104 / var(--tw-bg-opacity)); -} - -/* Styles only for use in MarkDown blocks */ - -/* NOTE: I'm pretty sure we don't render class="markdown" anymore anywhere */ - -.markdown { - font-size: 1.25rem; - line-height: 1.5; - --tw-text-opacity: 1; - color: rgb(45 55 72 / var(--tw-text-opacity)); -} - -.markdown li + li, .markdown li > p + p { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.markdown strong { - font-weight: 700; -} - -.markdown * + h1 { - margin-bottom: 0.5rem; - margin-top: 2.5rem; - line-height: 1.25; -} - -h2 { - font-weight: 500; - --tw-text-opacity: 1; - color: rgb(66 153 225 / var(--tw-text-opacity)); - font-family: 'Balsamiq Sans', sans-serif; - margin-bottom: 0.5rem; - margin-top: 2.5rem; - font-size: 1.5rem; - line-height: 1.25; -} - -h2:first-child { - margin-top: 0; -} - -h3 { - --tw-text-opacity: 1; - color: rgb(43 108 176 / var(--tw-text-opacity)); - font-family: 'Balsamiq Sans', sans-serif; - margin-top: 1rem; - margin-bottom: 0.25rem; - font-size: 1.25rem; - line-height: 1.25; -} - -h4 { - margin-top: 1rem; - margin-bottom: 0.5rem; -} - -pre, code { -} - -.markdown code { - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.25rem; - padding-right: 0.25rem; - font-size: 1rem; -} - -pre code { - margin-top: 0.5rem; - margin-bottom: 0.5rem; - display: block; - border-radius: 0.25rem; - border-width: 1px; - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(237 242 247 / var(--tw-bg-opacity)); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - font-size: 1rem; - --tw-text-opacity: 1; - color: rgb(229 62 62 / var(--tw-text-opacity)); -} - -pre { - white-space: pre-wrap; -} - -/** - * A container for Ace editors that adds a little padding around it - * - * (It looks nicer if the text isn't all the way up to the margin - */ - -.ace-container { - background-color: #272822; - border-radius: 0.25rem; - padding: 0.5rem; -} - -/* Code in a fenced code block (``` in MarkDown) */ - -pre, pre code { - font-size: 100%; - color: white; -} - -/* All code (` and ```) */ - -code { - display: inline; - border-radius: 0.25rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - padding-right: 0.5rem; - font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-weight: 400; - background: #272822 !important; - color: #ff6188; - font-size: 90%; -} - -.markdown blockquote { - border-left-width: 4px; - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)); - font-style: italic; -} - -:is([dir="ltr"] .markdown blockquote) { - padding-left: 1rem; -} - -:is([dir="rtl"] .markdown blockquote) { - padding-right: 1rem; -} - -.container { - width: 100%; -} - -@media (min-width: 640px) { - .container { - max-width: 640px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 768px; - } -} - -@media (min-width: 1024px) { - .container { - max-width: 1024px; - } -} - -@media (min-width: 1280px) { - .container { - max-width: 1280px; - } -} - -@media (min-width: 1536px) { - .container { - max-width: 1536px; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.visible { - visibility: visible; -} - -.invisible { - visibility: hidden; -} - -.static { - position: static; -} - -.fixed { - position: fixed; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.sticky { - position: sticky; -} - -.inset-0 { - inset: 0px; -} - -.-top-1 { - top: -0.25rem; -} - -.bottom-0 { - bottom: 0px; -} - -.left-0 { - left: 0px; -} - -.left-1\/2 { - left: 50%; -} - -.right-0 { - right: 0px; -} - -.right-0\.5 { - right: 0.125rem; -} - -.right-2 { - right: 0.5rem; -} - -.top-0 { - top: 0px; -} - -.top-0\.5 { - top: 0.125rem; -} - -.top-16 { - top: 4rem; -} - -.top-2 { - top: 0.5rem; -} - -.z-10 { - z-index: 10; -} - -.z-20 { - z-index: 20; -} - -.z-30 { - z-index: 30; -} - -.z-40 { - z-index: 40; -} - -.z-50 { - z-index: 50; -} - -.order-1 { - order: 1; -} - -.order-2 { - order: 2; -} - -.order-3 { - order: 3; -} - -.order-5 { - order: 5; -} - -.col-span-2 { - grid-column: span 2 / span 2; -} - -.col-start-1 { - grid-column-start: 1; -} - -.col-start-2 { - grid-column-start: 2; -} - -.row-span-2 { - grid-row: span 2 / span 2; -} - -.float-right { - float: right; -} - -.m-1 { - margin: 0.25rem; -} - -.m-2 { - margin: 0.5rem; -} - -.m-4 { - margin: 1rem; -} - -.m-8 { - margin: 2rem; -} - -.m-auto { - margin: auto; -} - -.mx-0 { - margin-left: 0px; - margin-right: 0px; -} - -.mx-16 { - margin-left: 4rem; - margin-right: 4rem; -} - -.mx-2 { - margin-left: 0.5rem; - margin-right: 0.5rem; -} - -.mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.my-0 { - margin-top: 0px; - margin-bottom: 0px; -} - -.my-1 { - margin-top: 0.25rem; - margin-bottom: 0.25rem; -} - -.my-10 { - margin-top: 2.5rem; - margin-bottom: 2.5rem; -} - -.my-16 { - margin-top: 4rem; - margin-bottom: 4rem; -} - -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} - -.my-5 { - margin-top: 1.25rem; - margin-bottom: 1.25rem; -} - -.my-8 { - margin-top: 2rem; - margin-bottom: 2rem; -} - -.my-auto { - margin-top: auto; - margin-bottom: auto; -} - -.-mb-px { - margin-bottom: -1px; -} - -.-ml-32 { - margin-left: -8rem; -} - -.-mr-6 { - margin-right: -1.5rem; -} - -.-mt-2 { - margin-top: -0.5rem; -} - -.-mt-8 { - margin-top: -2rem; -} - -.mb-0 { - margin-bottom: 0px; -} - -.mb-1 { - margin-bottom: 0.25rem; -} - -.mb-10 { - margin-bottom: 2.5rem; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.ml-0 { - margin-left: 0px; -} - -.ml-1 { - margin-left: 0.25rem; -} - -.ml-14 { - margin-left: 3.5rem; -} - -.ml-2 { - margin-left: 0.5rem; -} - -.ml-4 { - margin-left: 1rem; -} - -.ml-6 { - margin-left: 1.5rem; -} - -.ml-auto { - margin-left: auto; -} - -.mr-1 { - margin-right: 0.25rem; -} - -.mr-2 { - margin-right: 0.5rem; -} - -.mr-4 { - margin-right: 1rem; -} - -.mr-5 { - margin-right: 1.25rem; -} - -.mr-8 { - margin-right: 2rem; -} - -.mt-0 { - margin-top: 0px; -} - -.mt-0\.5 { - margin-top: 0.125rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-10 { - margin-top: 2.5rem; -} - -.mt-2 { - margin-top: 0.5rem; -} - -.mt-24 { - margin-top: 6rem; -} - -.mt-28 { - margin-top: 7rem; -} - -.mt-3 { - margin-top: 0.75rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-5 { - margin-top: 1.25rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.mt-auto { - margin-top: auto; -} - -.block { - display: block; -} - -.inline-block { - display: inline-block; -} - -.inline { - display: inline; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.table { - display: table; -} - -.grid { - display: grid; -} - -.contents { - display: contents; -} - -.hidden { - display: none; -} - -.aspect-\[2\/3\] { - aspect-ratio: 2/3; -} - -.h-10 { - height: 2.5rem; -} - -.h-12 { - height: 3rem; -} - -.h-14 { - height: 3.5rem; -} - -.h-16 { - height: 4rem; -} - -.h-2 { - height: 0.5rem; -} - -.h-24 { - height: 6rem; -} - -.h-28 { - height: 7rem; -} - -.h-32 { - height: 8rem; -} - -.h-4 { - height: 1rem; -} - -.h-40 { - height: 10rem; -} - -.h-6 { - height: 1.5rem; -} - -.h-64 { - height: 16rem; -} - -.h-8 { - height: 2rem; -} - -.h-80 { - height: 20rem; -} - -.h-96 { - height: 24rem; -} - -.h-auto { - height: auto; -} - -.h-full { - height: 100%; -} - -.h-min { - height: -moz-min-content; - height: min-content; -} - -.h-screen { - height: 100vh; -} - -.max-h-56 { - max-height: 14rem; -} - -.min-h-\[3\.5rem\] { - min-height: 3.5rem; -} - -.min-h-full { - min-height: 100%; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-1\/12 { - width: 8.333333%; -} - -.w-1\/2 { - width: 50%; -} - -.w-1\/3 { - width: 33.333333%; -} - -.w-10 { - width: 2.5rem; -} - -.w-10\/12 { - width: 83.333333%; -} - -.w-12 { - width: 3rem; -} - -.w-14 { - width: 3.5rem; -} - -.w-16 { - width: 4rem; -} - -.w-2 { - width: 0.5rem; -} - -.w-2\/12 { - width: 16.666667%; -} - -.w-2\/3 { - width: 66.666667%; -} - -.w-24 { - width: 6rem; -} - -.w-3\/4 { - width: 75%; -} - -.w-32 { - width: 8rem; -} - -.w-4 { - width: 1rem; -} - -.w-4\/5 { - width: 80%; -} - -.w-40 { - width: 10rem; -} - -.w-56 { - width: 14rem; -} - -.w-6 { - width: 1.5rem; -} - -.w-64 { - width: 16rem; -} - -.w-72 { - width: 18rem; -} - -.w-8 { - width: 2rem; -} - -.w-80 { - width: 20rem; -} - -.w-96 { - width: 24rem; -} - -.w-auto { - width: auto; -} - -.w-fit { - width: -moz-fit-content; - width: fit-content; -} - -.w-full { - width: 100%; -} - -.w-max { - width: -moz-max-content; - width: max-content; -} - -.w-min { - width: -moz-min-content; - width: min-content; -} - -.w-px { - width: 1px; -} - -.w-screen { - width: 100vw; -} - -.min-w-\[100px\] { - min-width: 100px; -} - -.min-w-\[200px\] { - min-width: 200px; -} - -.min-w-min { - min-width: -moz-min-content; - min-width: min-content; -} - -.max-w-3xl { - max-width: 48rem; -} - -.max-w-full { - max-width: 100%; -} - -.max-w-lg { - max-width: 32rem; -} - -.max-w-md { - max-width: 28rem; -} - -.max-w-prose { - max-width: 65ch; -} - -.max-w-screen-2xl { - max-width: 1536px; -} - -.max-w-screen-lg { - max-width: 1024px; -} - -.max-w-screen-md { - max-width: 768px; -} - -.max-w-screen-xl { - max-width: 1280px; -} - -.max-w-xl { - max-width: 36rem; -} - -.flex-1 { - flex: 1 1 0%; -} - -.flex-initial { - flex: 0 1 auto; -} - -.flex-none { - flex: none; -} - -.flex-grow { - flex-grow: 1; -} - -.basis-1\/3 { - flex-basis: 33.333333%; -} - -.basis-2\/3 { - flex-basis: 66.666667%; -} - -.table-auto { - table-layout: auto; -} - -.border-separate { - border-collapse: separate; -} - -.border-spacing-2 { - --tw-border-spacing-x: 0.5rem; - --tw-border-spacing-y: 0.5rem; - border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); -} - -.-translate-x-1\/2 { - --tw-translate-x: -50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.-translate-y-8 { - --tw-translate-y: -2rem; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.translate-y-6 { - --tw-translate-y: 1.5rem; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.translate-y-8 { - --tw-translate-y: 2rem; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.rotate-180 { - --tw-rotate: 180deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.cursor-pointer { - cursor: pointer; -} - -.resize { - resize: both; -} - -.list-inside { - list-style-position: inside; -} - -.list-none { - list-style-type: none; -} - -.appearance-none { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.grid-flow-row-dense { - grid-auto-flow: row dense; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.flex-row { - flex-direction: row; -} - -.flex-col { - flex-direction: column; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.content-start { - align-content: flex-start; -} - -.items-start { - align-items: flex-start; -} - -.items-center { - align-items: center; -} - -.items-stretch { - align-items: stretch; -} - -.justify-start { - justify-content: flex-start; -} - -.justify-end { - justify-content: flex-end; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.justify-around { - justify-content: space-around; -} - -.gap-1 { - gap: 0.25rem; -} - -.gap-16 { - gap: 4rem; -} - -.gap-2 { - gap: 0.5rem; -} - -.gap-4 { - gap: 1rem; -} - -.gap-6 { - gap: 1.5rem; -} - -.gap-8 { - gap: 2rem; -} - -.gap-x-12 { - -moz-column-gap: 3rem; - column-gap: 3rem; -} - -.gap-x-2 { - -moz-column-gap: 0.5rem; - column-gap: 0.5rem; -} - -.gap-x-4 { - -moz-column-gap: 1rem; - column-gap: 1rem; -} - -.gap-y-16 { - row-gap: 4rem; -} - -.space-x-3 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.75rem * var(--tw-space-x-reverse)); - margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-y-3 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); -} - -.space-y-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); -} - -.divide-blue-300 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(144 205 244 / var(--tw-divide-opacity)); -} - -.divide-blue-400 > :not([hidden]) ~ :not([hidden]) { - --tw-divide-opacity: 1; - border-color: rgb(99 179 237 / var(--tw-divide-opacity)); -} - -.place-self-center { - place-self: center; -} - -.self-end { - align-self: flex-end; -} - -.self-center { - align-self: center; -} - -.overflow-auto { - overflow: auto; -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-visible { - overflow: visible; -} - -.overflow-x-auto { - overflow-x: auto; -} - -.overflow-x-hidden { - overflow-x: hidden; -} - -.overflow-y-hidden { - overflow-y: hidden; -} - -.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.whitespace-pre-wrap { - white-space: pre-wrap; -} - -.break-words { - overflow-wrap: break-word; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-md { - border-radius: 0.375rem; -} - -.rounded-xl { - border-radius: 0.75rem; -} - -.rounded-b { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.rounded-b-lg { - border-bottom-right-radius: 0.5rem; - border-bottom-left-radius: 0.5rem; -} - -.rounded-t-lg { - border-top-left-radius: 0.5rem; - border-top-right-radius: 0.5rem; -} - -.border { - border-width: 1px; -} - -.border-0 { - border-width: 0px; -} - -.border-2 { - border-width: 2px; -} - -.border-4 { - border-width: 4px; -} - -.border-8 { - border-width: 8px; -} - -.border-b { - border-bottom-width: 1px; -} - -.border-b-2 { - border-bottom-width: 2px; -} - -.border-b-4 { - border-bottom-width: 4px; -} - -.border-b-8 { - border-bottom-width: 8px; -} - -.border-l { - border-left-width: 1px; -} - -.border-r { - border-right-width: 1px; -} - -.border-t { - border-top-width: 1px; -} - -.border-t-2 { - border-top-width: 2px; -} - -.border-t-4 { - border-top-width: 4px; -} - -.border-solid { - border-style: solid; -} - -.border-dashed { - border-style: dashed; -} - -.border-black { - --tw-border-opacity: 1; - border-color: rgb(0 0 0 / var(--tw-border-opacity)); -} - -.border-blue-300 { - --tw-border-opacity: 1; - border-color: rgb(144 205 244 / var(--tw-border-opacity)); -} - -.border-blue-400 { - --tw-border-opacity: 1; - border-color: rgb(99 179 237 / var(--tw-border-opacity)); -} - -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(66 153 225 / var(--tw-border-opacity)); -} - -.border-blue-600 { - --tw-border-opacity: 1; - border-color: rgb(49 130 206 / var(--tw-border-opacity)); -} - -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(237 242 247 / var(--tw-border-opacity)); -} - -.border-gray-400 { - --tw-border-opacity: 1; - border-color: rgb(203 213 224 / var(--tw-border-opacity)); -} - -.border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(160 174 192 / var(--tw-border-opacity)); -} - -.border-gray-600 { - --tw-border-opacity: 1; - border-color: rgb(113 128 150 / var(--tw-border-opacity)); -} - -.border-green-400 { - --tw-border-opacity: 1; - border-color: rgb(104 211 145 / var(--tw-border-opacity)); -} - -.border-green-500 { - --tw-border-opacity: 1; - border-color: rgb(72 187 120 / var(--tw-border-opacity)); -} - -.border-green-600 { - --tw-border-opacity: 1; - border-color: rgb(56 161 105 / var(--tw-border-opacity)); -} - -.border-orange-400 { - --tw-border-opacity: 1; - border-color: rgb(246 173 85 / var(--tw-border-opacity)); -} - -.border-orange-600 { - --tw-border-opacity: 1; - border-color: rgb(221 107 32 / var(--tw-border-opacity)); -} - -.border-pink-600 { - --tw-border-opacity: 1; - border-color: rgb(213 63 140 / var(--tw-border-opacity)); -} - -.border-purple-600 { - --tw-border-opacity: 1; - border-color: rgb(128 90 213 / var(--tw-border-opacity)); -} - -.border-red-400 { - --tw-border-opacity: 1; - border-color: rgb(252 129 129 / var(--tw-border-opacity)); -} - -.border-red-500 { - --tw-border-opacity: 1; - border-color: rgb(245 101 101 / var(--tw-border-opacity)); -} - -.border-red-600 { - --tw-border-opacity: 1; - border-color: rgb(229 62 62 / var(--tw-border-opacity)); -} - -.border-teal-500 { - --tw-border-opacity: 1; - border-color: rgb(56 178 172 / var(--tw-border-opacity)); -} - -.border-transparent { - border-color: transparent; -} - -.border-white { - --tw-border-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-border-opacity)); -} - -.border-yellow-400 { - --tw-border-opacity: 1; - border-color: rgb(246 224 94 / var(--tw-border-opacity)); -} - -.border-yellow-500 { - --tw-border-opacity: 1; - border-color: rgb(236 201 75 / var(--tw-border-opacity)); -} - -.border-yellow-600 { - --tw-border-opacity: 1; - border-color: rgb(214 158 46 / var(--tw-border-opacity)); -} - -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity)); -} - -.bg-blue-100 { - --tw-bg-opacity: 1; - background-color: rgb(235 248 255 / var(--tw-bg-opacity)); -} - -.bg-blue-200 { - --tw-bg-opacity: 1; - background-color: rgb(190 227 248 / var(--tw-bg-opacity)); -} - -.bg-blue-300 { - --tw-bg-opacity: 1; - background-color: rgb(144 205 244 / var(--tw-bg-opacity)); -} - -.bg-blue-400 { - --tw-bg-opacity: 1; - background-color: rgb(99 179 237 / var(--tw-bg-opacity)); -} - -.bg-blue-500 { - --tw-bg-opacity: 1; - background-color: rgb(66 153 225 / var(--tw-bg-opacity)); -} - -.bg-blue-600 { - --tw-bg-opacity: 1; - background-color: rgb(49 130 206 / var(--tw-bg-opacity)); -} - -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(247 250 252 / var(--tw-bg-opacity)); -} - -.bg-gray-200 { - --tw-bg-opacity: 1; - background-color: rgb(237 242 247 / var(--tw-bg-opacity)); -} - -.bg-gray-400 { - --tw-bg-opacity: 1; - background-color: rgb(203 213 224 / var(--tw-bg-opacity)); -} - -.bg-gray-500 { - --tw-bg-opacity: 1; - background-color: rgb(160 174 192 / var(--tw-bg-opacity)); -} - -.bg-gray-800 { - --tw-bg-opacity: 1; - background-color: rgb(45 55 72 / var(--tw-bg-opacity)); -} - -.bg-gray-900 { - --tw-bg-opacity: 1; - background-color: rgb(26 32 44 / var(--tw-bg-opacity)); -} - -.bg-green-100 { - --tw-bg-opacity: 1; - background-color: rgb(240 255 244 / var(--tw-bg-opacity)); -} - -.bg-green-200 { - --tw-bg-opacity: 1; - background-color: rgb(198 246 213 / var(--tw-bg-opacity)); -} - -.bg-green-300 { - --tw-bg-opacity: 1; - background-color: rgb(154 230 180 / var(--tw-bg-opacity)); -} - -.bg-green-500 { - --tw-bg-opacity: 1; - background-color: rgb(72 187 120 / var(--tw-bg-opacity)); -} - -.bg-green-600 { - --tw-bg-opacity: 1; - background-color: rgb(56 161 105 / var(--tw-bg-opacity)); -} - -.bg-indigo-500 { - --tw-bg-opacity: 1; - background-color: rgb(102 126 234 / var(--tw-bg-opacity)); -} - -.bg-orange-300 { - --tw-bg-opacity: 1; - background-color: rgb(251 211 141 / var(--tw-bg-opacity)); -} - -.bg-pink-300 { - --tw-bg-opacity: 1; - background-color: rgb(251 182 206 / var(--tw-bg-opacity)); -} - -.bg-pink-500 { - --tw-bg-opacity: 1; - background-color: rgb(237 100 166 / var(--tw-bg-opacity)); -} - -.bg-pink-800 { - --tw-bg-opacity: 1; - background-color: rgb(151 38 109 / var(--tw-bg-opacity)); -} - -.bg-purple-300 { - --tw-bg-opacity: 1; - background-color: rgb(214 188 250 / var(--tw-bg-opacity)); -} - -.bg-red-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 245 245 / var(--tw-bg-opacity)); -} - -.bg-red-200\/50 { - background-color: rgb(254 215 215 / 0.5); -} - -.bg-red-500 { - --tw-bg-opacity: 1; - background-color: rgb(245 101 101 / var(--tw-bg-opacity)); -} - -.bg-transparent { - background-color: transparent; -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.bg-yellow-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 255 240 / var(--tw-bg-opacity)); -} - -.bg-yellow-200 { - --tw-bg-opacity: 1; - background-color: rgb(254 252 191 / var(--tw-bg-opacity)); -} - -.bg-yellow-300 { - --tw-bg-opacity: 1; - background-color: rgb(250 240 137 / var(--tw-bg-opacity)); -} - -.bg-yellow-400 { - --tw-bg-opacity: 1; - background-color: rgb(246 224 94 / var(--tw-bg-opacity)); -} - -.bg-yellow-500 { - --tw-bg-opacity: 1; - background-color: rgb(236 201 75 / var(--tw-bg-opacity)); -} - -.fill-blue-800 { - fill: #2c5282; -} - -.fill-current { - fill: currentColor; -} - -.fill-green-800 { - fill: #276749; -} - -.fill-orange-800 { - fill: #9c4221; -} - -.fill-pink-800 { - fill: #97266d; -} - -.fill-purple-800 { - fill: #553c9a; -} - -.fill-yellow-800 { - fill: #975a16; -} - -.p-0 { - padding: 0px; -} - -.p-1 { - padding: 0.25rem; -} - -.p-12 { - padding: 3rem; -} - -.p-2 { - padding: 0.5rem; -} - -.p-4 { - padding: 1rem; -} - -.p-5 { - padding: 1.25rem; -} - -.p-6 { - padding: 1.5rem; -} - -.p-8 { - padding: 2rem; -} - -.px-0 { - padding-left: 0px; - padding-right: 0px; -} - -.px-0\.5 { - padding-left: 0.125rem; - padding-right: 0.125rem; -} - -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.px-10 { - padding-left: 2.5rem; - padding-right: 2.5rem; -} - -.px-12 { - padding-left: 3rem; - padding-right: 3rem; -} - -.px-16 { - padding-left: 4rem; - padding-right: 4rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-2\.5 { - padding-left: 0.625rem; - padding-right: 0.625rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -.px-8 { - padding-left: 2rem; - padding-right: 2rem; -} - -.py-0 { - padding-top: 0px; - padding-bottom: 0px; -} - -.py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.py-12 { - padding-top: 3rem; - padding-bottom: 3rem; -} - -.py-16 { - padding-top: 4rem; - padding-bottom: 4rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-3 { - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.py-8 { - padding-top: 2rem; - padding-bottom: 2rem; -} - -.pb-0 { - padding-bottom: 0px; -} - -.pb-1 { - padding-bottom: 0.25rem; -} - -.pb-2 { - padding-bottom: 0.5rem; -} - -.pb-4 { - padding-bottom: 1rem; -} - -.pb-6 { - padding-bottom: 1.5rem; -} - -.pl-0 { - padding-left: 0px; -} - -.pl-2 { - padding-left: 0.5rem; -} - -.pl-4 { - padding-left: 1rem; -} - -.pr-2 { - padding-right: 0.5rem; -} - -.pr-8 { - padding-right: 2rem; -} - -.pt-0 { - padding-top: 0px; -} - -.pt-0\.5 { - padding-top: 0.125rem; -} - -.pt-1 { - padding-top: 0.25rem; -} - -.pt-10 { - padding-top: 2.5rem; -} - -.pt-2 { - padding-top: 0.5rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.pt-8 { - padding-top: 2rem; -} - -.text-left { - text-align: left; -} - -.text-center { - text-align: center; -} - -.align-middle { - vertical-align: middle; -} - -.font-sans { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -} - -.font-serif { - font-family: Georgia, Cambria, "Times New Roman", Times, serif; -} - -.text-2xl { - font-size: 1.5rem; -} - -.text-3xl { - font-size: 1.875rem; -} - -.text-4xl { - font-size: 2.25rem; -} - -.text-5xl { - font-size: 3rem; -} - -.text-6xl { - font-size: 4rem; -} - -.text-base { - font-size: 1rem; -} - -.text-lg { - font-size: 1.125rem; -} - -.text-sm { - font-size: 0.875rem; -} - -.text-xl { - font-size: 1.25rem; -} - -.text-xs { - font-size: 0.75rem; -} - -.font-bold { - font-weight: 700; -} - -.font-extralight { - font-weight: 200; -} - -.font-light { - font-weight: 300; -} - -.font-medium { - font-weight: 500; -} - -.font-normal { - font-weight: 400; -} - -.font-semibold { - font-weight: 600; -} - -.italic { - font-style: italic; -} - -.leading-6 { - line-height: 1.5rem; -} - -.tracking-wide { - letter-spacing: 0.025em; -} - -.text-black { - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); -} - -.text-blue-500 { - --tw-text-opacity: 1; - color: rgb(66 153 225 / var(--tw-text-opacity)); -} - -.text-blue-600 { - --tw-text-opacity: 1; - color: rgb(49 130 206 / var(--tw-text-opacity)); -} - -.text-blue-800 { - --tw-text-opacity: 1; - color: rgb(44 82 130 / var(--tw-text-opacity)); -} - -.text-blue-900 { - --tw-text-opacity: 1; - color: rgb(42 67 101 / var(--tw-text-opacity)); -} - -.text-gray-100 { - --tw-text-opacity: 1; - color: rgb(247 250 252 / var(--tw-text-opacity)); -} - -.text-gray-400 { - --tw-text-opacity: 1; - color: rgb(203 213 224 / var(--tw-text-opacity)); -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(160 174 192 / var(--tw-text-opacity)); -} - -.text-gray-600 { - --tw-text-opacity: 1; - color: rgb(113 128 150 / var(--tw-text-opacity)); -} - -.text-gray-700 { - --tw-text-opacity: 1; - color: rgb(74 85 104 / var(--tw-text-opacity)); -} - -.text-gray-800 { - --tw-text-opacity: 1; - color: rgb(45 55 72 / var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(26 32 44 / var(--tw-text-opacity)); -} - -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(72 187 120 / var(--tw-text-opacity)); -} - -.text-green-600 { - --tw-text-opacity: 1; - color: rgb(56 161 105 / var(--tw-text-opacity)); -} - -.text-green-700 { - --tw-text-opacity: 1; - color: rgb(47 133 90 / var(--tw-text-opacity)); -} - -.text-green-900 { - --tw-text-opacity: 1; - color: rgb(34 84 61 / var(--tw-text-opacity)); -} - -.text-orange-600 { - --tw-text-opacity: 1; - color: rgb(221 107 32 / var(--tw-text-opacity)); -} - -.text-pink-500 { - --tw-text-opacity: 1; - color: rgb(237 100 166 / var(--tw-text-opacity)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgb(245 101 101 / var(--tw-text-opacity)); -} - -.text-red-600 { - --tw-text-opacity: 1; - color: rgb(229 62 62 / var(--tw-text-opacity)); -} - -.text-red-700 { - --tw-text-opacity: 1; - color: rgb(197 48 48 / var(--tw-text-opacity)); -} - -.text-red-900 { - --tw-text-opacity: 1; - color: rgb(116 42 42 / var(--tw-text-opacity)); -} - -.text-sky-600 { - --tw-text-opacity: 1; - color: rgb(2 132 199 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.text-yellow-400 { - --tw-text-opacity: 1; - color: rgb(246 224 94 / var(--tw-text-opacity)); -} - -.text-yellow-500 { - --tw-text-opacity: 1; - color: rgb(236 201 75 / var(--tw-text-opacity)); -} - -.text-yellow-600 { - --tw-text-opacity: 1; - color: rgb(214 158 46 / var(--tw-text-opacity)); -} - -.text-yellow-900 { - --tw-text-opacity: 1; - color: rgb(116 66 16 / var(--tw-text-opacity)); -} - -.underline { - text-decoration-line: underline; -} - -.no-underline { - text-decoration-line: none; -} - -.underline-offset-2 { - text-underline-offset: 2px; -} - -.opacity-0 { - opacity: 0; -} - -.opacity-100 { - opacity: 1; -} - -.opacity-50 { - opacity: 0.5; -} - -.opacity-75 { - opacity: 0.75; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-2xl { - --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); - --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-inner { - --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-md { - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-xl { - --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.outline-0 { - outline-width: 0px; -} - -.blur { - --tw-blur: blur(8px); - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.drop-shadow-lg { - --tw-drop-shadow: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) drop-shadow(0 4px 3px rgb(0 0 0 / 0.1)); - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition { - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.transition-opacity { - transition-property: opacity; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.duration-300 { - transition-duration: 300ms; -} - -.btn { - font-weight: 400; - line-height: 1.5rem; - letter-spacing: 0.025em; - font-family: 'Balsamiq Sans', sans-serif; - border-radius: 0.25rem; - border-width: 1px; - border-bottom-width: 4px; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.25rem; - display: inline-block; - --tw-border-opacity: 1; - border-color: rgb(43 108 176 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(66 153 225 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -.btn:hover { - --tw-border-opacity: 1; - border-color: rgb(66 153 225 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(99 179 237 / var(--tw-bg-opacity)); -} - -.btn:hover:active { - --tw-border-opacity: 1; - border-color: rgb(43 108 176 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(43 108 176 / var(--tw-bg-opacity)); -} - -.menubar-item { - display: block; - cursor: pointer; - border-bottom-width: 4px; - letter-spacing: 0.025em; - /* Colors */ - --tw-border-opacity: 1; - border-color: rgb(247 250 252 / var(--tw-border-opacity)); -} - -.menubar-item:hover { - /* Colors */ - --tw-border-opacity: 1; - border-color: rgb(247 250 252 / var(--tw-border-opacity)); -} - -.menubar-item.active { - /* Colors */ - --tw-border-opacity: 1 !important; - border-color: rgb(49 130 206 / var(--tw-border-opacity)) !important; -} - -.menubar-text { - align-items: center; - padding: 0.25rem; - font-size: 1rem; - text-decoration-line: none; - font-family: 'Balsamiq Sans', sans-serif; -} - -@media (min-width: 1024px) { - .menubar-text { - font-size: 1.25rem; - } -} - -.menubar-text { - /* Colors */ - --tw-text-opacity: 1; - color: rgb(49 130 206 / var(--tw-text-opacity)); -} - -#output, #quiz_question_output_container { - font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; -} - -.dropdown-menu { - position: absolute; - display: block; - width: -moz-max-content; - width: max-content; - overflow: hidden; - border-radius: 0.375rem; - padding: 1rem; - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -:is([dir="ltr"] .dropdown-menu) { - right: 0px; - margin-right: 0.25rem; -} - -:is([dir="rtl"] .dropdown-menu) { - left: 0px; - margin-left: 0.25rem; -} - -.dropdown-menu { - top: 40px; - cursor: auto; - /* Undo cursor-pointer we inherit from the menu */ -} - -.dropdown-blue { - border-width: 2px; - --tw-border-opacity: 1; - border-color: rgb(66 153 225 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(247 250 252 / var(--tw-bg-opacity)); -} - -.dropdown-green { - border-width: 2px; - --tw-border-opacity: 1; - border-color: rgb(72 187 120 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(247 250 252 / var(--tw-bg-opacity)); -} - -.dropdown-menu h2 { - margin-left: 1rem; - margin-right: 1rem; - margin-bottom: 0.5rem; - padding-bottom: 0.5rem; - text-align: center; - font-weight: 500; -} - -.dropdown-green h2 { - --tw-text-opacity: 1; - color: rgb(56 161 105 / var(--tw-text-opacity)); -} - -.dropdown-item { - display: block; - white-space: nowrap; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - --tw-text-opacity: 1; - color: rgb(45 55 72 / var(--tw-text-opacity)); - text-decoration-line: none; -} - -.dropdown-item:hover { - --tw-bg-opacity: 1; - background-color: rgb(49 130 206 / var(--tw-bg-opacity)); -} - -.dropdown-item { - width: 13rem; - cursor: pointer; - border-radius: 0.375rem; - font-weight: 500; - flex-grow: 0; -} - -.dropdown-item:hover { - --tw-bg-opacity: 1; - background-color: rgb(49 130 206 / var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.text-shadow { - text-shadow: 0 2px 4px rgba(0,0,0,0.10); -} - -.text-shadow-md { - text-shadow: 0 4px 8px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.08); -} - -.text-shadow-lg { - text-shadow: 0 15px 30px rgba(0,0,0,0.11), 0 5px 15px rgba(0,0,0,0.08); -} - -.text-shadow-none { - text-shadow: none; -} - -/* Lists */ - -ul { - list-style: disc outside none; -} - -ol { - list-style: decimal outside none; -} - -.text-display-copy ul, .text-display-copy ol, -.text-business-copy ul, .text-business-copy ol { - margin-left: 2.5rem; -} - -.text-adventure-copy ul, .text-adventure-copy ol { - margin-left: 2rem; -} - -.text-display-copy ul li + li, .text-display-copy ol li + li, -.text-business-copy ul li + li, .text-business-copy ol li + li { - margin-top: 0.5rem; -} - -.text-adventure-copy ul li + li, .text-adventure-copy ol li + li { - margin-top: 0.25rem; -} - -/* AUTH */ - -input:disabled { - --tw-bg-opacity: 1; - background-color: rgb(203 213 224 / var(--tw-bg-opacity)); -} - -input[type=checkbox], input[type=radio] { - height: 1.25rem; - width: 1.25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-width: 1px; - --tw-border-opacity: 1; - border-color: rgb(74 85 104 / var(--tw-border-opacity)); -} - -input[type=radio] { - border-radius: 9999px; -} - -#signup input:required, #signup select:required, #profile input:required, #change_password input:required { - border-width: 1px; - --tw-border-opacity: 1; - border-color: rgb(252 129 129 / var(--tw-border-opacity)); -} - -/* Make this !important to it over-writes the red required border when valid */ - -input:required:valid, select:required:valid { - --tw-border-opacity: 1 !important; - border-color: rgb(104 211 145 / var(--tw-border-opacity)) !important; -} - -input[type=checkbox]:checked, input[type=radio]:checked { - --tw-border-opacity: 1; - border-color: rgb(56 161 105 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(104 211 145 / var(--tw-bg-opacity)); -} - -input, select { - border-width: 1px; - --tw-border-opacity: 1; - border-color: rgb(203 213 224 / var(--tw-border-opacity)); -} - -table.users thead { - font-weight: bold; -} - -table.users td { - padding: 10px; - border: solid 1px gray; -} - -/* Keep the class name the same to prevent complex restructuring -> the RTL version is actually left-hand-shadow */ - -/* https://stackoverflow.com/questions/17572619/how-to-create-a-inset-box-shadow-only-on-one-side */ - -body[dir='ltr'] .right-hand-shadow { - box-shadow: inset -7px 0 9px -7px rgba(0,0,0,0.4); -} - -body[dir='rtl'] .right-hand-shadow { - box-shadow: inset 7px 0 9px -7px rgba(0,0,0,0.4); -} - -.tab { - margin-top: 0.5rem; - cursor: pointer; - border-top-left-radius: 0.5rem; - border-top-right-radius: 0.5rem; - border-top-width: 8px; - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(247 250 252 / var(--tw-bg-opacity)); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 0.25rem; - padding-right: 0.25rem; - font-size: 0.875rem; - box-shadow: - /* bottom */ inset 0px -4px 4px -1px rgba(0,0,0,0.1); -} - -.teacher_tab { - --tw-border-opacity: 1; - border-color: rgb(154 230 180 / var(--tw-border-opacity)); -} - -.special_tab { - --tw-border-opacity: 1; - border-color: rgb(144 205 244 / var(--tw-border-opacity)); -} - -.command_tab { - --tw-border-opacity: 1; - border-color: rgb(253 178 197 / var(--tw-border-opacity)); -} - -.active-bluebar-btn { - --tw-bg-opacity: 1; - background-color: rgb(144 205 244 / var(--tw-bg-opacity)); - box-shadow: inset 0 2px 4px 0 rgb(0 0 10 / 0.3); -} - -/* TB: We shouldn't ever do this, all this dynamic handling can already be fixed with Tailwind! */ - -@media (min-width: 1024px) { - .tab { - padding-left: 0.5rem; - padding-right: 0.5rem; - } -} - -@media (min-width: 1280px) { - .tab { - padding-left: 1rem; - padding-right: 1rem; - } -} - -.tab + .tab { - box-shadow: - /* bottom */ inset 0px -4px 4px -1px rgba(0,0,0,0.1), - /* left */ inset 4px 0px 4px -1px rgba(0,0,0,0.1); -} - -.tab-selected { - margin-top: 0px; - border-top-left-radius: 0.5rem; - border-top-right-radius: 0.5rem; - border-top-width: 8px; - border-right-width: 1px; - border-left-width: 1px; - --tw-border-opacity: 1; - border-color: rgb(237 100 166 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - padding-top: 0.5rem; - font-weight: 400; - --tw-text-opacity: 1; - color: rgb(0 0 0 / var(--tw-text-opacity)); - box-shadow: none !important; -} - -/* EDITOR WARNINGS & ERRORS */ - -div#errorbox, div#warningbox { - position: relative; -} - -:is([dir="ltr"] p.close-dialog) { - right: 5px; -} - -:is([dir="rtl"] p.close-dialog) { - left: 5px; -} - -p.close-dialog { - font-weight: bold; - position: absolute; - top: 5px; - cursor: pointer; -} - -.editor-error { - position: absolute; - border-bottom-width: 2px; - border-top-width: 2px; - --tw-border-opacity: 1; - border-color: rgb(245 101 101 / var(--tw-border-opacity)); - background-color: rgb(66 153 225 / 0.7); - z-index: 10; - /* Show higher than the active line (which has z-index 2) */ -} - -/** - * Will be used to strikethrough a line without actual text, so we need to fake it - * with a horizontal line that's a bit offset from the top. - */ - -.disabled-line { - position: absolute; - border-top: solid 1px white; - margin-top: 0.6em; - border-radius: 0px !important; -} - -/** - * Will be used to indicate current line in debugger - */ - -.debugger-current-line { - position: absolute; - background: #2D6099; - z-index: 20; -} - -/* DOCS */ - -.expandable-docs-text h1 { - margin-top: 30px; - margin-bottom: 30px; -} - -/* QUIZ */ - -#quiz-iframe { - height: 72rem; - -moz-transform-origin: 0 0; - -o-transform-origin: 0 0; - -webkit-transform-origin: 0 0; -} - -/* Stats */ - -.stats-period-toggle.active { - color: black; - text-decoration: none; - cursor: default; - font-weight: normal; -} - -.stats-legend { - list-style-type: none; -} - -.stats-legend-item { - display: inline; - padding-right: 15px; - cursor: default; -} - -.stats-legend-color-box { - width: 45px; - height: 12px; - display:inline-block; - margin-right: 5px; -} - -/* Tab content - closed */ - -.accordion .accordion-tab input ~ .tab-content { - max-height: 0; - transition: max-height .35s; -} - -/* Accordion icon */ - -:is([dir="ltr"] .accordion .accordion-tab label)::before { - right: 0px; - float: right; -} - -:is([dir="rtl"] .accordion .accordion-tab label)::before { - left: 0px; - float: left; -} - -.accordion .accordion-tab label::before { - top: 0; - display: block; - width: 1.5em; - height: 1.5em; - line-height: 1.5; - font-size: 1.25rem; - font-weight: bolder; - text-align: center; - transition: all .35s; -} - -/* Tab content - open */ - -.accordion .accordion-tab input:checked ~ .tab-content { - max-height: 3000vh; -} - -/* Accordion icon formatting - closed */ - -:is([dir="ltr"] .accordion .accordion-tab input[type=checkbox] + label)::before { - right: 5px; -} - -:is([dir="rtl"] .accordion .accordion-tab input[type=checkbox] + label)::before { - left: 5px; -} - -.accordion .accordion-tab input[type=checkbox] + label::before { - content: ">"; - transform: rotate(90deg); -} - -/* Accordion icon formatting - open */ - -.accordion .accordion-tab input[type=checkbox]:checked + label::before { - transform: rotate(270deg); -} - -/* Programs */ - -.explore-program-box { - position: relative; - height: 18rem; - width: 16rem; - border-radius: 0.5rem; - border-width: 1px; - --tw-border-opacity: 1; - border-color: rgb(74 85 104 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(190 227 248 / var(--tw-bg-opacity)); -} - -.explore-program-box-title { - margin-top: -2rem; - width: 18rem; - padding-top: 2.5rem; - text-align: center; - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -:is([dir="ltr"] .explore-program-box-title) { - margin-left: -0.5rem; - --tw-rotate: 6deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - padding-left: 3rem; -} - -:is([dir="rtl"] .explore-program-box-title) { - margin-right: -0.5rem; - --tw-rotate: -6deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - padding-right: 3rem; -} - -/* Profile page */ - -.section-header { - cursor: pointer; - border-radius: 0.5rem; - --tw-bg-opacity: 1; - background-color: rgb(190 227 248 / var(--tw-bg-opacity)); - padding-left: 2rem; - padding-right: 2rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - font-size: 1.875rem; -} - -.profile-section-body-header { - margin-bottom: 1rem; - display: inline-block; - width: 100%; - border-bottom-width: 1px; - padding-bottom: 0.5rem; -} - -.profile-section-body { - margin-left: auto; - margin-right: auto; - display: none; - width: 100%; - border-radius: 0.25rem; - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - padding-left: 2rem; - padding-right: 2rem; - padding-top: 1rem; - padding-bottom: 1rem; - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -@media (min-width: 1024px) { - .profile-section-body { - width: 75%; - } -} - -.personal-input { - display: block; - width: 75%; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 0.5rem; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - --tw-text-opacity: 1; - color: rgb(74 85 104 / var(--tw-text-opacity)); -} - -@media (min-width: 1024px) { - .personal-input { - width: 50%; - } -} - -/* Signup page */ - -.signup-container { - margin-left: auto; - margin-right: auto; - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - padding-left: 2rem; - padding-right: 2rem; -} - -.signup-label { - display: inline-block; - width: 33.333333%; -} - -@media (min-width: 768px) { - .signup-label { - width: 12rem; - } -} - -.signup-input { - display: inline-block; - width: 66.666667%; - border-radius: 0.5rem; - --tw-border-opacity: 1; - border-color: rgb(203 213 224 / var(--tw-border-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -@media (min-width: 768px) { - .signup-input { - width: 20rem; - } -} - -@media (min-width: 1024px) { - .signup-input { - width: 24rem; - } -} - -/* Developers mode toggle */ - -:is([dir="ltr"] .toggle-circle) { - left: 0px; -} - -:is([dir="rtl"] .toggle-circle) { - right: 0px; -} - -.toggle-circle { - transition: all 0.2s ease-in-out; -} - -body[dir='ltr'] input:checked ~ .toggle-circle { - transform: translateX(100%); - --tw-bg-opacity: 1; - background-color: rgb(104 211 145 / var(--tw-bg-opacity)); -} - -body[dir='rtl'] input:checked ~ .toggle-circle { - transform: translateX(-100%); - --tw-bg-opacity: 1; - background-color: rgb(104 211 145 / var(--tw-bg-opacity)); -} - -/* For the keyword toggle we have to move 200% instead of 100%, implement as edge case */ - -body[dir='ltr'] #keyword_toggle_container input:checked ~ .toggle-circle { - /* transform: translateX(200%); */ -} - -body[dir='rtl'] #keyword_toggle_container input:checked ~ .toggle-circle { - /* transform: translateX(-200%); */ -} - -input:checked ~ .toggle-path { - --tw-bg-opacity: 1; - background-color: rgb(113 128 150 / var(--tw-bg-opacity)); -} - -.focused-option { - border-width: 8px; - border-style: double; -} - -.menubar-item.focused-option { - /* Colors */ - --tw-border-opacity: 1 !important; - border-color: rgb(49 130 206 / var(--tw-border-opacity)) !important; -} - -.stats-period-toggle.focused-option { - color: black; - text-decoration: none; - cursor: default; - font-weight: normal; -} - -.focused-option { - --tw-scale-x: 1.1; - --tw-scale-y: 1.1; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -/* Not really nice, but we have to use the !important attribute to overwrite the current style */ - -.incorrect-option { - background-color: rgba(234, 55, 55, 0.6) !important; - border: 5px #c21919 dashed!important; -} - -/* Also not really nice, but with the relic quiz code still an improvement */ - -.quiz-icons { - position: relative; - height: 3.5rem; - width: 3.5rem; - top: -40px; - left: -10px; -} - -.animate-keys { - position: absolute; - bottom: 0.25rem; - right: 0.5rem; - /* Would be nice to animate this with Tailwind as well, but should be fine for now */ - animation-name: animate-keys; - animation-duration: 1.5s; - animation-timing-function: ease-in-out; - -webkit-animation-timing-function: ease-in-out; -} - -/* We could also add this keyframe to tailwind.config.js, but as it is the only one: leave here for now */ - -@keyframes animate-keys { - 0% { - bottom:15px; - font-size: 1em; - opacity: 1 - } - - 100% { - bottom:100%; - font-size: 4em; - opacity: 0 - } -} - -.drop-adventures-hint { - --tw-border-opacity: 1; - border-color: rgb(144 205 244 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(235 248 255 / var(--tw-bg-opacity)); -} - -.drop-adventures-active { - --tw-border-opacity: 1; - border-color: rgb(250 240 137 / var(--tw-border-opacity)); - --tw-bg-opacity: 1; - background-color: rgb(255 255 240 / var(--tw-bg-opacity)); -} - -.adventures-tab { - width: auto; - flex-direction: row; - overflow-x: auto; - overflow-y: hidden; -} - -.adventures-tab[style*='display: block'] { - display: flex !important; -} - -.profile-nametag__stats { - display: flex; - width: 100%; - flex-direction: row; - align-items: stretch; - justify-content: center; - text-align: center; -} - -.switch { - position: relative; - display: inline-block; - width: 30px; - height: 17px; -} - -.switch input { - opacity: 0; - width: 0; - height: 0; -} - -.slider { - --tw-bg-opacity: 1; - background-color: rgb(203 213 224 / var(--tw-bg-opacity)); - position: absolute; - cursor: pointer; - top: 0; - left: 0; - right: 0; - bottom: 0; - transition: .4s; -} - -.slider:before { - position: absolute; - content: ""; - height: 13px; - width: 13px; - left: 2px; - bottom: 2px; - background-color: white; - transition: .4s; -} - -input:checked + .slider { - --tw-bg-opacity: 1; - background-color: rgb(72 187 120 / var(--tw-bg-opacity)); -} - -input:checked + .slider:before { - transform: translateX(13px); -} - -/* Rounded sliders */ - -.slider.round { - border-radius: 34px; -} - -.slider.round:before { - border-radius: 50%; -} - -input:disabled::-moz-placeholder { - --tw-text-opacity: 1; - color: rgb(74 85 104 / var(--tw-text-opacity)); -} - -input:disabled::placeholder { - --tw-text-opacity: 1; - color: rgb(74 85 104 / var(--tw-text-opacity)); -} - -.htmx-indicator.custom-indicator{ - opacity:0; - transition: opacity 0ms ease-in; -} - -.htmx-request .custom-indicator{ - opacity:1; -} - -.htmx-request.custom-indicator{ - opacity:1; -} - -div[class^="ace_incorrect_hedy_code"] { - border-bottom: 2px dashed red; - position: absolute; - cursor: pointer !important; - pointer-events: auto; -} - -.student_adventure_checkbox[disabled] { - position: relative !important; - border-radius: 0.25rem !important; - --tw-border-opacity: 1 !important; - border-color: rgb(160 174 192 / var(--tw-border-opacity)) !important; - --tw-bg-opacity: 1 !important; - background-color: rgb(237 242 247 / var(--tw-bg-opacity)) !important; -} - -.student_adventure_checkbox { - position: relative !important; - border-radius: 0.25rem !important; - --tw-border-opacity: 1 !important; - border-color: rgb(160 174 192 / var(--tw-border-opacity)) !important; - --tw-bg-opacity: 1 !important; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)) !important; -} - -.student_adventure_checkbox:checked { - position: relative !important; - border-radius: 0.25rem !important; - --tw-border-opacity: 1 !important; - border-color: rgb(160 174 192 / var(--tw-border-opacity)) !important; - --tw-bg-opacity: 1 !important; - background-color: rgb(154 230 180 / var(--tw-bg-opacity)) !important; -} - -.hover\:rounded-full:hover { - border-radius: 9999px; -} - -.hover\:border-blue-300:hover { - --tw-border-opacity: 1; - border-color: rgb(144 205 244 / var(--tw-border-opacity)); -} - -.hover\:border-blue-600:hover { - --tw-border-opacity: 1; - border-color: rgb(49 130 206 / var(--tw-border-opacity)); -} - -.hover\:border-green-400:hover { - --tw-border-opacity: 1; - border-color: rgb(104 211 145 / var(--tw-border-opacity)); -} - -.hover\:bg-black\/75:hover { - background-color: rgb(0 0 0 / 0.75); -} - -.hover\:bg-blue-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(235 248 255 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(144 205 244 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(99 179 237 / var(--tw-bg-opacity)); -} - -.hover\:bg-blue-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(49 130 206 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(226 232 240 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(203 213 224 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-400\/50:hover { - background-color: rgb(203 213 224 / 0.5); -} - -.hover\:bg-green-300:hover { - --tw-bg-opacity: 1; - background-color: rgb(154 230 180 / var(--tw-bg-opacity)); -} - -.hover\:bg-green-400:hover { - --tw-bg-opacity: 1; - background-color: rgb(104 211 145 / var(--tw-bg-opacity)); -} - -.hover\:text-red-400:hover { - --tw-text-opacity: 1; - color: rgb(252 129 129 / var(--tw-text-opacity)); -} - -.hover\:text-white:hover { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.hover\:underline:hover { - text-decoration-line: underline; -} - -.hover\:opacity-100:hover { - opacity: 1; -} - -.focus\:bg-blue-100:focus { - --tw-bg-opacity: 1; - background-color: rgb(235 248 255 / var(--tw-bg-opacity)); -} - -.group:hover .group-hover\:opacity-100 { - opacity: 1; -} - -:is([dir="ltr"] .ltr\:-left-1) { - left: -0.25rem; -} - -:is([dir="ltr"] .ltr\:-left-2) { - left: -0.5rem; -} - -:is([dir="ltr"] .ltr\:-right-1) { - right: -0.25rem; -} - -:is([dir="ltr"] .ltr\:right-0) { - right: 0px; -} - -:is([dir="ltr"] .ltr\:clear-right) { - clear: right; -} - -:is([dir="ltr"] .ltr\:ml-0) { - margin-left: 0px; -} - -:is([dir="ltr"] .ltr\:ml-1) { - margin-left: 0.25rem; -} - -:is([dir="ltr"] .ltr\:ml-2) { - margin-left: 0.5rem; -} - -:is([dir="ltr"] .ltr\:ml-3) { - margin-left: 0.75rem; -} - -:is([dir="ltr"] .ltr\:ml-4) { - margin-left: 1rem; -} - -:is([dir="ltr"] .ltr\:ml-8) { - margin-left: 2rem; -} - -:is([dir="ltr"] .ltr\:ml-auto) { - margin-left: auto; -} - -:is([dir="ltr"] .ltr\:mr-1) { - margin-right: 0.25rem; -} - -:is([dir="ltr"] .ltr\:mr-2) { - margin-right: 0.5rem; -} - -:is([dir="ltr"] .ltr\:mr-24) { - margin-right: 6rem; -} - -:is([dir="ltr"] .ltr\:mr-3) { - margin-right: 0.75rem; -} - -:is([dir="ltr"] .ltr\:mr-4) { - margin-right: 1rem; -} - -:is([dir="ltr"] .ltr\:mr-5) { - margin-right: 1.25rem; -} - -:is([dir="ltr"] .ltr\:mr-auto) { - margin-right: auto; -} - -:is([dir="ltr"] .ltr\:hidden) { - display: none; -} - -:is([dir="ltr"] .ltr\:divide-x) > :not([hidden]) ~ :not([hidden]) { - --tw-divide-x-reverse: 0; - border-right-width: calc(1px * var(--tw-divide-x-reverse)); - border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); -} - -:is([dir="ltr"] .ltr\:pl-2) { - padding-left: 0.5rem; -} - -:is([dir="ltr"] .ltr\:pl-4) { - padding-left: 1rem; -} - -:is([dir="ltr"] .ltr\:pl-8) { - padding-left: 2rem; -} - -:is([dir="ltr"] .ltr\:pr-4) { - padding-right: 1rem; -} - -:is([dir="ltr"] .ltr\:pr-8) { - padding-right: 2rem; -} - -:is([dir="ltr"] .ltr\:text-left) { - text-align: left; -} - -:is([dir="ltr"] .ltr\:text-right) { - text-align: right; -} - -:is([dir="rtl"] .rtl\:-left-1) { - left: -0.25rem; -} - -:is([dir="rtl"] .rtl\:-right-1) { - right: -0.25rem; -} - -:is([dir="rtl"] .rtl\:-right-2) { - right: -0.5rem; -} - -:is([dir="rtl"] .rtl\:left-0) { - left: 0px; -} - -:is([dir="rtl"] .rtl\:left-2) { - left: 0.5rem; -} - -:is([dir="rtl"] .rtl\:clear-left) { - clear: left; -} - -:is([dir="rtl"] .rtl\:ml-1) { - margin-left: 0.25rem; -} - -:is([dir="rtl"] .rtl\:ml-2) { - margin-left: 0.5rem; -} - -:is([dir="rtl"] .rtl\:ml-24) { - margin-left: 6rem; -} - -:is([dir="rtl"] .rtl\:ml-3) { - margin-left: 0.75rem; -} - -:is([dir="rtl"] .rtl\:ml-4) { - margin-left: 1rem; -} - -:is([dir="rtl"] .rtl\:ml-5) { - margin-left: 1.25rem; -} - -:is([dir="rtl"] .rtl\:ml-auto) { - margin-left: auto; -} - -:is([dir="rtl"] .rtl\:mr-0) { - margin-right: 0px; -} - -:is([dir="rtl"] .rtl\:mr-1) { - margin-right: 0.25rem; -} - -:is([dir="rtl"] .rtl\:mr-2) { - margin-right: 0.5rem; -} - -:is([dir="rtl"] .rtl\:mr-3) { - margin-right: 0.75rem; -} - -:is([dir="rtl"] .rtl\:mr-4) { - margin-right: 1rem; -} - -:is([dir="rtl"] .rtl\:mr-8) { - margin-right: 2rem; -} - -:is([dir="rtl"] .rtl\:mr-auto) { - margin-right: auto; -} - -:is([dir="rtl"] .rtl\:hidden) { - display: none; -} - -:is([dir="rtl"] .rtl\:divide-x-reverse) > :not([hidden]) ~ :not([hidden]) { - --tw-divide-x-reverse: 1; -} - -:is([dir="rtl"] .rtl\:pl-4) { - padding-left: 1rem; -} - -:is([dir="rtl"] .rtl\:pl-8) { - padding-left: 2rem; -} - -:is([dir="rtl"] .rtl\:pr-2) { - padding-right: 0.5rem; -} - -:is([dir="rtl"] .rtl\:pr-4) { - padding-right: 1rem; -} - -:is([dir="rtl"] .rtl\:pr-8) { - padding-right: 2rem; -} - -:is([dir="rtl"] .rtl\:text-left) { - text-align: left; -} - -:is([dir="rtl"] .rtl\:text-right) { - text-align: right; -} - -@media (min-width: 640px) { - .sm\:block { - display: block; - } - - .sm\:inline { - display: inline; - } - - .sm\:w-5\/12 { - width: 41.666667%; - } -} - -@media (min-width: 768px) { - .md\:order-4 { - order: 4; - } - - .md\:mx-16 { - margin-left: 4rem; - margin-right: 4rem; - } - - .md\:block { - display: block; - } - - .md\:flex { - display: flex; - } - - .md\:hidden { - display: none; - } - - .md\:h-64 { - height: 16rem; - } - - .md\:w-2\/5 { - width: 40%; - } - - .md\:w-3\/12 { - width: 25%; - } - - .md\:w-3\/5 { - width: 60%; - } - - .md\:grid-flow-row-dense { - grid-auto-flow: row dense; - } - - .md\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .md\:flex-row { - flex-direction: row; - } - - .md\:items-center { - align-items: center; - } - - .md\:justify-center { - justify-content: center; - } - - .md\:gap-8 { - gap: 2rem; - } - - .md\:px-16 { - padding-left: 4rem; - padding-right: 4rem; - } - - .md\:px-4 { - padding-left: 1rem; - padding-right: 1rem; - } - - .md\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } - - .md\:py-16 { - padding-top: 4rem; - padding-bottom: 4rem; - } -} - -@media (min-width: 1024px) { - .lg\:mx-16 { - margin-left: 4rem; - margin-right: 4rem; - } - - .lg\:inline-block { - display: inline-block; - } - - .lg\:flex { - display: flex; - } - - .lg\:h-10 { - height: 2.5rem; - } - - .lg\:h-16 { - height: 4rem; - } - - .lg\:w-1\/12 { - width: 8.333333%; - } - - .lg\:w-1\/2 { - width: 50%; - } - - .lg\:w-12 { - width: 3rem; - } - - .lg\:w-3\/4 { - width: 75%; - } - - .lg\:flex-row { - flex-direction: row; - } - - .lg\:flex-nowrap { - flex-wrap: nowrap; - } - - .lg\:px-0 { - padding-left: 0px; - padding-right: 0px; - } - - .lg\:px-4 { - padding-left: 1rem; - padding-right: 1rem; - } - - .lg\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } -} - -@media (min-width: 1280px) { - .xl\:gap-x-6 { - -moz-column-gap: 1.5rem; - column-gap: 1.5rem; - } -} +*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#edf2f7}::after,::before{--tw-content:''}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#cbd5e0}input::placeholder,textarea::placeholder{opacity:1;color:#cbd5e0}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::after,::before{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(66 153 225 / 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }html{font-weight:300;overflow-x:hidden;margin-right:calc(-1 * (100vw - 100%))}.font-slab{font-family:'Balsamiq Sans',sans-serif}.dot{height:25px;width:25px;border-radius:50%;display:inline-block}h1{font-size:2.25rem;font-weight:200}h2{font-size:1.5rem;font-weight:700}h3{font-size:1.5rem;font-weight:700}h4{font-size:1rem;font-weight:700}*+ol,*+p,*+pre,*+ul{margin-top:1rem}a{font-weight:600;--tw-text-opacity:1;color:rgb(99 179 237 / var(--tw-text-opacity));text-decoration:underline}strong{font-weight:700}.tiny-btn{border-bottom-width:2px;padding-left:.5rem;padding-right:.5rem;padding-top:.25rem;font-size:.875rem}.common-page-container{margin-left:auto;margin-right:auto;width:100%;max-width:1536px;padding:2rem}.copy-container{margin-left:auto;margin-right:auto;max-width:1024px}.copy-container-wide{margin-left:auto;margin-right:auto;max-width:1280px}.text-business-copy,.text-display-copy{line-height:1.625}.text-display-copy h2{text-align:center;font-size:2.25rem;--tw-text-opacity:1;color:rgb(213 63 140 / var(--tw-text-opacity))}.text-display-copy h3{font-size:2.25rem;--tw-text-opacity:1;color:rgb(213 63 140 / var(--tw-text-opacity))}.text-display-copy .columns h3{font-size:1.5rem}.text-business-copy h3:first-child{margin-top:0}.text-business-copy *+h3{margin-top:2rem}.btn-shape{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block}.green-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(47 133 90 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(72 187 120 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.green-btn:disabled,.green-btn[disabled]{--tw-border-opacity:1;border-color:rgb(74 85 104 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(160 174 192 / var(--tw-bg-opacity))}.white-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(99 179 237 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(66 153 225 / var(--tw-text-opacity))}.stripe-colored{border-bottom-width:4px;--tw-border-opacity:1;border-color:rgb(236 201 75 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(246 224 94 / var(--tw-bg-opacity))}.stripe-white{border-bottom-width:4px}.stripe-colored a,.stripe-colored h2{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.stripe-colored .column-pane a{--tw-text-opacity:1;color:rgb(43 108 176 / var(--tw-text-opacity))}.stripe-colored .column-pane{border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));--tw-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1),0 2px 4px -2px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.heading-underline{margin-left:auto;margin-right:auto;margin-top:2rem;margin-bottom:2rem;height:.25rem;width:9rem;--tw-bg-opacity:1;background-color:rgb(213 63 140 / var(--tw-bg-opacity))}.stripe-colored .heading-underline{--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.text-links-plain a{color:inherit;text-decoration:none;font-weight:inherit}.tooltip{position:relative;display:inline-block}.tooltip .tooltiptext{visibility:hidden;position:absolute;align-items:center;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(229 62 62 / var(--tw-text-opacity));width:130;bottom:150%;left:50%;margin-left:-80px}.tooltip:hover .tooltiptext{visibility:visible}.tooltip .tooltiptext::after{position:absolute;content:" ";top:100%;left:50%;margin-left:-10px;border-width:10px;border-style:solid;border-color:#fff transparent transparent transparent}.green-btn:hover:enabled,a.green-btn:hover{--tw-border-opacity:1;border-color:rgb(72 187 120 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(104 211 145 / var(--tw-bg-opacity))}.green-btn:hover:enabled:active,a.green-btn:hover:active{--tw-border-opacity:1;border-color:rgb(47 133 90 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(47 133 90 / var(--tw-bg-opacity))}.red-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(197 48 48 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(245 101 101 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.red-btn:hover{--tw-border-opacity:1;border-color:rgb(245 101 101 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(252 129 129 / var(--tw-bg-opacity))}.red-btn:hover:active{--tw-border-opacity:1;border-color:rgb(197 48 48 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(197 48 48 / var(--tw-bg-opacity))}.yellow-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(183 121 31 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(236 201 75 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(0 0 0 / var(--tw-text-opacity))}.yellow-btn:hover{--tw-border-opacity:1;border-color:rgb(236 201 75 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(246 224 94 / var(--tw-bg-opacity))}.yellow-btn:hover:active{--tw-border-opacity:1;border-color:rgb(183 121 31 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(183 121 31 / var(--tw-bg-opacity))}.pink-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(237 100 166 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(246 135 179 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.pink-btn:hover{--tw-border-opacity:1;border-color:rgb(246 135 179 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(251 182 206 / var(--tw-bg-opacity))}.pink-btn:hover:active{--tw-border-opacity:1;border-color:rgb(237 100 166 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(184 50 128 / var(--tw-bg-opacity))}.blue-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(43 108 176 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(66 153 225 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.blue-btn:hover{--tw-border-opacity:1;border-color:rgb(66 153 225 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(99 179 237 / var(--tw-bg-opacity))}.blue-btn:hover:active{--tw-border-opacity:1;border-color:rgb(43 108 176 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(43 108 176 / var(--tw-bg-opacity))}.gray-btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;-webkit-text-decoration-line:none;text-decoration-line:none;display:inline-block;--tw-border-opacity:1;border-color:rgb(74 85 104 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(160 174 192 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.gray-btn:hover{--tw-border-opacity:1;border-color:rgb(160 174 192 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(203 213 224 / var(--tw-bg-opacity))}.gray-btn:hover:active{--tw-border-opacity:1;border-color:rgb(74 85 104 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(74 85 104 / var(--tw-bg-opacity))}.markdown{font-size:1.25rem;line-height:1.5;--tw-text-opacity:1;color:rgb(45 55 72 / var(--tw-text-opacity))}.markdown li+li,.markdown li>p+p{margin-top:.5rem;margin-bottom:.5rem}.markdown strong{font-weight:700}.markdown *+h1{margin-bottom:.5rem;margin-top:2.5rem;line-height:1.25}h2{font-weight:500;--tw-text-opacity:1;color:rgb(66 153 225 / var(--tw-text-opacity));font-family:'Balsamiq Sans',sans-serif;margin-bottom:.5rem;margin-top:2.5rem;font-size:1.5rem;line-height:1.25}h2:first-child{margin-top:0}h3{--tw-text-opacity:1;color:rgb(43 108 176 / var(--tw-text-opacity));font-family:'Balsamiq Sans',sans-serif;margin-top:1rem;margin-bottom:.25rem;font-size:1.25rem;line-height:1.25}h4{margin-top:1rem;margin-bottom:.5rem}.markdown code{padding-top:.25rem;padding-bottom:.25rem;padding-left:.25rem;padding-right:.25rem;font-size:1rem}pre code{margin-top:.5rem;margin-bottom:.5rem;display:block;border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(226 232 240 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(237 242 247 / var(--tw-bg-opacity));padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;padding-right:1rem;font-size:1rem;--tw-text-opacity:1;color:rgb(229 62 62 / var(--tw-text-opacity))}pre{white-space:pre-wrap}.ace-container{background-color:#272822;border-radius:.25rem;padding:.5rem}pre,pre code{font-size:100%;color:#fff}code{display:inline;border-radius:.25rem;padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;padding-right:.5rem;font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-weight:400;background:#272822!important;color:#ff6188;font-size:90%}.markdown blockquote{border-left-width:4px;--tw-border-opacity:1;border-color:rgb(226 232 240 / var(--tw-border-opacity));font-style:italic}[dir=ltr] .markdown blockquote{padding-left:1rem}[dir=rtl] .markdown blockquote{padding-right:1rem}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.-top-1{top:-.25rem}.top-0\.5{top:.125rem}.right-0\.5{right:.125rem}.top-0{top:0}.right-0{right:0}.top-2{top:.5rem}.right-2{right:.5rem}.left-0{left:0}.left-1\/2{left:50%}.top-16{top:4rem}.bottom-0{bottom:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-30{z-index:30}.z-40{z-index:40}.order-2{order:2}.order-1{order:1}.order-3{order:3}.order-5{order:5}.col-span-2{grid-column:span 2/span 2}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.float-right{float:right}.m-auto{margin:auto}.m-2{margin:.5rem}.m-4{margin:1rem}.m-1{margin:.25rem}.m-8{margin:2rem}.mx-0{margin-left:0;margin-right:0}.my-4{margin-top:1rem;margin-bottom:1rem}.my-0{margin-top:0;margin-bottom:0}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-16{margin-left:4rem;margin-right:4rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-auto{margin-top:auto;margin-bottom:auto}.my-8{margin-top:2rem;margin-bottom:2rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-4{margin-left:1rem}.mt-4{margin-top:1rem}.ml-auto{margin-left:auto}.ml-14{margin-left:3.5rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.mt-0{margin-top:0}.mb-2{margin-bottom:.5rem}.mb-8{margin-bottom:2rem}.mt-10{margin-top:2.5rem}.mb-0{margin-bottom:0}.mr-4{margin-right:1rem}.mt-3{margin-top:.75rem}.mt-8{margin-top:2rem}.mb-6{margin-bottom:1.5rem}.-mt-8{margin-top:-2rem}.mt-auto{margin-top:auto}.mt-1{margin-top:.25rem}.-ml-32{margin-left:-8rem}.mb-10{margin-bottom:2.5rem}.-mb-px{margin-bottom:-1px}.mr-1{margin-right:.25rem}.ml-1{margin-left:.25rem}.-mr-6{margin-right:-1.5rem}.mt-0\.5{margin-top:.125rem}.mr-5{margin-right:1.25rem}.ml-6{margin-left:1.5rem}.mt-5{margin-top:1.25rem}.ml-0{margin-left:0}.-mt-2{margin-top:-.5rem}.mt-24{margin-top:6rem}.mb-1{margin-bottom:.25rem}.mt-28{margin-top:7rem}.mr-8{margin-right:2rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[2\/3\]{aspect-ratio:2/3}.h-40{height:10rem}.h-full{height:100%}.h-16{height:4rem}.h-10{height:2.5rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-4{height:1rem}.h-96{height:24rem}.h-12{height:3rem}.h-32{height:8rem}.h-64{height:16rem}.h-min{height:-moz-min-content;height:min-content}.h-14{height:3.5rem}.h-80{height:20rem}.h-28{height:7rem}.h-screen{height:100vh}.h-auto{height:auto}.h-24{height:6rem}.h-2{height:.5rem}.max-h-56{max-height:14rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-h-\[3\.5rem\]{min-height:3.5rem}.w-40{width:10rem}.w-3\/4{width:75%}.w-full{width:100%}.w-6{width:1.5rem}.w-1\/2{width:50%}.w-8{width:2rem}.w-10{width:2.5rem}.w-64{width:16rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-1\/12{width:8.333333%}.w-auto{width:auto}.w-2\/3{width:66.666667%}.w-1\/3{width:33.333333%}.w-4\/5{width:80%}.w-12{width:3rem}.w-14{width:3.5rem}.w-4{width:1rem}.w-72{width:18rem}.w-max{width:-moz-max-content;width:max-content}.w-32{width:8rem}.w-24{width:6rem}.w-px{width:1px}.w-80{width:20rem}.w-10\/12{width:83.333333%}.w-2\/12{width:16.666667%}.w-min{width:-moz-min-content;width:min-content}.w-screen{width:100vw}.w-96{width:24rem}.w-2{width:.5rem}.w-56{width:14rem}.w-16{width:4rem}.min-w-\[100px\]{min-width:100px}.min-w-full{min-width:100%}.min-w-\[200px\]{min-width:200px}.min-w-min{min-width:-moz-min-content;min-width:min-content}.max-w-screen-xl{max-width:1280px}.max-w-screen-2xl{max-width:1536px}.max-w-lg{max-width:32rem}.max-w-screen-md{max-width:768px}.max-w-md{max-width:28rem}.max-w-3xl{max-width:48rem}.max-w-prose{max-width:65ch}.max-w-xl{max-width:36rem}.max-w-screen-lg{max-width:1024px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-initial{flex:0 1 auto}.flex-grow{flex-grow:1}.basis-2\/3{flex-basis:66.666667%}.basis-1\/3{flex-basis:33.333333%}.table-auto{table-layout:auto}.border-separate{border-collapse:separate}.translate-y-8{--tw-translate-y:2rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-6{--tw-translate-y:1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-8{--tw-translate-y:-2rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-flow-row-dense{grid-auto-flow:row dense}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-start{align-content:flex-start}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-4{gap:1rem}.gap-2{gap:.5rem}.gap-8{gap:2rem}.gap-16{gap:4rem}.gap-6{gap:1.5rem}.gap-1{gap:.25rem}.gap-x-2{-moz-column-gap:0.5rem;column-gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-y-16{row-gap:4rem}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(99 179 237 / var(--tw-divide-opacity))}.divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(144 205 244 / var(--tw-divide-opacity))}.place-self-center{place-self:center}.self-end{align-self:flex-end}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded-lg{border-radius:.5rem}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.border-2{border-width:2px}.border{border-width:1px}.border-0{border-width:0}.border-4{border-width:4px}.border-8{border-width:8px}.border-t-4{border-top-width:4px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-b-8{border-bottom-width:8px}.border-b-2{border-bottom-width:2px}.border-b-4{border-bottom-width:4px}.border-l{border-left-width:1px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-red-500{--tw-border-opacity:1;border-color:rgb(245 101 101 / var(--tw-border-opacity))}.border-orange-400{--tw-border-opacity:1;border-color:rgb(246 173 85 / var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(160 174 192 / var(--tw-border-opacity))}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0 / var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(237 242 247 / var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(203 213 224 / var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgb(236 201 75 / var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgb(72 187 120 / var(--tw-border-opacity))}.border-teal-500{--tw-border-opacity:1;border-color:rgb(56 178 172 / var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgb(104 211 145 / var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(49 130 206 / var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgb(154 230 180 / var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgb(66 153 225 / var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(99 179 237 / var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(144 205 244 / var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(56 161 105 / var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(246 224 94 / var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(113 128 150 / var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-yellow-600{--tw-border-opacity:1;border-color:rgb(214 158 46 / var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgb(128 90 213 / var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgb(213 63 140 / var(--tw-border-opacity))}.border-orange-600{--tw-border-opacity:1;border-color:rgb(221 107 32 / var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(229 62 62 / var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(252 129 129 / var(--tw-border-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgb(190 227 248 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(160 174 192 / var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(255 245 245 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(66 153 225 / var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(237 242 247 / var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(203 213 224 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgb(154 230 180 / var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(255 255 240 / var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(240 255 244 / var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(26 32 44 / var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(144 205 244 / var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-red-200\/50{background-color:rgb(254 215 215 / .5)}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(49 130 206 / var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(246 224 94 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(247 250 252 / var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(99 179 237 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(56 161 105 / var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgb(151 38 109 / var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(235 248 255 / var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(45 55 72 / var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(72 187 120 / var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(236 201 75 / var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(245 101 101 / var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(102 126 234 / var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgb(237 100 166 / var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(254 252 191 / var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgb(198 246 213 / var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(250 240 137 / var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgb(214 188 250 / var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgb(251 182 206 / var(--tw-bg-opacity))}.bg-orange-300{--tw-bg-opacity:1;background-color:rgb(251 211 141 / var(--tw-bg-opacity))}.fill-current{fill:currentColor}.fill-green-800{fill:#276749}.fill-yellow-800{fill:#975a16}.fill-blue-800{fill:#2c5282}.fill-purple-800{fill:#553c9a}.fill-pink-800{fill:#97266d}.fill-orange-800{fill:#9c4221}.p-2{padding:.5rem}.p-5{padding:1.25rem}.p-4{padding:1rem}.p-12{padding:3rem}.p-8{padding:2rem}.p-1{padding:.25rem}.p-6{padding:1.5rem}.p-0{padding:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-0{padding-left:0;padding-right:0}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-0{padding-top:0;padding-bottom:0}.px-3{padding-left:.75rem;padding-right:.75rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-16{padding-left:4rem;padding-right:4rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.px-12{padding-left:3rem;padding-right:3rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-10{padding-top:2.5rem}.pt-0\.5{padding-top:.125rem}.pb-0{padding-bottom:0}.pt-0{padding-top:0}.pt-4{padding-top:1rem}.pl-4{padding-left:1rem}.pb-1{padding-bottom:.25rem}.pt-1{padding-top:.25rem}.pl-2{padding-left:.5rem}.pr-2{padding-right:.5rem}.pt-2{padding-top:.5rem}.pb-4{padding-bottom:1rem}.pt-5{padding-top:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-2{padding-bottom:.5rem}.pl-0{padding-left:0}.pr-8{padding-right:2rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.text-sm{font-size:.875rem}.text-xl{font-size:1.25rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-6xl{font-size:4rem}.text-xs{font-size:.75rem}.text-5xl{font-size:3rem}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-normal{font-weight:400}.font-extralight{font-weight:200}.font-medium{font-weight:500}.font-light{font-weight:300}.italic{font-style:italic}.leading-6{line-height:1.5rem}.tracking-wide{letter-spacing:.025em}.text-white{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(49 130 206 / var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(116 42 42 / var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(245 101 101 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(74 85 104 / var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(72 187 120 / var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgb(116 66 16 / var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(236 201 75 / var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(34 84 61 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(45 55 72 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(113 128 150 / var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(47 133 90 / var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgb(237 100 166 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(160 174 192 / var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(66 153 225 / var(--tw-text-opacity))}.text-sky-600{--tw-text-opacity:1;color:rgb(2 132 199 / var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(44 82 130 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(26 32 44 / var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(247 250 252 / var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(246 224 94 / var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(221 107 32 / var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(203 213 224 / var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(42 67 101 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(229 62 62 / var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(56 161 105 / var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(214 158 46 / var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(197 48 48 / var(--tw-text-opacity))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.line-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.no-underline{-webkit-text-decoration-line:none;text-decoration-line:none}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-75{opacity:.75}.opacity-100{opacity:1}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1),0 4px 6px -4px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1),0 2px 4px -2px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgb(0 0 0 / 0.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1),0 1px 2px -1px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgb(0 0 0 / 0.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgb(0 0 0 / 0.1),0 8px 10px -6px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.outline-0{outline-width:0}.blur{--tw-blur:blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) drop-shadow(0 4px 3px rgb(0 0 0 / 0.1));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(0.4,0,0.2,1);transition-duration:150ms}.duration-300{transition-duration:.3s}.btn{font-weight:400;line-height:1.5rem;letter-spacing:.025em;font-family:'Balsamiq Sans',sans-serif;border-radius:.25rem;border-width:1px;border-bottom-width:4px;padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.25rem;display:inline-block;--tw-border-opacity:1;border-color:rgb(43 108 176 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(66 153 225 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity));-webkit-text-decoration-line:none;text-decoration-line:none}.btn:hover{--tw-border-opacity:1;border-color:rgb(66 153 225 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(99 179 237 / var(--tw-bg-opacity))}.btn:hover:active{--tw-border-opacity:1;border-color:rgb(43 108 176 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(43 108 176 / var(--tw-bg-opacity))}.menubar-item{display:block;cursor:pointer;border-bottom-width:4px;letter-spacing:.025em;--tw-border-opacity:1;border-color:rgb(247 250 252 / var(--tw-border-opacity))}.menubar-item:hover{--tw-border-opacity:1;border-color:rgb(247 250 252 / var(--tw-border-opacity))}.menubar-item.active{--tw-border-opacity:1!important;border-color:rgb(49 130 206 / var(--tw-border-opacity))!important}.menubar-text{align-items:center;padding:.25rem;font-size:1rem;-webkit-text-decoration-line:none;text-decoration-line:none;font-family:'Balsamiq Sans',sans-serif}@media (min-width:1024px){.menubar-text{font-size:1.25rem}}.menubar-text{--tw-text-opacity:1;color:rgb(49 130 206 / var(--tw-text-opacity))}#output,#quiz_question_output_container{font-family:Monaco,Menlo,'Ubuntu Mono',Consolas,source-code-pro,monospace}.dropdown-menu{position:absolute;display:block;width:-moz-max-content;width:max-content;overflow:hidden;border-radius:.375rem;padding:1rem;--tw-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1),0 4px 6px -4px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}[dir=ltr] .dropdown-menu{right:0;margin-right:.25rem}[dir=rtl] .dropdown-menu{left:0;margin-left:.25rem}.dropdown-menu{top:40px;cursor:auto}.dropdown-blue{border-width:2px;--tw-border-opacity:1;border-color:rgb(66 153 225 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(247 250 252 / var(--tw-bg-opacity))}.dropdown-green{border-width:2px;--tw-border-opacity:1;border-color:rgb(72 187 120 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(247 250 252 / var(--tw-bg-opacity))}.dropdown-menu h2{margin-left:1rem;margin-right:1rem;margin-bottom:.5rem;padding-bottom:.5rem;text-align:center;font-weight:500}.dropdown-green h2{--tw-text-opacity:1;color:rgb(56 161 105 / var(--tw-text-opacity))}.dropdown-item{display:block;white-space:nowrap;padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;padding-right:1rem;--tw-text-opacity:1;color:rgb(45 55 72 / var(--tw-text-opacity));-webkit-text-decoration-line:none;text-decoration-line:none}.dropdown-item:hover{--tw-bg-opacity:1;background-color:rgb(49 130 206 / var(--tw-bg-opacity))}.dropdown-item{width:13rem;cursor:pointer;border-radius:.375rem;font-weight:500;flex-grow:0}.dropdown-item:hover{--tw-bg-opacity:1;background-color:rgb(49 130 206 / var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-shadow{text-shadow:0 2px 4px rgba(0,0,0,.1)}.text-shadow-md{text-shadow:0 4px 8px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.08)}.text-shadow-lg{text-shadow:0 15px 30px rgba(0,0,0,.11),0 5px 15px rgba(0,0,0,.08)}.text-shadow-none{text-shadow:none}ul{list-style:disc outside none}ol{list-style:decimal outside none}.text-business-copy ol,.text-business-copy ul,.text-display-copy ol,.text-display-copy ul{margin-left:2.5rem}.text-adventure-copy ol,.text-adventure-copy ul{margin-left:2rem}.text-business-copy ol li+li,.text-business-copy ul li+li,.text-display-copy ol li+li,.text-display-copy ul li+li{margin-top:.5rem}.text-adventure-copy ol li+li,.text-adventure-copy ul li+li{margin-top:.25rem}input:disabled{--tw-bg-opacity:1;background-color:rgb(203 213 224 / var(--tw-bg-opacity))}input[type=checkbox],input[type=radio]{height:1.25rem;width:1.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-width:1px;--tw-border-opacity:1;border-color:rgb(74 85 104 / var(--tw-border-opacity))}input[type=radio]{border-radius:9999px}#change_password input:required,#profile input:required,#signup input:required,#signup select:required{border-width:1px;--tw-border-opacity:1;border-color:rgb(252 129 129 / var(--tw-border-opacity))}input:required:valid,select:required:valid{--tw-border-opacity:1!important;border-color:rgb(104 211 145 / var(--tw-border-opacity))!important}input[type=checkbox]:checked,input[type=radio]:checked{--tw-border-opacity:1;border-color:rgb(56 161 105 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(104 211 145 / var(--tw-bg-opacity))}input,select{border-width:1px;--tw-border-opacity:1;border-color:rgb(203 213 224 / var(--tw-border-opacity))}table.users thead{font-weight:700}table.users td{padding:10px;border:solid 1px gray}body[dir=ltr] .right-hand-shadow{box-shadow:inset -7px 0 9px -7px rgba(0,0,0,.4)}body[dir=rtl] .right-hand-shadow{box-shadow:inset 7px 0 9px -7px rgba(0,0,0,.4)}.tab{margin-top:.5rem;cursor:pointer;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-top-width:8px;--tw-border-opacity:1;border-color:rgb(226 232 240 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(247 250 252 / var(--tw-bg-opacity));padding-top:.5rem;padding-bottom:.5rem;padding-left:.25rem;padding-right:.25rem;font-size:.875rem;box-shadow:inset 0 -4px 4px -1px rgba(0,0,0,.1)}.teacher_tab{--tw-border-opacity:1;border-color:rgb(154 230 180 / var(--tw-border-opacity))}.special_tab{--tw-border-opacity:1;border-color:rgb(144 205 244 / var(--tw-border-opacity))}.command_tab{--tw-border-opacity:1;border-color:rgb(253 178 197 / var(--tw-border-opacity))}.active-bluebar-btn{--tw-bg-opacity:1;background-color:rgb(144 205 244 / var(--tw-bg-opacity));box-shadow:inset 0 2px 4px 0 rgb(0 0 10 / .3)}@media (min-width:1024px){.tab{padding-left:.5rem;padding-right:.5rem}}@media (min-width:1280px){.tab{padding-left:1rem;padding-right:1rem}}.tab+.tab{box-shadow:inset 0 -4px 4px -1px rgba(0,0,0,.1),inset 4px 0 4px -1px rgba(0,0,0,.1)}.tab-selected{margin-top:0;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-top-width:8px;border-right-width:1px;border-left-width:1px;--tw-border-opacity:1;border-color:rgb(237 100 166 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));padding-top:.5rem;font-weight:400;--tw-text-opacity:1;color:rgb(0 0 0 / var(--tw-text-opacity));box-shadow:none!important}div#errorbox,div#warningbox{position:relative}[dir=ltr] p.close-dialog{right:5px}[dir=rtl] p.close-dialog{left:5px}p.close-dialog{font-weight:700;position:absolute;top:5px;cursor:pointer}.editor-error{position:absolute;border-bottom-width:2px;border-top-width:2px;--tw-border-opacity:1;border-color:rgb(245 101 101 / var(--tw-border-opacity));background-color:rgb(66 153 225 / .7);z-index:10}.disabled-line{position:absolute;border-top:solid 1px #fff;margin-top:.6em;border-radius:0!important}.debugger-current-line{position:absolute;background:#2d6099;z-index:20}.expandable-docs-text h1{margin-top:30px;margin-bottom:30px}#quiz-iframe{height:72rem;-moz-transform-origin:0 0;-o-transform-origin:0 0;-webkit-transform-origin:0 0}.stats-period-toggle.active{color:#000;text-decoration:none;cursor:default;font-weight:400}.stats-legend{list-style-type:none}.stats-legend-item{display:inline;padding-right:15px;cursor:default}.stats-legend-color-box{width:45px;height:12px;display:inline-block;margin-right:5px}.accordion .accordion-tab input~.tab-content{max-height:0;transition:max-height .35s}[dir=ltr] .accordion .accordion-tab label::before{right:0;float:right}[dir=rtl] .accordion .accordion-tab label::before{left:0;float:left}.accordion .accordion-tab label::before{top:0;display:block;width:1.5em;height:1.5em;line-height:1.5;font-size:1.25rem;font-weight:bolder;text-align:center;transition:all .35s}.accordion .accordion-tab input:checked~.tab-content{max-height:3000vh}[dir=ltr] .accordion .accordion-tab input[type=checkbox]+label::before{right:5px}[dir=rtl] .accordion .accordion-tab input[type=checkbox]+label::before{left:5px}.accordion .accordion-tab input[type=checkbox]+label::before{content:">";transform:rotate(90deg)}.accordion .accordion-tab input[type=checkbox]:checked+label::before{transform:rotate(270deg)}.explore-program-box{position:relative;height:18rem;width:16rem;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(74 85 104 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(190 227 248 / var(--tw-bg-opacity))}.explore-program-box-title{margin-top:-2rem;width:18rem;padding-top:2.5rem;text-align:center;--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}[dir=ltr] .explore-program-box-title{margin-left:-.5rem;--tw-rotate:6deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));padding-left:3rem}[dir=rtl] .explore-program-box-title{margin-right:-.5rem;--tw-rotate:-6deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));padding-right:3rem}.section-header{cursor:pointer;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(190 227 248 / var(--tw-bg-opacity));padding-left:2rem;padding-right:2rem;padding-top:.5rem;padding-bottom:.5rem;font-size:1.875rem}.profile-section-body-header{margin-bottom:1rem;display:inline-block;width:100%;border-bottom-width:1px;padding-bottom:.5rem}.profile-section-body{margin-left:auto;margin-right:auto;display:none;width:100%;border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity));padding-left:2rem;padding-right:2rem;padding-top:1rem;padding-bottom:1rem;--tw-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1),0 2px 4px -2px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:1024px){.profile-section-body{width:75%}}.personal-input{display:block;width:75%;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.5rem;padding-left:1rem;padding-right:1rem;padding-top:.25rem;padding-bottom:.25rem;--tw-text-opacity:1;color:rgb(74 85 104 / var(--tw-text-opacity))}@media (min-width:1024px){.personal-input{width:50%}}.signup-container{margin-left:auto;margin-right:auto;display:flex;flex-direction:row;align-items:center;justify-content:flex-start;padding-left:2rem;padding-right:2rem}.signup-label{display:inline-block;width:33.333333%}@media (min-width:768px){.signup-label{width:12rem}}.signup-input{display:inline-block;width:66.666667%;border-radius:.5rem;--tw-border-opacity:1;border-color:rgb(203 213 224 / var(--tw-border-opacity));padding-left:.5rem;padding-right:.5rem;padding-top:.25rem;padding-bottom:.25rem}@media (min-width:768px){.signup-input{width:20rem}}@media (min-width:1024px){.signup-input{width:24rem}}[dir=ltr] .toggle-circle{left:0}[dir=rtl] .toggle-circle{right:0}.toggle-circle{transition:all .2s ease-in-out}body[dir=ltr] input:checked~.toggle-circle{transform:translateX(100%);--tw-bg-opacity:1;background-color:rgb(104 211 145 / var(--tw-bg-opacity))}body[dir=rtl] input:checked~.toggle-circle{transform:translateX(-100%);--tw-bg-opacity:1;background-color:rgb(104 211 145 / var(--tw-bg-opacity))}input:checked~.toggle-path{--tw-bg-opacity:1;background-color:rgb(113 128 150 / var(--tw-bg-opacity))}.focused-option{border-width:8px;border-style:double}.menubar-item.focused-option{--tw-border-opacity:1!important;border-color:rgb(49 130 206 / var(--tw-border-opacity))!important}.stats-period-toggle.focused-option{color:#000;text-decoration:none;cursor:default;font-weight:400}.focused-option{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.incorrect-option{background-color:rgba(234,55,55,.6)!important;border:5px #c21919 dashed!important}.quiz-icons{position:relative;height:3.5rem;width:3.5rem;top:-40px;left:-10px}.animate-keys{position:absolute;bottom:.25rem;right:.5rem;animation-name:animate-keys;animation-duration:1.5s;animation-timing-function:ease-in-out;-webkit-animation-timing-function:ease-in-out}@keyframes animate-keys{0%{bottom:15px;font-size:1em;opacity:1}100%{bottom:100%;font-size:4em;opacity:0}}.drop-adventures-hint{--tw-border-opacity:1;border-color:rgb(144 205 244 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(235 248 255 / var(--tw-bg-opacity))}.drop-adventures-active{--tw-border-opacity:1;border-color:rgb(250 240 137 / var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgb(255 255 240 / var(--tw-bg-opacity))}.adventures-tab{width:auto;flex-direction:row;overflow-x:auto;overflow-y:hidden}.adventures-tab[style*='display: block']{display:flex!important}.profile-nametag__stats{display:flex;width:100%;flex-direction:row;align-items:stretch;justify-content:center;text-align:center}.switch{position:relative;display:inline-block;width:30px;height:17px}.switch input{opacity:0;width:0;height:0}.slider{--tw-bg-opacity:1;background-color:rgb(203 213 224 / var(--tw-bg-opacity));position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;transition:.4s}.slider:before{position:absolute;content:"";height:13px;width:13px;left:2px;bottom:2px;background-color:#fff;transition:.4s}input:checked+.slider{--tw-bg-opacity:1;background-color:rgb(72 187 120 / var(--tw-bg-opacity))}input:checked+.slider:before{transform:translateX(13px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}input:disabled::-moz-placeholder{--tw-text-opacity:1;color:rgb(74 85 104 / var(--tw-text-opacity))}input:disabled::placeholder{--tw-text-opacity:1;color:rgb(74 85 104 / var(--tw-text-opacity))}.htmx-indicator.custom-indicator{opacity:0;transition:opacity 0s ease-in}.htmx-request .custom-indicator{opacity:1}.htmx-request.custom-indicator{opacity:1}div[class^=ace_incorrect_hedy_code]{border-bottom:2px dashed red;position:absolute;cursor:pointer!important;pointer-events:auto}.student_adventure_checkbox[disabled]{position:relative!important;border-radius:.25rem!important;--tw-border-opacity:1!important;border-color:rgb(160 174 192 / var(--tw-border-opacity))!important;--tw-bg-opacity:1!important;background-color:rgb(237 242 247 / var(--tw-bg-opacity))!important}.student_adventure_checkbox{position:relative!important;border-radius:.25rem!important;--tw-border-opacity:1!important;border-color:rgb(160 174 192 / var(--tw-border-opacity))!important;--tw-bg-opacity:1!important;background-color:rgb(255 255 255 / var(--tw-bg-opacity))!important}.student_adventure_checkbox:checked{position:relative!important;border-radius:.25rem!important;--tw-border-opacity:1!important;border-color:rgb(160 174 192 / var(--tw-border-opacity))!important;--tw-bg-opacity:1!important;background-color:rgb(154 230 180 / var(--tw-bg-opacity))!important}.hover\:rounded-full:hover{border-radius:9999px}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgb(144 205 244 / var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgb(104 211 145 / var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgb(49 130 206 / var(--tw-border-opacity))}.hover\:bg-black\/75:hover{background-color:rgb(0 0 0 / .75)}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgb(104 211 145 / var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(235 248 255 / var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgb(99 179 237 / var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgb(154 230 180 / var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240 / var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgb(144 205 244 / var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgb(203 213 224 / var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgb(49 130 206 / var(--tw-bg-opacity))}.hover\:bg-gray-400\/50:hover{background-color:rgb(203 213 224 / .5)}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(252 129 129 / var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255 / var(--tw-text-opacity))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgb(235 248 255 / var(--tw-bg-opacity))}.group:hover .group-hover\:opacity-100{opacity:1}[dir=ltr] .ltr\:-left-1{left:-.25rem}[dir=ltr] .ltr\:-left-2{left:-.5rem}[dir=ltr] .ltr\:-right-1{right:-.25rem}[dir=ltr] .ltr\:right-0{right:0}[dir=ltr] .ltr\:clear-right{clear:right}[dir=ltr] .ltr\:mr-2{margin-right:.5rem}[dir=ltr] .ltr\:mr-4{margin-right:1rem}[dir=ltr] .ltr\:ml-auto{margin-left:auto}[dir=ltr] .ltr\:mr-5{margin-right:1.25rem}[dir=ltr] .ltr\:ml-3{margin-left:.75rem}[dir=ltr] .ltr\:mr-auto{margin-right:auto}[dir=ltr] .ltr\:ml-8{margin-left:2rem}[dir=ltr] .ltr\:ml-0{margin-left:0}[dir=ltr] .ltr\:mr-3{margin-right:.75rem}[dir=ltr] .ltr\:mr-1{margin-right:.25rem}[dir=ltr] .ltr\:ml-2{margin-left:.5rem}[dir=ltr] .ltr\:ml-4{margin-left:1rem}[dir=ltr] .ltr\:ml-1{margin-left:.25rem}[dir=ltr] .ltr\:mr-24{margin-right:6rem}[dir=ltr] .ltr\:hidden{display:none}[dir=ltr] .ltr\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}[dir=ltr] .ltr\:pr-4{padding-right:1rem}[dir=ltr] .ltr\:pr-8{padding-right:2rem}[dir=ltr] .ltr\:pl-2{padding-left:.5rem}[dir=ltr] .ltr\:pl-4{padding-left:1rem}[dir=ltr] .ltr\:pl-8{padding-left:2rem}[dir=ltr] .ltr\:text-left{text-align:left}[dir=ltr] .ltr\:text-right{text-align:right}[dir=rtl] .rtl\:-right-1{right:-.25rem}[dir=rtl] .rtl\:-right-2{right:-.5rem}[dir=rtl] .rtl\:-left-1{left:-.25rem}[dir=rtl] .rtl\:left-0{left:0}[dir=rtl] .rtl\:left-2{left:.5rem}[dir=rtl] .rtl\:clear-left{clear:left}[dir=rtl] .rtl\:ml-2{margin-left:.5rem}[dir=rtl] .rtl\:ml-4{margin-left:1rem}[dir=rtl] .rtl\:mr-auto{margin-right:auto}[dir=rtl] .rtl\:ml-5{margin-left:1.25rem}[dir=rtl] .rtl\:mr-3{margin-right:.75rem}[dir=rtl] .rtl\:ml-auto{margin-left:auto}[dir=rtl] .rtl\:mr-8{margin-right:2rem}[dir=rtl] .rtl\:mr-0{margin-right:0}[dir=rtl] .rtl\:ml-3{margin-left:.75rem}[dir=rtl] .rtl\:ml-1{margin-left:.25rem}[dir=rtl] .rtl\:mr-2{margin-right:.5rem}[dir=rtl] .rtl\:mr-4{margin-right:1rem}[dir=rtl] .rtl\:mr-1{margin-right:.25rem}[dir=rtl] .rtl\:ml-24{margin-left:6rem}[dir=rtl] .rtl\:hidden{display:none}[dir=rtl] .rtl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}[dir=rtl] .rtl\:pl-4{padding-left:1rem}[dir=rtl] .rtl\:pl-8{padding-left:2rem}[dir=rtl] .rtl\:pr-2{padding-right:.5rem}[dir=rtl] .rtl\:pr-4{padding-right:1rem}[dir=rtl] .rtl\:pr-8{padding-right:2rem}[dir=rtl] .rtl\:text-left{text-align:left}[dir=rtl] .rtl\:text-right{text-align:right}@media (min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:w-5\/12{width:41.666667%}}@media (min-width:768px){.md\:order-4{order:4}.md\:mx-16{margin-left:4rem;margin-right:4rem}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:w-3\/12{width:25%}.md\:w-2\/5{width:40%}.md\:w-3\/5{width:60%}.md\:grid-flow-row-dense{grid-auto-flow:row dense}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-center{justify-content:center}.md\:gap-8{gap:2rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:px-16{padding-left:4rem;padding-right:4rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-8{padding-left:2rem;padding-right:2rem}}@media (min-width:1024px){.lg\:mx-16{margin-left:4rem;margin-right:4rem}.lg\:inline-block{display:inline-block}.lg\:flex{display:flex}.lg\:h-16{height:4rem}.lg\:h-10{height:2.5rem}.lg\:w-1\/12{width:8.333333%}.lg\:w-1\/2{width:50%}.lg\:w-3\/4{width:75%}.lg\:w-12{width:3rem}.lg\:flex-row{flex-direction:row}.lg\:flex-nowrap{flex-wrap:nowrap}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:px-0{padding-left:0;padding-right:0}}@media (min-width:1280px){.xl\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}} diff --git a/tests/test_level/test_level_04.py b/tests/test_level/test_level_04.py index d9f83ea4b13..d6be2c3c34a 100644 --- a/tests/test_level/test_level_04.py +++ b/tests/test_level/test_level_04.py @@ -207,7 +207,63 @@ def test_print_without_quotes_gives_error_from_grammar(self): max_level=5, ) - def test_print_without_quotes_gives_error_from_transpiler(self): + def test_print_without_ending_quote_gives_UnquotedException(self): + + code = "print 'hallo wereld" + + self.multi_level_tester( + code=code, + max_level=17, + exception=hedy.exceptions.UnquotedTextException, + ) + + def test_print_comma_without_ending_quote_gives_UnquotedException(self): + code = "print 'hallo, wereld" + + self.multi_level_tester( + code=code, + max_level=17, + exception=hedy.exceptions.UnquotedTextException, + ) + + def test_print_comma_starting_ending_quote_gives_UnquotedException(self): + code = "print hallo, wereld'" + + self.multi_level_tester( + code=code, + max_level=17, + exception=hedy.exceptions.UnquotedTextException, + ) + + def test_print_comma_without_ending_double_quote_gives_UnquotedException(self): + code = 'print "hallo, wereld' + + self.multi_level_tester( + code=code, + max_level=17, + exception=hedy.exceptions.UnquotedTextException, + ) + + def test_print_comma_without_starting_double_quote_gives_UnquotedException(self): + code = 'print hallo, wereld"' + + self.multi_level_tester( + code=code, + max_level=17, + exception=hedy.exceptions.UnquotedTextException, + ) + + def test_print_without_starting_quote_gives_UnquotedException(self): + + code = "print hallo wereld'" + + self.multi_level_tester( + code=code, + max_level=17, + exception=hedy.exceptions.UnquotedTextException, + ) + + def test_print_without_all_quotes_gives_UnquotedException(self): # in other cases, there might be two different problems # is this unquoted? or did we forget an initialization of a variable? @@ -827,12 +883,12 @@ def test_quoted_text_gives_error(self): ) def test_repair_incorrect_print_argument(self): - code = "print ,'Hello'" + code = "print ,Hello" self.multi_level_tester( code=code, exception=hedy.exceptions.ParseException, - extra_check_function=lambda c: c.exception.fixed_code == "print 'Hello'" + extra_check_function=lambda c: c.exception.fixed_code == "print ,Hello" ) def test_lonely_text(self): From 95dc05b338b9fb76d940c075f4f0502cccd1a6d8 Mon Sep 17 00:00:00 2001 From: rix0rrr Date: Sat, 25 Nov 2023 09:11:39 +0000 Subject: [PATCH 12/15] =?UTF-8?q?Automatically=20update=20JavaScript=20bun?= =?UTF-8?q?dle=20=F0=9F=A4=96=20beep=20boop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/js/appbundle.js | 2 +- static/js/appbundle.js.map | 2 +- static/js/message-translations.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/static/js/appbundle.js b/static/js/appbundle.js index 00483922712..c5d48dab5d5 100644 --- a/static/js/appbundle.js +++ b/static/js/appbundle.js @@ -170,7 +170,7 @@ You did great!`,Transpile_warning:"Warning!",Unsaved_Changes:"You have an unsave \u0130nan\u0131lmaz! \u0130yi i\u015Fti, Aferin! M\xFCkemmel! -\xC7ok iyiydin!`,Transpile_warning:"Uyar\u0131!",Unsaved_Changes:"Kaydedilmemi\u015F bir program\u0131n var. Kaydetmeden ayr\u0131lmak m\u0131 istiyorsun?",adventures_restored:"Varsay\u0131lan maceralar geri y\xFCklendi.",copy_link_to_share:"Payla\u015Fmak i\xE7in ba\u011Flant\u0131y\u0131 kopyalay\u0131n",customization_deleted:"\xD6zelle\u015Ftirmeler ba\u015Far\u0131yla silindi.",dice:"\u{1F3B2}",directly_available:"Do\u011Frudan a\xE7\u0131n",disabled:"Devre d\u0131\u015F\u0131",fortune:"\u{1F52E}, \u2728",haunted:"\u{1F987}, \u{1F47B}, \u{1F383}",level_title:"Seviye",restaurant:"\u{1F363}, \u{1F355}, \u{1F354}",rock:"\u2702\uFE0F, \u{1F4DC}, \u{1F5FB}",songs:"\u{1F3B5},\u{1F3B6}",teacher_welcome:"Hedy'ye ho\u015F geldiniz! Art\u0131k s\u0131n\u0131flar olu\u015Fturman\u0131za ve \xF6\u011Frencileri davet etmenize olanak tan\u0131yan bir \xF6\u011Fretmen hesab\u0131n\u0131n gururlu sahibisiniz.",turtle:"\u{1F422}",unsaved_class_changes:"Kaydedilmemi\u015F de\u011Fi\u015Fiklikler var, bu sayfadan ayr\u0131lmak istedi\u011Finize emin misiniz?"},uk:{CheckInternet:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u0432\u0430\u0448\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0434\u043E \u0406\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0443 \u043F\u0440\u0430\u0446\u044E\u0454 \u043D\u0430\u043B\u0435\u0436\u043D\u0438\u043C \u0447\u0438\u043D\u043E\u043C.",Connection_error:"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u0434\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",Empty_output:"\u0426\u0435\u0439 \u043A\u043E\u0434 \u043F\u0440\u0430\u0446\u044E\u0454, \u0430\u043B\u0435 \u043D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0434\u0440\u0443\u043A\u0443\u0454. \u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0434\u0440\u0443\u043A\u0443 \u0434\u043E \u0441\u0432\u043E\u0433\u043E \u043A\u043E\u0434\u0443 \u0430\u0431\u043E \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u043F\u0430\u0445\u0443, \u0449\u043E\u0431 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0432\u0438\u0432\u0456\u0434.",Errors_found:"You made a mistake! Don't worry, Hedy is trying to find the mistakes",Execute_error:"\u0429\u043E\u0441\u044C \u043F\u0456\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A \u043F\u0456\u0434 \u0447\u0430\u0441 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438.",Other_error:"\u041E\u0439! \u041C\u043E\u0436\u043B\u0438\u0432\u043E, \u043C\u0438 \u0442\u0440\u043E\u0445\u0438 \u043F\u043E\u043C\u0438\u043B\u0438\u043B\u0438\u0441\u044F.",Program_repair:"\u0426\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u043E\u0434, \u0432\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0439\u043E\u0433\u043E \u0432\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438?",Program_too_long:"\u0412\u0430\u0448\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 \u0432\u0438\u043A\u043E\u043D\u0443\u0454\u0442\u044C\u0441\u044F \u043D\u0430\u0434\u0442\u043E \u0434\u043E\u0432\u0433\u043E.",ServerError:"\u0412\u0438 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443, \u044F\u043A\u0443 \u043C\u0438 \u043D\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043B\u0438. \u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u0442\u0438, \u043D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043D\u0430\u043C \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0438\u0439 \u043B\u0438\u0441\u0442 \u0456\u0437 \u0437\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\u043C \u0440\u0456\u0432\u043D\u044F \u0442\u0430 \u0432\u0430\u0448\u043E\u0457 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438 \u043D\u0430 hello@hedy.org. \u0422\u0438\u043C \u0447\u0430\u0441\u043E\u043C \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u043E\u0441\u044C \u0442\u0440\u043E\u0445\u0438 \u0456\u043D\u0448\u0435 \u0442\u0430 \u0449\u0435 \u0440\u0430\u0437 \u043F\u043E\u0434\u0438\u0432\u0456\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u0440\u0438\u043A\u043B\u0430\u0434\u0438. \u0414\u044F\u043A\u0443\u044E!",Transpile_error:"\u041C\u0438 \u043D\u0435 \u043C\u043E\u0436\u0435\u043C\u043E \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0432\u0430\u0448\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443.",Transpile_success:`\u0413\u0430\u0440\u043D\u0430 \u0440\u043E\u0431\u043E\u0442\u0430! +\xC7ok iyiydin!`,Transpile_warning:"Uyar\u0131!",Unsaved_Changes:"Kaydedilmemi\u015F bir program\u0131n var. Kaydetmeden ayr\u0131lmak m\u0131 istiyorsun?",adventures_restored:"Varsay\u0131lan maceralar geri y\xFCklendi.",copy_link_to_share:"Payla\u015Fmak i\xE7in ba\u011Flant\u0131y\u0131 kopyalay\u0131n",customization_deleted:"\xD6zelle\u015Ftirmeler ba\u015Far\u0131yla silindi.",dice:"\u{1F3B2}",directly_available:"Do\u011Frudan a\xE7\u0131n",disabled:"Devre d\u0131\u015F\u0131",fortune:"\u{1F52E}, \u2728",haunted:"\u{1F987}, \u{1F47B}, \u{1F383}",level_title:"Seviye",restaurant:"\u{1F363}, \u{1F355}, \u{1F354}",rock:"\u2702\uFE0F, \u{1F4DC}, \u{1F5FB}",songs:"\u{1F3B5},\u{1F3B6}",teacher_welcome:"Hedy'ye ho\u015F geldiniz! Art\u0131k s\u0131n\u0131flar olu\u015Fturman\u0131za ve \xF6\u011Frencileri davet etmenize olanak tan\u0131yan bir \xF6\u011Fretmen hesab\u0131n\u0131n gururlu sahibisiniz.",turtle:"\u{1F422}",unsaved_class_changes:"Kaydedilmemi\u015F de\u011Fi\u015Fiklikler var, bu sayfadan ayr\u0131lmak istedi\u011Finize emin misiniz?"},uk:{CheckInternet:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u0432\u0430\u0448\u0435 \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044F \u0434\u043E \u0406\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0443 \u043F\u0440\u0430\u0446\u044E\u0454 \u043D\u0430\u043B\u0435\u0436\u043D\u0438\u043C \u0447\u0438\u043D\u043E\u043C.",Connection_error:"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u0434\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",Empty_output:"\u0426\u0435\u0439 \u043A\u043E\u0434 \u043F\u0440\u0430\u0446\u044E\u0454, \u0430\u043B\u0435 \u043D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0434\u0440\u0443\u043A\u0443\u0454. \u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0434\u0440\u0443\u043A\u0443 \u0434\u043E \u0441\u0432\u043E\u0433\u043E \u043A\u043E\u0434\u0443 \u0430\u0431\u043E \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u043F\u0430\u0445\u0443, \u0449\u043E\u0431 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0432\u0438\u0432\u0456\u0434.",Errors_found:"\u0412\u0438 \u0437\u0440\u043E\u0431\u0438\u043B\u0438 \u043F\u043E\u043C\u0438\u043B\u043A\u0443! \u041D\u0435 \u0442\u0443\u0440\u0431\u0443\u0439\u0442\u0435\u0441\u044F, \u043C\u0438 \u043F\u0440\u043E\u0434\u043E\u0432\u0438\u043C\u043E \u0432\u0438\u043A\u043E\u043D\u0443\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443",Execute_error:"\u0429\u043E\u0441\u044C \u043F\u0456\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A \u043F\u0456\u0434 \u0447\u0430\u0441 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438.",Other_error:"\u041E\u0439! \u041C\u043E\u0436\u043B\u0438\u0432\u043E, \u043C\u0438 \u0442\u0440\u043E\u0445\u0438 \u043F\u043E\u043C\u0438\u043B\u0438\u043B\u0438\u0441\u044F.",Program_repair:"\u0426\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u043E\u0434, \u0432\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0439\u043E\u0433\u043E \u0432\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438?",Program_too_long:"\u0412\u0430\u0448\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 \u0432\u0438\u043A\u043E\u043D\u0443\u0454\u0442\u044C\u0441\u044F \u043D\u0430\u0434\u0442\u043E \u0434\u043E\u0432\u0433\u043E.",ServerError:"\u0412\u0438 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443, \u044F\u043A\u0443 \u043C\u0438 \u043D\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043B\u0438. \u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u0442\u0438, \u043D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043D\u0430\u043C \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0438\u0439 \u043B\u0438\u0441\u0442 \u0456\u0437 \u0437\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\u043C \u0440\u0456\u0432\u043D\u044F \u0442\u0430 \u0432\u0430\u0448\u043E\u0457 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438 \u043D\u0430 hello@hedy.org. \u0422\u0438\u043C \u0447\u0430\u0441\u043E\u043C \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u043E\u0441\u044C \u0442\u0440\u043E\u0445\u0438 \u0456\u043D\u0448\u0435 \u0442\u0430 \u0449\u0435 \u0440\u0430\u0437 \u043F\u043E\u0434\u0438\u0432\u0456\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u0440\u0438\u043A\u043B\u0430\u0434\u0438. \u0414\u044F\u043A\u0443\u044E!",Transpile_error:"\u041C\u0438 \u043D\u0435 \u043C\u043E\u0436\u0435\u043C\u043E \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u0432\u0430\u0448\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443.",Transpile_success:`\u0413\u0430\u0440\u043D\u0430 \u0440\u043E\u0431\u043E\u0442\u0430! \u0414\u0438\u0432\u043E\u0432\u0438\u0436\u043D\u043E! \u0427\u0443\u0434\u043E\u0432\u0430 \u0440\u043E\u0431\u043E\u0442\u0430! \u0427\u0443\u0434\u043E\u0432\u043E! diff --git a/static/js/appbundle.js.map b/static/js/appbundle.js.map index c1312a74c7f..ab142d9eabd 100644 --- a/static/js/appbundle.js.map +++ b/static/js/appbundle.js.map @@ -2,6 +2,6 @@ "version": 3, "sources": ["syntaxModesRules.ts", "message-translations.ts", "client-messages.ts", "modal.ts", "../../node_modules/jszip/dist/jszip.min.js", "event-emitter.ts", "tabs.ts", "pythonPrefixes.ts", "types.ts", "tutorials/utils.ts", "browser-helpers/unsaved-changes.ts", "tutorials/intro.ts", "tutorials/teacher.ts", "tutorials/level1.ts", "tutorials/tutorial.ts", "parsons.ts", "browser-helpers/on-element-becomes-visible.ts", "editor.ts", "ace-editor.ts", "debugging.ts", "local.ts", "../../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", "teachers.ts", "comm.ts", "auth.ts", "local-save-warning.ts", "../../node_modules/@codemirror/state/dist/index.cjs", "../../node_modules/style-mod/dist/style-mod.cjs", "../../node_modules/w3c-keyname/index.cjs", "../../node_modules/@codemirror/view/dist/index.cjs", "../../node_modules/@lezer/common/dist/index.cjs", "../../node_modules/@lezer/highlight/dist/index.cjs", "../../node_modules/@codemirror/language/dist/index.cjs", "../../node_modules/@codemirror/commands/dist/index.cjs", "../../node_modules/crelt/dist/index.cjs", "../../node_modules/@codemirror/search/dist/index.cjs", "cm-decorations.ts", "../../node_modules/@lezer/lr/dist/index.cjs", "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", "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", "app.ts", "../../node_modules/sortablejs/Sortable.min.js", "htmx-integration.ts", "../../node_modules/chart.js/dist/chart.js", "statistics.ts", "logs.ts", "admin.ts", "initialize.ts", "index.ts"], "sourcesContent": [null, null, null, null, "/*!\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 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(/