diff --git a/.gitignore b/.gitignore
index dd1e5203..0162274c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,81 +1,119 @@
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-# User-specific stuff
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# AWS User-specific
-.idea/**/aws.xml
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-.idea/**/libraries
-
-# Gradle and Maven with auto-import
-# When using Gradle or Maven with auto-import, you should exclude module files,
-# since they will be recreated, and may cause churn. Uncomment if using
-# auto-import.
-# .idea/artifacts
-# .idea/compiler.xml
-# .idea/jarRepositories.xml
-# .idea/modules.xml
-# .idea/*.iml
-# .idea/modules
-# *.iml
-# *.ipr
-
-# CMake
-cmake-build-*/
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# File-based project format
-*.iws
-
-# IntelliJ
-out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# SonarLint plugin
-.idea/sonarlint/
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-# Android studio 3.1+ serialized cache file
-.idea/caches/build_file_checksums.ser
-
-target
-*.class
-*.out
\ No newline at end of file
+# Created by https://www.toptal.com/developers/gitignore/api/intellij
+# Edit at https://www.toptal.com/developers/gitignore?templates=intellij
+
+### Intellij ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+# https://plugins.jetbrains.com/plugin/7973-sonarlint
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator-enh.xml
+.idea/**/markdown-navigator/
+
+# Cache file creation bug
+# See https://youtrack.jetbrains.com/issue/JBR-2257
+.idea/$CACHE_FILE$
+
+# CodeStream plugin
+# https://plugins.jetbrains.com/plugin/12206-codestream
+.idea/codestream.xml
+
+# Azure Toolkit for IntelliJ plugin
+# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
+.idea/**/azureSettings.xml
+
+# End of https://www.toptal.com/developers/gitignore/api/intellij
+
+*.class
\ No newline at end of file
diff --git a/materials/2019-2020/homeworks/29-05-HW-2-3b/README.pdf b/materials/2019-2020/homeworks/29-05-HW-2-3b/README.pdf
new file mode 100644
index 00000000..f051a194
Binary files /dev/null and b/materials/2019-2020/homeworks/29-05-HW-2-3b/README.pdf differ
diff --git a/materials/2020-2021/11a/2021-03-22-input/2021-03-22-input.iml b/materials/2020-2021/11a/2021-03-22-input/2021-03-22-input.iml
new file mode 100644
index 00000000..c90834f2
--- /dev/null
+++ b/materials/2020-2021/11a/2021-03-22-input/2021-03-22-input.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/materials/2020-2021/11a/2021-03-22-input/src/Main.java b/materials/2020-2021/11a/2021-03-22-input/src/Main.java
new file mode 100644
index 00000000..de98eab0
--- /dev/null
+++ b/materials/2020-2021/11a/2021-03-22-input/src/Main.java
@@ -0,0 +1,44 @@
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Scanner;
+
+public class Main {
+ public static void main(String[] args) {
+// String str1 = "Hello";
+// String str2 = "Hello";
+//
+// String str3 = str1.concat(str2);
+// String str4 = str1.concat(str2);
+//
+// StringBuilder sb = new StringBuilder();
+// sb.append("Hello").append(" ").append("World");
+//
+// System.out.println(str4);
+// System.out.println(sb);
+//
+// System.out.println(args.length);
+// for (String arg : args) {
+// System.out.println(arg);
+// }
+//
+// InputStreamReader isr = new InputStreamReader(System.in);
+//// isr.read
+// BufferedReader br = new BufferedReader(isr);
+// try {
+// String line = br.readLine();
+// System.out.println(line);
+// int num = Integer.parseInt(line);
+// System.out.println(num);
+//// line.spl
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+
+// Scanner sc = new Scanner(System.in);
+// System.out.println(sc.nextLine());
+// System.out.println(sc.nextInt());
+
+ System.out.println(System.console().readLine());
+ }
+}
diff --git a/materials/2020-2021/11b/2021-03-22-strings/2021-03-22-strings.iml b/materials/2020-2021/11b/2021-03-22-strings/2021-03-22-strings.iml
new file mode 100644
index 00000000..c90834f2
--- /dev/null
+++ b/materials/2020-2021/11b/2021-03-22-strings/2021-03-22-strings.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/materials/2020-2021/11b/2021-03-22-strings/src/Main.java b/materials/2020-2021/11b/2021-03-22-strings/src/Main.java
new file mode 100644
index 00000000..cab6382d
--- /dev/null
+++ b/materials/2020-2021/11b/2021-03-22-strings/src/Main.java
@@ -0,0 +1,43 @@
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Scanner;
+
+public class Main {
+ public static void main(String[] args) {
+ /*System.out.println(args.length);
+
+ for (String arg : args) {
+ System.out.println(arg);
+ }
+
+ InputStreamReader isr = new InputStreamReader(System.in);
+ BufferedReader br = new BufferedReader(isr);
+
+ try {
+ String line = br.readLine();
+ System.out.println(line);
+ int num = Integer.parseInt(line);
+ System.out.println(num);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }*/
+
+// Scanner in = new Scanner(System.in);
+
+// System.out.println(in.nextLine());
+// int num = in.nextInt();
+// System.out.println(num);
+
+// String line = System.console().readLine();
+// System.out.println(line);
+
+// String str1 = "Hello";
+// String str2 = "Hello";
+// String str3 = str1.concat(str2);
+
+ StringBuilder sb = new StringBuilder();
+ sb.append("Hello").append(" ").append("World");
+ System.out.println(sb);
+ }
+}
diff --git a/materials/2020-2021/exams/exam-1-2/matrix.md b/materials/2020-2021/exams/exam-1-2/matrix.md
new file mode 100644
index 00000000..f6f55d0c
--- /dev/null
+++ b/materials/2020-2021/exams/exam-1-2/matrix.md
@@ -0,0 +1,68 @@
+1. Дефинирайте клас за **вектор** от геометрията. От тук нататък когато в условието се спомене **вектор** се има в предвид този клас.
+ - има атрибут цяло число с неговия размер N. Може да се чете, но не и да се пише отвън
+ - има едномерен динамичен масив от цели числа. Не може да се достъпва отвън
+ - има единствен конструктор, който получава аргументи размер N и масив. Заделя памет за N на брой елементи и ги чете последователно от подадения масив
+ - дефинирайте оператор [] за достъпване на елемент от масива по индекс
+
+2. Дефинирайте клас за матрица
+ - има атрибути цели числа за нейния размер - N за брой редове и M за брой колони
+ - има едномерен динамичен масив от вектори - всеки вектор представлява една **колона**
+ - има единствен скрит конструктор с аргументи за размерите. Конструкторът заделя нужната памет за елементите в масива
+ - има статичен метод `Matrix from_array(int N, int M, int arr)`, който връща инициализирана инстанция на матрица
+ - има статичен метод `Matrix from_matrix(Matrix other)`, който връща инициализирана инстанция на матрица
+ - дефинирайте оператор за събиране **+**
+ - с число - всеки елемент на матрицата се събира с подаденото число
+ ```
+ | 1 2 3 | | 2 3 4 |
+ | 4 5 6 | + 1 = | 5 6 7 |
+ ```
+ - с матрица - всеки елемент на първата матрица се събира със съответния елемент на втората
+ ```
+ | 1 2 3 | | 7 8 9 | | 8 10 12 |
+ | 4 5 6 | + | 1 2 3 | = | 5 7 9 |
+ ```
+ - дефинирайте оператор за изваждане **-**
+ - с число - от всеки елемент на матрицата се изважда подаденото число
+ ```
+ | 1 2 3 | | 0 1 2 |
+ | 4 5 6 | - 1 = | 3 4 5 |
+ ```
+ - с матрица - от всеки елемент на първата матрица се вади съответният елемент елемент на втората
+ ```
+ | 1 2 3 | | 7 8 9 | | -6 -6 -6 |
+ | 4 5 6 | - | 1 2 3 | = | 3 3 3 |
+ ```
+ - дефинирайте оператор за умножение **\***
+ - с число - всеки елемент на матрицата се умножава с подаденото число
+ ```
+ | 1 2 3 | | 2 4 6 |
+ | 4 5 6 | * 2 = | 8 10 12 |
+ ```
+ - с матрица - всеки елемент от резултантната матрица представлява сбор от произведенията на съответни елементи в ред на първата и колона на втората матрица. [картинка](https://miro.medium.com/max/1200/1*YGcMQSr0ge_DGn96WnEkZw.png)
+ ```
+ | 1 2 3 | | 3 | | 3*1 + 3*2 + 3*3 | | 18 |
+ | 4 5 6 | * | 7 | = | 7*4 + 7*5 + 7*6 | = | 105 |
+ ```
+
+ *За умножение е нужно броят **колони** на **първата** матрица да е равен на броя **редове** на **втората** матрица*
+ - дефинирайте оператор за изход **<<**, който извежда елементите на матрицата във формат
+ ```
+ | v11 v12 ... v1m |
+ | v21 v22 ... v2m |
+ | ... |
+ | vn1 vn2 ... vnm |
+ ```
+ - дефинирайте оператор за достъпване по индекс [], който връща връща векторът на подадения индeкс. *my_matrix[3][7] трябва да върне елемента в колона с индекс 3 и ред с индекс 7*
+ - всички горни методи и оператори да хвърлят изключения при несъвпадащи или нулеви и отрицателни размери
+
+3. Допълнителни:
+ - имайте минимален брой извиквания на конструктури и копирания на данни при извикване на методи и оператори
+ - динамичната памет да се почиства и освобождава
+ - да се обработват хвърляните изключения
+ - демонстрация на всичко в `main`
+ - имплементирайте метод транспониране на матрица - завъртане така, че да се разменят редовете и колоните
+ ```
+ | 1 2 3 | | 1 4 |
+ | 4 5 6 | => | 2 5 |
+ | 3 6 |
+ ```
diff --git a/materials/2020-2021/exams/exam-1-2/matrix.pdf b/materials/2020-2021/exams/exam-1-2/matrix.pdf
new file mode 100644
index 00000000..96f052db
Binary files /dev/null and b/materials/2020-2021/exams/exam-1-2/matrix.pdf differ
diff --git a/materials/2020-2021/exams/exam-1-3/mining.md b/materials/2020-2021/exams/exam-1-3/mining.md
new file mode 100644
index 00000000..48e91ea3
--- /dev/null
+++ b/materials/2020-2021/exams/exam-1-3/mining.md
@@ -0,0 +1,83 @@
+# Минна компания
+Имплементирайте програма, която да разпределя работници в мина за диаманти.
+
+## Клас за работник
+Това са работниците, които копаят в мините. Всеки от тях има:
+- име - стринг
+- уникален номер - цяло положително число
+- количество материал, което може да изкопае за един ден - цяло положително число
+- копиращ конструктур и конструктур с нужните аргументи
+- гетъри за всички атрибути
+- метод или оператор за извеждане на информацията за него
+
+Работниците имат и метод `unsigned int choose_mine(vector<тип, чрез който представяте мина> mines)`, който:
+- получава като аргумент списък от мини
+- избира мина според определен критерий и връща нейния индекс
+- ако списъкът е празен хвърля изключение
+- ако не намери подходяща мина връща -1
+
+## Видове работници
+### Обикновен
+- изкопава по 20 материал
+- отива в първата възможна мина
+
+### Алчен
+- изкопава 25 материал
+- отива в мината с най-много материал
+
+### Асоциален
+- изкопава 30 материал
+- отива в първата възможна мине без други хора
+
+## Клас за минна компания
+Това е класът, който менажира работниците. Трябва да има:
+- име на компанията - стринг
+- събран до момента материал - цяло положително число, като винаги започва от 0
+- списък от работници
+- вектор от мини. За всяка мина трябва да можете да отразите текущото количество материал в нея и разпределените работници
+- метод за задаване на списък от мини. Ако подаденият списък е празен да се хвърли изключение
+
+Дефинирайте метод `void mine()`, който изпълнява цикъл на разпределяне на работници и събиране на материала от тях докато всички мини се изчерпат.
+- цикълът се изпълнява докато във вектора все още има с повече от 0 останал материал
+- извършва разпределяне на всички възможни работници
+- събира материала от всички разпределени работници - намалява го от останалото количество в съответната мина и го увеличава в атрибута на компанията
+- всяка итерация представлява един "работен ден"
+
+Разпределянето на работници става като се обходи списъка от работници и се избере мина чрез метода `choose_mine`.
+Ако в една мина вече има достатъчно работници, че да изкопаят всичкия материал от нея, то тя се прескача и следващите работници се разпределят в следващата възможна.
+Ако в дадена итерация всички работници върнат -1 или хвърлят изключение(никой не може да бъде разпределен) то методът `mine` хвърля изключение.
+
+## Допълнителни
+- извеждайте информативни съобщения в конзолата за работата на метода `mine`
+- разделете кода в отделни файлове и добавете мейкфайл
+
+## Примери
+Ако компанията има 2 мини с 20 и 40 материал и 2 обикновени работника, то:
+- 1ва итерация
+ - **1 работник** ще отиде в **първата** мина
+ - **1 работник** ще отиде във **втората** мина
+ - ще се изкопае **20 материал от първата** мина и **20 от втората**. Материалът в първата ще свърши
+- 2ра итерация
+ - **1 работник** ще отиде във **втората** мина
+ - **другия работник** няма къде да отиде и **пропуска** този ден
+ - ще се изкопае **20 материал от втората** мина. Материалът в нея ще свърши
+- няма останали мини с наличен материал
+
+Ако компанията има 3 мини с 50, 40 и 35 материал, 1 обикновен, 1 алчен и 1 асоциален работник(в този ред), то:
+- 1ва итерация
+ - **обикновеният** отива в **първата** мина
+ - **алчният** отива в **първата** мина защото има най-много материал
+ - **асоциалният** отива във **втората** мина защото е празна
+ - изкопават **45 от първата** и **30 от втората**
+ - оставащ материал - **5 10 35**
+- 2ра итерация
+ - **обикновеният** отива в **първата** мина
+ - **алчиният** отива в **третата** защото има най-много материал
+ - **асоциалният** отива във **втората** защото е празна
+ - изкопават **5 от първата**, **10 от втората** и **25 от третата**. Материал в първата и втората свършва
+ - оставащ материал - **0 0 10**
+- 3та итерация
+ - **обикновеният** отива в **третата** мина
+ - **алчният и асоциалният пропускат** деня защото няма къде да ходят
+ - изкопават **10 от третата** и нейният материал свършва
+- няма останали мини
diff --git a/materials/2020-2021/exams/exam-1-3/mining.pdf b/materials/2020-2021/exams/exam-1-3/mining.pdf
new file mode 100644
index 00000000..dd78c95f
Binary files /dev/null and b/materials/2020-2021/exams/exam-1-3/mining.pdf differ
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/Heroes.iml b/materials/2020-2021/exams/exam-2-1/B/Heroes/Heroes.iml
new file mode 100644
index 00000000..06690f3e
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/Heroes.iml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Hero.java b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Hero.java
new file mode 100644
index 00000000..fb01b5ec
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Hero.java
@@ -0,0 +1,35 @@
+package org.elsys.oop.heroes;
+
+import java.util.List;
+
+public abstract class Hero {
+ private int level;
+ private int strength;
+ private int intelligence;
+ private String specialty;
+
+ public Hero(int level, int strength, int intelligence, String specialty) {
+ this.level = level;
+ this.strength = strength;
+ this.intelligence = intelligence;
+ this.specialty = specialty;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public int getStrength() {
+ return strength;
+ }
+
+ public int getIntelligence() {
+ return intelligence;
+ }
+
+ public String getSpecialty() {
+ return specialty;
+ }
+
+ public abstract int getPower(List party, Monster monster);
+}
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Main.java b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Main.java
new file mode 100644
index 00000000..34515626
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Main.java
@@ -0,0 +1,18 @@
+package org.elsys.oop.heroes;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class Main {
+ public static void main(String[] args) {
+ List party = new ArrayList<>();
+
+ party.add(new Warrior(5, 4,2, "Knight"));
+
+ Monster enemy = new Monster("Dragon", 5, 20, Arrays.asList(new String[]{"Darkness"}));
+
+ System.out.println(party.get(0).getPower(party, enemy));
+ System.out.println(enemy.getPower(party));
+ }
+}
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Monster.java b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Monster.java
new file mode 100644
index 00000000..c8eb74b4
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Monster.java
@@ -0,0 +1,44 @@
+package org.elsys.oop.heroes;
+
+import java.util.List;
+
+public class Monster {
+ private String name;
+ private int level;
+ private int strength;
+ private List traits;
+
+ public Monster(String name, int level, int strength, List traits) {
+ this.name = name;
+ this.level = level;
+ this.strength = strength;
+ this.traits = traits;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getTraits() {
+ return traits;
+ }
+
+ private boolean isOpposite(String a, String b) {
+ if(a == "Evil" && b == "Knight") return true;
+ return false;
+ }
+
+ public int getPower(List party) {
+ int pow = level * strength;
+
+ for (Hero hero : party) {
+ for (String trait : traits) {
+ if (isOpposite(trait, hero.getSpecialty())) {
+ pow *= 1.25;
+ }
+ }
+ }
+
+ return pow;
+ }
+}
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/MonsterTest.java b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/MonsterTest.java
new file mode 100644
index 00000000..04d06b39
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/MonsterTest.java
@@ -0,0 +1,21 @@
+package org.elsys.oop.heroes;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class MonsterTest {
+ @Test
+ void getPower() {
+ Monster testDragon = new Monster("Dragon", 10, 20, Arrays.asList(new String[]{"Evil"}));
+
+ List party = Arrays.asList(new Hero[]{new Warrior(1, 2, 1, "Barbarian")});
+ assertEquals(200, testDragon.getPower(party));
+
+ party = Arrays.asList(new Hero[]{new Warrior(1, 2, 1, "Knight")});
+ assertEquals(250, testDragon.getPower(party));
+ }
+}
\ No newline at end of file
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Warrior.java b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Warrior.java
new file mode 100644
index 00000000..72fdbf8d
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Warrior.java
@@ -0,0 +1,24 @@
+package org.elsys.oop.heroes;
+
+import java.util.List;
+
+public class Warrior extends Hero {
+ public Warrior(int level, int strength, int intelligence, String specialty) {
+ super(level, strength, intelligence, specialty);
+ }
+
+ @Override
+ public int getPower(List party, Monster monster) {
+ int pow = getLevel() * getStrength();
+
+ if(getSpecialty() == "Knight") {
+ for (Hero h : party) {
+ if (h.getSpecialty() == "Cleric") {
+ pow *= 1.25;
+ }
+ }
+ }
+
+ return pow;
+ }
+}
diff --git a/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Wizard.java b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Wizard.java
new file mode 100644
index 00000000..d34b29eb
--- /dev/null
+++ b/materials/2020-2021/exams/exam-2-1/B/Heroes/src/org/elsys/oop/heroes/Wizard.java
@@ -0,0 +1,26 @@
+package org.elsys.oop.heroes;
+
+import java.util.List;
+
+public class Wizard extends Hero {
+ public Wizard(int level, int strength, int intelligence, String specialty) {
+ super(level, strength, intelligence, specialty);
+ }
+
+ private boolean isOpposite(String a, String b) {
+ return true;
+ }
+
+ @Override
+ public int getPower(List party, Monster monster) {
+ int pow = getLevel() * getIntelligence();
+
+ for(String trait : monster.getTraits()) {
+ if(isOpposite(trait, getSpecialty())) {
+ pow *= 1.25;
+ }
+ }
+
+ return pow;
+ }
+}
diff --git a/materials/2020-2021/homeworks/2020-11-15-optional-1/Dates.pdf b/materials/2020-2021/homeworks/2020-11-15-optional-1/Dates.pdf
new file mode 100644
index 00000000..73b8465e
Binary files /dev/null and b/materials/2020-2021/homeworks/2020-11-15-optional-1/Dates.pdf differ
diff --git a/materials/2020-2021/homeworks/2020-11-15-optional-1/README.md b/materials/2020-2021/homeworks/2020-11-15-optional-1/README.md
new file mode 100644
index 00000000..3c2b626b
--- /dev/null
+++ b/materials/2020-2021/homeworks/2020-11-15-optional-1/README.md
@@ -0,0 +1,40 @@
+Да се имплементира клас за дата и час(обичайни имена са `Date`, `Time` или `DateTime`). Класът трябва да има числови атрибути за секунди, минути, часове, ден, месец и година. Веднъж инициализирани атрибутите не могат да се променят.
+Добавете конструктури:
+- по подразбиране - всички атрибути се инициализират с 0
+- с аргументи за всички атрибути - атрибутите се инициализират чрез инициализиращ списък
+- копиращ
+
+Към класа добавете константен статичен член за нулева дата. Това е инстанция на класа за дата, за която са подадени:
+- секунди = 0
+- минути = 0
+- часове = 0
+- дни = 0
+- месеци = 0
+- година = 1900
+
+*Дни и месеци се броят от 0!*
+
+Това е нулавата(началната) дата и всяка инстанция на класа ще представлява отстояние от нея вместо от пълната нула.
+```
+Дата с (година = 100, месеци = 2, дни . 17) представлява (18 март 2000г.) защото 1900 + 100 = 2000.
+```
+
+Предефинирайте операторите:
+- `==`, `!=`, `>`, `<`, `>=`, `<=` - сравняват текущата инстанция с друга дата
+- `+` - добавя към текущата инстанция всички атрибути на друга дата
+- `-` - изважда от текущата инстанция всички атрибути на друга дата
+- `<<` - извежда датата във формат `YYYY-MM-DD hh:mm:ss` *Взимайте предвид отстоянието от нулавата дата*
+
+За да имплементирате правилно операторите за сравнение добавете скрит метод, който връща сумата от равностойността в секунди на всички атрибути на инстанцията.
+
+Дефинирайте към класа статичен метод, който получава референция към списък от дати и го сортира.
+
+Конструктурите и операторите да хвърлят `std::invalid_argument` изключения ако са подадени дати с отрицателни стойности.
+
+Демонстрирайте в `main` работата на всичко дефинирано.
+
+Допълнително:
+- ползвайте подходящи модификатори за достъп - отвън да може да се достъпва само каквото е нужно да се достъпва
+- добавяйте гетъри и сетъри само при нужда
+- ползвайте константи когато нещо няма да бъде променяно
+- ползвайте референции когато се подават инстанции на класове за да се намали излишното копиране
diff --git a/materials/2020-2021/practice/2021-03-08-squirrels/2021-03-08-squirrels.iml b/materials/2020-2021/practice/2021-03-08-squirrels/2021-03-08-squirrels.iml
new file mode 100644
index 00000000..d14e4972
--- /dev/null
+++ b/materials/2020-2021/practice/2021-03-08-squirrels/2021-03-08-squirrels.iml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/materials/2020-2021/practice/2021-03-08-squirrels/src/Main.java b/materials/2020-2021/practice/2021-03-08-squirrels/src/Main.java
new file mode 100644
index 00000000..1377a663
--- /dev/null
+++ b/materials/2020-2021/practice/2021-03-08-squirrels/src/Main.java
@@ -0,0 +1,23 @@
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.Random;
+import java.util.Scanner;
+
+public class Main {
+ private Random rand;
+
+ public static void main(String[] args) {
+ Main m = new Main(new Random());
+ m.calc();
+ }
+
+ public Main(Random rand) {
+ this.rand = rand;
+ }
+
+ public void calc() {
+ System.out.println(rand.nextInt());
+ Scanner sc = new Scanner(System.in);
+ System.out.println(sc.nextInt());
+ }
+}
diff --git a/materials/2020-2021/practice/2021-03-08-squirrels/src/MainTest.java b/materials/2020-2021/practice/2021-03-08-squirrels/src/MainTest.java
new file mode 100644
index 00000000..9a1e8136
--- /dev/null
+++ b/materials/2020-2021/practice/2021-03-08-squirrels/src/MainTest.java
@@ -0,0 +1,35 @@
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.io.*;
+import java.util.Random;
+
+@ExtendWith(MockitoExtension.class)
+class MainTest {
+ @Mock
+ Random rand = new Random();
+
+ private static final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+
+ @BeforeAll
+ static void setup() {
+ System.setOut(new PrintStream(outContent));
+ System.setIn(new ByteArrayInputStream("13 14".getBytes()));
+ }
+
+ @Test
+ void main() {
+ Mockito.when(rand.nextInt()).thenReturn(10);
+ Main m = new Main(rand);
+
+ m.calc();
+ String s = outContent.toString();
+ s = s.replaceAll("\r", "");
+ assertEquals("10\n13\n", s);
+ }
+}
\ No newline at end of file