diff --git a/1-getting-started/lessons/1-introduction-to-iot/README.md b/1-getting-started/lessons/1-introduction-to-iot/README.md index 1e366652..b739ddc7 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/README.md +++ b/1-getting-started/lessons/1-introduction-to-iot/README.md @@ -1,6 +1,6 @@ # Introduction to IoT -![A sketchnote overview of this lesson](../../../sketchnotes/lesson-1.png) +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-1.jpg) > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/README.ar.md b/1-getting-started/lessons/1-introduction-to-iot/translations/README.ar.md index 3e60eab4..5c4ed726 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/translations/README.ar.md +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/README.ar.md @@ -1,6 +1,6 @@ #
مقدمة لإنترنت الأشياء
-![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-1.png) +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-1.jpg) >
خريطة من Nitya Narasimhan
>
اضغط على الصورة لتكبيرها
diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/README.bn.md b/1-getting-started/lessons/1-introduction-to-iot/translations/README.bn.md index 9be3a08e..f70182f8 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/translations/README.bn.md +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/README.bn.md @@ -1,6 +1,6 @@ # IoT পরিচিতি -![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-1.png) +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-1.jpg) > Nitya Narasimhan তৈরী করছেন এই স্কেচনোটটি । এটির বড় সংস্করণ দেখতে চাইলে ছবিটির উপর ক্লিক করুন । diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/README.hi.md b/1-getting-started/lessons/1-introduction-to-iot/translations/README.hi.md index 0886f95a..79b91fcd 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/translations/README.hi.md +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/README.hi.md @@ -1,6 +1,6 @@ # इंटरनेट ऑफ थिंग्स (IoT )का परिचय -![इस पाठ का एक संक्षिप्त विवरण](../../../../sketchnotes/lesson-1.png) +![इस पाठ का एक संक्षिप्त विवरण](../../../../sketchnotes/lesson-1.jpg) > [Nitya Narasimhan](https://github.com/nitya) द्वारा स्केचनोट. Click the image for a larger version. diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/README.id.md b/1-getting-started/lessons/1-introduction-to-iot/translations/README.id.md index afea28f7..5fb3dcc2 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/translations/README.id.md +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/README.id.md @@ -1,6 +1,6 @@ # Pengenalan IoT -![Ikhtisar catatan sketsa dari pelajaran ini](../../../../sketchnotes/lesson-1.png) +![Ikhtisar catatan sketsa dari pelajaran ini](../../../../sketchnotes/lesson-1.jpg) > Sketsa dibuat oleh [Nitya Narasimhan](https://github.com/nitya). Klik gambar untuk versi yang lebih besar. diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/README.zh.md b/1-getting-started/lessons/1-introduction-to-iot/translations/README.zh.md index 7b63fd03..4a90bd5e 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/translations/README.zh.md +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/README.zh.md @@ -1,6 +1,6 @@ # 物联网(IoT)简介 -![这个课程概述的涂鸦笔记(sketchnote)](../../../sketchnotes/lesson-1.png) +![这个课程概述的涂鸦笔记(sketchnote)](../../../../sketchnotes/lesson-1.jpg) > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 如果你想看比较大的图片,请点击它。 diff --git a/1-getting-started/lessons/2-deeper-dive/README.md b/1-getting-started/lessons/2-deeper-dive/README.md index 83897896..7b8b2a59 100644 --- a/1-getting-started/lessons/2-deeper-dive/README.md +++ b/1-getting-started/lessons/2-deeper-dive/README.md @@ -1,6 +1,6 @@ # A deeper dive into IoT -![A sketchnote overview of this lesson](../../../sketchnotes/lesson-2.png) +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-2.jpg) > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. diff --git a/1-getting-started/lessons/2-deeper-dive/translations/README.ar.md b/1-getting-started/lessons/2-deeper-dive/translations/README.ar.md index 956499de..4205bc3b 100644 --- a/1-getting-started/lessons/2-deeper-dive/translations/README.ar.md +++ b/1-getting-started/lessons/2-deeper-dive/translations/README.ar.md @@ -1,6 +1,6 @@ #
التعمق أكثر بإنترنت الأشياء
-![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-2.png) +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-2.jpg) >
خريطة من Nitya Narasimhan
>
اضغط على الصورة لتكبيرها
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/README.md b/1-getting-started/lessons/3-sensors-and-actuators/README.md index de62fc30..dae8f583 100644 --- a/1-getting-started/lessons/3-sensors-and-actuators/README.md +++ b/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -1,6 +1,6 @@ # Interact with the physical world with sensors and actuators -![A sketchnote overview of this lesson](../../../sketchnotes/lesson-3.png) +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-3.jpg) > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/pi-actuator.ar.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/pi-actuator.ar.md new file mode 100644 index 00000000..ffe0f5be --- /dev/null +++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/pi-actuator.ar.md @@ -0,0 +1,128 @@ +
+ +# قم ببناء ضوء ليلي - Raspberry Pi + +في هذا الجزء من الدرس ، ستضيف مؤشر LED إلى Raspberry Pi الخاص بك وتستخدمه لإنشاء ضوء ليلي. + +## المعدات + +يحتاج ضوء الليل الآن إلى مشغل. + +المشغل هو ** LED ** ، الصمام الثنائي الباعث للضوء الذي ينبعث منه الضوء عندما يتدفق التيار خلاله. هذا مشغل رقمي له حالتان ، تشغيل وإيقاف. يؤدي إرسال القيمة 1 إلى تشغيل مؤشر LED و 0 يؤدي إلى إيقاف تشغيله. LED هو مشغل Grove خارجي ويجب توصيله بقبعة Grove Base على Raspberry Pi. + +منطق ضوء الليل في الكود الزائف هو: + +```output +تحقق من مستوى الضوء. +إذا كان الضوء أقل من 300 + قم بتشغيل LED +غير ذلك + قم بإيقاف تشغيل LED +``` +### قم بتوصيل الصمام + +يأتي Grove LED كوحدة نمطية مع مجموعة مختارة من مصابيح LED ، مما يسمح لك باختيار اللون. + +#### المهمة - قم بتوصيل LED + +قم بتوصيل الصمام. + +![A grove LED](../../../../images/grove-led.png) + +1. اختر مؤشر LED المفضل لديك وأدخل الأرجل في الفتحتين على وحدة LED. + + المصابيح هي صمامات ثنائية باعثة للضوء ، والصمامات الثنائية هي أجهزة إلكترونية يمكنها حمل التيار في اتجاه واحد فقط. هذا يعني أن مؤشر LED يحتاج إلى الاتصال بالطريقة الصحيحة ، وإلا فلن يعمل. + + أحد أرجل مؤشر LED هو الدبوس الموجب ، والآخر هو الدبوس السالب. LED ليس مستديرًا تمامًا وهو مسطح قليلاً من جانب واحد. الجانب المسطح قليلاً هو الدبوس السالب. عندما تقوم بتوصيل مؤشر LED بالوحدة ، تأكد من توصيل دبوس الجانب المستدير بالمقبس المميز بعلامة ** + ** على الجزء الخارجي من الوحدة ، وأن الجانب المسطح متصل بالمقبس الأقرب إلى منتصف الجزء وحدة. + +1. تحتوي وحدة LED على زر دوران يسمح لك بالتحكم في السطوع. اقلب هذا على طول الطريق لتبدأ بتدويره عكس اتجاه عقارب الساعة بقدر ما سيذهب باستخدام مفك براغي صغير من فيليبس. + +1. أدخل أحد طرفي كبل Grove في المقبس الموجود في وحدة LED. سوف تذهب في اتجاه واحد فقط. + +1. مع إيقاف تشغيل Raspberry Pi ، قم بتوصيل الطرف الآخر من كابل Grove بالمقبس الرقمي المميز بعلامة ** D5 ** على قبعة Grove Base المرفقة بـ Pi. هذا المقبس هو الثاني من اليسار ، على صف المقابس بجوار دبابيس GPIO. + +![The grove LED connected to socket D5](../../../../images/pi-led.png) + + +## برمجة ضوء الليل + +يمكن الآن برمجة ضوء الليل باستخدام مستشعر الضوء Grove و Grove LED. + +### المهمة - برمجة ضوء الليل + +برمجة ضوء الليل. + +1. قم بتشغيل Pi وانتظر حتى يتم التمهيد + +1. افتح مشروع Nightlight في VS Code الذي أنشأته في الجزء السابق من هذه المهمة ، سواء كان يعمل مباشرة على Pi أو متصل باستخدام امتداد Remote SSH. + +1. أضف الكود التالي إلى ملف `app.py` للاتصال لاستيراد المكتبة المطلوبة. يجب إضافة هذا إلى الأعلى ، أسفل سطور "الاستيراد" الأخرى. + + + ```python + from grove.grove_led import GroveLed + ``` + +تستورد العبارة `from grove.grove_led import GroveLed`` GroveLed` من مكتبات Grove Python. تحتوي هذه المكتبة على رمز للتفاعل مع Grove LED. + +1. أضف الكود التالي بعد إعلان "light_sensor" لإنشاء مثيل للفئة التي تدير مؤشر LED: + + + ```python + led = GroveLed(5) + ``` + + يُنشئ السطر `led = GroveLed (5)` مثيلًا لفئة `GroveLed` التي تتصل بالطرف ** D5 ** - دبوس Grove الرقمي الذي يتصل به مؤشر LED. + + > 💁 جميع المقابس لها أرقام دبوس فريدة. الدبابيس 0 و 2 و 4 و 6 هي دبابيس تمثيلية ، والدبابيس 5 و 16 و 18 و 22 و 24 و 26 هي دبابيس رقمية. + +1. أضف فحصًا داخل حلقة "while" وقبل "time.sleep" للتحقق من مستويات الإضاءة وتشغيل مؤشر LED أو إيقاف تشغيله: + + +
+ + ```python + if light < 300: + led.on() + else: + led.off() + ``` + +
+ يتحقق هذا الرمز من قيمة "light". إذا كان هذا أقل من 300 ، فإنه يستدعي طريقة "on" لفئة "GroveLed" التي ترسل قيمة رقمية 1 إلى LED ، وتشغيلها. إذا كانت قيمة الضوء أكبر من أو تساوي 300 ، فإنها تستدعي طريقة "إيقاف التشغيل" ، وإرسال قيمة رقمية بقيمة 0 إلى LED ، وإيقاف تشغيلها. + +> 💁 يجب وضع مسافة بادئة لهذا الرمز إلى نفس مستوى خط الطباعة ('Light level:'، light) `ليكون داخل حلقة while! + +> 💁 عند إرسال القيم الرقمية إلى المشغلات ، تكون القيمة 0 هي 0 فولت ، والقيمة 1 هي أقصى جهد للجهاز. بالنسبة لـ Raspberry Pi مع مستشعرات ومشغلات Grove ، يكون الجهد 1 هو 3.3 فولت. + +1. من VS Code Terminal ، قم بتشغيل ما يلي لتشغيل تطبيق Python: + + ```sh + python3 app.py + ``` + + Light values will be output to the console. + + ```output + pi@raspberrypi:~/nightlight $ python3 app.py + Light level: 634 + Light level: 634 + Light level: 634 + Light level: 230 + Light level: 104 + Light level: 290 + ``` +1. قم بتغطية وكشف مستشعر الضوء. لاحظ كيف سيضيء مؤشر LED إذا كان مستوى الضوء 300 أو أقل ، وينطفئ عندما يكون مستوى الضوء أكبر من 300. + + > 💁 إذا لم يتم تشغيل مؤشر LED ، فتأكد من توصيله بالطريقة الصحيحة ، وأن زر الدوران مضبوط على الوضع الكامل. + +![The LED connected to the Pi turning on and off as the light level changes](../../../../images/pi-running-assignment-1-1.gif) + +> 💁 يمكنك العثور على هذا الرمز في المجلد +[code-actuator/pi](../code-actuator/pi) + +😀 كان برنامج الإضاءة الليلية الخاص بك ناجحًا! +
+ + + diff --git a/1-getting-started/lessons/4-connect-internet/README.md b/1-getting-started/lessons/4-connect-internet/README.md index 18c30a57..475239f8 100644 --- a/1-getting-started/lessons/4-connect-internet/README.md +++ b/1-getting-started/lessons/4-connect-internet/README.md @@ -1,6 +1,6 @@ # Connect your device to the Internet -![A sketchnote overview of this lesson](../../../sketchnotes/lesson-4.png) +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-4.jpg) > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. diff --git a/2-farm/lessons/1-predict-plant-growth/README.md b/2-farm/lessons/1-predict-plant-growth/README.md index 1558065a..c3e945cb 100644 --- a/2-farm/lessons/1-predict-plant-growth/README.md +++ b/2-farm/lessons/1-predict-plant-growth/README.md @@ -1,5 +1,9 @@ # Predict plant growth with IoT +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-5.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/9) diff --git a/2-farm/lessons/1-predict-plant-growth/translations/.dummy.md b/2-farm/lessons/1-predict-plant-growth/translations/.dummy.md deleted file mode 100644 index 6e7db247..00000000 --- a/2-farm/lessons/1-predict-plant-growth/translations/.dummy.md +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy File - -This file acts as a placeholder for the `translations` folder.
-**Please remove this file after adding the first translation** - -For the instructions, follow the directives in the [translations guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/TRANSLATIONS.md) . - -## THANK YOU -We truly appreciate your efforts! diff --git a/2-farm/lessons/1-predict-plant-growth/translations/README.bn.md b/2-farm/lessons/1-predict-plant-growth/translations/README.bn.md new file mode 100644 index 00000000..f1fcd985 --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/README.bn.md @@ -0,0 +1,265 @@ +# আইওটি দ্বারা উদ্ভিদ বৃদ্ধির পূর্বাভাস + +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-5.jpg) + +> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya). বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে। + +## লেকচার-পূর্ববর্তী কুইজ + +[লেকচার-পূর্ববর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/9) + +## সূচনা + +উদ্ভিদের বৃদ্ধির জন্য নির্দিষ্ট কিছু উপাদান প্রয়োজন - পানি, কার্বন-ডাইঅক্সাইড, পুষ্টি, হালকা এবং তাপ। এই পাঠে আমরা শিখবো কীভাবে বায়ুর তাপমাত্রা পরিমাপ করে উদ্ভিদের বৃদ্ধি এবং পরিপক্কতার হার হিসেব করা যায়। + +এই লেসনে আমরা শিখবো: + +* [ডিজিটাল কৃষিব্যবস্থা](#ডিজিটাল-কৃষিব্যবস্থা) +* [কৃষিকাজে তাপমাত্রা কেন গুরুত্বপূর্ণ?](#কৃষিকাজে-তাপমাত্রা-কেন-গুরুত্বপূর্ণ) +* [চারিপার্শ্বিক তাপমাত্রা পরিমাপ](#চারিপার্শ্বিক-তাপমাত্রা-পরিমাপ) +* [Growing degree days (GDD) হিসেব](#growing-degree-days) +* [তাপমাত্রা সেন্সরের তথ্য দিয়ে GDD নির্ণয়](#তাপমাত্রা-সেন্সরের-তথ্য-দিয়ে-GDD-নির্ণয়) + +## ডিজিটাল কৃষিব্যবস্থা + +ডিজিটাল বিপ্লব আমাদের কৃষিব্যবস্থায় আমূল পরিবর্তন আনছে। ডেটা সংগ্রহ, ডেটা স্টোর এবং সেই তথ্য বিশ্লেষণের মাধ্যমে আমাদের কৃষিকাজ নতুন রূপ লাভ করছে। ওয়ার্ল্ড ইকোনমিক ফোরামের ভাষ্যমতে আমরা বর্তমানে 'চতুর্থ শিল্প বিপ্লব' এর সময়ে আছি এবং ডিজিটাল কৃষির উত্থানকে 'চতুর্থ কৃষি বিপ্লব' বা 'কৃষি 4.0' হিসাবে চিহ্নিত করা হচ্ছে। + +> 🎓 'ডিজিটাল এগ্রিকালচার' বলতে কৃষিব্যবস্থার সম্পূর্ণ value chain কে বোঝানো হয় যা একেবারে খামার থেকে খাওয়ার টেবিল পর্যন্ত সম্পূর্ণ যাত্রা । খাদ্য পরিবহণ এবং প্রক্রিয়াজাতকরণের সময় তার গুণগত মান ট্র্যাক করা, গুদাম এবং ই-কমার্স ব্যবস্থা পরিচালনা এমনকি ট্র্যাক্টর ভাড়া করা পর্যন্ত - সবকিছুই বর্তমানে ডিজিটাল মাধ্যমে করা সম্ভব হচ্ছে + +এই বৈপ্লবিক পরিবর্তনের কারণে কম পরিমাণে সার ও কীটনাশক এবং দক্ষতার সাথে সেচ বা পানি ব্যবহার করে কৃষকেরা এখন অধিক ফলন পাচ্ছেন। যদিও প্রাথমিকভাবে কেবল উন্নত দেশগুলোতেই সেন্সর এবং অন্যান্য আধুনিক যন্ত্রের ব্যবহার শুরু হয়, বর্তমানে এগুলোর দাম কমে আসছে এবং উন্নয়নশীল দেশগুলোতেও অনেক বেশি সহজলভ্য হচ্ছে। + +ডিজিটাল কৃষিব্যবস্থায় আমরা দেখতে পাচ্ছি - + +* তাপমাত্রা পরিমাপ - তাপমাত্রা সঠিক পরিমাপ কৃষকদের গাছের বৃদ্ধি এবং পরিপক্কতা সম্পর্কে পূর্বাভাস দেয়। +* স্বয়ংক্রিয় সেচকার্য - নির্দিষ্ট সময় পরপর পানি দেয়ার পরিবর্তে, মাটির আর্দ্রতা পরিমাপ করে, তা খুব শুষ্ক হলে সেচ ব্যবস্থা চালু করা অধিক উপযোগী। সময়ভিত্তিক সেচের ফলে গরম, শুষ্ক সময়ে কম পানি পাওয়া বা বৃষ্টির সময় অতিরিক্ত পানির চাপ বেড়ে যাওয়ার মতো ঘটনা ঘটতে পারে। কেবল প্রয়োজনের সময়ে সেচ দিয়েই, কৃষকরা তাদের জলের ব্যবহার আরো বেশি কার্যকর করতে পারে। +* কীটপতঙ্গ নিয়ন্ত্রণ - কৃষকরা স্বয়ংক্রিয় রোবট বা ড্রোনগুলিতে ক্যামেরা ব্যবহার করে কীতপতঙ্গ গুলো পর্যবেক্ষণ করতে পারে এবং কেবল যেখানে প্রয়োজন সেখানেই কীটনাশক প্রয়োগ করতে পারেন। এতে করে কীটনাশকের পরিমাণ হ্রাস হবে এবং স্থানীয় জলের সরবরাহে কীটনাশকের মিশ্রণ কমে আসবে। + +✅ একটু ভাবা যাক - কৃষকের ফলন উন্নত করতে আর কোন কোন কৌশল ব্যবহার করা হয়? + +> 🎓 'Precision Agriculture' পরিভাষা ব্যবহৃত হয় ফসলের পর্যবেক্ষণ, পরিমাপ ও প্রতিক্রিয়া সংক্রান্ত কাজে। এর মধ্যে সেচ নিশ্চিতকরণ, পুষ্টিমাত্রা সঠিক রাখা এবং কীটপতঙ্গের মাত্রা পরিমাপ করা এবং নির্ভুলভাবে যথাযথ কাজটি করা যেমন ক্ষেতের কেবলমাত্র প্রয়োজনীয় ছোট অংশে সেচ দেয়া - এসব অন্তর্ভুক্ত। + +## কৃষিকাজে তাপমাত্রা কেন গুরুত্বপূর্ণ ? + +গাছপালা সম্পর্কে শেখার সময়, বেশিরভাগ শিক্ষার্থীদের পানি, আলো, কার্বন ডাইঅক্সাইড এবং পুষ্টির প্রয়োজনীয়তা সম্পর্কে শেখানো হয়। গাছপালা বৃদ্ধির জন্য উষ্ণতাও প্রয়োজন - এই কারণেই তাপমাত্রা বৃদ্ধির সাথে সাথে বসন্তে উদ্ভিদের ফুল ফোটে। উষ্ণতার কারণেই ড্যাফোডিল খুব শীঘ্রই ফুটতে পারে পারে এবং হটহাউস ও গ্রিনহাউসগুলি গাছ এর বৃদ্ধির জন্য কার্যকরী ভূমিকা রাখে। + +> 🎓 হটহাউস এবং গ্রিনহাউসগুলি একই কাজ করে তবে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। হটহাউস কৃত্রিমভাবে উত্তপ্ত করা হয় এবং কৃষকদেরকে তাপমাত্রা আরও সঠিকভাবে নিয়ন্ত্রণ করার সুযোগ দেয়, কিন্তু গ্রিনহাউসগুলি উষ্ণতার জন্য সূর্যের উপর নির্ভর করে এবং সাধারণত তাপমাত্রা নিয়ন্ত্রণের জন্য জানালা বা কোন ছিদ্রের উপর নির্ভর করতে হয়। + +গাছের একটি বেস বা সর্বনিম্ন তাপমাত্রা, সর্বোত্তম বা পরিমিত তাপমাত্রা এবং সর্বাধিক তাপমাত্রা থাকে, যা সবগুলিই প্রতিদিনের গড় তাপমাত্রার উপর নির্ভর করে। + +* বেস (সর্বনিম্ন) তাপমাত্রা - এটি কোনও গাছের বৃদ্ধির জন্য প্রয়োজনীয় ন্যূনতম দৈনিক গড় তাপমাত্রা। +* পরিমিত তাপমাত্রা - সর্বাধিক বৃদ্ধি পেতে এটি সেরা দৈনিক গড় তাপমাত্রা। +* সর্বাধিক তাপমাত্রা - এটি একটি উদ্ভিদ সহ্য করতে পারে সর্বোচ্চ তাপমাত্রা। এর উপরে উদ্ভিদ পানি সংরক্ষণ এবং জীবিত থাকার চেষ্টায় এর বৃদ্ধি বন্ধ করে দেবে। + +> 💁 এগুলি দিন এবং রাতের তুলনায় গড় তাপমাত্রা। গাছপালাগুলিকে আরও বেশি দক্ষতার সাথে আলোকসংশ্লেষণ করতে এবং রাতে শক্তি সঞ্চয় করতে সহায়তা করার জন্য দিন ও রাতে বিভিন্ন তাপমাত্রার প্রয়োজন হয়। + +প্রতিটি প্রজাতির উদ্ভিদের তাদের সর্বনিম্ন, সর্বোত্তম এবং সর্বাধিক তাপমাত্রারর জন্য আলাদা আলাদা মান রয়েছে । এ কারণেই কিছু দেশে গাছপালা উষ্ণ এবং অপর কিছু দেশে শীতল অবস্থায় অধিক বৃদ্ধি পায়। + +✅ ছোট একটি গবেষণা করা যাক। আমাদের বাগান, স্কুল বা স্থানীয় উদ্যানের যে কোনও গাছের জন্য কীভাবে বেস তাপমাত্রা খুঁজে পেতে পারেন কিনা তা দেখুন। + +![A graph showing growth rate rising as temperature rises, then dropping as the temperature goes too high](../../../../images/plant-growth-temp-graph.png) + +উপরের গ্রাফটি তাপমাত্রার গ্রাফের একটি বৃদ্ধির হার দেখায়। বেস তাপমাত্রা পর্যন্ত কোনও বৃদ্ধি নেই। বৃদ্ধির হার পরিমিত তাপমাত্রা পর্যন্ত বৃদ্ধি পায়, তারপরে এই শীর্ষে পৌঁছানোর পরে কমতে থাকে। সর্বোচ্চ তাপমাত্রায় বৃদ্ধি বন্ধ হয়। + +এই গ্রাফের আকার গাছের প্রজাতি থেকে উদ্ভিদ প্রজাতির মধ্যে পরিবর্তিত হয়। কোন কোন ক্ষেত্রে অপটিমাম (পরিমিত) তাপমাত্রার পরে খুব খাড়াভাবে নেমে যায়, আবার কোন কোন উদ্ভিদে বেস তাপমাত্রা থেকে খুবই ধীরে ধীরে বৃদ্ধি পেয়ে পরিমিত তাপমাত্রায় পৌঁছায়। + +> 💁 একজন কৃষকের সর্বোচ্চ ফলন নিশ্চিত করার জন্য, তিনটি তাপমাত্রার মানই জানতে হবে এবং তাদের গাছগুলি বৃদ্ধির গ্রাফের ধরণ বুঝতে হবে। + +যদি কোন কৃষকের তাপমাত্রা নিয়ন্ত্রিত মাধ্যম থাকে, উদাহরণস্বরূপ বাণিজ্যিক হটহাউস, যেখানে তারা তাদের গাছগুলির জন্য অনুকূল তাপমাত্রা নিশ্চিত করতে পারে। যেমন বাণিজ্যিকভাবে এরকম হটহাউসে টমেটোগুলির দ্রুততম বৃদ্ধির জন্য দিনে তাপমাত্রা 25 ডিগ্রি সেন্টিগ্রেড এবং রাতে 20 ডিগ্রি সেলসিয়াস রাখতে হয়। + +> 🍅 কৃত্রিম আলো, সার এর নিয়ন্ত্রণের সাথে তাপমাত্রার মেলবন্ধনের ফলে অর্থ বাণিজ্যিক উৎপাদকরা সারা বছর ধরে তাদের উৎপাদন বজায় রাখতে পারে। + +## চারিপার্শ্বিক তাপমাত্রা পরিমাপ + +আইওটি ডিভাইসের সাথে তাপমাত্রা সেন্সর ব্যবহার করে চারিপার্শ্বের তাপমাত্রা পরিমাপ করা যায়। + +### কাজ - তাপমাত্রা পরিমাপ + +আইওটি ডিভাইসটি ব্যবহার করে তাপমাত্রা পর্যবেক্ষণ করতে, পছন্দ অনুসারে নিচের যেকোন একটি গাইডের মাধ্যমে কাজ শুরু করতে হবে। + +* [Arduino - Wio Terminal](wio-terminal-temp.md) +* [Single-board computer - Raspberry Pi](pi-temp.md) +* [Single-board computer - Virtual device](virtual-device-temp.md) + +## Growing degree days + +Growing degree days (যাকে growing degree units ও বলা হয়) হলো তাপমাত্রার ভিত্তিতে গাছের বৃদ্ধি পরিমাপ করার একটি উপায়। একটি উদ্ভিদে পর্যাপ্ত পরিমাণে জল, পুষ্টি এবং CO2 রয়েছে - এমনটা ধরে নিয়েই, তাপমাত্রার ভিত্তিতে বৃদ্ধির হার নির্ধারণ করা হয়। + +Growing degree days, সংক্ষেপে GDD কে উদিভের বেস তাপমাত্রার উপরে, প্রতিদিনের গড় তাপমাত্রা হিসেবে গণনা করা হয়। প্রতিটি উদ্ভিদে বৃদ্ধি, ফুল হওয়া বা উৎপাদন এবং পরিপক্ক হওয়ার জন্য নির্দিষ্ট সংখ্যক GDD প্রয়োজন। প্রতিদিন যত বেশি জিডিডি হবে, গাছটি তত দ্রুত বাড়বে। + +GDD-এর সম্পূর্ণ সূত্রটি কিছুটা জটিল, তবে একটি সরলীকৃত সমীকরণ রয়েছে যা প্রায়শই একটি কাছাকাছি মান হিসাবে ব্যবহৃত হয়: + +![GDD = T max + T min divided by 2, all minus T base](../../../../images/gdd-calculation.png) + +* **GDD** - growing degree days এর সংখ্যা +* **Tmax** - এটি প্রতিদিনের সর্বোচ্চ তাপমাত্রা (ডিগ্রি সেলসিয়াসে) +* **Tmin** - এটি প্রতিদিনের সর্বনিম্ন তাপমাত্রা (ডিগ্রি সেলসিয়াসে) +* **Tbase** - এটি **উদ্ভিদের** বেইস তাপমাত্রা (ডিগ্রি সেলসিয়াসে) + +> 💁 Tmax এর মান ৩০ ডিগ্রি এর বেশি হলে অথবা Tmin এর মান Tbase এর কম হলে এখানে কিছুটা পরিবর্তন আসে। তবে আমরা এখন আপাতত এই পরিবর্তনগুলো অগ্রাহ্য করবো। + +### উদাহরণ - ভুট্টা 🌽 + +বিভিন্ন জাতের উপর নির্ভর করে, ভুট্টা পরিপক্ক হতে 800 এবং 2,700 জিডিডি প্রয়োজন (যখন বেস তাপমাত্রা 10 ডিগ্রি ্সেলসিয়াস)। + +বেস তাপমাত্রার উপরে প্রথম দিন, নিম্নলিখিত তাপমাত্রা পরিমাপ করা হয়েছিল: + +| পরিমাপ | তাপমাত্রা °C | +| :---------- | :-----: | +| সর্বোচ্চ | 16 | +| সর্বনিম্ন | 12 | + +তাহলে, +* Tmax = 16 +* Tmin = 12 +* Tbase = 10 + +হিসেব করে পাই, + +![GDD = 16 + 12 divided by 2, all minus 10, giving an answer of 4](../../../../images/gdd-calculation-corn.png) + +ঐদিন ভুট্টা 4 জিডিডি পেয়েছিল। এটিকে 800 GDD চাহিদাসম্পন্ন জাত হিসেবে বিবেচনা করলে, উদ্ভিদটির পরিপক্ব হতে আরো 796 GDD প্রয়োজন। + +✅ ছোট একটি গবেষণা করা যাক । বাগান, স্কুল বা স্থানীয় পার্কে যে কোনও উদ্ভিদের পরিপক্কতায় পৌঁছানোর জন্য বা ফসল উৎপাদনের জন্য প্রয়োজনীয় জিডিডি নম্বর নির্ণয় করা যায় কিনা দেখা যাক। + +## তাপমাত্রা সেন্সরের তথ্য দিয়ে GDD নির্ণয় + +গাছপালা নির্দিষ্ট তারিখ ধরে জন্মায় না - উদাহরণস্বরূপ আমরা কোনও বীজ রোপণ করতে রোপন করে এটা বলতে পারবোনা যে গাছটি ঠিক 100 দিন পরে ফলন দিবে। কৃষক হিসাবে আমরা বরং একটি উদ্ভিদ বাড়তে কত সময় নেয় তার ধরে সম্পর্কে মোটামুটি রাখতে পারি এবং সেই ধারণা অনুসারে প্রতিদিন ফসলগুলি প্রস্তুত হচ্ছে কিনা তা পরীক্ষা করে দেখতে পারি। + +এভাবে গাছপালার প্রতি সার্বক্ষণিক নজর রাখাটা বড় খামারে অনেক সমস্যাপূর্ণ বিষয় কেননা এতে প্রচুর লোকবল দরকার এবং কোন ফলন অপ্রত্যাশিতভাবে তাড়াতাড়ি প্রস্তুত হয়ে গেলে, ঝুঁকি রয়েছে যে কৃষক হয়তো নজর এড়িয়ে যেতে পারে। তাপমাত্রা পরিমাপ করে, কৃষক একটি উদ্ভিদ এর জিডিডি গণনা করতে পারে এবং তখন কেবলমাত্র তাদের প্রত্যাশিত পরিপক্কতার সময়ের কাছাকাছি হলেই সার্বক্ষণিক নজরদারি করলেই হয়, এতে অতিরিক্ত শ্রম কমে আসে। +আইওটি ডিভাইস ব্যবহার করে তাপমাত্রার ডেটা সংগ্রহ করে, যখন গাছগুলি পরিপক্কতার কাছাকাছি থাকে তখন একজন কৃষককে স্বয়ংক্রিয়ভাবে অবহিত করা যায়। এর জন্য একটি সাধারণ একটি কার্যধারা হল আইওটি ডিভাইসগুলির দ্বারা তাপমাত্রা পরিমাপ করে, তারপরে MQTT-র মতো কিছু ব্যবহার করে এই টেলিমেট্রি ডেটা ইন্টারনেটে প্রকাশ করতে হবে। সার্ভার কোড তখন এই ডেটা গ্রহণ করে এবং এটি কোথাও সংরক্ষণ করে, যেমন কোনও ডাটাবেস এ। এতে করে এই ডেটাগুলি পরে বিশ্লেষণ করা যেতে পারে - যেমনঃ জিডিডি গণনা করা, নির্দিষ্ট পর্যন্ত প্রতিটি ফসলের জন্য মোট জিডিডি এর হিসেব রাখা এবং কোন উদ্ভিদ পরিপক্কতার কাছাকাছি গেলে, কৃষককে এই বিষয়ে সতর্ক করা। + +![Telemetry data is sent to a server and then saved to a database](../../../../images/save-telemetry-database.png) + +সার্ভার কোড অতিরিক্ত তথ্য যুক্ত করে ডেটা সমৃদ্ধ করতে পারে। উদাহরণস্বরূপ, আইওটি ডিভাইসটি নিজেকে চিহ্নিত করতে একটি সনাক্তকারী/আইডেন্টিফায়ার প্রকাশ করতে পারে এবং সার্ভার কোডটি ডিভাইসের অবস্থান এবং এটি কোন স্থানে কী ফসল পর্যবেক্ষণ করছে তা সন্ধান করতে এটি ব্যবহার করতে পারে। এটি চলমান সময়ের মতো বেসিক ডেটাও যুক্ত করতে পারে কারণ কিছু আইওটি ডিভাইসে সঠিক সময়ের উপর নজর রাখতে প্রয়োজনীয় হার্ডওয়্যার থাকেনা বা ইন্টারনেটের মাধ্যমে সময় এর হিসাব রাখতে অতিরিক্ত কোডের প্রয়োজন হয়। + +✅ বিভিন্ন ফার্মের তাপমাত্রা ভিন্ন ভিন্ন হওয়ার কারণ কী হতে পারে? + +### কাজ - তাপমাত্রা সংক্রান্ত তথ্য প্রকাশ করা + +আইওটি ডিভাইস ব্যবহার করে MQTT এর মাধ্যমে তাপমাত্রার ডেটা প্রকাশের জন্য নীচের যেকোন একটি গাইডের মাধ্যমে কাজ শুরু করতে হবে: + +* [Arduino - Wio Terminal](wio-terminal-temp-publish.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-temp-publish.md) + +### কাজ - তাপমাত্রা সংক্রান্ত তথ্য গ্রহণ ও সংরক্ষণ + +আইওটি ডিভাইসটি টেলিমেট্রি প্রকাশ করার পরে, এমনভাবে কোড লিখতে হবে সার্ভার কোডটি এই ডেটাতে সাবস্ক্রাইব এবং সংরক্ষণ করে। এটি একটি ডেটাবেজে সংরক্ষণের পরিবর্তে, সার্ভার কোড এটি একটি Comma Separated Values (CSV) ফাইলে সংরক্ষণ করবে। CSV ফাইল মানগুলির সারি হিসাবে ডেটা সংরক্ষণ করে; প্রতিটি মান একটি কমা দ্বারা পৃথক করা হয় এবং প্রতিটি রেকর্ড নতুন লাইনে থাকে। ফাইল হিসাবে ডেটা সংরক্ষণ করার জন্য এটি বেশ সুবিধাজনক, যা মানব-পঠনযোগ্য এবং অবশ্যই একটি ভাল উপায়। + +এই CSV ফাইলে দুটি কলাম থাকবে - *তারিখ* এবং *তাপমাত্রা* । এখানে *তারিখ* কলামটিতে সার্ভার কর্তৃক ম্যাসেজ পাওয়ার সময় ও তারিখ থাকে এবং *তাপমাত্রা* সংক্রান্ত তথ্য আসে টেলিমেট্রি থেকে। + +1. টেলিমেট্রিতে সাবস্ক্রাইব করার জন্য সার্ভার কোড তৈরি করতে লেসন 4 এ এই ধাপগুলি পুনরাবৃত্তি করতে হবে। কমান্ডগুলি প্রকাশ করার জন্য আলাদা কোড যুক্ত করার দরকার নেই। + + ধাপগুলো হলোঃ + + * পাইথন ভার্চুয়াল এনভায়রনমেন্ট কনফিগার এবং একটিভেট করা । + + * এরপর paho-mqtt pip package ইন্সটল করতে হবে। + + * টেলিমেট্রিতে যেসকল MQTT messages প্রকাশিত হয়েছে তা একসেস করতে হলে কোড লিখতে হবে। + + > ⚠️ এক্ষেত্রে [লেসন 4 এ প্রদেয়, টেলিমেট্রি ডেটা রিসিভ করার জন্য পাইথন কোড ](../../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker) আমরা অনুসরণ করতে পারি। + + এই প্রজেক্টের জন্য ফোল্ডারের নাম দিই `temperature-sensor-server`. + +1. নিশ্চিত করতে হবে যেন `client_name` এ এই প্রজেক্টের ইঙ্গিত থাকে: + + ```cpp + client_name = id + 'temperature_sensor_server' + ``` + +1. আগে থেকে এসকম ইম্পোর্ট রয়েছে তার নীচে এগুলো যুক্ত করতে হবে: + + ```python + from os import path + import csv + from datetime import datetime + ``` + + এটি ফাইলগুলি পড়ার জন্য একটি লাইব্রেরি ইম্পোর্ট করে । এছাড়াও সিএসভি ফাইলগুলির সাথে যোগাযোগের জন্য একটি লাইব্রেরি এবং তারিখ ও সময়গুলির সংরক্ষণের জন্যে একটি লাইব্রেরি অন্তর্ভুক্ত হয়। + +1. তারপর`handle_telemetry` function এর পূর্বে এই কোড যুক্ত করতে হবে: + + ```python + temperature_file_name = 'temperature.csv' + fieldnames = ['date', 'temperature'] + + if not path.exists(temperature_file_name): + with open(temperature_file_name, mode='w') as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=fieldnames) + writer.writeheader() + ``` + + এই কোডে কিছু কনস্ট্যান্ট ডিক্লেয়ার করা হয়েছে - যে CSV ফাইলে ডেটা রাখা হবে সেটির একং কলাম হেডারগুলোর নামকরণ এর জন্য। কোন সিএসভি ফাইলের প্রথম সারিতে সাধারণত কমা দ্বারা আলাদাকৃত ভাবে কলামের শিরোনাম বা হেডার থাকে। + + কোডটি পরীক্ষা করে দেখ সিএসভি ফাইল ইতিমধ্যে বিদ্যমান কিনা । যদি এটি বিদ্যমান না থাকে তবে এটি প্রথম সারিতে কলাম শিরোনাম দিয়ে তৈরি করা হবে। + +1. `handle_telemetry` function এর পর নিম্নোক্ত কোড যুক্ত করতে হবে: + + ```python + with open(temperature_file_name, mode='a') as temperature_file: + temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames) + temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']}) + ``` + + এই কোড CSV file টি খুলে এতে নতুন সারি যুক্ত করবে। সেই সারিতে আইওটি ডিভাইস থেকে প্রাপ্ত তাপমাত্রা এবং তখনকার সময় ও তারিখ আমাদের বোধগম্য ফরম্যাটে রাখা হয়। এই তথ্যসমূহ [ISO 8601 ফরম্যাট](https://wikipedia.org/wiki/ISO_8601) অনুসরণ করে, নির্দিষ্ট টাইমজোন সহ, তবে এখানে মাইক্রোসেকেন্ড আকারে সময় সংরক্ষিত হয়। + +1. আগের মতই এই কোডটি রান করতে হবে - এদিকে এটাও নিশ্চিত করতে হবে যে আইওটি ডিভাইস থেকে ডেটা পাঠানো হচ্ছে। দেখা যাবে `temperature.csv`নামে একটি ফোল্ডার তৈরী হয়েছে একই ফোল্ডারে। এটি খুললে দেখা যাবে, তারিখ-সময় এবং তাপমাত্রা রয়েছে। + + ```output + date,temperature + 2021-04-19T17:21:36-07:00,25 + 2021-04-19T17:31:36-07:00,24 + 2021-04-19T17:41:36-07:00,25 + ``` + +1. তথ্য সংগ্রহের জন্য এই কোডটিও রান করি। জিডিডি গণনার জন্য পর্যাপ্ত ডেটা সংগ্রহ করার জন্য আমাদের পুরো দিন ধরে এটি রান করানো উচিত। + + > 💁 যদি আমরা Virtual IoT Device ব্যবহার করে থাকি, সেক্ষেত্রে র‍্যান্ডম চেকবাক্সটি নির্বাচন করতে হবে এবং প্রতিবার তাপমাত্রার মান একই আসার বিষয়টি এড়াতে একটি সীমা নির্ধারণ করতে হবে। + ![Select the random checkbox and set a range](../../../../images/select-the-random-checkbox-and-set-a-range.png) + + > 💁 যদি এটি একটি পুরো দিন চালনা করতে চাই, তবে আমাদেরকে অবশ্যই এটি নিশ্চিত করতে হবে, যে সার্ভারে কোডটি চলছে সেই কম্পিউটারটি সারাদিন কাজ করবে। এক্ষেত্রে হয় আমাদেরকে পাওয়ার সেটিং ঠিক করে নিতে হবে অথবা [সিস্টেমকে একটিভ রাখার পাইথন স্ক্রিপ্ট](https://github.com/jaqsparow/keep-system-active) এর মতো কিছু ব্যবহার করতে হবে। + +> 💁 এই কোডগুলো [code-server/temperature-sensor-server](code-server/temperature-sensor-server) ফোল্ডারে পাওয়া যাবে। + +### কাজ - সঞ্চিত ডেটা ব্যবহার করে জিডিডি গণনাকরণ + +একবার সার্ভার তাপমাত্রার ডেটা ক্যাপচার করে নিলে, একটি গাছের জন্য জিডিডি গণনা করা যায়। + +এটি ম্যানুয়ালি করার ধাপগুলি হল: + +1. উদ্ভিদের জন্য আগে বেস তাপমাত্রা নির্ণয়. যেমন, সট্রবেরির জন্য এটি ১০°C. + +1. এরপর `temperature.csv`থেকে, দিনের সর্বোচ্চ এবং সর্বনিম্ন তাপমাত্রা বের করতে হবে। + +1. পূর্বে প্রদত্ত সূত্র ব্যবহার করে জিডিডি গণনা করতে হবে। + +উদাহরণস্বরূপ, যদি দিনের সর্বোচ্চ তাপমাত্রা ২৫°C হয় এবং সর্বনিম্ন ১২°C হয়: + +![GDD = 25 + 12 divided by 2, then subtract 10 from the result giving 8.5](../../../../images/gdd-calculation-strawberries.png) + +* 25 + 12 = 37 +* 37 / 2 = 18.5 +* 18.5 - 10 = 8.5 + +এখানে স্ট্রবেরির জন্য মান এসেছে **8.5** GDD । যেহেতু স্ট্রবেরির ফলনের জন্য ২৫০ জিডিডি প্রয়োজন, তাহলে আরো অনেকদিন হাতে রয়েছে। + +--- + +## 🚀 চ্যালেঞ্জ + +উদ্ভিদের বৃদ্ধির জন্য তাপ ছাড়াও আরো কিছু বিষয় প্রয়োজন। আর কি কি জিনিস দরকার এক্ষেত্রে? +এই অতিরিক্ত ফ্যাক্টরগুলোর জন্য কী সেন্সর রয়েছে যা সেগুলি পরিমাপ করতে পারে ? এই স্তরগুলি নিয়ন্ত্রণ করতে একচুয়েটর ব্যবহার করা যায়? উদ্ভিদের বৃদ্ধি অনুকূল করতে কীভাবে এক বা একাধিক আইওটি ডিভাইস যুক্ত করলে ভালো ফল আসবে ? + +## লেকচার পরবর্তী কুইজ + +[লেকচার পরবর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/10) + +## রিভিউ এবং স্ব-অধ্যয়ন + +ডিজিটাল কৃষিব্যবস্থা সম্পর্কে আরো জানতে [Digital Agriculture Wikipedia page](https://wikipedia.org/wiki/Digital_agriculture) পড়া যায়। এছাড়াও [Precision Agriculture](https://wikipedia.org/wiki/Precision_agriculture) এর ব্যাপারেও আরো জানার চেষ্টা করা উচিত। + +জিডিডি গণনা এখানে দেওয়া সরলীকৃত সূত্রের চেয়ে কিছুটা জটিল। এই সংক্রান্ত বিষয়ে আরো জানতে এবং বেস তাপমাত্রার নিচে দৈনিক তাপমাত্রা হলে তা কিভাবে ম্যানেজ করা যায় সেই সংক্রান্ত তথ্য [Growing Degree Day Wikipedia page](https://wikipedia.org/wiki/Growing_degree-day) এ পাওয়া যাবে। + +## এসাইনমেন্ট + +[জুপিটার নোটবুক ব্যবহার করে জিডিডি ডেটা প্রদর্শন করা](assignment.md) diff --git a/2-farm/lessons/1-predict-plant-growth/translations/assignment.bn.md b/2-farm/lessons/1-predict-plant-growth/translations/assignment.bn.md new file mode 100644 index 00000000..342e66ed --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/assignment.bn.md @@ -0,0 +1,43 @@ +# জুপিটার নোটবুক ব্যবহার করে জিডিডি ডেটা প্রদর্শন করা + +## নির্দেশাবলী + +এই পাঠে আমরা আইওটি সেন্সর ব্যবহার করে জিডিডি ডেটা সংগ্রহ করেছি। ভাল জিডিডি ডেটা পেতে, আমাদেরকে একাধিক দিনের জন্য ডেটা সংগ্রহ করতে হবে। তাপমাত্রার ডেটা ভিজ্যুয়ালাইজ করতে এবং জিডিডি গণনা করা বা ডেটা বিশ্লেষণ করতে [জুপিটার নোটবুকস](https://jupyter.org) এর মতো ট্যুল ব্যবহার করা যেতে পারে। + +কিছুদিন ডেটা সংগ্রহের মাধ্যমে কাজ শুরু করতে হবে। আইওটি ডিভাইসটি চলমান সময়ে আমাদের সার্ভার কোড যে চলমান রয়েছে তা নিশ্চিত করতে হবে, হয় পাওয়ার ম্যানেজমেন্ট সেটিংস ঠিক করে বা কোন [ সিস্টেমকে অ্যাক্টিভ রাখার পাইথন স্ক্রিপ্ট](https://github.com/jaqsparow/keep-system-active) এর মতো কিছু চালিয়ে। + +একবার তাপমাত্রার ডেটা পেয়ে গেলে আমরা এটি দেখতে এবং জিডিডি গণনা করতে এই রেপোতে জুপিটার নোটবুকটি ব্যবহার করতে পার্রি। জুপিটার নোটবুক এ ব্লক হিসেবে *সেল* এ কোড এবং নির্দেশাবলী মিশ্রিত থাকে, এবং সাধারণত পাইথনেই কোড করা হয়। নির্দেশাবলী পড়ে, তারপরে কোডের প্রতিটি ব্লক বাই ব্লক রান করতে হবে। এখানে প্রদত্ত কোডটি এডিট করা যেতে পারে। উদাহরণস্বরূপ, এই নোটবুকটিতে, য়ামরা আমাদের গাছের জন্য জিডিডি গণনা করতে ব্যবহৃত বেস তাপমাত্রা, উদ্ভিদভেদে ভিন্ন ভিন্ন হবে। + +1. `gdd-calculation` নামে একটি ফোল্ডার খুলতে হবে। + +1. [gdd.ipynb](./code-notebook/gdd.ipynb) ডাউনলোড করে তার একটি কপি `gdd-calculation` ফোল্ডারে রাখতে হবে। + +1. MQTT সার্ভার দ্বারা তৈরী `temperature.csv` ফাইলটি কপি করতে হবে। + +1. `gdd-calculation` ফোল্ডারে নতুন পাইথন এনভায়রনমেন্ট তৈরী করতে হবে। + +1. জুপিটার নোটবুকে কিছু পিপ প্যাকেজ ইন্সটল করতে হবে। + + ```sh + pip install --upgrade pip + pip install pandas + pip install matplotlib + pip install jupyter + ``` + +1. নোটবুকটি জুপিটারে রান করতে হবে + + ```sh + jupyter notebook gdd.ipynb + ``` + + জুপিটারটি শুরু হয়ে ব্রাউজারে নোটবুকটি খুলবে। তাপমাত্রা পরিমাপ করা এবং জিডিডি গণনা করতে নোটবুকের নির্দেশাবলীর মাধ্যমে কাজ করতে হবে। + + ![The jupyter notebook](../../../images/gdd-jupyter-notebook.png) + +## এসাইনমেন্ট মূল্যায়ন মানদন্ড + +| ক্রাইটেরিয়া | দৃষ্টান্তমূলক ব্যখ্যা (সর্বোত্তম) | পর্যাপ্ত ব্যখ্যা (মাঝারি) | আরো উন্নতির প্রয়োজন (নিম্ন) | +| -------- | --------- | -------- | ----------------- | +| ডেটা সংগ্রহ করা | কমপক্ষে ২টি সম্পূর্ণ দিনের ডেটা সংগ্রহ করা | কমপক্ষে ১টি সম্পূর্ণ দিনের ডেটা সংগ্রহ করা | কিছু ডেটা সংগ্রহ করা | +| জিডিডি গণনা করা | সফলতার সাথে নোটবুক রান করে জিডিডি গণনা | সফলতার সাথে নোটবুক রান করা | নোটবুক রান করতে ব্যার্থ | diff --git a/2-farm/lessons/2-detect-soil-moisture/README.md b/2-farm/lessons/2-detect-soil-moisture/README.md index 5e9b1685..9b7605ec 100644 --- a/2-farm/lessons/2-detect-soil-moisture/README.md +++ b/2-farm/lessons/2-detect-soil-moisture/README.md @@ -1,5 +1,9 @@ # Detect soil moisture +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-6.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/11) diff --git a/2-farm/lessons/3-automated-plant-watering/README.md b/2-farm/lessons/3-automated-plant-watering/README.md index 728b3f95..780faa9e 100644 --- a/2-farm/lessons/3-automated-plant-watering/README.md +++ b/2-farm/lessons/3-automated-plant-watering/README.md @@ -1,5 +1,9 @@ # Automated plant watering +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-7.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/13) diff --git a/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md b/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md index 718b0a18..66da93fc 100644 --- a/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md +++ b/2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md @@ -1,5 +1,9 @@ # Migrate your plant to the cloud +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-8.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/15) diff --git a/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/2-farm/lessons/5-migrate-application-to-the-cloud/README.md index 0e8190fc..3d428cec 100644 --- a/2-farm/lessons/5-migrate-application-to-the-cloud/README.md +++ b/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -1,5 +1,9 @@ # Migrate your application logic to the cloud +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-9.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/17) diff --git a/2-farm/lessons/6-keep-your-plant-secure/README.md b/2-farm/lessons/6-keep-your-plant-secure/README.md index 7614e166..5d15dc52 100644 --- a/2-farm/lessons/6-keep-your-plant-secure/README.md +++ b/2-farm/lessons/6-keep-your-plant-secure/README.md @@ -1,5 +1,9 @@ # Keep your plant secure +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-10.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/19) diff --git a/2-farm/translations/.dummy.md b/2-farm/translations/.dummy.md deleted file mode 100644 index 6e7db247..00000000 --- a/2-farm/translations/.dummy.md +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy File - -This file acts as a placeholder for the `translations` folder.
-**Please remove this file after adding the first translation** - -For the instructions, follow the directives in the [translations guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/TRANSLATIONS.md) . - -## THANK YOU -We truly appreciate your efforts! diff --git a/2-farm/translations/README.bn.md b/2-farm/translations/README.bn.md new file mode 100644 index 00000000..3a87cd26 --- /dev/null +++ b/2-farm/translations/README.bn.md @@ -0,0 +1,20 @@ +# কৃষিকাজে IoT + +জনসংখ্যা যেমন বাড়ছে, তেমনি কৃষির চাহিদাও বাড়ছে। কৃষিজমির পরিমাণ অতোটা পরিবর্তন না হলেও, জলবায়ুর পরিবর্তন ঠিকই হচ্ছে - যা কৃষকদের আরও বেশি সমস্যার মুখে ফেলে দিচ্ছে, বিশেষত সেই ২বিলিয়ন [জীবিকা নির্বাহী কৃষক](https://wikipedia.org/wiki/Subsistence_agriculture) যাদের ফসল বেড়ে ওঠার উপর নির্ভর করেই তাদের পরিবারের অন্নসংস্থান হয়। কোন ধরণের ফসল উৎপাদন করা যাবে, কখন কাজ শুরু করা উচিত, ফলনের বৃদ্ধি, শারিরীক শ্রমের পরিমাণ হ্রাস এবং কীটপতঙ্গগুলি সনাক্ত ও তাদেরকে বিনাশ করার বিষয়ে কৃষকদের অনেকাংশে সাহায্য করতে পারে আইওটি । + +এই ৬টি লেসনে আমরা শিখবো কীভাবে কৃষিকাজ উন্নত ও স্বয়ংক্রিয় করতে ইন্টারনেট অফ থিংস প্রয়োগ করা যায়। + +> 💁 এই লেসনগুলোতে আমরা ক্লাউড রিসোর্স ব্যবহার করবো। যদি এই অধ্যায়ের সমস্ত পাঠ সম্পূর্ণ করা সম্ভব নাও হয়, তবুও [Clean up your project](../clean-up.md) অংশটি অবশ্যই দেখে নিতে হবে। + +## বিষয়াবলী + +1. [আইওটি দ্বারা উদ্ভিদ বৃদ্ধির পূর্বাভাস](lessons/1-predict-plant-growth/README.md) +1. [মাটির আর্দ্রতা সনাক্তকরণ](lessons/2-detect-soil-moisture/README.md) +1. [স্বয়ংক্রিয়ভাবে গাছে সেচকার্য](lessons/3-automated-plant-watering/README.md) +1. [উদ্ভিদকে ক্লাউড থেকে নিয়ন্ত্রণ](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [ক্লাউড থেকে এপ্লিকেশন নিয়ন্ত্রণ](lessons/5-migrate-application-to-the-cloud/README.md) +1. [উদ্ভিদের নিরাপত্তা নিশ্চিতকরণ](lessons/6-keep-your-plant-secure/README.md) + +## ক্রেডিট + + ♥️ প্রতিটি লেসনই ভালোবাসার সাথে তৈরী করেছেন [Jim Bennett](https://GitHub.com/JimBobBennett) diff --git a/3-transport/lessons/1-location-tracking/README.md b/3-transport/lessons/1-location-tracking/README.md index 418e0275..a26f8b0a 100644 --- a/3-transport/lessons/1-location-tracking/README.md +++ b/3-transport/lessons/1-location-tracking/README.md @@ -1,5 +1,9 @@ # Location tracking +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-11.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/21) diff --git a/3-transport/lessons/2-store-location-data/README.md b/3-transport/lessons/2-store-location-data/README.md index fe1eea4f..d42d6781 100644 --- a/3-transport/lessons/2-store-location-data/README.md +++ b/3-transport/lessons/2-store-location-data/README.md @@ -1,5 +1,9 @@ # Store location data +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-12.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/23) diff --git a/3-transport/lessons/3-visualize-location-data/README.md b/3-transport/lessons/3-visualize-location-data/README.md index 27c27ddb..903c697d 100644 --- a/3-transport/lessons/3-visualize-location-data/README.md +++ b/3-transport/lessons/3-visualize-location-data/README.md @@ -1,5 +1,9 @@ # Visualize location data +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-13.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of Azure Maps with IoT, a service that will be covered in this lesson. [![Azure Maps - The Microsoft Azure Enterprise Location Platform](https://img.youtube.com/vi/P5i2GFTtb2s/0.jpg)](https://www.youtube.com/watch?v=P5i2GFTtb2s) diff --git a/3-transport/lessons/4-geofences/README.md b/3-transport/lessons/4-geofences/README.md index 77b67eec..2fdf1d2f 100644 --- a/3-transport/lessons/4-geofences/README.md +++ b/3-transport/lessons/4-geofences/README.md @@ -1,5 +1,9 @@ # Geofences +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-14.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of geofences and how to use them in Azure Maps, topics that will be covered in this lesson: [![Geofencing with Azure Maps from the Microsoft Developer IoT show](https://img.youtube.com/vi/nsrgYhaYNVY/0.jpg)](https://www.youtube.com/watch?v=nsrgYhaYNVY) diff --git a/4-manufacturing/README.md b/4-manufacturing/README.md index b68b0319..6f0ec4e3 100644 --- a/4-manufacturing/README.md +++ b/4-manufacturing/README.md @@ -21,4 +21,4 @@ In these 4 lessons you'll learn how to train image-based AI models to detect fru ## Credits -All the lessons were written with ♥️ by [Jim Bennett](https://GitHub.com/JimBobBennett) +All the lessons were written with ♥️ by [Jen Fox](https://github.com/jenfoxbot) and [Jim Bennett](https://GitHub.com/JimBobBennett) diff --git a/4-manufacturing/lessons/1-train-fruit-detector/README.md b/4-manufacturing/lessons/1-train-fruit-detector/README.md index ee8edee5..f51c8d80 100644 --- a/4-manufacturing/lessons/1-train-fruit-detector/README.md +++ b/4-manufacturing/lessons/1-train-fruit-detector/README.md @@ -1,5 +1,9 @@ # Train a fruit quality detector +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-15.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of the Azure Custom Vision service, a service that will be covered in this lesson. [![Custom Vision – Machine Learning Made Easy | The Xamarin Show](https://img.youtube.com/vi/TETcDLJlWR4/0.jpg)](https://www.youtube.com/watch?v=TETcDLJlWR4) diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/README.md b/4-manufacturing/lessons/2-check-fruit-from-device/README.md index 72e5a04b..ad4ff02a 100644 --- a/4-manufacturing/lessons/2-check-fruit-from-device/README.md +++ b/4-manufacturing/lessons/2-check-fruit-from-device/README.md @@ -1,5 +1,9 @@ # Check fruit quality from an IoT device +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-16.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/31) diff --git a/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md b/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md index 2ff87dd2..70d13047 100644 --- a/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md +++ b/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md @@ -1,5 +1,9 @@ # Run your fruit detector on the edge +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-17.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of running image classifiers on IoT devices, the topic that is covered in this lesson. [![Custom Vision AI on Azure IoT Edge](https://img.youtube.com/vi/_K5fqGLO8us/0.jpg)](https://www.youtube.com/watch?v=_K5fqGLO8us) diff --git a/4-manufacturing/lessons/4-trigger-fruit-detector/README.md b/4-manufacturing/lessons/4-trigger-fruit-detector/README.md index 5a9d5f33..addc74db 100644 --- a/4-manufacturing/lessons/4-trigger-fruit-detector/README.md +++ b/4-manufacturing/lessons/4-trigger-fruit-detector/README.md @@ -1,5 +1,9 @@ # Trigger fruit quality detection from a sensor +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-18.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/35) diff --git a/5-retail/lessons/1-train-stock-detector/README.md b/5-retail/lessons/1-train-stock-detector/README.md index e9dbdcbc..3d3d92bb 100644 --- a/5-retail/lessons/1-train-stock-detector/README.md +++ b/5-retail/lessons/1-train-stock-detector/README.md @@ -1,5 +1,9 @@ # Train a stock detector +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-19.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of Object Detection the Azure Custom Vision service, a service that will be covered in this lesson. [![Custom Vision 2 - Object Detection Made Easy | The Xamarin Show](https://img.youtube.com/vi/wtTYSyBUpFc/0.jpg)](https://www.youtube.com/watch?v=wtTYSyBUpFc) @@ -105,7 +109,7 @@ You can train an object detector using Custom Vision, in a similar way to how yo Call your project `stock-detector`. - When you create your project, make sure to use the `stock-detector-training` resource you created earlier. Use *Object Detection* project type, and the *Products on Shelves* domain. + When you create your project, make sure to use the `stock-detector-training` resource you created earlier. Use the *Object Detection* project type, and the *Products on Shelves* domain. ![The settings for the custom vision project with the name set to fruit-quality-detector, no description, the resource set to fruit-quality-detector-training, the project type set to classification, the classification types set to multi class and the domains set to food](../../../images/custom-vision-create-object-detector-project.png) @@ -135,7 +139,7 @@ To train your model you will need a set of images containing the objects you wan ![Tagging some tomato paste](../../../images/object-detector-tag-tomato-paste.png) - > 💁 If you have more than 15 images for each object, you can train after 15 then use the **Suggested tags** feature. This will use the trained model to detect the objecs in the untagged image. You can then confirm the detected objects, or reject and re-draw the bounding boxes. This can save a *lot* of time. + > 💁 If you have more than 15 images for each object, you can train after 15 then use the **Suggested tags** feature. This will use the trained model to detect the objects in the untagged image. You can then confirm the detected objects, or reject and re-draw the bounding boxes. This can save a *lot* of time. 1. Follow the [Train the detector section of the Build an object detector quickstart on the Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/get-started-build-detector?WT.mc_id=academic-17441-jabenn#train-the-detector) to train the object detector on your tagged images. diff --git a/5-retail/lessons/2-check-stock-device/README.md b/5-retail/lessons/2-check-stock-device/README.md index 2ce36dcb..b83f7686 100644 --- a/5-retail/lessons/2-check-stock-device/README.md +++ b/5-retail/lessons/2-check-stock-device/README.md @@ -1,5 +1,9 @@ # Check stock from an IoT device +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-20.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/39) diff --git a/6-consumer/lessons/1-speech-recognition/README.md b/6-consumer/lessons/1-speech-recognition/README.md index 30887071..fda6f9b4 100644 --- a/6-consumer/lessons/1-speech-recognition/README.md +++ b/6-consumer/lessons/1-speech-recognition/README.md @@ -1,5 +1,9 @@ # Recognize speech with an IoT device +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-21.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of the Azure speech service, a topic that will be covered in this lesson: [![How to get started using your Cognitive Services Speech resource from the Microsoft Azure YouTube channel](https://img.youtube.com/vi/iW0Fw0l3mrA/0.jpg)](https://www.youtube.com/watch?v=iW0Fw0l3mrA) diff --git a/6-consumer/lessons/2-language-understanding/README.md b/6-consumer/lessons/2-language-understanding/README.md index e6da5a28..94556dee 100644 --- a/6-consumer/lessons/2-language-understanding/README.md +++ b/6-consumer/lessons/2-language-understanding/README.md @@ -1,5 +1,9 @@ # Understand language +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-22.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/43) diff --git a/6-consumer/lessons/3-spoken-feedback/README.md b/6-consumer/lessons/3-spoken-feedback/README.md index 3cff7a3f..7352b568 100644 --- a/6-consumer/lessons/3-spoken-feedback/README.md +++ b/6-consumer/lessons/3-spoken-feedback/README.md @@ -1,5 +1,9 @@ # Set a timer and provide spoken feedback +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-23.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/45) @@ -117,6 +121,7 @@ SSML has ways to change how words are spoken, such as adding emphasis to certain * Read more on speech synthesis on the [Speech synthesis page on Wikipedia](https://wikipedia.org/wiki/Speech_synthesis) * Read more on ways criminals are using speech synthesis to steal on the [Fake voices 'help cyber crooks steal cash' story on BBC news](https://www.bbc.com/news/technology-48908736) +* Learn more about the risks to voice actors from synthesized versions of their voices in the [This TikTok Lawsuit Is Highlighting How AI Is Screwing Over Voice Actors article on Vice](https://www.vice.com/en/article/z3xqwj/this-tiktok-lawsuit-is-highlighting-how-ai-is-screwing-over-voice-actors) ## Assignment diff --git a/6-consumer/lessons/4-multiple-language-support/README.md b/6-consumer/lessons/4-multiple-language-support/README.md index 09f42a9c..9e7eb8d1 100644 --- a/6-consumer/lessons/4-multiple-language-support/README.md +++ b/6-consumer/lessons/4-multiple-language-support/README.md @@ -1,5 +1,9 @@ # Support multiple languages +![A sketchnote overview of this lesson](../../../sketchnotes/lesson-24.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + This video gives an overview of the Azure speech services, covering speech to text and text to speech from earlier lessons, as well as translating speech, a topic covered in this lesson: [![Recognizing speech with a few lines of Python from Microsoft Build 2020](https://img.youtube.com/vi/h6xbpMPSGEA/0.jpg)](https://www.youtube.com/watch?v=h6xbpMPSGEA) @@ -44,7 +48,7 @@ For example, translating "Hello world" from English into French can be performed Substitutions don't work when different languages use different ways of saying the same thing. For example, the English sentence "My name is Jim", translates into "Je m'appelle Jim" in French - literally "I call myself Jim". "Je" is French for "I", "moi" is me, but is concatenated with the verb as it starts with a vowel, so becomes "m'", "appelle" is to call, and "Jim" isn't translated as it's a name, and not a word that can be translated. Word ordering also becomes an issue - a simple substitution of "Je m'appelle Jim" becomes "I myself call Jim", with a different word order to English. -> 💁 Some words are never translated - my name is Jim regardless of which language is used to introduce me. +> 💁 Some words are never translated - my name is Jim regardless of which language is used to introduce me. When translating to languages that use different alphabets, or use different letters for different sounds, then words can be *transliterated*, that is selecting letters or characters that give the appropriate sound to sound the same as the given word. Idioms are also a problem for translation. These are phrases that have an understood meaning that is different from a direct interpretation of the words. For example, in English the idiom "I've got ants in my pants" does not literally refer to having ants in your clothing, but to being restless. If you translated this to German, you would end up confusing the listener, as the German version is "I have bumble bees in the bottom". diff --git a/README.md b/README.md index 2024a7a1..15eac171 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ Azure Cloud Advocates at Microsoft are pleased to offer a 12-week, 24-lesson cur The projects cover the journey of food from farm to table. This includes farming, logistics, manufacturing, retail and consumer - all popular industry areas for IoT devices. -![A road map for the course showing 24 lessons covering intro, farming, transport, processing, retail and cooking](sketchnotes/Roadmap.png) +![A road map for the course showing 24 lessons covering intro, farming, transport, processing, retail and cooking](sketchnotes/Roadmap.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. **Hearty thanks to our authors [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), and our sketchnote artist [Nitya Narasimhan](https://github.com/nitya).** @@ -24,11 +26,13 @@ The projects cover the journey of food from farm to table. This includes farming > **Students**, to use this curriculum on your own, fork the entire repo and complete the exercises on your own, starting with a pre-lecture quiz, then reading the lecture and completing the rest of the activities. Try to create the projects by comprehending the lessons rather than copying the solution code; however that code is available in the /solutions folders in each project-oriented lesson. Another idea would be to form a study group with friends and go through the content together. For further study, we recommend [Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn). + ## Pedagogy @@ -40,13 +44,15 @@ In addition, a low-stakes quiz before a class sets the intention of the student Each project is be based around real-world hardware available to students and hobbyists. Each project looks into the specific project domain, providing relevant background knowledge. To be a successful developer it helps to understand the domain in which you are solving problems, providing this background knowledge allows students to think about their IoT solutions and learnings in the context of the kind of real-world problem that they might be asked to solve as an IoT developer. Students learn the 'why' of the solutions they are building, and get an appreciation of the end user. -We have two choices of IoT hardware to use for the projects depending on personal preference, programming language knowledge or preferences, learning goals and availability. We have also provided a 'virtual hardware' version for those who don't have access to hardware, or want to learn mode before committing to a purchase. You can read more and find a 'shopping list' on the [hardware page](./hardware.md). +## Hardware + +We have two choices of IoT hardware to use for the projects depending on personal preference, programming language knowledge or preferences, learning goals and availability. We have also provided a 'virtual hardware' version for those who don't have access to hardware, or want to learn mode before committing to a purchase. You can read more and find a 'shopping list' on the [hardware page](./hardware.md), including links to buy complete kits from our friends at Seeed Studio. > 💁 Find our [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md), and [Translation](TRANSLATIONS.md) guidelines. We welcome your constructive feedback! ## Each lesson includes: -- optional sketchnote +- sketchnote - optional supplemental video - pre-lesson warmup quiz - written lesson @@ -92,6 +98,15 @@ We have two choices of IoT hardware to use for the projects depending on persona You can run this documentation offline by using [Docsify](https://docsify.js.org/#/). Fork this repo, [install Docsify](https://docsify.js.org/#/quickstart) on your local machine, and then in the root folder of this repo, type `docsify serve`. The website will be served on port 3000 on your localhost: `localhost:3000`. +### PDF + +You can generate a PDF of this content for offline access if needed. To do this, make sure you have [npm installed](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) and run the following commands in the root folder of this repo: + +```sh +npm i +npm run convert +``` + ## Image attributions You can find all the attributions for the images used in this curriculum where required in the [Attributions](./attributions.md). \ No newline at end of file diff --git a/clean-up.md b/clean-up.md index 87de782c..7746e38d 100644 --- a/clean-up.md +++ b/clean-up.md @@ -37,3 +37,5 @@ Are you sure you want to perform this operation? (y/n): Enter `y` to confirm and delete the Resource Group. It will take a while to delete all the services. + +> 💁 You can read more about deleting resource groups on the [Azure Resource Manager resource group and resource deletion documentation on Microsoft Docs](https://docs.microsoft.com/azure/azure-resource-manager/management/delete-resource-group?tabs=azure-cli&WT.mc_id=academic-17441-jabenn) \ No newline at end of file diff --git a/hardware.md b/hardware.md index f8f9df06..62678c81 100644 --- a/hardware.md +++ b/hardware.md @@ -16,8 +16,17 @@ You will also need a few non-technical items, such as soil or a pot plant, and f Seeed Studios have very kindly made all the hardware available as easy to purchase kits: -* [IoT for beginners with Seeed and Microsoft - Wio Terminal Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Wio-Terminal-Starter-Kit-p-5006.html) -* [IoT for beginners with Seeed and Microsoft - Raspberry Pi 4 Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit.html) +### Arduino - Wio Terminal + +**[IoT for beginners with Seeed and Microsoft - Wio Terminal Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Wio-Terminal-Starter-Kit-p-5006.html)** + +[![The Wio Terminal hardware kit](./images/wio-hardware-kit.png)](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Wio-Terminal-Starter-Kit-p-5006.html) + +### Raspberry Pi + +**[IoT for beginners with Seeed and Microsoft - Raspberry Pi 4 Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit.html)** + +[![The Raspberry Pi Terminal hardware kit](./images/pi-hardware-kit.png)](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit.html) ## Arduino diff --git a/images/Diagrams.sketch b/images/Diagrams.sketch index aa14d58c..53c08897 100644 Binary files a/images/Diagrams.sketch and b/images/Diagrams.sketch differ diff --git a/images/fruit-quality-detector-message-flow.png b/images/fruit-quality-detector-message-flow.png index 311a527f..e76e9a37 100644 Binary files a/images/fruit-quality-detector-message-flow.png and b/images/fruit-quality-detector-message-flow.png differ diff --git a/images/pi-hardware-kit.png b/images/pi-hardware-kit.png new file mode 100644 index 00000000..a26107f8 Binary files /dev/null and b/images/pi-hardware-kit.png differ diff --git a/images/wio-hardware-kit.png b/images/wio-hardware-kit.png new file mode 100644 index 00000000..4e3dad3b Binary files /dev/null and b/images/wio-hardware-kit.png differ diff --git a/package-lock.json b/package-lock.json index 14927ed5..29bec53a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,2791 @@ { "name": "iot-for-beginners", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "iot-for-beginners", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "docsify-to-pdf": "0.0.5" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "dependencies": { + "callsites": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "dev": true, + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true, + "optional": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/docsify": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.12.1.tgz", + "integrity": "sha512-7v4UlCYLTmb83leJLIlheQlQ8kDTbTxcpMttRg0Uf92Nl//m0AcKFHoLLo5HHS4UhnO0KhDV8SKCdTR279zI9A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "dompurify": "^2.2.6", + "marked": "^1.2.9", + "medium-zoom": "^1.0.6", + "opencollective-postinstall": "^2.0.2", + "prismjs": "^1.23.0", + "strip-indent": "^3.0.0", + "tinydate": "^1.3.0", + "tweezer.js": "^1.4.0" + } + }, + "node_modules/docsify-cli": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/docsify-cli/-/docsify-cli-4.4.3.tgz", + "integrity": "sha512-oI/cD04b+hklNd9yKiN9p9EqGx9UKL6p4D0J3fS9L5fpwOti1F8p2rshGJTyArxUlw6EeEBtaJd4rzPzBkK+Lw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "connect": "^3.6.0", + "connect-livereload": "^0.6.0", + "cp-file": "^7.0.0", + "docsify": "^4.12.1", + "docsify-server-renderer": ">=4.10.0", + "enquirer": "^2.3.6", + "fs-extra": "^8.1.0", + "get-port": "^5.0.0", + "livereload": "^0.9.1", + "lru-cache": "^5.1.1", + "open": "^6.4.0", + "serve-static": "^1.12.1", + "update-notifier": "^4.1.0", + "yargonaut": "^1.1.2", + "yargs": "^14.2.0" + }, + "bin": { + "docsify": "bin/docsify" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6" + } + }, + "node_modules/docsify-server-renderer": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/docsify-server-renderer/-/docsify-server-renderer-4.12.1.tgz", + "integrity": "sha512-IYakkc+UxPS89N/Mq8MF4SKTQ1gtxN5nDEFAnJPf5TvQO+1fuxszHgv/hMprG5z/ms7PJb1w4nMykUfRW36+/A==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "docsify": "^4.12.0", + "dompurify": "^2.2.6", + "node-fetch": "^2.6.0", + "resolve-pathname": "^3.0.0" + } + }, + "node_modules/docsify-server-renderer/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/docsify-server-renderer/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/docsify-to-pdf": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/docsify-to-pdf/-/docsify-to-pdf-0.0.5.tgz", + "integrity": "sha512-0ErhTv5wuqxzBe3JYS8kcbLZ1kbdHgnWC2ZxFkaDrL7j7rebDL+fueT+kuLCsICinvi596DOwyKy0j2a8wc/7Q==", + "dev": true, + "dependencies": { + "colors": "^1.3.3", + "docsify-cli": "^4.3.0", + "find-free-port": "^2.0.0", + "is-url": "^1.2.4", + "lodash": "^4.17.11", + "markdown-link-extractor": "^1.2.0", + "puppeteer": "^1.12.2", + "rcfile": "^1.0.3", + "rimraf": "^2.6.3", + "yesno": "^0.2.0" + }, + "bin": { + "converter": ".bin/cli.js", + "docsify-to-pdf": ".bin/cli.js" + } + }, + "node_modules/dompurify": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.9.tgz", + "integrity": "sha512-+9MqacuigMIZ+1+EwoEltogyWGFTJZWU3258Rupxs+2CGs4H914G9er6pZbsme/bvb5L67o2rade9n21e4RW/w==", + "dev": true + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figlet": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", + "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-free-port": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-free-port/-/find-free-port-2.0.0.tgz", + "integrity": "sha1-SyLl9leesaOMQaxryz7+0bbamxs=", + "dev": true + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.2.tgz", + "integrity": "sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA==", + "dev": true + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/markdown-link-extractor": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-1.3.0.tgz", + "integrity": "sha512-1qXoYqhsU5qgWtUF9HQlBF82jRrakENh+7nmPUxoMJw13kf92jzb72EchrSsw5vdqbDLJurkpNL50xLFRhjmbw==", + "dev": true, + "dependencies": { + "marked": "^2.0.5" + } + }, + "node_modules/markdown-link-extractor/node_modules/marked": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.1.tgz", + "integrity": "sha512-5XFS69o9CzDpQDSpUYC+AN2xvq8yl1EGa5SG/GI1hP78/uTeo3PDfiDNmsUyiahpyhToDDJhQk7fNtJsga+KVw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/marked": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", + "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "node_modules/medium-zoom": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.6.tgz", + "integrity": "sha512-UdiUWfvz9fZMg1pzf4dcuqA0W079o0mpqbTnOz5ip4VGYX96QjmbM+OgOU/0uOzAytxC0Ny4z+VcYQnhdifimg==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", + "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", + "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", + "dev": true, + "optionalDependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/puppeteer/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/puppeteer/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/puppeteer/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rcfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rcfile/-/rcfile-1.0.3.tgz", + "integrity": "sha1-wdgXXCiRh8Hci7OpY7bURAF7FXY=", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "js-yaml": "^3.6.1", + "json5": "^0.5.0", + "object-assign": "^4.1.0", + "object-keys": "^1.0.9", + "path-exists": "^2.1.0", + "require-uncached": "^1.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/rcfile/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "dependencies": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "dev": true + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true, + "optional": true + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true, + "optional": true + }, + "node_modules/tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tweezer.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz", + "integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz", + "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==", + "dev": true, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargonaut": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", + "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "figlet": "^1.1.1", + "parent-require": "^1.0.0" + } + }, + "node_modules/yargonaut/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yesno": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.2.1.tgz", + "integrity": "sha512-2pm4TA/JO5AG/Uz0sCmRlTa2gm5N6dlLlCd0Akun7wcAzrZ5H7qVHlzPH2ojk5K72+lOpH/wG5W77AE/P96jRg==", + "dev": true + } + }, "dependencies": { "@sindresorhus/is": { "version": "0.14.0", @@ -1792,6 +4575,15 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -1832,15 +4624,6 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", diff --git a/pdf/readme.pdf b/pdf/readme.pdf deleted file mode 100644 index 964d731d..00000000 Binary files a/pdf/readme.pdf and /dev/null differ diff --git a/quiz-app/src/assets/translations/en.json b/quiz-app/src/assets/translations/en.json index 730419db..28c17c9a 100644 --- a/quiz-app/src/assets/translations/en.json +++ b/quiz-app/src/assets/translations/en.json @@ -1619,7 +1619,843 @@ ] } ] + }, + { + "id": 33, + "title": "Lesson 17 - Run your fruit detector on the edge: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "Edge computing can be more secure than cloud computing.", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Running an ML model on an edge device is less accurate than running an ML model in the cloud.", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Edge devices always need an Internet connection.", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 34, + "title": "Lesson 17 - Run your fruit detector on the edge: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "What kind of format or domain do we need for Custom Vision ML models to properly run on an edge device?", + "answerOptions": [ + { + "answerText": "General", + "isCorrect": "false" + }, + { + "answerText": "Quick Training", + "isCorrect": "false" + }, + { + "answerText": "Standard", + "isCorrect": "false" + }, + { + "answerText": "Compact", + "isCorrect": "true" + }, + { + "answerText": "Food", + "isCorrect": "false" + }, + { + "answerText": "Remote Deployment", + "isCorrect": "false" + } + ] + }, + { + "questionText": "What is a container?", + "answerOptions": [ + { + "answerText": "Self-contained applications that hold ML models.", + "isCorrect": "false" + }, + { + "answerText": "Self-contained applications that run in isolation from other programs.", + "isCorrect": "true" + }, + { + "answerText": "Self-contained applications that run programs only on edge devices.", + "isCorrect": "false" + }, + { + "answerText": "self-contained applications that handle communication between the cloud and edge devices.", + "isCorrect": "false" + } + ] + }, + { + "questionText": "How do you do Custom Vision model retraining for ML models deployed on edge devices?", + "answerOptions": [ + { + "answerText": "Take images on the edge device, save to the edge device, and point the ML model to the new image folder.", + "isCorrect": "false" + }, + { + "answerText": "Upload images from the edge device to the cloud, retrain the model in Custom Vision, then re-deploy onto the edge device.", + "isCorrect": "true" + }, + { + "answerText": "Take images on the edge device and check the prediction output.", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 35, + "title": "Lesson 18 - Trigger fruit quality detection from a sensor: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "Which part of your IoT application gathers data?", + "answerOptions": [ + { + "answerText": "Things", + "isCorrect": "true" + }, + { + "answerText": "Cloud services", + "isCorrect": "false" + }, + { + "answerText": "Edge devices", + "isCorrect": "false" + } + ] + }, + { + "questionText": "The only outputs of an IoT application are actuators.", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Things don't need to connect directly to IoT Hub, they can use edge devices as gateways.", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 36, + "title": "Lesson 18 - Trigger fruit quality detection from a sensor: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "The three components of architecting an IoT application are", + "answerOptions": [ + { + "answerText": "Things, Insights, Actions", + "isCorrect": "true" + }, + { + "answerText": "Things, Internet, Databases", + "isCorrect": "false" + }, + { + "answerText": "AI, Blockchain, FizzBuzzers", + "isCorrect": "false" + } + ] + }, + { + "questionText": "The component that communicates between the things and the components that create insights is:", + "answerOptions": [ + { + "answerText": "Azure Functions", + "isCorrect": "false" + }, + { + "answerText": "IoT Hub", + "isCorrect": "true" + }, + { + "answerText": "Azure Maps", + "isCorrect": "false" + } + ] + }, + { + "questionText": "How do time of flight proximity sensors work?", + "answerOptions": [ + { + "answerText": "They send laser beams and time how long till they bounce off an object", + "isCorrect": "true" + }, + { + "answerText": "They use sound and measure how long till the sound bounces off an object", + "isCorrect": "false" + }, + { + "answerText": "They use very large rulers", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 37, + "title": "Lesson 19 - Train a stock detector: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "AI models cannot be used to count objects?", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "IoT and AI can be used in retail for:", + "answerOptions": [ + { + "answerText": "Stock checking only", + "isCorrect": "false" + }, + { + "answerText": "A wide range of uses including stock checking, monitoring for mask where where required, tracking footfall, automated billing", + "isCorrect": "true" + }, + { + "answerText": "IoT and AI cannot be used in retail", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Object detection involves:", + "answerOptions": [ + { + "answerText": "Detecting objects in an image and tracking their location and probability", + "isCorrect": "true" + }, + { + "answerText": "Counting objects in an image only", + "isCorrect": "false" + }, + { + "answerText": "Classifying images", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 38, + "title": "Lesson 19 - Train a stock detector: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "Object detectors only return one result no matter how many objects are detected", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + }, + { + "questionText": "What is the best domain to use in Custom Vision for stock counting", + "answerOptions": [ + { + "answerText": "General", + "isCorrect": "false" + }, + { + "answerText": "Food", + "isCorrect": "false" + }, + { + "answerText": "Products on shelves", + "isCorrect": "true" + } + ] + }, + { + "questionText": "At least how many images do you need to train an object detector?", + "answerOptions": [ + { + "answerText": "1", + "isCorrect": "false" + }, + { + "answerText": "15", + "isCorrect": "true" + }, + { + "answerText": "100", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 39, + "title": "Lesson 20 - Check stock from an IoT device: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "IoT devices are not powerful enough to use object detectors", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Object detectors give you:", + "answerOptions": [ + { + "answerText": "The count of objects detected", + "isCorrect": "false" + }, + { + "answerText": "The count and location of objects detected", + "isCorrect": "false" + }, + { + "answerText": "The count, location and probability of objects detected", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Object detectors can be used to detect where missing stock should be to allow robots to automatically stock shelves", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 40, + "title": "Lesson 20 - Check stock from an IoT device: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "To count stock you only need to consider the count of objects detected by the object detector", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Bounding boxes use:", + "answerOptions": [ + { + "answerText": "Percentage based coordinates", + "isCorrect": "true" + }, + { + "answerText": "Pixel based coordinates", + "isCorrect": "false" + }, + { + "answerText": "Centimeter based coordinates", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Can detected objects overlap?", + "answerOptions": [ + { + "answerText": "Yes", + "isCorrect": "true" + }, + { + "answerText": "No", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 41, + "title": "Lesson 21 - Recognize speech with an IoT device: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "IoT devices can be used to recognize speech:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Voice assistants should send all the audio they hear to the cloud for processing:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "To recognize speech, IoT devices need large microphones:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 42, + "title": "Lesson 21 - Recognize speech with an IoT device: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "Microphones are what type of sensor?", + "answerOptions": [ + { + "answerText": "Digital", + "isCorrect": "false" + }, + { + "answerText": "Analog", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Sound waves are converted to digital signals using:", + "answerOptions": [ + { + "answerText": "Pulse Code Modulation", + "isCorrect": "true" + }, + { + "answerText": "Pure Code Multiplication", + "isCorrect": "false" + }, + { + "answerText": "Pulse Width Maximization", + "isCorrect": "false" + } + ] + }, + { + "questionText": "1 second of 16-bit audio sampled at 16KHz is how large?", + "answerOptions": [ + { + "answerText": "1KB", + "isCorrect": "false" + }, + { + "answerText": "16KB", + "isCorrect": "false" + }, + { + "answerText": "32KB", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 43, + "title": "Lesson 22 - Understand language: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "Language understanding involves looking for fixed words:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Language understanding involves:", + "answerOptions": [ + { + "answerText": "Looking at the individual words in a sentence and trying to get the meaning", + "isCorrect": "false" + }, + { + "answerText": "Finding pre-defined sentences and using those to get the meaning", + "isCorrect": "false" + }, + { + "answerText": "Looking at the whole sentence and trying to get the meaning using the context of the words", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Cloud providers have AI services that can understand language:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 44, + "title": "Lesson 22 - Understand language: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "Sentences are understood by being broken down into:", + "answerOptions": [ + { + "answerText": "Ideas and explanations", + "isCorrect": "false" + }, + { + "answerText": "Intents and entities", + "isCorrect": "true" + }, + { + "answerText": "Imps and elves", + "isCorrect": "false" + } + ] + }, + { + "questionText": "The Microsoft service for language understanding is called:", + "answerOptions": [ + { + "answerText": "LUIS", + "isCorrect": "true" + }, + { + "answerText": "Luigi", + "isCorrect": "false" + }, + { + "answerText": "Jarvis", + "isCorrect": "false" + } + ] + }, + { + "questionText": "In the sentence 'set a 3 minute timer' the:", + "answerOptions": [ + { + "answerText": "The intent is 3 minutes and the entity is a timer", + "isCorrect": "false" + }, + { + "answerText": "The intent is minutes, and the entity is 3 timers", + "isCorrect": "false" + }, + { + "answerText": "The intent is set a timer and the entity is 3 minutes", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 45, + "title": "Lesson 23 - Set a timer and provide spoken feedback: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "Speech generated by AI models sounds monotonous and robotic", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "AI models can only create speech in American English:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "AI models would convert 1234 into which spoken phrase:", + "answerOptions": [ + { + "answerText": "One two three four", + "isCorrect": "false" + }, + { + "answerText": "One thousand two hundred and thirty four", + "isCorrect": "false" + }, + { + "answerText": "It can be 'one two three four' or 'one thousand two hundred and thirty four' depending on the context", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 46, + "title": "Lesson 23 - Set a timer and provide spoken feedback: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "The three parts of speech generation are:", + "answerOptions": [ + { + "answerText": "Text analysis, understanding analysis, sound generation", + "isCorrect": "false" + }, + { + "answerText": "Text analysis, linguistic analysis, wave form generation", + "isCorrect": "true" + }, + { + "answerText": "Word analysis, audio production", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Can speech generation models be trained to sound like existing people:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + }, + { + "questionText": "The markup language used to encode speech is called:", + "answerOptions": [ + { + "answerText": "SSML", + "isCorrect": "true" + }, + { + "answerText": "MSSL", + "isCorrect": "false" + }, + { + "answerText": "SpeechXML", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 47, + "title": "Lesson 24 - Support multiple languages: Pre-Lecture Quiz", + "quiz": [ + { + "questionText": "Language understanding only understands English:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "False", + "isCorrect": "true" + } + ] + }, + { + "questionText": "AI speech to text models understand multiple languages:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "true" + }, + { + "answerText": "False", + "isCorrect": "false" + } + ] + }, + { + "questionText": "AI translation involves swapping individual words for their translated version:", + "answerOptions": [ + { + "answerText": "True", + "isCorrect": "false" + }, + { + "answerText": "false", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 48, + "title": "Lesson 24 - Support multiple languages: Post-Lecture Quiz", + "quiz": [ + { + "questionText": "Machine translation has been researched for nearly:", + "answerOptions": [ + { + "answerText": "70 years", + "isCorrect": "true" + }, + { + "answerText": "17 years", + "isCorrect": "false" + }, + { + "answerText": "7 years", + "isCorrect": "false" + } + ] + }, + { + "questionText": "AI language translators are called:", + "answerOptions": [ + { + "answerText": "Noddy translators", + "isCorrect": "false" + }, + { + "answerText": "Neural translators", + "isCorrect": "true" + }, + { + "answerText": "Nothing - AI cannot be used for translation", + "isCorrect": "false" + } + ] + }, + { + "questionText": "What alien languages does the Microsoft translator support:", + "answerOptions": [ + { + "answerText": "Na'vi", + "isCorrect": "false" + }, + { + "answerText": "Alienese", + "isCorrect": "false" + }, + { + "answerText": "Klingon", + "isCorrect": "true" + } + ] + } + ] } ] } -] +] \ No newline at end of file diff --git a/sketchnotes/Roadmap.jpg b/sketchnotes/Roadmap.jpg new file mode 100755 index 00000000..f4390729 Binary files /dev/null and b/sketchnotes/Roadmap.jpg differ diff --git a/sketchnotes/Roadmap.png b/sketchnotes/Roadmap.png deleted file mode 100644 index c2f45cf9..00000000 Binary files a/sketchnotes/Roadmap.png and /dev/null differ diff --git a/sketchnotes/lesson-1.jpg b/sketchnotes/lesson-1.jpg new file mode 100755 index 00000000..0855954f Binary files /dev/null and b/sketchnotes/lesson-1.jpg differ diff --git a/sketchnotes/lesson-1.png b/sketchnotes/lesson-1.png deleted file mode 100755 index 120c056e..00000000 Binary files a/sketchnotes/lesson-1.png and /dev/null differ diff --git a/sketchnotes/lesson-10.jpg b/sketchnotes/lesson-10.jpg new file mode 100644 index 00000000..22b435f4 Binary files /dev/null and b/sketchnotes/lesson-10.jpg differ diff --git a/sketchnotes/lesson-11.jpg b/sketchnotes/lesson-11.jpg new file mode 100644 index 00000000..2646dfd8 Binary files /dev/null and b/sketchnotes/lesson-11.jpg differ diff --git a/sketchnotes/lesson-12.jpg b/sketchnotes/lesson-12.jpg new file mode 100644 index 00000000..924198ca Binary files /dev/null and b/sketchnotes/lesson-12.jpg differ diff --git a/sketchnotes/lesson-13.jpg b/sketchnotes/lesson-13.jpg new file mode 100644 index 00000000..f658df86 Binary files /dev/null and b/sketchnotes/lesson-13.jpg differ diff --git a/sketchnotes/lesson-14.jpg b/sketchnotes/lesson-14.jpg new file mode 100644 index 00000000..c226f9fb Binary files /dev/null and b/sketchnotes/lesson-14.jpg differ diff --git a/sketchnotes/lesson-15.jpg b/sketchnotes/lesson-15.jpg new file mode 100644 index 00000000..017cfcdc Binary files /dev/null and b/sketchnotes/lesson-15.jpg differ diff --git a/sketchnotes/lesson-16.jpg b/sketchnotes/lesson-16.jpg new file mode 100644 index 00000000..56a7bcf2 Binary files /dev/null and b/sketchnotes/lesson-16.jpg differ diff --git a/sketchnotes/lesson-17.jpg b/sketchnotes/lesson-17.jpg new file mode 100644 index 00000000..60bc6c71 Binary files /dev/null and b/sketchnotes/lesson-17.jpg differ diff --git a/sketchnotes/lesson-18.jpg b/sketchnotes/lesson-18.jpg new file mode 100644 index 00000000..c65e43f2 Binary files /dev/null and b/sketchnotes/lesson-18.jpg differ diff --git a/sketchnotes/lesson-19.jpg b/sketchnotes/lesson-19.jpg new file mode 100644 index 00000000..a33473bc Binary files /dev/null and b/sketchnotes/lesson-19.jpg differ diff --git a/sketchnotes/lesson-2.jpg b/sketchnotes/lesson-2.jpg new file mode 100755 index 00000000..545b1457 Binary files /dev/null and b/sketchnotes/lesson-2.jpg differ diff --git a/sketchnotes/lesson-2.png b/sketchnotes/lesson-2.png deleted file mode 100755 index df014170..00000000 Binary files a/sketchnotes/lesson-2.png and /dev/null differ diff --git a/sketchnotes/lesson-20.jpg b/sketchnotes/lesson-20.jpg new file mode 100644 index 00000000..2d2fd588 Binary files /dev/null and b/sketchnotes/lesson-20.jpg differ diff --git a/sketchnotes/lesson-21.jpg b/sketchnotes/lesson-21.jpg new file mode 100644 index 00000000..0e71e320 Binary files /dev/null and b/sketchnotes/lesson-21.jpg differ diff --git a/sketchnotes/lesson-22.jpg b/sketchnotes/lesson-22.jpg new file mode 100644 index 00000000..a49c473f Binary files /dev/null and b/sketchnotes/lesson-22.jpg differ diff --git a/sketchnotes/lesson-23.jpg b/sketchnotes/lesson-23.jpg new file mode 100644 index 00000000..ac2ec3c8 Binary files /dev/null and b/sketchnotes/lesson-23.jpg differ diff --git a/sketchnotes/lesson-24.jpg b/sketchnotes/lesson-24.jpg new file mode 100644 index 00000000..4e599532 Binary files /dev/null and b/sketchnotes/lesson-24.jpg differ diff --git a/sketchnotes/lesson-3.jpg b/sketchnotes/lesson-3.jpg new file mode 100644 index 00000000..93d7b0b0 Binary files /dev/null and b/sketchnotes/lesson-3.jpg differ diff --git a/sketchnotes/lesson-3.png b/sketchnotes/lesson-3.png deleted file mode 100644 index f230e872..00000000 Binary files a/sketchnotes/lesson-3.png and /dev/null differ diff --git a/sketchnotes/lesson-4.jpg b/sketchnotes/lesson-4.jpg new file mode 100644 index 00000000..f79d01ef Binary files /dev/null and b/sketchnotes/lesson-4.jpg differ diff --git a/sketchnotes/lesson-4.png b/sketchnotes/lesson-4.png deleted file mode 100644 index 4f1bbb72..00000000 Binary files a/sketchnotes/lesson-4.png and /dev/null differ diff --git a/sketchnotes/lesson-5.jpg b/sketchnotes/lesson-5.jpg new file mode 100644 index 00000000..9f390a8f Binary files /dev/null and b/sketchnotes/lesson-5.jpg differ diff --git a/sketchnotes/lesson-6.jpg b/sketchnotes/lesson-6.jpg new file mode 100644 index 00000000..0d65db37 Binary files /dev/null and b/sketchnotes/lesson-6.jpg differ diff --git a/sketchnotes/lesson-7.jpg b/sketchnotes/lesson-7.jpg new file mode 100644 index 00000000..26db6289 Binary files /dev/null and b/sketchnotes/lesson-7.jpg differ diff --git a/sketchnotes/lesson-8.jpg b/sketchnotes/lesson-8.jpg new file mode 100644 index 00000000..50c6962c Binary files /dev/null and b/sketchnotes/lesson-8.jpg differ diff --git a/sketchnotes/lesson-9.jpg b/sketchnotes/lesson-9.jpg new file mode 100644 index 00000000..2a7ccd5c Binary files /dev/null and b/sketchnotes/lesson-9.jpg differ diff --git a/translations/.dummy.md b/translations/.dummy.md deleted file mode 100644 index 6e7db247..00000000 --- a/translations/.dummy.md +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy File - -This file acts as a placeholder for the `translations` folder.
-**Please remove this file after adding the first translation** - -For the instructions, follow the directives in the [translations guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/TRANSLATIONS.md) . - -## THANK YOU -We truly appreciate your efforts! diff --git a/translations/CODE_OF_CONDUCT.bn.md b/translations/CODE_OF_CONDUCT.bn.md new file mode 100644 index 00000000..b9c66760 --- /dev/null +++ b/translations/CODE_OF_CONDUCT.bn.md @@ -0,0 +1,9 @@ +# মাইক্রোসফট ওপেন সোর্স - আচরণ বিধি + +এই প্রজেক্টে [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)অনুসরণ করা হচ্ছে। + +রিসোর্সসমূহ: + +- [মাইক্রোসফট ওপেন সোর্স - আচরণ বিধি](https://opensource.microsoft.com/codeofconduct/) +- [মাইক্রোসফটর আচরণ বিধি - বহুল জিজ্ঞাসিত প্রশ্ন (FAQ)](https://opensource.microsoft.com/codeofconduct/faq/) +- যেকোন প্রশ্ন বা বিষয় নিয়ে যোগাযোগ করতে পারবেন [opencode@microsoft.com](mailto:opencode@microsoft.com) ইমেইলের মাধ্যমে। diff --git a/translations/CONTRIBUTING.bn.md b/translations/CONTRIBUTING.bn.md new file mode 100644 index 00000000..24e58af3 --- /dev/null +++ b/translations/CONTRIBUTING.bn.md @@ -0,0 +1,7 @@ +# কন্ট্রিবিউশন + +এই প্রজেক্টটি কন্ট্রিবিউশন বা অবদান এবং সব ধরণের পরামর্শকে স্বাগত জানায়। বেশিরভাগ কন্ট্রিবিউশনের জন্য আপনাকে একটি Contributor License Agreement (CLA) অর্থাৎ অবদানকারী লাইসেন্স চুক্তিতে (সিএলএ) সম্মতি জানাতে হবে যে আপনার এই অধিকার রয়েছে যে আমাদেরকে আপনার কন্ট্রিবিউশন ব্যবহার করার অধিকার আপনি আমাদেরকে দিবেন। বিশদ জানার জন্য, https://cla.microsoft.com দেখুন। + +আপনি যখন একটি Pull Request জমা দিবেন, তখন একটি সিএলএ-বট স্বয়ংক্রিয়ভাবে নির্ধারণ করবে যে আপনাকে সিএলএ সরবরাহ করতে হবে কিনা এবং Pull Requestটি যথাযথভাবে প্রদান করতে লেবেল, কমেন্ট এসব দিতে হবে কিনা। কেবল বট দ্বারা প্রদত্ত নির্দেশাবলী অনুসরণ করুন। আমাদের যেকোন রেপোসিটরিতে কাজ করতে, সিএলএ আপনাকে কেবল একবারই ব্যবহার করতে হবে। + +এই প্রজেক্টটিতে [মাইক্রোসফ্ট ওপেন সোর্স আচরণবিধি](https://opensource.microsoft.com/codeofconduct/) অনুসরণ করা হচ্ছে। আরও তথ্যের জন্য [আচরণবিধি FAQ](https://opensource.microsoft.com/codeofconduct/faq/) পড়ুন বা কোনও অতিরিক্ত প্রশ্ন বা মন্তব্য থাকলে opencode@microsoft.com এ যোগাযোগ করুন। diff --git a/translations/TRANSLATIONS.bn.md b/translations/TRANSLATIONS.bn.md new file mode 100644 index 00000000..719572b5 --- /dev/null +++ b/translations/TRANSLATIONS.bn.md @@ -0,0 +1,16 @@ +# অনুবাদ +আমরা এই কারিক্যুলামের জন্য সকল ভাষায় অনুবাদকে স্বাগত জানাই! + +## গাইডলাইনস +এখানে প্রতিটি অধ্যায়ের সাথে অনুবাদ ফোল্ডার রয়েছে যা অনুবাদকৃত মার্কডাউন ফাইল ধারণ করে। + +অনুবাদকৃত লেসনগুলির নামকরণের এই নীতি অনুসরণ করা উচিত: +README.[language].md + +যেখানে [language] হলো যেকোন ভাষার ২ বর্ণের সংক্ষিপ্ত নাম যা ISO 639-1 নীতি অনুসরণ করে (যেমনঃ `README.bn.md` লেখা হয় বাংলা ভাষার জন্য)। + +## কুইজ +এখানে একটি ফাইল যুক্ত করে অনুবাদ কুইজ-অ্যাপে যুক্ত করা যাবে: https://github.com/microsoft/IoT- for-Beginners/tree/main/quiz-app/src/assets/transferences। তবে JSON এর 'true' এবং 'false' শব্দের অনুবাদ করবেন না। ধন্যবাদ! + +## ধন্যবাদ +আপনার প্রচেষ্টাকে আমরা হৃদয়ের অন্তঃস্থল থেকে সাধুবাদ জানাই। diff --git a/translations/clean-up.bn.md b/translations/clean-up.bn.md new file mode 100644 index 00000000..1243404d --- /dev/null +++ b/translations/clean-up.bn.md @@ -0,0 +1,38 @@ +# প্রজেক্ট সুবিন্যস্ত রাখা + +প্রতিটি প্রজেক্ট শেষ করার পরে, ক্লাউড রিসোর্সসমূহ মুছে ফেলা (delete) করাই ভালো। + +প্রতিটি অধ্যায়ের প্রজেক্টে হয়তো আমরা এসব রিসোর্স তৈরী করেছি + +* একটি রিসোর্স গ্রুপ +* একটি IoT Hub +* ২টি IoT device রেজিস্ট্রেশন +* একটি স্টোরেজ একাউন্ট +* একটি ফাংশন এপ +* একটি Azure Maps একাউন্ট +* একটি কাস্টম ভিশন প্রজেক্ট +* একটি কগনিটিভ সার্ভিস রিসোর্স + +এই সার্ভিসগুলোর বেশিরভাগই বিনা খরচে ব্যবহার করা হচ্ছে - হয় সেগুলি সম্পূর্ণ ফ্রী তে, অথবা একটি ফ্রী টায়ার ব্যবহার করে কাজ করা হচ্ছে। এছাড়াও যেসকল সার্ভিসের জন্য খরচ রয়েছে, সেগুলোর ফ্রী পরিষেবা বা খুবই নিম্নমূল্যের সেবা ব্যবহার করেই কাজ করা সম্ভব। + +এক্ষেত্রেকাজ শেষ হয়ে গেলে এই সার্ভিসগুলি মুছে ফেলা বা ডিলিট করাই ভালো সিদ্ধান্ত হবে। উদাহরণস্বরূপ ফ্রি টায়ার ব্যবহার করে আমরা কেবল একটি আইওটি হাব নিতে পারি, সুতরাং যদি অন্য আরেকটি তৈরি করতে হয়, সেক্ষেত্রে পেইড সার্ভিস ব্যবহার করতে হবে। + +সমস্ত পরিষেবাগুলি রিসোর্স গ্রুপের ভিতরে তৈরি হয়েছে এবং এটি আমাদের সম্পূর্ণ প্রজেক্ট পরিচালনা করা সহজ করে তোলে। রিসোর্স গ্রুপ ডিলিট করলে, সেই সাথে গ্রুপের সমস্ত পরিষেবাও এর সাথে মুছে ফেলা হবে। + +রিসোর্স গ্রুপ ডিলিট করতে নীচের কমান্ডটি টার্মিনাল বা কমান্ড প্রমাপ্ট এ ব্যবহার করতে হবেঃ + +```sh +az group delete --name +``` + +এখানে `` এর জায়গায় প্রজেক্টে ব্যবহৃত নামটি দিতে হবে। + +কনফার্মেশন ম্যাসেজ আসবে এরকমঃ + +```output +Are you sure you want to perform this operation? (y/n): +``` + +এখানে `y` দিতে হবে। + +কিছুক্ষণের মধ্যেই সম্পূর্ণ সার্ভিস ডিলিট হয়ে যাবে।