From 439f8e6f1ad6a277c593c274803826b6281f4041 Mon Sep 17 00:00:00 2001 From: erius Date: Fri, 18 Aug 2023 01:08:53 +0300 Subject: [PATCH] Initital commit --- sem2/print_hex | Bin 0 -> 8969 bytes sem2/print_hex.asm | 26 + sem2/print_hex.o | Bin 0 -> 912 bytes sem3/task-custom-make/Lab2-1.0.jar | Bin 0 -> 43799 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 74875 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/5.6.3/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../5.6.3/fileContent/fileContent.lock | Bin 0 -> 17 bytes .../.gradle/5.6.3/fileHashes/fileHashes.bin | Bin 0 -> 22547 bytes .../.gradle/5.6.3/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../5.6.3/fileHashes/resourceHashesCache.bin | Bin 0 -> 18531 bytes .../Lab2/.gradle/5.6.3/gc.properties | 0 .../5.6.3/javaCompile/classAnalysis.bin | Bin 0 -> 48265 bytes .../.gradle/5.6.3/javaCompile/jarAnalysis.bin | Bin 0 -> 20434 bytes .../5.6.3/javaCompile/javaCompile.lock | Bin 0 -> 17 bytes .../.gradle/5.6.3/javaCompile/taskHistory.bin | Bin 0 -> 18655 bytes .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 18749 bytes .../Lab2/.gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .../Lab2/.gradle/vcs-1/gc.properties | 0 sem3/task-custom-make/Lab2/.idea/.gitignore | 8 + sem3/task-custom-make/Lab2/.idea/compiler.xml | 6 + sem3/task-custom-make/Lab2/.idea/discord.xml | 7 + .../task-custom-make/Lab2/.idea/encodings.xml | 7 + sem3/task-custom-make/Lab2/.idea/gradle.xml | 17 + .../Lab2/.idea/jarRepositories.xml | 20 + sem3/task-custom-make/Lab2/.idea/misc.xml | 10 + .../Lab2/.idea/runConfigurations.xml | 10 + .../Lab2/.idea/uiDesigner.xml | 124 ++++ sem3/task-custom-make/Lab2/build.gradle | 28 + .../java/main/ru/erius/lab2/Lab2.class | Bin 0 -> 2164 bytes sem3/task-custom-make/Lab2/gradlew | 185 ++++++ sem3/task-custom-make/Lab2/gradlew.bat | 89 +++ sem3/task-custom-make/Lab2/settings.gradle | 2 + .../src/main/java/ru/erius/lab2/Lab2.java | 32 + .../ru/erius/lab2/move/physical/Bulldoze.java | 25 + .../ru/erius/lab2/move/physical/Facade.java | 28 + .../ru/erius/lab2/move/special/AirSlash.java | 25 + .../ru/erius/lab2/move/status/AquaRing.java | 27 + .../ru/erius/lab2/move/status/Confide.java | 25 + .../ru/erius/lab2/move/status/DoubleTeam.java | 28 + .../java/ru/erius/lab2/move/status/Leer.java | 25 + .../java/ru/erius/lab2/move/status/Rest.java | 30 + .../ru/erius/lab2/move/status/Supersonic.java | 25 + .../ru/erius/lab2/move/status/Swagger.java | 26 + .../java/ru/erius/lab2/pokemon/Blaziken.java | 33 + .../java/ru/erius/lab2/pokemon/Combusken.java | 33 + .../java/ru/erius/lab2/pokemon/Comfey.java | 38 ++ .../java/ru/erius/lab2/pokemon/Gligar.java | 36 ++ .../java/ru/erius/lab2/pokemon/Gliscor.java | 33 + .../java/ru/erius/lab2/pokemon/Torchic.java | 34 ++ sem3/task-custom-make/lab2_prog.docx | Bin 0 -> 111853 bytes sem3/task-custom-make/makefile | 0 sem3/task-custom-make/task/Pokemon.jar | Bin 0 -> 26020 bytes .../task/code/ru/erius/lab2/Lab2.java | 33 + .../ru/erius/lab2/move/physical/Bulldoze.java | 25 + .../ru/erius/lab2/move/physical/Facade.java | 28 + .../ru/erius/lab2/move/special/AirSlash.java | 25 + .../ru/erius/lab2/move/status/AquaRing.java | 27 + .../ru/erius/lab2/move/status/Confide.java | 25 + .../ru/erius/lab2/move/status/DoubleTeam.java | 28 + .../code/ru/erius/lab2/move/status/Leer.java | 25 + .../code/ru/erius/lab2/move/status/Rest.java | 30 + .../ru/erius/lab2/move/status/Supersonic.java | 25 + .../ru/erius/lab2/move/status/Swagger.java | 26 + .../code/ru/erius/lab2/pokemon/Blaziken.java | 33 + .../code/ru/erius/lab2/pokemon/Combusken.java | 33 + .../code/ru/erius/lab2/pokemon/Comfey.java | 38 ++ .../code/ru/erius/lab2/pokemon/Gligar.java | 36 ++ .../code/ru/erius/lab2/pokemon/Gliscor.java | 33 + .../code/ru/erius/lab2/pokemon/Torchic.java | 34 ++ .../task/compiled/ru/erius/lab2/Lab2.class | Bin 0 -> 2164 bytes .../erius/lab2/move/physical/Bulldoze.class | Bin 0 -> 1154 bytes .../ru/erius/lab2/move/physical/Facade.class | Bin 0 -> 1428 bytes .../ru/erius/lab2/move/special/AirSlash.class | Bin 0 -> 1130 bytes .../ru/erius/lab2/move/status/AquaRing.class | Bin 0 -> 1486 bytes .../ru/erius/lab2/move/status/Confide.class | Bin 0 -> 1150 bytes .../erius/lab2/move/status/DoubleTeam.class | Bin 0 -> 1161 bytes .../ru/erius/lab2/move/status/Leer.class | Bin 0 -> 1128 bytes .../ru/erius/lab2/move/status/Rest.class | Bin 0 -> 1652 bytes .../erius/lab2/move/status/Supersonic.class | Bin 0 -> 1045 bytes .../ru/erius/lab2/move/status/Swagger.class | Bin 0 -> 1201 bytes .../ru/erius/lab2/pokemon/Blaziken.class | Bin 0 -> 2114 bytes .../ru/erius/lab2/pokemon/Combusken.class | Bin 0 -> 2158 bytes .../ru/erius/lab2/pokemon/Comfey.class | Bin 0 -> 2409 bytes .../ru/erius/lab2/pokemon/Gligar.class | Bin 0 -> 2282 bytes .../ru/erius/lab2/pokemon/Gliscor.class | Bin 0 -> 2112 bytes .../ru/erius/lab2/pokemon/Torchic.class | Bin 0 -> 2290 bytes .../ru/ifmo/se/pokemon/Battle$1.class | Bin 0 -> 709 bytes .../ru/ifmo/se/pokemon/Battle$2.class | Bin 0 -> 681 bytes .../compiled/ru/ifmo/se/pokemon/Battle.class | Bin 0 -> 3139 bytes .../ru/ifmo/se/pokemon/DamageMove.class | Bin 0 -> 3116 bytes .../compiled/ru/ifmo/se/pokemon/Effect.class | Bin 0 -> 3242 bytes .../ru/ifmo/se/pokemon/FireMove.class | Bin 0 -> 817 bytes .../ru/ifmo/se/pokemon/Messages.class | Bin 0 -> 2982 bytes .../ru/ifmo/se/pokemon/Messages_en.class | Bin 0 -> 226 bytes .../ru/ifmo/se/pokemon/Messages_ru_RU.class | Bin 0 -> 3186 bytes .../compiled/ru/ifmo/se/pokemon/Move$1.class | Bin 0 -> 598 bytes .../compiled/ru/ifmo/se/pokemon/Move$2.class | Bin 0 -> 840 bytes .../compiled/ru/ifmo/se/pokemon/Move$3.class | Bin 0 -> 956 bytes .../compiled/ru/ifmo/se/pokemon/Move.class | Bin 0 -> 2169 bytes .../ru/ifmo/se/pokemon/PhysicalMove.class | Bin 0 -> 742 bytes .../ru/ifmo/se/pokemon/Pokemon$1.class | Bin 0 -> 791 bytes .../compiled/ru/ifmo/se/pokemon/Pokemon.class | Bin 0 -> 7892 bytes .../ru/ifmo/se/pokemon/SpecialMove.class | Bin 0 -> 756 bytes .../compiled/ru/ifmo/se/pokemon/Stat.class | Bin 0 -> 1325 bytes .../compiled/ru/ifmo/se/pokemon/Status.class | Bin 0 -> 1066 bytes .../ru/ifmo/se/pokemon/StatusMove.class | Bin 0 -> 1767 bytes .../compiled/ru/ifmo/se/pokemon/Team.class | Bin 0 -> 1678 bytes .../compiled/ru/ifmo/se/pokemon/Type.class | Bin 0 -> 3811 bytes .../task/doc/allclasses-frame.html | 35 ++ .../task/doc/allclasses-noframe.html | 35 ++ .../task/doc/constant-values.html | 498 +++++++++++++++ .../task/doc/deprecated-list.html | 122 ++++ sem3/task-custom-make/task/doc/help-doc.html | 223 +++++++ sem3/task-custom-make/task/doc/index-all.html | 449 ++++++++++++++ sem3/task-custom-make/task/doc/index.html | 74 +++ .../task/doc/overview-frame.html | 25 + .../task/doc/overview-summary.html | 149 +++++ .../task/doc/overview-tree.html | 216 +++++++ sem3/task-custom-make/task/doc/package-list | 5 + .../task/doc/ru/erius/lab2/Lab2.html | 269 ++++++++ .../ru/erius/lab2/move/physical/Bulldoze.html | 287 +++++++++ .../ru/erius/lab2/move/physical/Facade.html | 289 +++++++++ .../lab2/move/physical/package-frame.html | 21 + .../lab2/move/physical/package-summary.html | 144 +++++ .../lab2/move/physical/package-tree.html | 144 +++++ .../ru/erius/lab2/move/special/AirSlash.html | 287 +++++++++ .../lab2/move/special/package-frame.html | 20 + .../lab2/move/special/package-summary.html | 140 +++++ .../erius/lab2/move/special/package-tree.html | 139 +++++ .../ru/erius/lab2/move/status/AquaRing.html | 287 +++++++++ .../ru/erius/lab2/move/status/Confide.html | 287 +++++++++ .../ru/erius/lab2/move/status/DoubleTeam.html | 287 +++++++++ .../doc/ru/erius/lab2/move/status/Leer.html | 287 +++++++++ .../doc/ru/erius/lab2/move/status/Rest.html | 287 +++++++++ .../ru/erius/lab2/move/status/Supersonic.html | 287 +++++++++ .../ru/erius/lab2/move/status/Swagger.html | 287 +++++++++ .../erius/lab2/move/status/package-frame.html | 26 + .../lab2/move/status/package-summary.html | 164 +++++ .../erius/lab2/move/status/package-tree.html | 169 ++++++ .../task/doc/ru/erius/lab2/package-frame.html | 20 + .../doc/ru/erius/lab2/package-summary.html | 140 +++++ .../task/doc/ru/erius/lab2/package-tree.html | 135 ++++ .../doc/ru/erius/lab2/pokemon/Blaziken.html | 444 ++++++++++++++ .../doc/ru/erius/lab2/pokemon/Combusken.html | 443 ++++++++++++++ .../doc/ru/erius/lab2/pokemon/Comfey.html | 434 +++++++++++++ .../doc/ru/erius/lab2/pokemon/Gligar.html | 438 +++++++++++++ .../doc/ru/erius/lab2/pokemon/Gliscor.html | 439 ++++++++++++++ .../doc/ru/erius/lab2/pokemon/Torchic.html | 438 +++++++++++++ .../ru/erius/lab2/pokemon/package-frame.html | 25 + .../erius/lab2/pokemon/package-summary.html | 160 +++++ .../ru/erius/lab2/pokemon/package-tree.html | 161 +++++ sem3/task-custom-make/task/doc/script.js | 30 + sem3/task-custom-make/task/doc/stylesheet.css | 574 ++++++++++++++++++ .../task/fatJar/.makefile.swp | Bin 0 -> 12288 bytes sem3/task-custom-make/task/fatJar/Lab2.jar | Bin 0 -> 44483 bytes sem3/task-custom-make/task/fatJar/MANIFEST.MF | 2 + sem3/task-custom-make/task/fatJar/bild.sh | 0 sem3/task-custom-make/task/fatJar/build.sh | 7 + sem3/task-custom-make/task/fatJar/jar | Bin 0 -> 44483 bytes sem3/task-custom-make/task/fatJar/makefile | 15 + .../fatJar/ru/ifmo/se/pokemon/Battle$1.class | Bin 0 -> 709 bytes .../fatJar/ru/ifmo/se/pokemon/Battle$2.class | Bin 0 -> 681 bytes .../fatJar/ru/ifmo/se/pokemon/Battle.class | Bin 0 -> 3139 bytes .../ru/ifmo/se/pokemon/DamageMove.class | Bin 0 -> 3116 bytes .../fatJar/ru/ifmo/se/pokemon/Effect.class | Bin 0 -> 3242 bytes .../fatJar/ru/ifmo/se/pokemon/FireMove.class | Bin 0 -> 817 bytes .../fatJar/ru/ifmo/se/pokemon/Messages.class | Bin 0 -> 2982 bytes .../ru/ifmo/se/pokemon/Messages_en.class | Bin 0 -> 226 bytes .../ru/ifmo/se/pokemon/Messages_ru_RU.class | Bin 0 -> 3186 bytes .../fatJar/ru/ifmo/se/pokemon/Move$1.class | Bin 0 -> 598 bytes .../fatJar/ru/ifmo/se/pokemon/Move$2.class | Bin 0 -> 840 bytes .../fatJar/ru/ifmo/se/pokemon/Move$3.class | Bin 0 -> 956 bytes .../task/fatJar/ru/ifmo/se/pokemon/Move.class | Bin 0 -> 2169 bytes .../ru/ifmo/se/pokemon/PhysicalMove.class | Bin 0 -> 742 bytes .../fatJar/ru/ifmo/se/pokemon/Pokemon$1.class | Bin 0 -> 791 bytes .../fatJar/ru/ifmo/se/pokemon/Pokemon.class | Bin 0 -> 7892 bytes .../ru/ifmo/se/pokemon/SpecialMove.class | Bin 0 -> 756 bytes .../task/fatJar/ru/ifmo/se/pokemon/Stat.class | Bin 0 -> 1325 bytes .../fatJar/ru/ifmo/se/pokemon/Status.class | Bin 0 -> 1066 bytes .../ru/ifmo/se/pokemon/StatusMove.class | Bin 0 -> 1767 bytes .../task/fatJar/ru/ifmo/se/pokemon/Team.class | Bin 0 -> 1678 bytes .../task/fatJar/ru/ifmo/se/pokemon/Type.class | Bin 0 -> 3811 bytes sem3/task-custom-make/task/modular/Lab2.jar | Bin 0 -> 18484 bytes .../task-custom-make/task/modular/MANIFEST.MF | 3 + sem3/task-custom-make/task/modular/build.sh | 4 + sem3/task-hex-make/lib.asm | 32 + sem3/task-hex-make/lib.inc | 3 + sem3/task-hex-make/lib.o | Bin 0 -> 928 bytes sem3/task-hex-make/main | Bin 0 -> 9024 bytes sem3/task-hex-make/main.asm | 10 + sem3/task-hex-make/main.o | Bin 0 -> 736 bytes sem3/task-hex-make/makefile | 14 + sem3/task-macro/macro.asm | 6 + sem3/task-macro/macro.o | 4 + sem4/hello | Bin 0 -> 17848 bytes sem4/hello.c | 12 + sem4/hello.o | Bin 0 -> 2000 bytes sem4/hello.txt | 1 + sem4/hello_mmap | Bin 0 -> 10088 bytes sem4/hello_mmap.asm | 122 ++++ sem4/hello_mmap.o | Bin 0 -> 3680 bytes sem4/makefile | 25 + sem4/string.asm | 39 ++ sem5/ast.png | Bin 0 -> 21244 bytes sem5/generic_list | Bin 0 -> 17176 bytes sem5/generic_list.c | 80 +++ sem5/print_var | Bin 0 -> 16704 bytes sem5/print_var.c | 11 + sem5/printer | Bin 0 -> 17656 bytes sem5/printer.c | 119 ++++ sem6/README.org | 201 ++++++ sem6/ast.c | 77 +++ sem6/ast.h | 56 ++ sem6/ast.o | Bin 0 -> 22576 bytes sem6/bad.c | 27 + sem6/heap-0.c | 91 +++ sem6/heap-0.exe | Bin 0 -> 42278 bytes sem6/heap-1.c | 212 +++++++ sem6/heap-1.exe | Bin 0 -> 45422 bytes sem6/main.c | 58 ++ sem6/main.o | Bin 0 -> 22776 bytes sem6/makefile | 21 + sem6/parser | Bin 0 -> 41072 bytes sem6/ring.h | 144 +++++ sem6/tokenizer.c | 99 +++ sem6/tokenizer.h | 25 + sem6/tokenizer.o | Bin 0 -> 15080 bytes sem7/README.org | 442 ++++++++++++++ sem7/a.out | 0 sem7/check-pwd.c | 23 + sem7/img/output.png | Bin 0 -> 20662 bytes sem7/precompute.c | 13 + sem7/printf.c | 11 + sem7/prologue-epilogue.c | 15 + sem7/restrict-0.c | 7 + sem7/restrict-1.c | 7 + sem7/return-value.c | 19 + sem7/stack-smash | Bin 0 -> 20384 bytes sem7/stack-smash.c | 46 ++ sem7/tail-rec.c | 40 ++ sem7/tail-rec.exe | Bin 0 -> 41869 bytes sem7/volatile.c | 15 + sem8/README.org | 448 ++++++++++++++ sem8/cpu-reordering.c | 72 +++ sem8/fork-example-1.c | 30 + sem8/fork-example.c | 19 + sem8/mutex-example-1.c | 34 ++ sem8/mutex-example.c | 27 + sem8/pipe-example-1.c | 180 ++++++ sem8/pipe-example.c | 54 ++ 253 files changed, 14390 insertions(+) create mode 100644 sem2/print_hex create mode 100644 sem2/print_hex.asm create mode 100644 sem2/print_hex.o create mode 100644 sem3/task-custom-make/Lab2-1.0.jar create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/executionHistory/executionHistory.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/executionHistory/executionHistory.lock create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/fileChanges/last-build.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/fileContent/fileContent.lock create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/fileHashes.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/fileHashes.lock create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/resourceHashesCache.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/gc.properties create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/classAnalysis.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/jarAnalysis.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/javaCompile.lock create mode 100644 sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/taskHistory.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/cache.properties create mode 100644 sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 sem3/task-custom-make/Lab2/.gradle/checksums/checksums.lock create mode 100644 sem3/task-custom-make/Lab2/.gradle/vcs-1/gc.properties create mode 100644 sem3/task-custom-make/Lab2/.idea/.gitignore create mode 100644 sem3/task-custom-make/Lab2/.idea/compiler.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/discord.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/encodings.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/gradle.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/jarRepositories.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/misc.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/runConfigurations.xml create mode 100644 sem3/task-custom-make/Lab2/.idea/uiDesigner.xml create mode 100644 sem3/task-custom-make/Lab2/build.gradle create mode 100644 sem3/task-custom-make/Lab2/build/classes/java/main/ru/erius/lab2/Lab2.class create mode 100644 sem3/task-custom-make/Lab2/gradlew create mode 100644 sem3/task-custom-make/Lab2/gradlew.bat create mode 100644 sem3/task-custom-make/Lab2/settings.gradle create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/Lab2.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Bulldoze.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Facade.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/special/AirSlash.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/AquaRing.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Confide.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/DoubleTeam.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Leer.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Rest.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Supersonic.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Swagger.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Blaziken.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Combusken.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Comfey.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gligar.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gliscor.java create mode 100644 sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Torchic.java create mode 100644 sem3/task-custom-make/lab2_prog.docx create mode 100644 sem3/task-custom-make/makefile create mode 100644 sem3/task-custom-make/task/Pokemon.jar create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/Lab2.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Bulldoze.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Facade.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/special/AirSlash.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/AquaRing.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Confide.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/DoubleTeam.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Leer.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Rest.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Supersonic.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Swagger.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Blaziken.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Combusken.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Comfey.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gligar.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gliscor.java create mode 100644 sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Torchic.java create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/Lab2.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/physical/Bulldoze.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/physical/Facade.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/special/AirSlash.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/AquaRing.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Confide.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/DoubleTeam.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Leer.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Rest.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Supersonic.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Swagger.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Blaziken.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Combusken.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Comfey.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Gligar.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Gliscor.class create mode 100644 sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Torchic.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle$1.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle$2.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/DamageMove.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Effect.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/FireMove.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Messages.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Messages_en.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Messages_ru_RU.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$1.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$2.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$3.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/PhysicalMove.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Pokemon$1.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Pokemon.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/SpecialMove.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Stat.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Status.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/StatusMove.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Team.class create mode 100644 sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Type.class create mode 100644 sem3/task-custom-make/task/doc/allclasses-frame.html create mode 100644 sem3/task-custom-make/task/doc/allclasses-noframe.html create mode 100644 sem3/task-custom-make/task/doc/constant-values.html create mode 100644 sem3/task-custom-make/task/doc/deprecated-list.html create mode 100644 sem3/task-custom-make/task/doc/help-doc.html create mode 100644 sem3/task-custom-make/task/doc/index-all.html create mode 100644 sem3/task-custom-make/task/doc/index.html create mode 100644 sem3/task-custom-make/task/doc/overview-frame.html create mode 100644 sem3/task-custom-make/task/doc/overview-summary.html create mode 100644 sem3/task-custom-make/task/doc/overview-tree.html create mode 100644 sem3/task-custom-make/task/doc/package-list create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/Lab2.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Bulldoze.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Facade.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-frame.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-summary.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-tree.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/AirSlash.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-frame.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-summary.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-tree.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/AquaRing.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Confide.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/DoubleTeam.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Leer.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Rest.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Supersonic.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Swagger.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-frame.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-summary.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-tree.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/package-frame.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/package-summary.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/package-tree.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Blaziken.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Combusken.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Comfey.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gligar.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gliscor.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Torchic.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-frame.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-summary.html create mode 100644 sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-tree.html create mode 100644 sem3/task-custom-make/task/doc/script.js create mode 100644 sem3/task-custom-make/task/doc/stylesheet.css create mode 100644 sem3/task-custom-make/task/fatJar/.makefile.swp create mode 100644 sem3/task-custom-make/task/fatJar/Lab2.jar create mode 100644 sem3/task-custom-make/task/fatJar/MANIFEST.MF create mode 100644 sem3/task-custom-make/task/fatJar/bild.sh create mode 100644 sem3/task-custom-make/task/fatJar/build.sh create mode 100644 sem3/task-custom-make/task/fatJar/jar create mode 100644 sem3/task-custom-make/task/fatJar/makefile create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle$1.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle$2.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/DamageMove.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Effect.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/FireMove.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Messages.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Messages_en.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Messages_ru_RU.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$1.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$2.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$3.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/PhysicalMove.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Pokemon$1.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Pokemon.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/SpecialMove.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Stat.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Status.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/StatusMove.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Team.class create mode 100644 sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Type.class create mode 100644 sem3/task-custom-make/task/modular/Lab2.jar create mode 100644 sem3/task-custom-make/task/modular/MANIFEST.MF create mode 100644 sem3/task-custom-make/task/modular/build.sh create mode 100644 sem3/task-hex-make/lib.asm create mode 100644 sem3/task-hex-make/lib.inc create mode 100644 sem3/task-hex-make/lib.o create mode 100644 sem3/task-hex-make/main create mode 100644 sem3/task-hex-make/main.asm create mode 100644 sem3/task-hex-make/main.o create mode 100644 sem3/task-hex-make/makefile create mode 100644 sem3/task-macro/macro.asm create mode 100644 sem3/task-macro/macro.o create mode 100644 sem4/hello create mode 100644 sem4/hello.c create mode 100644 sem4/hello.o create mode 100644 sem4/hello.txt create mode 100644 sem4/hello_mmap create mode 100644 sem4/hello_mmap.asm create mode 100644 sem4/hello_mmap.o create mode 100644 sem4/makefile create mode 100644 sem4/string.asm create mode 100644 sem5/ast.png create mode 100644 sem5/generic_list create mode 100644 sem5/generic_list.c create mode 100644 sem5/print_var create mode 100644 sem5/print_var.c create mode 100644 sem5/printer create mode 100644 sem5/printer.c create mode 100644 sem6/README.org create mode 100644 sem6/ast.c create mode 100644 sem6/ast.h create mode 100644 sem6/ast.o create mode 100644 sem6/bad.c create mode 100644 sem6/heap-0.c create mode 100644 sem6/heap-0.exe create mode 100644 sem6/heap-1.c create mode 100644 sem6/heap-1.exe create mode 100644 sem6/main.c create mode 100644 sem6/main.o create mode 100644 sem6/makefile create mode 100644 sem6/parser create mode 100644 sem6/ring.h create mode 100644 sem6/tokenizer.c create mode 100644 sem6/tokenizer.h create mode 100644 sem6/tokenizer.o create mode 100644 sem7/README.org create mode 100644 sem7/a.out create mode 100644 sem7/check-pwd.c create mode 100644 sem7/img/output.png create mode 100644 sem7/precompute.c create mode 100644 sem7/printf.c create mode 100644 sem7/prologue-epilogue.c create mode 100644 sem7/restrict-0.c create mode 100644 sem7/restrict-1.c create mode 100644 sem7/return-value.c create mode 100644 sem7/stack-smash create mode 100644 sem7/stack-smash.c create mode 100644 sem7/tail-rec.c create mode 100644 sem7/tail-rec.exe create mode 100644 sem7/volatile.c create mode 100644 sem8/README.org create mode 100644 sem8/cpu-reordering.c create mode 100644 sem8/fork-example-1.c create mode 100644 sem8/fork-example.c create mode 100644 sem8/mutex-example-1.c create mode 100644 sem8/mutex-example.c create mode 100644 sem8/pipe-example-1.c create mode 100644 sem8/pipe-example.c diff --git a/sem2/print_hex b/sem2/print_hex new file mode 100644 index 0000000000000000000000000000000000000000..d8288f488f8c5cbad77556cf41ba00d5ff99fb9c GIT binary patch literal 8969 zcmeI2J4*vW5XUDkjcIZzgouUFMyo@OZ$#pg11+==wDCAiB!WpKccNAnBBb%VSVkKQ zD{FhP)Y8r_&g>(nXJTU`I0H8```?+p%`a—`iE8$QGw1r^~#K_1ANqT@R=swzzqynhNWCQR-Y4Z3L_Bq-@_}N{u_wGTjNui zNRz^UukRLm2zmnR_bGiSpl4AxTI|OZdKe6SETR}F6150!BEZvnC@B0b9OO$RT+yq^9rXPn4(tg@i(Ct zn~AwN8$kT3QC^!q~jG(kP^9V`#x2rdm!;qEF$~s((lI4>l`h66{ZW0Ce+H3IG5A literal 0 HcmV?d00001 diff --git a/sem2/print_hex.asm b/sem2/print_hex.asm new file mode 100644 index 0000000..a309842 --- /dev/null +++ b/sem2/print_hex.asm @@ -0,0 +1,26 @@ +section .data + +codes: db '0123456789ABCDEF' + +section .text + +global print_hex +print_hex: + mov rdi, 1 + mov rdx, 1 + mov rcx, 64 + .loop: + push rax + sub rcx, 4 + sar rax, cl + and rax, 0xf + lea rsi, [codes + rax] + mov rax, 1 + push rcx + syscall + pop rcx + pop rax + test rcx, rcx + jnz .loop + ret + diff --git a/sem2/print_hex.o b/sem2/print_hex.o new file mode 100644 index 0000000000000000000000000000000000000000..904d5f655a892b5bcac4d1ffd078eda7bca664f9 GIT binary patch literal 912 zcmb<-^>JfjWMqH=Mg}_u1P><4z~F#jLfH-s>^F`fYS0n z8k_wNP(eMYIv9m+zdBF?JxoAq3!wU8_JGuYoP=(_fuWJHiK&^ng{7mDvx}?Sevk#b zK*UZ5AQ9lv{F24v@(+*Z2mBtr8-OAVJ3x|w{H&1?9<3)!?;Qq-ApyOV#F9h?y^_?5 z5(d5EjN+1_lEfq+t1=ftL-|FiIf)QONP6)wL6)*GeEg412{YCd3kp}vnBfN-05S~~ zh=RG8>Ot`X3OR^AFb9<=D9X$$iO)!_&`T`NWk}9XNiAl8iy>HgIr;eoK%H_>-P}ML I(>4YM0JvE_J^%m! literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2-1.0.jar b/sem3/task-custom-make/Lab2-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..61baced925dc0753be0e0235c969d09e53a58b35 GIT binary patch literal 43799 zcmafbV{~O*)^#P7q+;X7729^jwr$(CZQHhO+qRR6lZsPcp4Qj>^xNI%j(dNtea;zU z&o$Rv*jGmUD+uJ5FW}%`ic%!xzkFW6fBbx25T9R3K?PnaQ7IvsuU};TVdxjbEAI!v zVb1nx@W&VVpA98>r9_1U;*(?<2;-_v#C1WUDC_9bY__J<4eyL+J6&7S3k z%!k9TgR!>bDS`Xwqd4L-?6)3Wv+ukz6d?pX0_dv=hy}44Vl1tJZ(YIjKsXa^=!d|iG@ZiHFBH2O0rUu@dUZ@j)0*gH$&O*1(~ha) zN>qi9m!O>`YpWpjKQd0~8VonZ)@&xjlAByU#Ms5Fp-sm(8qn9|AM5WtLgS~X3+=ni z*9s+C(455$Hr+zf-u99VF$$!F*21jSPAg8I{aQ}IB{`=(wOee(ep;iBORX`?g-`j( zI{m!2DIs)t^_osbbMCnMjds_g%P2paf=)<0dgz4LZV)(%p&w%}HMkflD__GDR`Lp( z?`MBvbW$-nWaH*NG-bYMdC4dZ$L@k@YQhDhfR9y2U9}|>GO!rDjB|v)*>}9cnm1c1f=f+S6(vxxw%Lm6yhVWm= zu*nHGR@yL5Ic};DR#)LdR^lXdZlO>#U8d{GT2{+3YuGiqcHcQ*ghjcBpW8zl%L}gw zRZ-I~BxYb|(I(hl#ye_ckQZa&l%*qbE9~fr_6p|(;1W#RSS|N8B#)SrE3s+sC^%^y zv|Y70=%tOdQ$WClFrTwRp{yyQ*IV|(Ady=|@;nmPkD)QmVBhxBcihG59_g%_qla-E z{wB+(if+1KE5Xhkr!#)pbBcG#r8Q6;&zlJBE72Eu3V6BV2^9HuXM*J^HZ@1!^>B}! zYaY3EY?@dUJG(N|4*4sE*s`DmEz0goaEH^h@oF~F>7)P~t z;xi^DRCPgqsc=jDs!~KMM7By@q{uY#`8={_FrxOaJVm9GgccCHqLQ9rsAk~Siwn$Z zSZLQbk`3nNtaP@e((Zoo&MY%P75VkB$<83fWqw^GtnaK5vLLg9m%d%~rX?wZ5N+I2 zatuy8cE*)%7Fwp1etukJyNP0m1*4)&l<-*l)KgP+wB zqbVOSRh7r0h(H0&N3Bj>%xv1%+^Jk(=rL|Kw&t~&V5w-8QoYz_IT3uXP+;$r7b|=O0E%nR*=6`>6vm~ zp?Xf`8Zk`Rsx8i?F`HIZj5ywfoWMm}MhYE77F8`zuxR+J$X}EdDw;5+rQjaeshBd} z@AKuyZf+}=!}>~-fTfZGEl zDH5V1zz6+^POQGYX06VnZd{3b0arQy>vbvlS9|K66i_)L&Q7k6Fe1)=s82EC5-r~r z*ysh~VMrojwm+=|%m(=5g%Q06uHILiWbDCQXKiYu`c$YcxGlbPq;8k<6N*|z662+j z(;o=b1L5I}HlZN3s^mWp7+R!;`SR>{gt2s?Wtk;Xza^7(&n1T^%)`oK2_q}JJJKBH zd$!_ohv@_IUs)C7z-2(7sWN(y0$Ct`lLbgyS#NN8lo`cGIC5G|aDn?#{w&5CRbD zxuoZ*5x!^a%o)3|0?y_8e={~~__gxx@5VEIs)Yp5FJDOi2Y`ii^>q#Y2H!vh zO?f2c&rrTPNvsRR3m*z>R!RKb3Ppfi1Oh_E0#VP8)uow`!eaEB74wvf@p|~yJ>1h* z6B_l?28XkVEq9cU=>4aRN!WhD9)qKI_N%+DE7vKu*WLNwS6?LXDs}0heM@)x@|9z{ zclv^g5qRM)18A{(H75dYs4hk6C%S*+b~c2(>O6rwmD*RElROeF|ska z9reb{>S0t)>qh|yU#P*YEqCk&JowbA;(8_;_`u#dWkN+FrEgY)W@BCCSkYlcYPzBL zlmbQCq2qjQ;ng=3=k+QmjYLbTVXFnUyCchdIrrXQ>on)gctdrnjN*2FGNWZ^*zWN? zA1WQ2IPIz08jR;kV-+dt6X}tS>#|ja#?tEH_UUQ3$Sp2v>Q0-a*~ znneVznpCINr!kxK6Ct_zI8j0rFbtQssMeGEdmy7D%Lg+fTF+&RbYnMubFfQ~_g)@u(QCv3jV&6kaoJK=Kx6Ie=5wg;CcbQsRY zOY{HOuG83hh`U&u!#+}EyC6&$9Db(!HeOkUtYjKs7wUoEd6O`$dmTWQlBqdqjA*KH z6o0XcsVKUKem{4fzwBFo{~G;__i~WtgzV4ijSM$~%YIZYVsPL2nizlhaCzh&{x{zUQi^MB91dHM9XX&s7dGr)x#$A}tEm??75l1R(m~({h%zEN^}Tq}$n?=prrW z9y8{T**-s>>$u%r8DCX;;(SWs0YzV@S-SdLfv20*g#fY}5PHNBsv^F|Jja_95$!E# zeOO1Jl(bJv^nqCXoWH|x?L_xqvJ~p56t~q4LJVL!jqEqK_S7^X_PG6JMiRwR74@E& zox>Uk@02vQR)3C1N;n1M#V9#0YUy1U z5jT^{F0Cj6^jsB{m(CXJ^ek`didfU2Q_a;kVB6a)7%2mudh0@0D9cN=H z8~maBfBVgWh%+a{L2g)-!xb4;ZhEvBEKsSc%4WJ8L?5UMHthL zn6z2Cn5Hnb)2}d!Cz~UuCt36Zu?TF*i(&69JgHed!w=4C|o1m_ z^Re+8A#us5s1VP%6BcdtBk}(FpB)3^KcL$|*Wv$2TZLEDF+M*1V(LFfGyA`;@gje)uM_I7=p}ffFaa6D%Ob;vimD_K#eomn#xb&{8Q9PRvAM`p zCv^+ffQXk}Uy?oZCsmW^vJuiM&Tn2#K5o5sEpxp;ZeJmN(RU%*?fM3tUzG}@5{)+L zvNM$O4en+n+?F%xdH@QJSc8F}7#@yzkd~;6=RpT!ns9=aHHlwb7HoS@-BDPP-pooo zG(9M3Jj*kBTrG+QtxnX6 zaKRu5%Faz}vZ6GI_-EL>ZrAKB^w&IYmIl785fb6VimrYXe9Jh3`>vd-q{5bY&TRSy zLeQ75y=Hpp3l|p?S{cU7`RVDLhH{r#KbUN5Z#l_G#ZgH3j}2wa1eM-tarLi%mJzco zwIu1Dl%UE{Qv;+6=@Wms?7Q`f+^9;PRPiV>Q3}xBYgcLuL8%!!?6dJZ-zcBT-$>sS zxM;knaguwIeNcK{qKs$(CBi2m@GA6GM6gZFgDn%1(f=Az>48G0sU_8i7)Mkx7?>HG zQ6!?ax>3UqTL`UB6DTvwuarj)4dHHH5E;@z(yVj?A9Oy`cfat=eP7=*Vv{yjgj9;s z36N6X;)`4sq5`4Wlqy!GwR6RLfXoq=EFKrC>{7^Se8FE6dRXEQJt2QNi8e3#Jr(No zWD`lrqspv7@;U^%F360HsMeexxh3!Yt+JhZ#fjBK@>NQo#+8^fZk7@br)Oy=_#J%8 z6Kd6XlbspkTs9c&9!dc{JROj;>Z{(OIcgtmbTfHr@5uv2Q~XO4yfHg)i#G@HCDukN z&7c2U4D7BJYmo6ixK#_r-%NO;0g!qWLnW)Q+1k#M-vWGqPNY)L~?(WV8R_QMa zNY|w$^q2m%!;SDl8BhZlLbMXBiAbbH-bk|fZyU^Nl8D-Bif2ne$|4Q?pmEwvERjrooON(%Cq1p9~2zDXV)f@s7LN9tD zrD`EW-y@L60q%F$hOzNpucX@L;rHfsB@)kp zUe4F{T4sya^eq%Y4FW%XeYC`MV)itA1|5qJ811|KXEFmPJ0?7J$UA15ZkqW6I@#@k zZftn^&73`9{Qj2@xKKC0c%G+3qu7% zUCX~IBYAacBw6?mDfKo>)hc|ELphXMpPDe2uX-B|i!t}8sOBykN%9(-m(1%_5YcDl zJVLZ#vmo1^X1`->r<%xMOe2lsGa2f)J?J0Z!7YhT z1y&!_nLuSw4FGv5+Ag-xDz4p`bn?U(6mGOMy`1>LN;gI_`~ zkPw?+NKQalS)YzimEv$5BvrO397-&Ek5aY}U*)K>8^awr)+%;FSD_F2r3YRbI#903 zR67m7!A#ljIkXc^gAzigi~AP<-&l0Y9ZY3uF}A`RCp*;Va0Fei_xijJmC#X!y=>5( zF(GPeD3kv}_yn-HZ-FM7OO>*S#EH+cSd?tRLgg%Oc*g&AUk44U zUt`+V#hW7)c|PTgU)Wv@MZuCJ`NCcgBqRv=f`^Ztn(5N$=U2o{`5@uidFeoSQRLMP zD|r1QI`GsEyju?dv3J2ZT%5Fhktgzg%Uq~*4A1J}D?-jYa@DMR8h(1h z=*ZZ3@imNek9UwS5*+%&Wq$NlzJe?CGH6-gAhgja7;W$~^EA2Y%_I-b+lHvMtoDW2 zgR`8zmN~v+VF@Xc7F!_lQ_#%ei)=s$UyMYPk0oMld#L(enO^SvY=<&h7}%keOAlZT9rcHdVpW$IW-1`ztI1p-CW zl9yb$ItfXh2)YSEm`=;mHbq%X?8`xB{{+covC!lIo5XTZdU5pne3NgI{HFGWh8@R} z{K{j)R8lU^c)y7?4Rpxhg3$a~VkNq$iQ^Q(q&4Q5&e{AK+LZ8y3Tmg(kLc5;>@$rb z(+wM!cK9-6l`&Bk7Xo;o+bWvX((&-m?B&lJL_I9kO)-Qu@Mcj#=`+#^``f429p%dr zOz_&6OJ~^{7tOGa)hq9NfvVL7Fr%c-%4uupa+NT^(35Dy3U6=R^jC_z4IC!ex90`E za^qQxm*}c=wm_gK)6o!w1T$W5MSlcuU2UmeDgU;=YWQ9HSoxa{zmD+d$fssU%o=eC zGe&eW9H5=9q36{ZEt-}iN-Ok<4-1uC$7M)F+UZcmXvrT!h#_e5l4HWs z(3;5fOY}kjoq4d_lsrHrZ{#q1RRC<+H2c}KxfP+0Xyjlr=D3IQ*n0qh)|B% zLMDZ870C{{9{8mcYFn9A>Sw-NmC&2C)jH_q+n=<$KNYy6*k}F70qlR_RnE}f;qQ1= z{Z!lVAH>T>{gB`;@G>`2KQynPIQ0;T(sT?EB8{m=eac6v6D>H$NFEk%n@N*;=g2)D z$=>kBFC`&eMOK1WFH6>Zc4ds1f>fjemYcr#%3Gs5m#;Clrn zZfOVmiK03tmQYZXV`Xfp{Im!a3u27U+2L4_C7?iz5L+91e*9{Eo?93%>MX#tTC7VZ z25ln5Za+$E;;>FSr;mv6i4(^Z+5iGg{Q^=0dm0R%P;~+u~KKbc-aV&RC$B5-&w!N+vck zjBJKTHmFo-L?tyPMZF>v?r!bS@X{Z-)q}!Z+(bGD;o5$Yrq?LsBBO0nB@LCO)0U10 z_!`eqB4w27wN7&Au|Al|YBi_CjM+rfvHNbO$IsD5lmvOUhz>8jb^WS(ZhtO+w!hG~ zcf8=gTVH#ni;}Yu=SO7&Wx%i^sNRJ&VgjVh(*|{7T($Nz(n5&=qLvx_w%O`^a!NL!ly>bxn(AZ)y8qOEg)RiT47_xE{m?4I3Jz{Bo(Ze zF{~l@DHCMnA?5wp3Vn&`kdbU-D;9WbGd2V?n!S$NJZlFS`I8dMY6adGfm z7iAuM8pw>5K%RKh3`ELwk^%wNVp1=mhY5*^Tidd)Gw!-xeHkP3jVDe-0OxO z)(x&OdWicz2RE3t3?;lj#5HjbV7<&H=B;%H7r%UW{M_Vy*XqjMgiHrH(~blmfep$`$r7 z{WlM}1SwnYF~ERr9WbM_o@Tf`j=GKksCrl5BT{Fe;(cXKw{K-H7+6={arh(b?_?pO zgNdI7-+nIqsg_H$js#Hnj2$TdQ~by~+8El|TU(jx|C9Ln6z@gNmgc!C2&8t31E>Lt z3uwIh@?~&MGYuiTw(SzOj_vKMP!QHyTJLmzbnuebo5jE2(5Ed}3h@?O;Ovhw*tVU! z7~GGRuda^2{1MCtK>(KnS)CqmH$<^NsG~d(#Z{zssFesS=mnY}6A}4~-jvuB{?dnN zGdCaVW$%}nWyDgZ+t3tzbitzcS0GzF4@3(H`T0|E)L^`c#C$S|j6NXE~ayiGKe*E)?pXE?c|u2tT9fnAtu zk2j@&;;CHAwEL|$qhiPs%&Uru|>O>~7s3h5|lTn)Vomb8AcJVO>#+cTItzdvLUt$ zzLlJjj`B^KpR9l`t`Be-JN8TUnE%!Iwc|biuGMqxdEsN}nbkR#V%H1OJSG16yI?+D zA1&7pvrQV=Tr)mhxCvT@Ys5G0j#jeE?;JZV?tuu zvSUyT^Tv&1sF!hy7a+2AD$G^(0|J?BsN6r_xDM|0ITAq7ym{z)?QJQ|`GRc_G z$D1kdxqLKqK7smG9j5;kfN#d$*;!cRjNUiimdh~>@GC9F=95Tw&&Xvd$MoowrLZf{ zK`GaWVGvhy6s~vJb?=S26KX~$7WB3{g-IVlJ5Ee%okqdGkoo>wt6ZT)Py*k5gId)s z_UuJY-b>BB(XG?1Mz-2`%uve?+?DZ=#IoKp8ANv!iXQr%B5{o-xh!izWy?Z^=z|Xp z!ytM$g?pFKK-2rcw0?Ns}u-9qw!s|Ykf7v^r(%~{z>@CQ`RNx&i>uVi=IPFe`o zTIRu^yD&Jjv)vKS&4b}CUj+oBKX>^>Js}m*JSmICrL-bxuFyHAIvZ2CZCn1PgM52T zKm^Y1-T~;0_(!3=SBeKabQ*~*sAuMr;_d77GjD(iw+}ByJhEzmn2=HyH{bWI;2pX) z*v*OaOLv%=6@KVF0HW%J2DE;F1$aK-&c3J2n+bV48Kn6ukhCuflMTs;A1eV@*eoITUk`Y2QeAwPYPWCJO#FtS9$%V_GE? zcb=+w^rHJ;_4=no|3?uY_22ZmjkUR}p!OBbfR}(mDa;U>%`Xp$Hc+&UIt#%|w$n|p=KdGQ41Gt|bLMCS13^-d?vfmB3ROCscAB=x` zY0k(OPjTZonA6y{IFz*= zL^tZ+I9^-=Ho9V={O z-zFWat&%^yPP5p*A#6D_$^43M(u__VV0E%MP)2qWPXgXdq>g=sKWTG!ro+x$TeuG< zR4O}Oh56(=oSu%qVt@Ye18d!%6lUOh@O#&SZcfE+Y!qbI99^WWoCjA3Hu`Cmh7prT z{=T}$FzvIQO1fEE{xkSV&r>K1M&JAmmzNHpJ4Jh|u{>8AglrS3s^LLU2Od(fmZmc= zOM=LE_$gMmrBif$(Nh-cs4y;nj5evuq0B&Vze5RW(ubP&r8_O&6f<{orWCYD@BAs3 ziqmYfF_|Rd$bR_&vZF~jQd;{IGqzGwNGYnZti=IO?SU; z90zu$-Eq?PO*fub+Zk*3km~Z)ujKdUR6!uxg`gwRF3P*p3l8-Mls;t0R zLBP;43`1E(LU*#MhFgXnejG=?2FWa=j4n6lexw9+QQV5;i*o`I(J$!bZ2X&VavZ}h z7wAD*_+&RKm|Ah98pR4%rL4Gm(xw0>-F)88-vxqhSr(|*WJDMjw<^zQ|H?b(St((# zpA2I4$sk1kk$3p5E%hAj|A|7(;FT}pvJ>Wd%y1L`OGIaj^@p!2H z1*cC^2Y_q-MA#%3@G_{BRn@?(&QmH0jKCQ-Uq>r)VoRe`L%ti&OUs!A!q!?bT--P_(!xZ+t6o?FlG|W+WeF_6qKi=jyE=_ zALv;E=#?jqnK^~?s*hJ5hZ!QGQY2?pD>e1OWX1*9ktOGk&t7DfCEN1gP&aiH~5gfi;(HFcDc{JH37@8m1-khg^o{ z#IKml9-L&4RNKLZNau52@8HGJT&fj3Jv#kf2<%jNuvTxNLS-6Shtv|J!eZ#t#Sr!? zR~_XXtC!*;$%-xb^Q0w`?rah1FJp0&mbhnqW8vu5*!t-75Ej0m7mmx zp@&9lIDCxh7rwSmm_G>(H$O@BKeA`-e+xQQ-e)Q4K*vDIh8^RTZ^_b62kXxqH&nt} zW{vsvl&VASL-Iy1E5o#3%Jh(4N!%l=53sUclDd!qeB?1=lrTgTS7lJEt^in|XYbLK zM6K$~{c$1L1=`CAtHx|D?@!5pV;?KfC;QY19bG0RYtOBL_P7NfLcAs3Cg zx@%QO(O3XhnyIvjXBvV_wUoIIGLrE)k}X6Y!?20c+Dda%#cKUoQJz?)H4cmi6)P@7 zHdh<-4bfy?MLn2}?8VP}?i<(GkD&b4`&gzXas-f3_Q*3r)9Xz(^{9`Wykj4x%5!^A zB#!axj^Zx!x%+#A-+qw`D~A6zgyz?};&7i$J4{k!_FVN@Prffg{+RE$cH^=r-WaVi z|0K?%NXQIMLit6k5BN{t>*Mda4;ov(T^ zc{mLMR7g=H(&lbIk>8II5YHSWh`5UJ%hZi4=mrOomp#JI`2&4TUXZ_LDj+FDiV7A6 zC#xxN9XLtB%O2#DwA^rjc?<4IZ)|W4#sG_oj;@i$FWh1#T=1iu5nz!+^#ft0EPP0- zx1pU*A#&$y^lPG;|Nc|q5n4_zBj%G(Oh4y>@&6m47#X_$U64TiAxJ)g0w^JP^)N~} z!#J6IoKPCoaueYF3P3_EA|gv1<0xxtRwW;K3%kzFpWF+MMW}?meLmUbX3EM(0jGG_ zW~J5nXv(?!H6^wC!}W#4r}@Sngg``G1$@#Fm-mg&-gyQ-Y?vWXUw2=H^qCo<;X6{% zv|dJo2FE9-EHttL>?~E#z)oqAk@26v1tD<7TQGTP#1OedbF?Ec5uihE=E1>a!*&=v zsCRMrZI~M4bVH7vo^X;Ktt>{vKBwQ782N?Q7%hS^rDD&k#%9z=4;di&Cs>@YC6n#b zE@DhoW}BcdTToLaKa5?8ja%!QR2dA_6VH#T)EHn|YqXV%jZKZm<+6OKXanQ|`N%sb zzEc^XGL%EsLXthZm-f}s%uve8+@?aKH&<1lfF>T_HtJnIckwZ#<+9a7Z;saA7!8Lf zL^Y@u!n50_E`^8Y zN5dq8ds<2ovk;oDEw#Q{$50f_a(3)A<5nPAk!7_(cbmq`eiSD6sbq)Tl_%>T1-)X? ziqL_B1GJ@a7*=-VD`lA0vii}KVvRznt0OZHP@ptk(r$=pZQ<=pYIdArpa|bBL9bVq zqCQMRO*6A$$4btRU5_#M>)g(DaxcDzm$;Ge%Wze<;KQ<;hL`?y3(Y<5lOYo=MxHCG zD#w8sGYXb`SWp~h^jOP3Cc67+h{%yCs*1YZEJ$vNt4G;-g9Sju5xPO?3g3%0`E@0z z50`B`sP%jaJx{e?rjqfYt`ae~JDuNj z=ULb?6jM>NQTRP_-k2sWoY`&kO*_16eEcygTT{|rQ<+g%L1u5UOxqeSv?=Bq$?&yR zuK@GfjstoYiis~;IRz(QHe$B@0n(J}1V8hVVs4nr)9+ri!>JDE`}+fNXX5?2WScB?IWrm;ryc5HYVd8lq!fx2OHh$=S+9(kMF)qAO#?O5Dg?V zH<;{j@aZmLXujJB*1bSgF-ayS-EK8kbIs`^z+B+792?QxG!2h7ksrJ?HOB!TTaQ{# z=_$YB@C(p4@IiRZnt08kD%4FZ(nFjdu=8FQga^`b3mBnYTQ<8kA*|Aahd3M7VHz+4 zhA>Qe?Pr7_EGPKGUz}hXnD=ZWY?s4fQrLPHNnB3p^yY9+$UviJ)Y%2HvV1dRP*M;V^EfVkJ?X zYc^tTpRTq4RUkna^Z6=#^4Zy^K>E*oCTwA9toye%N~Ypp)lrg0QUIvjSfNJ2k8rS= zswFi+Qlh`8Bjy}3GcHkPUEO+2XBLHyiKogx>jNGVoamhLftpV*}+ ze)kaqVIh2i2D#u+?n9&{&KTyi8Vek!_O9#a+%G85`%UADCS(T!sp89+aozz=*#R<5KNUd+5b7c*3oche-Hp(nr1)xcyH*)bs&feE9D zC_eQnUun503!d198cNf;jhqSlwaBOID0hYQvXsa;iegx%cx<>jLvO2}mLhSXjbMkj zwT9BkyT+ zs5Ob9LWzS@7kZM_uJhMF+d3V!Mt8FNx zs(i7&HPjj&{81KZh5nH|XTR!pwIFC2ciNW6*6|CUqTL8*@RfLvr0f^wp-8i=IY-1i zKb?@ZNWhk#t;EcoZFtM)^h?$y?B2H1vvWwa{+R;qcdxckI0T;gf$)Lu^#S|0$El0% z`2lBm8kT2wT;9CXwEPGDI8J_&3m~InW1%QKiAVgIa2c8bEdhE?0H<-m zcuo%7N^CeOI;V{dpWs}y6AF;1nQCM|VSvm>PvrItikELM-wp_Wpgwf`5eR`mXCX2l z34rLV$k;iu9W_m3m=vgt9(5xIXRl`w+~)c#hC&|^&mi(Dr9NmmcVpDgKNX8wbLJI+ zKRM~gCnpj7M~(H#N%s2I{~)F9zlba_k)(ja89)gtsY2cL>O{MyY*-&{UA5aEPyGz{&iW0i17?M# zeBBzfdeZ0LjpscZ7+f7u891ZzqKIzmup175v4`M$=HB4v?fb0a-^QJGVI}RW^e$s4 z?Tdir6zE3geyV*X1CfMZPe9XZ8(X7F9?K2RM}QZosEg-~U*;QT;aU|80%hrkdV#vM z*VeB^iBzds(p$A*t@`%e7mz`v^5b_z&6!Ni=~7Ebt4Z}VX;GP#I86f@QTXji7bsblJKF;2jt7Q9kX^Fw|6uWziAfl!U)_ohI%_`Yds#Dz0XmP&M+XW^rET7dCDGa?VjW7A?BR7%cQopscKD zf6pWx6NH-BdcgW>Nq>*Bj%wArmqkMQkerzs;K6%EW#6s~VNDO7!QuWq1*IVT+Ku{k zG+ck)SQ%=gj=YGbWJY=0#^Z1&`^A?9Sy*ROe(@TrKeCzpi)Kmq`!zS$p7M!k^sJ^A z+SRPNSE3A>5cvEBv4`ZYEg#asyIE)Y^#d#x-W%_?C2(mcol)<7g}311J!_|v!Wn+% zP60-#*$L~DVt@`a1Ctv_l4u@Bs0gAOVr|dISI_8N_^rfe?rC7Vvm;Si85O zd>WHcC6b$RVPoehOl2)8dub4@MJQnSsRV>l@{#gP#K?&_tbq!hPX{SGQMUz=T!S3a zIln^>ju3*f^qwHV2yxGM&Wn+$=aqOA*|T+}D`|iB`HEs@!Nq^XdDuNcLggwB%>9W% zXgX%ggg+_d_PpukTS8uDdSOb_*pr2pentX!`-=MY2|b_5}V_z8Goj=|J8bYdDr3m@p62c z{bg%V+E!vG%ct65U7!L2ygHP;tZJE5WM<$DGYjaEX#w`*l~4bR4l3xodXK` z-F3bOd)4Nw?y?Lzc1@{~l#b9te|h%aLhuhsBf1ua$5AC{WKTmyqeRJ4ZrMChQE3D> z;n`@2vAQcWY(zRmB>qqEI#NMninRvDBQYMMiZ077gIKfk1o8# ze8!oeeA{S*^U{?U{+XPKL-(iFKPMTVDMWRw79fLBd?sh@l|g2U2SI;Gny`vxL-Bo9 znV`=j4Mr_PnSUf_0xK<>Q?m^Tnv!_Ky8KqLp3z<<@^yxC2As}Z=pUDw3isb@S`6Bf z@{$;(Xuv?4T`KUc@WyFvb14wAb;So9C1jH?(?1nWl1EJud%Mv*PQ>0F2o9{!wIHx| z*b`(lhzAv)5dVOr#H?T3k9Z9D8VDId3w`09DsUKgXadc$aoTr14JtV!QztArWQpWt zi9~hIVAr7XO-mNVb%YukKH+fPH!Nqx-{Ok(io$uC3qC4EJ6sG8tk5aY{F(2YCO=EV z>U+>gYUB1GrW~NRo6Je0gu>q@TBsKDs^B_U(-l@M=gG&$ zsQV3$`Z~QTwjIJ3F->sJUEg;?XM7UJ(jEMU+KR*k&4goE95o;Ga?F0MJ7761(!ubY zo!*7H{(=-~U}77Oi?+}bTQ6>jb$x=w0;WV@?n1f2&YmXV4wt{MOtTe%F!=0^%_f)@ z9a^f|N}Pw}Rxb(xdwm~9ncr|OUDjKrRiLOIZ>p60;q6?6c>P?gFUXwMW+wfLi8iGL zx5?}__?NUR{BbHnb8@_m+7$LG=Q~TfS9|L~F<(!#!iDl!?9}d{lS5>H38XJzt|iR; z-Z_;JxzDiAVG!PHvVT6ndgo#O0jJN}VF!Fy;u|XXw1dtR&${m`_;lxhbAA7II(WRq zGG6C4{v^!_38s#h6SXHWb2^_iWGr$3vL4wz!W+!{Fd)Sz6^eLmht}e?tfpxr|aNgVMs{#*P4~1+`3r* z4|pzh{<$TSPKEQrt@0*COwb#_SU2GkvB5`>glNl9my<>)8^`i z@oLrw99A>j8;ipkeFjx|g^0QyrVRC|7*bU~+@fcvZcb$H1M-Buh7(M?g?oOmzPQ?TTEe zM@d>z47cVRi`WbDLyPt=$!xQMx^>=>eWPyI7X<=d$5#XWtCN_rBsCi)bfJ2xUK#ED zx?D?w1yv~NQeMirMiM_Vo%=a1nakWw2=*BvS0bKdudm}I2%>xtOV_emxkri8CdZbz zAz9tulLR<#z&hW;qKhut6ad?vYGV~}!y9)lj;g}{gtn*X1{|FO9T z=_p#spPO6yKR5Spe=p!DcTWBFk13Y4&8DT!OGlbA>hLGw5_5bt1e8#bk(u7Q%*4&g zf&6RKx9@m2U$zFsLm1lM=CURx*cgt-osGH}vbU{qzo6<6&qUx*B@5}OS>Zt=n($Re zDPVb?EZa?XpC(p+GmM5f0m!8AV)L^L0UC(J)jsI?g^9f7X~O8R?aGh%+H%w#b!)F1`LlCjwfTJcO6^(m9Mg@bic@*E(?gX6mRQso*8 z#8@4H-+m)d4L>>V^Nk1MLP%tPhXtWAa)T<2?&u4eaPdMG3oJ_6f?%Hz;tHa*(P8P7 z-0?oI!2Rp4Dme0+ihT|X@}|aXS_5b%qU;4jm_(#p(Gd<0h+HAmvj?+S!Oump#BaJa zOb<~eD$sXlN8Mr4a=KQGor!{l$ds9%4Yca|B{EYp-?Rq@z(qYj92}R(7AW)L26chB zy=Aw5a0q~JBItv65?zVplDI^wRpz7fclUo}xmYnCR`>8&k8=LGLbLZ}osb50?WPKZ z1@`8>CWOEVD^bRDYkU9D69E@I=KS4DvHFHQHwFVyN4`TV67Cs?Yj3H|1ISs#@!QwV zGMXLd=8~{#F`q_?9(<>`3v&gJvM<5L#dYGg?kL{P?Q9k1A6AG+q7w$|Nv2*@Z*e}1 z#-qe@)esJdj&;I!<&g;5?PblR7g~8CV#dZy=qNHL5)WSSt;)3sn4?ReBBEy}vK(&b zj9kd5G7kcsBx@E(F{@Zg>~5F|I>6C|9N+fMUvL9qDpoqR~lWB*!q!4ry9)d{^ z_OuEBgSd5(D92B0mR}?bOxqsd4oC+Mz=sSvg9>^z*w7QC5DseEOv{F%4?H%C07aG< zp`b>KLF2)}1+3!YhQLK*VX`51V{|JbclX4iC)Hv!N-tFFyx$Rg6NZi1%FKHrTC*Cy z8oC-O;jfHf%2=h-)n4wBzsPBrN@-b;>t4@sZQHhO+eybxR%~}{+qUhb;}zR>I!4F*vTL7n?moNjzF*aPf556|R*gBw z9AnJ%Zb2UrA!!TDLlu;3&+uBZ2p$Hs&>R#IzW5q?c;hKe8+!i2s(DCwOP(_o{_Ip} z5&#mZmBXCP++toqWj36@ZWgtncC?s`#m$PjJDu%zt1pkxdNRW-h|xZhU(8w z&j6}nV&0sQ0xCY1!x_dwY4upwqFsYP+ou|jamiZcd^p(*q(IVJ zQVa0GyK!+-ahBt9l-lT5q5_qhFzvFn%6fV}1(SLSC^l@!Vb@>!lvT|Af&B(@62V zVk?(Yt%bSX)9CUEG-%#!=kp2^gUz$+8GtgwJ^d>-i0-KK9TB!(OyQip8FNCA19eUC z#FP7unxTv*_|_am+I6dJpk618b3b)0If%6E5wHT|AmS{Mt78!xYvS3yvo%cxNLB_i z9tw)nL&t>*%NGB}npccHAr%Xx@HeK9qFuWCEN$8^t!V?oMmnlz3mNw-t z=R6Tr;mLOlsVkb@lHXfplBHs4b<(`-fR}*fGCgu_Am9=inH1X^oky%z(wwJ{P2|ih z5->X5qg)N+G)|XB0@q0kV4ldQRhuJ7XfDfx{FYvqT3a+%WJm7O&j40x5LwVN!RD!x z;q7L2dnYU46p_GbMy@~(ME997f}WPn=GqP;&78P6H?NBn6GbPQT7#Hb&{iIGB>gSY-bY+ej zqnV*k>3Htd*zXr$PfLuX*R`cH<&nM0D;|~7@e4Y5q_y}Jq`Kuc^mqHNEP8V-2K6nF z8|w7ZV&VG5Sz#dRl{lm5#N||#fwDDaDD@Bg(3WfpSWVK;zeu(dSa>?cgO2$f#aORT z2ws3$^5V;65nWufb2Wyvga{a(e|BtLXve1TL_J{9oU5%}Xs4zK2A!CA75IN&*EvmC zZAx$16w+_Tc&zv3#b=~=o=E9*axRB)whG@TF=)b7A ze{VKL4Q&j~P368KL;eXx#p+u2DyFC(wuwjNyDh;9k}z~l4QWNebxz3gSiPCe}eDx5~L@H4{x$Z<*} z&(2tan45Z@e*SD^`26*&<8@N*8^B>R0@~Vq$8^TF;^PqXQ(n9N2ag<^*8UEHpn z{Z(=*fC5SL@Du7T;!k5i5+99NZxmrI5x>$TB+Csh3KF;yICdarpf9-Bs{b(-j=?oZ z;FonZd^vS;1xSBoo{A90Nx6siy(Ic0PQMb_z@F0$n$cE?2kpCu+(+CTGK?!_ylXp& zAP)?lTzuO4Hk#_D(h#2dYf>JzV=F>XvUF@HnT(l{g@r+iPA=~C;+WD93B;kTvUa*s z30=MVl=IOYWZL8@J0L^iq$1TP16xYlAk#%xH$tIM(A`*Ou=W{h^|Uk_x0d|%CF9VZ zxz1x^H#rbGGM=5gN=>A`EGJJx3|AU^jXsonaVO}QTukLUqXa{*vl^z@V4b{DG3Tt+wP?cLU^Pe= z3>t&9!STWGVX?8S4X?Rsq%FiFgVe$G4U%-A%Omuxq4b$;U|$NApq4p9n7qmII7Ni# zxrh~5vc8g$6!f9FH&|?bC#q~lEEV0+eD|rr1~my??1pA56Z8Qrgh>hRevYtUqbVNP zPnl39K3;VA!knaG1{wkHxZRVOE%UjEMy>6B>Smi`+ocD4BaSKubW$3>o?2Uzb8Mnc zHY|x4qt2E}Pa`Yb6_sFxSwRz&G0g$&<`mv4I-@T$n1INtAGqrzXFf%YMuHyIm!G&d*Kp?+PxKipkOfsC+b% zlJR-c?5+d5{D!o1BAIp!a=pcH9+yL-3Wt_7B>;c}hO5?O)||NRy5?E{F{CM7s~!AN zB#ro#LDCjqrmPL7-Ke{dSc61tkoduAelioL#qFh*;6o*QCo$bwIiX~LE3u>+kDC@> z8L3Jkmepi@grYlW+Yq_WD2tXUVtbg#)-j)8WLp5+G}YLri5_}lp9@zo?Sh9cTy<(8 z?JxECd(h&bGmepD`aQ&z1DOlNsRi&`ep1Y-%33UnX?`9;W6oTKa#66!8YLFI>gsS0?v$VYOy9rPlwVhS6Gs`f@j98_(uGLe zhhOlP)ThTe6RHMjz_*);xYSJ%iyd%^jlRGTlPBq)ec6uXQdh*(68$)m$Uv#x!Na+ZwZn&*z&>$| zA!uNm=ryzW$?PYZ#tjDF;jj6`cZ6Y39(gF3>t;PuoC&u$vW-6ef!o{lI@9EhrAnFH zZ{|xFsI@_k3M2%W~RpfWs?g2!W&dIR6ag{nMJ}kBuG+26iITyZ$c@Egs_34A*7_= zN!wh^xEUF78uR=Li0RwD?e%N>=AjZOlPQ|?7E`9)0+q)FQg3D6^Q7Mw8lJvQUz}Jn zP6QR5_N-rRdQEL^$@KKx+^Bu~Yd;nVe&=3~kHbp|6h}e`Um-164xDt?Y?2r}P(m0o z*5ier4CD{$f)sHp+?EN%XWArQQ%6E#+9Y3dt&fNZ3s=!ON3JnlHh2pYQ?_;+F_ea% zFEAA~Idm!wqtF>2zlEc;wCa&H4S734+Spes-#{HN;F% zDKt8Rv4nuMGb1^rsJg5S9pVPFqfKWCdNzy?)_gCfTiu0cX$5U1oxs6SHwPn4fS?5r zABUqrWnbEuAD1JK)Be!F5U(kVAkhSSb`Tfic*2qbC6>&BFpc?I)i=dQj{HSPD89Hdf@i^)LO~Kg6c-72dv7_ z{7Pkis5lx6qskC1Yk68UIY*At4ee1y8p$5lxylXiL+4FE1V$gJzVeqtsqH2rLgOYQ z;4}eE>BbY^JlvjE(E;&Qt*O6u4-vl7{fC5VSNIR=E#%H2&7wUUCJ%{+n6WLU*_cR9 z@>~khEYwz)w9-6fW~&IRo39bUXMLp1VB;uZQiZW(5J{#@CDQD^X+nHJ5ppPDG8Thr zji+O&1$;F`lo~f2pk(}wQ?X?+`wkbR`Ar=k&yKP# zB(&mC92zNPyEx}jw71;X8+YSUrMbO06{qdxsr?T4(RMMRv7rb)Q_f?9A#W79`^2*3oe)Kuv>?aJ^bx!r%c9MR+}~Ps(rdD<(7Lt0qg)$@{idjg!d(Q_av38wg|1Z`uevYz7rq%&6OF zD>c5Scz&Da1bzb=Oy5c&Q?H0Oeo%G_ihw<;EcMB)LPC(U_)%d7doiJ_C`DQ>m>C4= zfF~M3m)q!U_S}GYZh_ojuSa6O8gbJWsoU56)xa&0`4))x=Bz0dIy8i*Md~>UDb=X!d?G*GGnCXOd#UmXk*3{7_IU1Tm}G; zFYKsyy)=S2IbV#y<$Z{GcRf6x1eh5@B)EeP<|R^#rHbWXbg=tpTFhlJkB(s(a6q^n$_rqH^v)IadV9L{x-bg zxR_3Ju>*8LUSZKza6z^1)8am4NH4#ZbUbqEB-f;5s4UIi&$klj+EK+VI%6(QQt+>p z?Fz-L5{0;=-SY)NJjF>jH11SuPJLq7Dz|pl&%x=TXBM<=h`C|iQokIDOUbHCq3aQ0`^6rt{$Pc24Jt)$G!YLwky0d|6D>o z!Y6@0=Y3;NAjIblVMe}kN1AOrXnZolM+X&O}IPPaGtgCou(1uVX&mi4yj?4rTcM>&vqEIxFkVF5p_jl)ZiAY(G<1-j5&)e$qYEF&bkVy1-!3tfd&>*BpS-?;ShUx=P2 zfm^P(@actVlaJ!wo}_a;bgy3bj^}SbWfLchIJ4E#8oG&{uYau`)*81v-1rWGz70$4 zx(T~#$BoO5K#>=LvERGaodouM2(o<~(EP>dThcN}tU4wMefdfMynJPsa!GLMjMeV; z3Gu%PH>o4I%>FMLmFdf+`yV)RaZAU4nR9}bH|5tEQ9m|PflzKKI4_eLk7W= zkrMN&gFvmdk&rjicc4WwMau&R-%D&_8Mll&A?L_1zCVz6fo8~2JM8<@`8;raOdUI& z|9!k%Cin)>Y`%tNkn3uQ>yyMU#8l~Y*x$TxW2;GK%QsLKn(ap|k()?MBV%N5n;s$; znq7@HO66GhUpKVH)Twjb>4eZAs#L8k775sJwI73gaciG`*nfbEg#RNY<6(i>QnM9m zSiNeJ^9NDZvYEdKAQr9_O&G(gek`457YRLUM00$Xutu4eYoLmfJ4Vx=74Crp<8EV& z6cde{Vx5FWyB{5nhC{!F90d?PlLgegSG< zw2|A*EoL@QgL*JrE41(UE7aBaWY9Mk@yLv)Fo(E(ZRt%fRdWr-9*efXgkr-;eistE z;>TjXe*QvQ!6R=Wke+dq)~Ij}vs`H)S{(5!yGnY}(S~6>0KJtlH79lZaVvri%0ODt z1InL|ky~v3EpRiA&g2l(>=%iXbKtqc0rDMepXAI>$+&6Kx`(lGs2BVu=tm@dM*rHh zK8_Q-4h7REg8y9rF`&84>|bq1$=CknKNNtRsgu*!tn2j8K{q)0*$Za~3-}u#v!)SY zL=!QJrzs+QE_j$S$3kR40}m=|)F59b>0eV6-#u!jv8hWY=V^bx)02N_!KIxSj30+8 zN%ehA7{L~r&rhIudcO3k6FYq{t@QUq*WYxvt>>vumaCqZ?PI-f_T>B%yUc@HIuWk$ zuXXwvb|cr{b`4@)?J}Owch`fi5Nil^q}n3v*>|03D-3JwNSr_c%|GU?8EHSu7CE=2bn`oBgY{6O1Q^dd-eYf zDh$GaWI)y<<_r=*{E&P?*){E_2@*j05PqWBwF}aKszuVH=n`^Iyhh)(LAgqM>hzaw zzF6inH5eMiH_v66i_x_+35^JF)l@Ma-2ne_qRBNmBDjlL3dIrOK@I4f??Gu5iK#c6 zx*MKaae6yJ;(^!w%Z97MAnmA|VCu6&p` zwfjn;qi+M?sHDzvtRU`i(;fns$9s9=A0UvxP1*E_{rqjDJ_4erl%v*ZV&U%F-Bf>M zImE>ywTZ5AN7tn&7SB>$kU%^3wO#ViiK$I@=ZJmWIlMu5@}Ojet%6-AYn_Faj;C%8 z=&rzeD!#ns{Rsc%@Nyh+1beRN^1+WW-Ntm4T246)^U&yETPA$ybUNI{u22NzEp17C zHsP@jXI24eQr#T<{nwp<;9xh;%HXC8NHbxIt3m3RHX5TGa}LonkJ>bk5vW#NaS>(C8mqkTiQmhsVAdn+6DFs=|hnLKh+X$LUiecJhN!f2 zYZrW;qL>3B^f$yEhgNqtWa^h3Mlhyf4;n$uPTJR|122l;2}fa5u!|LF z?3A8frO`F)+I_6ZY!A8N`_hDwa;k2jMzqG9Vkt*DuGnKy2RAPLEL908xycCW3%5gd zj3ORAq(xy4S3nGqf(nrM7X^Xb)IfBsSF%X_?hyAR<@=Ay7=}6^hSiU8{_>E&k2}&! zbl9u%c(MufuFIu&qoxiYpTfI^?X!%|@FS^?#7brc7c;!gChnIApn-3--BF+G-6K+_ zCNvbqkloymkwvGF5&Xea)WPBaljw!Go=jhgSxMqDu)b%=7{d9 zet~x@Ox@@WZpl6U^(sB`M6k!nEAG~?#3~n&oW9?faQMB2w(*xBEe^#;a{|}j1CtMo z8@l2Sz0s9SZDKXq*}-3T6!ov`5G{QZjp}(LO|Wcz?$1Wex>$o*LsS?*tdT=8hY#wH zt~*ezj=>}Kz+#XTCP_e@PA@b#7Mwb?=1}i~L9-tURvb75RGsyzPNEPI1RTWTaVn0Cn|FfLjcoRv#vgq(=N!m%aJDTsFVz?rB} zIK_&YyolB$ojfx*3P!7D6rJc8S}T9lL%0Q6t9#h~IuVLIR1vjFyAWo`GBXZ^ zZI#|cc|8 zxE?*Y892QwxUDNVzBo90=0w*7GLJa88QdhJI5_(8Tav0cxNq)6m+J4ijiQBuxWOXa zJV*_DUrQy&il5|RBs-bfI$3Es+PJwHrK!o9DI){D{k>x&gc_<9x#=mHwfb2V`f<70 z8JW4Iu|-MoLfEk&;9}t9dE<>+CO2|CFR`GhQ~|joxq=Yr^^jFVd-BZ6H~`qf4h%!Qoa68e@>`>--!Lyv?G;e zA&yO9Jc8H&ni@wEh3qRig2EfH9RQM(B2{YSP9E}wdr;FzzM@Y|yA(mkQ09>4P{u(H z{V+jJK^RcSPz*?VYW;wqTohlSC$e3a{#wZ2I!L#!dvhu?iy*=xSt|O0V)^iL-2`YS0RY%OKF279B&_N zpR7o%Ln4bZ7KGJLyUT4Dqe!F*_4f;A`D4EXsUJppv#r%t=7h7q`aRc9>7V3FI=64$ z@W3BQVM`HH(w zmMbOR#r(hqZeKrg#_V`?MP^=d)n_?iN;py2+??X6XPMR>J?ZXRbaE|^-Aewvrk+2s zCr*Q5XvjR*VjOS{4DJFLh$yP+O*C?-SkrWNP)>!I4@6cmXSH6K+uXQwV;^^qGUO1U zId5sKU zuNN}2(v=(59%C%wwcw^cZuJ2gMB)diw#1T;)kQN>sciPS@h6^vkD`eLkXuJp^2Mru zFhGX#$dUEh+9fv!Acz@i8WPP_ktx)yJ;A{}JqePn(v>rF;ec?1u8$Wd>*fzqn_>G5 zPP$Q}f`uM=wRRjdH^`0g$X8ahSqBFqa?SsC^~=OFMBoJxzs@zHInbgL3%u6Ypv)E1fsg*MD=u=Wg z-?5SXNxFuut!Y8vs1$cO(I{;>v#lj9&4}7tEPKkyYJN9ZzJ2O8<_cB|>qq$xGO+dQ zv_xoUlO0!@ltY`znYp{GdC$xRthv)>&L-Wl1N*V-wmaO7l-E9+=gh-G@x5XnAGv9U zChq0varJyoQY!@uob{?_;(8w7xj9~{K;q^l`985{A6jYsj!(>%8shU(QJJbNEo#sdiF7y(s244SyjlV zgMZba1ScWdtb=LQq$D$ei3Lw4A-%+;FFl`07z6-a&XcdnB5XS#z!P13LH4a2QLEJ# zZnp+iEgq~3dj@TkjEV?*23O6Sw8rrhow2Qw9PkLUTih}x601Y6mCfp<--X4&%i*KV zF&wzc;iEJtNJ=NZ3&TU6EF3rxK?HB)hpVbP3XYJ=!9#J;nlzGcqumBs>IrQcMK;-M ze4kv2;Y{4G7|;3y`QJmQk0tT(&o9jQ% zBmon_DuP@c#g0u+5Cxf$9Pz5Ssu`rSh>p}ZRF%#do3i->(P$j`M9zNe73H4Z^xkySQyoQH{oTr0 zIqF5PS%vpeXhRQNN-^HvP1UN^MZY)yP`!Vg|<< zE?K0ikm!j5UHa2I<)EWqM$6|H{;e;w$*G?_`Fa=0FE;4^^)CM-sk^Y9XGG<*?JR=x zuP&@(Sh8UhZ)h+Td7}}QqzTJ+%~-Jf++33RQLZ~QTGaEMfl)3X^_y>0I05fBgy1%) zL~o#?a^$xL>J-y_jzcl~dyz*p<)qB?@nsxmZLZo>N9 zkwyr8M-|=Hl=i?VNDeJ`qZc8Vl;?OdqQn{(9b>Viy{rf^OV<5SAx6t63P`qKEK7M2 zI|#t|904)wzS9cr7>*}io1D-^+eMiC_@Rk4kP6z~gFYZNM-_M<&6Bdzrxm29ksLx5 zN+)G1_1VfO>wr~+Wb)IPuuv-lqs?Kum89^P!of!o!@c@wI9{gR75jS20>gc(7Fp}{ z>$-uuIFekeDgooV$70l3y^&`03_~)8`CU;6AN&#`SSOA+CfdVn$m(*)L7h9XiMri4 z{l*REqfuvLdDP(6Q0L;Vgpy-a&*O}mfqkL@)golByc%x0N4$Z($;~{D0q2AW{>Q9voc7s^8Ka*`$<3}z$07w8S3L3k%Pz4?YA%pe!p1Zs7(;%v!xWbrAG6q ztn}4?Rtch;9Hu6<;i@QFGqbw={2=uy_!6u&BPszD)gBPmr4vU^mnnl%!-+$c;aOD5 z?HBs3dg(qcBkG#f2o|+2(R1U8NpGQ#9b#N5>%m&=pkGU5%e>Dno`>zuX#ILD2@#Mk z;-;T5?cRg&^y}J_Z14SqwHL4@`KaN<631;m)EG^%~a7N5rKGcvO?S>cj(~9xc z3j6u3Trz_4aRKRfszvF9LJC3B_Np`tOC)LnrBq{AEw^_|k;q{fDvd{|IW-HoxLXP(Q!!RFE4=`Grs= z+5NO^$OqNFfvFk9wdZmM3= z(`KV<^wsxcK;NdAwtS5%`ZBjOJ4Rde*}FCi2a~GQ=O~#oPdFY?3$l+BCaBi}JhghI zHO}QDYjui^ZNcwIL>NlfhMozw@Z(!~BQ0erJ;EPSqh91Y*HqCe+;(Q{U4XQ4+}M$J z_yC0_6R}3=QSVKrYGgI8f<>$3#0zbkZcSF_rK}U0LL(1Y$ILDzs+Q;gXZI<UNy+sKx1Q^E)f13ASYMycdGXNg)1mRDKx&hbPBR zzlqGDE;;9H=t~lL4L!YWg~P^muJ60!q%BP^NV@nEjqn%L1X98=ZZg~Uy48bv*aUc# z2J{bCN*B!Cd$irQiFdAGgbm{J(k3Fk&vLQzl=l3l6R)VU?Ga$w73qls?t&4IW~uH< zD9VKYsz&o9ErR$+y(DU(iqY=U*N*e8wF-~UOi6gFzoUH&QU&}bQq2(%6L5G1OCrb- zM*kJ^$4fkq-?wUTJZXqoN#Lbq85DNcrEAwCi*)Ln?=2-C0AjttQxMo4-pczY2_iWJ zLXYrG2I7IqaC@3x^&@c-RI;)@{QMt-5t(N_=o zUl~XL&Z{W?*I};zqtf$HTK`8U$p=%Mtc{4+MF{OKB^cH9q;4!sODf7rj<^j|qglML zVAQXHj zT|Oa@kl?4tIFBJ@>X-)XT)ERER*LpgoPN|fy&I32n;^x{;uM|=ZH^WdpMyn+K5;3>xg13oR^;UR{RaIOGg= zz*zKVPPd$=-Rx%*t1w|SL=;4gx^hDp4=^w|F>AnzP!18n!hr-;$mF+R!!@(q>D$Wh z&n@PjO`F=KDm;9~nh0MR!_Fb++bYbIU-7h7haeh<%ZQzdQJ#gqvo-T3(C>CPk_JXU zf+FwKNX-W0->Ft$z+kcSBjRF_!-II)Q?G3M8U1Ascz^Mje(q`YlR7|_|C^m-r(XN? z@7HT$eDxH>|95Cm{AXO={|p7n>+%bVsJiC#Hl^t05!{SnlxSv(<(T(k#>_?(>5Qpn z)R>3m^IXiq@-m)%zi$@J*@%WQ`M+NDQibU+2>GO**Zq0p!{PZ?OOXZQ9w3LNHldMc zlrO9&HzS7C3aW*C)WSI4zY*`C5z=RXIVB-*Kdk#W62>y{$rv6Lgd;Ialq;IQTV$I- z1{>VX9(dai^ERWP&y0E&ts63@&bkNNh$nE+ZOwdegX4xdlZ(}HjF(_GRSpWi7~Zh5 zPp6*+c+h{3{_(g%_MPS~fbwSGon8SrD>=-ERf)Z%xSVGwF7o3H`*Q#LKtP)jxNV!= z12M(lVY*xh5}KGo%>fal7NRJs36d%n+TnDnHD(msoMzLUVh;B5Bv;H^cN+V|AeF)w z)gA%f9X)9*26Tfof#d7#nIdD3k)S`y-Sx}ujMrRnw~JGGK*d+PINTu;0p~#Pmpfc# zfPvN(ohL>omxb#Vlt#m=O{s#iX{oVROONcheRxXXi5ipSu27%p1oG*iydo*W$}_y{ zi^_XQzs3!kf+F?3Kw(q1O1OoGv}wUy61C_dRW+iT;|rLnDr0D7kXn^Nvi(;OaMCqa zhP#|aUx^$1&81T{Sr_LEj?bkrpL|OncJO1KSW7VtIq98n zekh)2p4XDWkfh4_?0O_+h@T(Jz3P1Ia=PL>7O1>?0Wx$$@1Quw6148y{P=Y#@qO!I zm)%<<^f%*m3;}-TZ4Lad@&Wym>t$bWgkOb?zwZsg4*0`z;h+U~X4{4@aZ_*uHgK93N2c+B?_sca`o0Ch`w6jBZB5_( zCLY0UC)HQk_sLr0snrs+B7YNE5=}&HePYmrAThN**8Qu^=1a zLb;2kEFD~wq%q=M3)!k~X&TQARv!D*rJO$z30JOalx$m}K8DQaR&GAf zDML>GIlCzX)sa;Qq@7Pa#&*n6w%Ta13ch+i^wzSKtX4j|i}Osb>!Ts6Wj*x_#{asb zD3fSD;1=`eSgBSguT-~efZ8*(>S3JXfVfttYML!X$4Ih~2mod#L5w8R3>Q3qqN%+j z9TaLDAb9M5-Df|q$T_>ckSH~T@=gchb~F=qo3zFt!E%#dGUd)apwW}#{);#ZOU}X0 zV(H8!yL`69ecQf)3J-uS1wR~;7+#`>zu2IMfG3Z?Ao8nPSNEXVHJzkaFMVu`GQE9{M zo`(|S^c-2u!@r9*E&N)JrB1rpE>paYV&I+qBvY=1+gp@n72~C0J%I9UYc7dMqO&yq zHcP@Rb>qqAQD&3(#UwJ^=ru*ilmk;2Kjm3j==Bt_jW`*plU#8m)#b%$vOS9oNgVdM z3N`AKDbmH84PK)&c^LAcbPZ>+LeGV)F=TRb5F=oAcZ-w8;^I}dibCeRQ2O%BAQ@?s z8S0-Fe|utKrU=~aCf)h4(x0Jw5H@E>fGjcjn)GlL9bOom@ zt$q>JLLzTgkryqoO~G0Fk~9IR1#l1L>`oslczQT-*(?Q(%)jZfpYF^OTK>X}jigar zJ$WS*mP=a8=wz=rBWjmNk>d{|U1s7Jhxci!8ZQohWp#!Rv_(D}%G9C(mvdzAjF)W2oJ*$%m#Xn&?gzmB)vu#hPHycyySRrY8)l;d72gtR{Q!S4- z2Z%YPDS-)?jqt1VH*60sUsruA5hbnQ0^Z^%=u@M2ruTYS#$V46WqXPz+%$=&^YEcY zMq?tg6f0Qxi8an{vtkoO3@ewwN@h`A;AZ18-jHt<*kv$Nij=_agQ4UC-%ChU8;jsc zIF0tkpP=8(ICC)N0GgiSAoC|$YWPGl-fUs zD7XiNH^X*29CGdP> z*>)9v(~(lSb{K|vVd`iqw|zQlE;o9EzHDS0;KvX3km`)g-$(s#-0O@GB}T=8+9B!O z<~niFLtyAsIo4~VY~$k8==eF~=<=jq@FAh%(Dbn`1rCZf$GnY(=PX-5Q0wB}0uDW(?YBTx^DZ+rbRO_IkwZn8u=c|>)#WgO8`DB_sHa0$vVV3ysEtG8Kv)G4~Qa~%*o{V!#FfSgn zjz9U%Y(b>~&wHOVSv#HkpZo;V#$hV#b9<@t!vRP z1@F>QyX-olt94MWvAJ9zW8yLdhF3!t1ajLH9<0}Y&we{AptOF%Rbp2WMRPPPKBH>W zJ)@Q>obFY@)?HSVGSP2}Dm4eEWVQ!W*osyrR*tE>2Bo4$#nj6g0UzbB&-+R@Qb{^A zExV+&buEu0if}h<3{_z$l|kU}3e=e@*#8IyUyBR1(_MVnkLT-LxX$r;(0{4f<=Qix2x z2R*wPmXKnhO7v4=68z%}-@}`IYi0(9s ze}>Q4aHd*Tf#;ggZdno;1Qa||ISyGmP6IJ>T1}@LD zmak@_j0Mv8SDxjwyV5}XznkpwuwI5XOsbeHHB_uEd#c=45X z$MEHZ9ymF4vw?Ez1!4ON<@s z;B6Oa82N#I16T6M(O82Z$j?=2+ZA%8<~0afHplxooV$X03QVZ-(Q+EQ9Q8-259l*c zHR*@4d&eyf4@eI!R>1p>42#%FBe?5{@GK>}d@HLA8Jo{GS3vaz!!o?>BwFqznml!d zW_%@YjrLHSj&b64ZMO7g3d5+dyD1U~@|WJ$U&e$SG`U z-n3LBL`Mu$?^=ONzYp{>3{HqgROB4W3P*^ZGEZ(VGmU(|zBg>-6Lr4^oYzx7n(0DR zetF-eN6T>xCoiY}AD>c0mA99w#J7!=>D8q6)B%YbfD);TCh5H@e~{W-n3{Fh(8qWj^0JWgQXFE0R;kq5TOZQ#GliTDK5f{aOT5pKcjDy9wP*i%r0Fy|MLe zHr2M4*l~zX>~jM`GV&1>(u*7_4p~Uu-M%YUuQ^!^#Njvmcp_fv0d(mh``peCk|#_Q zqUt#WroK=AAHDlJ0LRPbb&!&anbtZ3aXW#KBSnq<$}<=S*W}KMT;a0%jb^KA@t(^5 zY`~|kI&51mXk+meeQK0k4-eUM`?(4c)|w0I-vh#mLvkI;Q2X+YDEcX{19q7?^bZ}B9j@TK{h{4VP%WeZ^bUG;uMI_I>iMdjm>i~Wuq=;M5x`uxVa zgTp7@d)L6HL|)Fe(tXDJW;0vdjd}YzCw~Wa+)E001jJB?@PUEBU6{dLq`hlK2X|+3 z`0cUXYnvtcp9?g&xU8`qB8?2b!_tSB{VHuzra9hr>Y-!`Opm06JJHK6+DpxvWmHjVJyU?%rTuLRh@$q6j~pMO3xe$b6ouX>J<9Iq?g2+K29 z-p4r%ze>pz1i#H$iq%P+ttGB$lp+nTfDNZkqLPCxAf89Q;pngA0d%I@K|==$QC z73#an0(@l8KM;3?1uT_fBTKa2+v(|7JmyoYvD2+?-+(Lgb$+H$G|0$ARYr0H-0UVv zs`cf>LwQ-6KI2@b*T=USu>KJ~B$!5Ul??Ra-7T0c?wv9e>+Qq#s!iN{olk@jKVJ3j z&VB3eIT6VQ;-)5k1$gR8?~z|+m;#wZONZrv_{>SXx~VGk?{29am`x>o*ck<8qZq@P zKMb|Iyli8KX7LD|@Q5ssiIEGaTb!*)s)-9pBJuD#B~^^^*?dinR&Eh7yMT5>cfOM} z{sVX+7JnPG%TsZd57jGmxQth>tt72vU`Ky@nJU@^vrMMn;-+Pa$df+k&Xp}yU`$f8 zRm^Rt(tIO_5XLOgO-Vz7fI+De}1bCJe9D?lBq&YK#WistIV!d-j%hw{8f>Y|d$|XuaxmspfJv71&GJ{J7B?#<0k-goX-g zSb7&-C3GxL$i{Zrk3}WPt9W}{YSV_*XpD60@Y`e~@yY6H<zsew9fJsQ;AZzd5b9)*qp?)^(Ztf-imsF)uehhJaRz_DOR+pm#jIfc%bx&;}E?l zh#0B7s>*~qn~x#F--Td}>gH2ZpV6HG_cq>vc~hNZ3=?H>`027C80is71F>P&Tjm~bR@`(%H{;maXPa<_SOK5b%Tn$0 z5b7d$|ElWxJ4B+Nd2-yKXOpz7@AXfG{z~Pl*J9P?80cc8S8L?izq35qAWg^g<{4n| zNOml8)(iWppFcQmCKY8&Ceh(i^z2I5*Q@yxvsB#TraiJ5Ls{}t^SJo$gpEhyyF>F6 zjhwa(62_di-p3DxUgJ@A`tp>8K^YSZPW%+t)aDgqwv2rL^NU{J_`=>$efR;2-zj%1 zOM?Oz0w*x7dc=wi6aHc)!c_VY_@hGt;%1Bu`@Ri3C zb(Hcl+PUFC=qRu6TG*CI3A4E%oz#y<(Op&C1n2`SvrA()(`Uu1s%n1v0(nA-Z;LWZ zb{9rdVha!u5nFh-n&~u^LsFlOttmAz&$e(r7A<(H1T)dQ`)NnvQs{;jb{EaZE3dcn zZ22tnbq7D6pi_OcOv{k6S_KifuoN>oU$#Ni`*z$uVr*2W&)1?iL*+)x`9777GU&_t zOx?)-?3vFOt;`B+ms5lrzKm9@&RD$q@O6af<*-q}lahYlSw3cN>CY3Vk5+KPw1?J%8+>2<+zMjYN+S-9a8SAKc9RG;DoxZno~_)&eNB_F z)ThAyyWCw`5Bl3u4Z^k$twr8EPkFVxF@`xy&sBLl#%@o{#zV4&F!cQ$Cy$PE1s3Sn zJ)T+(8BcXxa0IV&r@kS5QyK8FUp&ES7lH5CKkg+FFm7kE zk}_eG;~)sRt~Cr@lR;avjD6zsZ~<1)Li?`4ZttBo2V>0Dj=(9Zr#H;^Y#E326yA~U zLL;Yyv$(%mu6IqplMYbGw^z1Xqc^vSd$E0PrxNdV0Ey!Xo^k?HRk$Ze3Qm; zSzxL2xx+`}e>FtZb2bO5s}3lWnw;dnXLgoGL19?Cwv7o^ClpSf-E+2QvYMm;6DPhy zn?EZuSmdHl2{-SVO4os2)7QIb0r3X*HTZOd@+IwJ9_s1=6Pp!3szfrXt9J2B@ir+u zWXM^$q0F~B!#OR@(UHrbJEa*{TZne* zK411EO-$5eNc6pvYRWWLpHHOT=%Y3JY(K?CRIN22XoL5-L$XGrU3IM3I{7ttPT^AuF*y%AOcW($%w8tU@Ah z*xs3}E2&EEW~*k@#nRYT=#-veJ(QD^Hx}{q#)3GR+H-;7Mmk@XtJJ*e8`+u{p5*?x zGm;?_=$hXyA@6Xe#dvy1rY(h*aaw9^3E%sfntFgRqrGB!`K(9Rvs@~-hu=_Pht@`KA7wlRy3Z0TH z^*S?3zAyb2gfXo%wwN(f`V4Uj z0(UoQ!Zw0V#g`lyNp)*Ngcc48+3Doo1U;f zIsLQ{Ct3CS(C6l$_uh|x2v4lEcDr2zeX*y{AkUvLwP6+dr)YsRy9<$ zKR?vBkJC-Bfk)$9zP$5_hGMMIll;jSp*PD5rqD^)y>shisO95F<*cDumm36q@Jk`P zZKfpy1q1XMDN}t}mdt)y{YpAjGZ#eJnslJ6(N^!)WUSxjQHeytMU!sU-`&_&?5VG0 z6I~0JkhP8Y;sao#+><(53jk$<;#0ka(rt_LgcH{V=;jV5C5C7yIS!p%A;oIG@{B zbP>J^7aR0)qcrMML$Pf$dXy*zZ{w=Yf4yw0_C(q=xTH5LiunOc33ryKkQC7v4GvCH zDs$tg3{6`R59#9|Ye~i|qlMN6RlKcadG)h~`QLH69>ZN$& zv#ilYY^B~O@RVKh4WXK#VMy59qZBH;WZO2;IK*JrHQxivgxD5~f5Co^8=M#B51PO> z6Cax4#6?4!COP`Lyy5ygzf_v8p_btwu2#v5*GC2%d z#$oYW&nKCw&W1ZOnvpukoAkn+?+L1oJa+M$hw?vAJ0q?<^I%f>iC~}FwQcI{?zS)d zesd>U*80Z zl=%0On?||)5w#KoOA(g#tQ2~aF)ohS?pzK{lh(rJCYAS$xu}9(@)p>HQP}qAb7srb zoJqL@r=Yp(%`BN3d0ScN0m0Qo3?V93%yV?94^!^2uyU;QTXv|h&NWzaiX|myp6Ky5 zI3@PNVE!}3&1ci@jiuWBlAT$P;|I8hRpD~?mY%AHT*-fBeU6M%BR16hso+!cHmn&p zOFiA<%Q>o%#f7Bj{Jo?oGNLqi*r;P{oBVn2O|-`kaulqxOYj&Oz2mfvo+TJ=92hb8 zvJifm%yvf}OX&qWp7-=CfldB8-^Yb?B`Wl<>lflybKf_-mU|(Xm-&^nCE3M9HtoJ4 zkEMzseS+fG;%1Zi__uzJmJGytqaBIP>@=U7&rH16EEUqv>F7;+&{45;bgeD!p71{qmF+-wPEBkWLhA}fGo zIkV~xbujbjb(tLM$+@o?BcZ#maHBI=>>4nt?A$Hm(b7h|bMIKW?NC5!G8(^&sAaw= z-(IUGP4i9@QLi|!C5#&;nuNDRWV>){rPp}mhv;e7`Q6}e27ta&OI6A=@qQ~hUZC=8@Zm-suaa0;1(v_leIF@T(mnas@{A#jK(31 zcJuDqdivVE-k~`mhSS!5WCe^-ly+6JIrJg3bQXKEozItv<`!;^TV0=DZCD;K`nD$< z_G)l>D0D+@sXC4BXVT_$RkLB%JtHNAm^iG|cGJv-!uewWA#B??u@HJT`H@xmh4 ztCaNE)<+p4@w$JmN!ZSR!ttbUVaU`Z)gp&0$5|W4QOT+eVZ-oy7f9i%aco4gV?hrE zxxCKQsXd@<@TyZwrF=_LmoB)7wMelPeU(=~$<(IPBFK~Q8*v|peypjKsqzs~7seyju9ABXNRU@2zb~uK}&9t^x0(CY3&niu{sC z(ZXC#2~%agtWPDe;0|nOt#DJ;(C-?dlhm*R-RTWXxeHEe~t{FG}#IZ zKc#){obCB(jz#o@u=4VTRq1KFQA~|Ui19%Gxdj4)QJQXeyW+>x!KeCR+JgA0RGK$q zbH}^By=iem4DrOgX#!rb703*hgvi7#vBbwN+LGZqA!M*vc#}-rhpsxUj=0nqdW3OT zbml*=FdsSJzCb~~N=3e@$9kTwfah_ZO607RBi>5Y`Ay<1#OQ00b1{>A_PVvkLe00> zm7orTxyIi*Ajb8%hBRMKd&w{RsCt#X{+NsZUh{sZ-f1Rwc@G+)-Pd`|{TrU1r8g>` zVS2X9q?PKuKZnsD{R**k_vRH^wLxdgSW(9UwE<68Ax!?Oo7INjPL*3_l+T#XB>o^t z>|v3_D2`4aab3xCSbAY1t=_K@>}KpY@?rN1th8yPl~;$li)7FEcFlIl<1VRTn@nMt z3^UdEsray^;AY0rh4|5mSCBW=&Ns9uC#pxnN_Qu*bt6CPsje($tVtst}F+7hR$k&dU*sPbFd<4t7R^QjNsR=isHh zpYy+|bI*x8FLZjVxioETV^?OzP9~m_gIsIK_NTtQt*Ac`5S+g!l0O&F!nylNXAi$^ zs;pK5IRK1~L4iqthK7fS_Ba`;1-y*@Nk$IH*ZnS}Xv?z5P1Q@hgRl=AjQ?EuLz44!bhLEw`Q6_FSJCXz)IA~KEG7W{ zupi*I0f+85F2u~j%<>2-60~1$`ae`;y%m6P@k6NYza}gGsrLM%tLjMr$sVXSvVHCs zcwoTsAXz&%Ek`qV+y8%J>Gqlbofl(Z<>g`i{WsY7k9&$khID&?d++`^dP&D}WMQ6W zSL~c^4);zgDiOyUp!x%qMuyh!7kJ?4$>Y3}cX771JL;5R1r16e8&JeQ4JeuNIH-b) zr@5mQ>O~sdfUFG%&Nu^HTY$^F?1L>rH^DB6kZ1t z!P3hpVjytaINU3c5HlDF7GFgnd%2H6{*ht@^T6VVC|)+-QM|vU5WzgKa2bjxEPM

73J@SU z&hX&lQ2U_aVa*abYYkQ|+21!jFzj%^K^>F7{XycuS{W#uCC~=~+9Wt|<~Qz;r#%t} z7HL4?#O05{{d*5b!oaDvQLsAYLt)^=+u+KA^QfYLLK=qx|IVrkhJn-Lp~h~&6X? lAdNz?0dK5_JSVjO3{PuZ#s+$!XlR1K#}nw%N2enH`ybDD&=LRu literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/executionHistory/executionHistory.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..a5ebd98322e56602aeebf3e469a9e18168c4c79b GIT binary patch literal 74875 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 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/executionHistory/executionHistory.lock b/sem3/task-custom-make/Lab2/.gradle/5.6.3/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..4bbc67f8ff539b11e0b6c516d0b149c5073e8d4d GIT binary patch literal 17 VcmZQxfA6V(R08J=1~6bU2LLw&1X%z8 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileChanges/last-build.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileContent/fileContent.lock b/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileContent/fileContent.lock new file mode 100644 index 0000000000000000000000000000000000000000..9d986c38faebf7622c3eef88ff502403385ce5dc GIT binary patch literal 17 ScmZSH5xdAIC8b)70SW*te*<6u literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/fileHashes.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..8cd465528824dcefdeecc7bff6d532cde5366757 GIT binary patch literal 22547 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 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/fileHashes.lock b/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..7ae65be22020ed765d777d41673edb4aa462235b GIT binary patch literal 17 VcmZSnFy-COi`ykU7{Gw(0{}#B1_=NF literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/resourceHashesCache.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..d9a1a26ac50dda9a9d19f93c210b854f476cfb28 GIT binary patch literal 18531 zcmeI%K?*@p6adi2PznS3O3F|SlohC-J}DzBun04|FtiM11LkJt7QvAB`}DUUom=<4 z+r5)_&-A4sB+b_+LK*F{R1qLRfB*pk1PBlyK!5-N0t5&UAV7cs0RsObu!)P*ie-{< zH7^>w5GM6lRF2!n>3Qy?#W<^2XlK=q%1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U_yvJ!d_*^9E6--OzutR;<$Ata97c=V HB{utSPh%#c literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/gc.properties b/sem3/task-custom-make/Lab2/.gradle/5.6.3/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/classAnalysis.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/classAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..0c84d127e9d78a0afb03ad20c985e943ec3e62fb GIT binary patch literal 48265 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 LfDaTY`H1j8{!}Jm literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/jarAnalysis.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/jarAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..e3d7f55de455109dabdfaef4f4242fc726e373d4 GIT binary patch literal 20434 zcmeI%ZA?>F7y#gNPix!T&qF_u83UR%F^XZfC=iV#RqAx18EHi}S#3&l3k`*0KgKkf zx?mzUYcgaDQ`tnekpYGn3_n;*jALYH}6JGa-4{W##?WqF(2 za(mA?Z{PF0?+HIzflwZK^7MrkUY3PhxB~$Y009sH0T2KI5C8!X009sH0T2KI5C8!X z009sH0TB4V2vpOJsHM&1t;gbxp%tMGT6)8km;5zZ={dnk!#f?>-w(2X>GQSH7`%f3 z2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*>m7X*qCQnu6Uh0NU*}`L^G{f9e(L_-w z*c2&>2}LcDMxiOvT;vP}g+QG2xz4@1>w0Qq*wy)V$9e1E8OBtX5R3Wig_uuhCN9lj zf!DXP^4k@^h2L3o_X#VsEAqNvwGqYeX>#V9fz1UqCsSwh)9FR07L!k3YumalvOZYW zXY&Lf^zZnPk%cGjk0)YcY_h*9ydmNJadqI$I@~xlXj?S0om5}Fv#z8sKc;{0i?R8h z{;BsFk#`IJCUR)%zWcl1ueOfd85=cq9J|-en7AVp6*377ISV^hZ#r!E;&JC2pUov% z32gJn<6(i!KHf4uv1e^fTe;bGqG#YbYpS$0;=8DE+8EN*Q8vY`ybcLb!{FwKiT`|5>f4>;NB1BFH5J5t*Hy{ zwC~_$R@98ZDP?}i!Isf;?w{I&A^&7`}Ubq{L#<{tmslEw0w=fj$OKaqy0$oMZ)LQ?CtJl%+7}PMH4=EHHl7q zRsTxE@Ga{v)zbsxU4~r5v6@Lb*a)+T|A{CxBN=P4h;Owa`J!XRXc?>23x^Xa7F}yc zN@gAD@k1(>ZT7q&o)uF%3P{Zwlk!0tR@CefLRwZf;!31jVx1l7S?feOWMJ7W90NpH zMfq3Xqa0RfvC)xniOxo*XSFgivv!ni2V_~YSyAq@yK^~*u~8+%oL){Zw47BGaUZo_ zjB|`Ak2NmR({WC#pdpl)<5d`IbiDY6o@3=NRaso3R%1D5R9Q51l@{}y-XK>HqlwpJ zl}2WeFH;zK9UU@YOiToGsvNB2Wc0C0qthGcL?bq2J}Xsx=84IIR(S)&F WVa94KqhCeCD|rijip2lHslNdSTj8hx literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/javaCompile.lock b/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/javaCompile.lock new file mode 100644 index 0000000000000000000000000000000000000000..9f9be198d9b9c76f788719c7eb078ecaac6469bf GIT binary patch literal 17 VcmZSXd8!*V<-(-73}C=`8UQ(61zP|B literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/taskHistory.bin b/sem3/task-custom-make/Lab2/.gradle/5.6.3/javaCompile/taskHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..2e86cdb8c86169e3da7e9bf36506121f1edce5b5 GIT binary patch literal 18655 zcmeI%A#VaP9EagTz$_$SNDzqGg@r7`;Ybi8L13m+C)hpM|(7*pSKg*FSI5Tt3;pYaRX%4zpdqO7<8L zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0;6Dg7>?3BjzwG;GyD2+C>}u`#y(skEL2P7KIk(aodwM7bS{dUS>8mFtN6HJ* t3Nnj74{FabvKKzOqcEuZDk^Q_<@ZB%b@}`88qI6duk?!JG&v?A-gjEzO^*No literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..e3cf4a30e3c48d7e70db1bee4f99652eefcf35ff GIT binary patch literal 17 VcmZSHpp|}J`P$9v3}C=m2LL%f1v~%% literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/cache.properties b/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..7c03b14 --- /dev/null +++ b/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Wed Sep 29 20:58:54 MSK 2021 +gradle.version=5.6.3 diff --git a/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/outputFiles.bin b/sem3/task-custom-make/Lab2/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..d5eab0b88dbd1cd6e24af141ad4148b71271abc4 GIT binary patch literal 18749 zcmeI%Pbh<79Ki8+mV_CpX_LPPMZ?sbm2$AStsQXEj3TQ^k#bN9H_5>wC%Gvc9F&w5 z%Ejg~?Ih%6QQn<|cfHTga&W^z-?yIUefqv{&)f64zFnH;EPGd%mb)CeB`X9FKmY** z5I_I{1Q0*~0R#|0009ILKmY**5cn?w0plP==3$)8dD%tjl%}=WjD>ySc_-R3Z&b1A1X(#t#;L2pZ)By zV|?FLqV~C!Ufp|`c{yK8s=gz=rry!_qis3@ zEp@~C*4*lm>c`SsZ?u)s@I+emDd~Zk1AoxrnOEH}eR{jrlZr$Z&F*tcm%FA}2F+*8 z2q1s}0tg_000IagfB*srAb)-7B0SZ>hNdN!< literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/checksums/checksums.lock b/sem3/task-custom-make/Lab2/.gradle/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..f5dba26a4dbd5d01df497dea5c2f1caa8cd87646 GIT binary patch literal 17 ScmZQ>tC_FblJ_B-0SW*zhy)h^ literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/Lab2/.gradle/vcs-1/gc.properties b/sem3/task-custom-make/Lab2/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/sem3/task-custom-make/Lab2/.idea/.gitignore b/sem3/task-custom-make/Lab2/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/sem3/task-custom-make/Lab2/.idea/compiler.xml b/sem3/task-custom-make/Lab2/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/discord.xml b/sem3/task-custom-make/Lab2/.idea/discord.xml new file mode 100644 index 0000000..d8e9561 --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/encodings.xml b/sem3/task-custom-make/Lab2/.idea/encodings.xml new file mode 100644 index 0000000..4973c61 --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/gradle.xml b/sem3/task-custom-make/Lab2/.idea/gradle.xml new file mode 100644 index 0000000..611e7c8 --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/jarRepositories.xml b/sem3/task-custom-make/Lab2/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/misc.xml b/sem3/task-custom-make/Lab2/.idea/misc.xml new file mode 100644 index 0000000..2266f6b --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/runConfigurations.xml b/sem3/task-custom-make/Lab2/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/.idea/uiDesigner.xml b/sem3/task-custom-make/Lab2/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/sem3/task-custom-make/Lab2/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sem3/task-custom-make/Lab2/build.gradle b/sem3/task-custom-make/Lab2/build.gradle new file mode 100644 index 0000000..5600845 --- /dev/null +++ b/sem3/task-custom-make/Lab2/build.gradle @@ -0,0 +1,28 @@ +plugins { + id 'java' +} + +group 'ru.erius' +version '1.0' +def pokemon = files('libs/Pokemon.jar') +def main_class = group + '.lab2.Lab2' + +dependencies { + implementation pokemon +} + +jar { + manifest { + attributes 'Manifest-Version': '1.0', 'Main-Class': main_class + } + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } +} + +compileJava.options.encoding = 'UTF-8' + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} diff --git a/sem3/task-custom-make/Lab2/build/classes/java/main/ru/erius/lab2/Lab2.class b/sem3/task-custom-make/Lab2/build/classes/java/main/ru/erius/lab2/Lab2.class new file mode 100644 index 0000000000000000000000000000000000000000..46b70f665a42467d9e104a741a2efe246d781201 GIT binary patch literal 2164 zcma)8TUXpv6#g{oxOMih6xYTk}md`F9!XI+EPcoFDOj)wlBxmpa?R~zpFDLx{@8&jum+-lS z=WtcTYa*_tkdY9_kcih)7?zOa%QsTEE}9$bHj{;cQKp1e)li30V3{*xGNwzWZI@bEFj+7H!C2K zb&7_7)|_b@lhsPWaA#P-B8`%BbY{&m*W_|dnegXLPe6Olt*VA=Rz1~Xh0AJ=9vO;N zVWushqxW8Jfh{w#*=05FyQW>vgnKc!Ox|q`%*2aXmT8bV9XVHh(^7M$=kvfNhg*^b z=KGvmH{ahZRUFkb)Fo%ps5rJd8X5`Rv7hRAn3hzkf@fH z^c!_ls%-dKi+SYR)?2fOV-hOqQmBCPd90qoZm?NC)DD%S_pr9*M3YR{jU{4rts%5F zDD~`0Ra^H>8ltRYd)12J64j$&Y95avO+(3XZ!&#e!08&l(0I_dFQmF8AXX;6QJnCQ z6U-;?B%dm$5)Rc35g*HNu`J^gUcygN5O8L%D5kwk^GFv=rBGy4c2;7#@3=HEEtNe< z#C-~zbDYI0?JAGkw&8{e<+sK^^~tQoiyG)Q@vscH8kb5#1@j8B9f5GYfW2d))a|^mi#*8+%EixrW_?@YY0zk$}=P=A-qjf+DSOZ z;S*cv(AIE#^5TH@2q*4rq7&FaR}7bS72P$(z$2XGhlq!V=plNb@2m<1b2v`d#|di2 zPCP&t9-=!uTz_-`T*M{9s)QTBARTXx)+()H \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/sem3/task-custom-make/Lab2/gradlew.bat b/sem3/task-custom-make/Lab2/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/sem3/task-custom-make/Lab2/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/sem3/task-custom-make/Lab2/settings.gradle b/sem3/task-custom-make/Lab2/settings.gradle new file mode 100644 index 0000000..b0a4264 --- /dev/null +++ b/sem3/task-custom-make/Lab2/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'Lab2' + diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/Lab2.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/Lab2.java new file mode 100644 index 0000000..2ea4915 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/Lab2.java @@ -0,0 +1,32 @@ +package ru.erius.lab2; + +import ru.erius.lab2.pokemon.*; +import ru.ifmo.se.pokemon.Battle; +import ru.ifmo.se.pokemon.Pokemon; + +import java.util.Arrays; +import java.util.List; + +public class Lab2 { + + public static void main(String[] args) { + List allies = Arrays.asList( + new Comfey("Лёха", 1), + new Gligar("Олег", 1), + new Gliscor("Акакий", 1) + ); + List foes = Arrays.asList( + new Torchic("Гоша", 1), + new Combusken("Николай", 1), + new Blaziken("Владимир", 1) + ); + Battle battle = new Battle(); + allies.forEach(battle::addAlly); + foes.forEach(battle::addFoe); + battle.go(); + } + + private static int randLvl() { + return (int) (Math.random() * 99.0D + 1.0D); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Bulldoze.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Bulldoze.java new file mode 100644 index 0000000..1f8e6b1 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Bulldoze.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.physical; + +import ru.ifmo.se.pokemon.*; + +public class Bulldoze extends PhysicalMove { + + private final static String NAME = "Bulldoze"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.GROUND; + private final static double POWER = 60.0D, ACCURACY = 100.0D; + + public Bulldoze() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.SPEED, -1); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Facade.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Facade.java new file mode 100644 index 0000000..5b2258b --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/physical/Facade.java @@ -0,0 +1,28 @@ +package ru.erius.lab2.move.physical; + +import ru.ifmo.se.pokemon.*; + +public class Facade extends PhysicalMove { + + private final static String NAME = "Facade"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 70.0D, ACCURACY = 100.0D; + + public Facade() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected double calcBaseDamage(Pokemon pokemon, Pokemon pokemon1) { + Status status = pokemon.getCondition(); + boolean hasRequiredStatus = status == Status.BURN || status == Status.POISON || status == Status.PARALYZE; + int multiplier = hasRequiredStatus ? 2 : 1; + return super.calcBaseDamage(pokemon, pokemon1) * multiplier; + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/special/AirSlash.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/special/AirSlash.java new file mode 100644 index 0000000..c99c703 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/special/AirSlash.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.special; + +import ru.ifmo.se.pokemon.*; + +public class AirSlash extends SpecialMove { + + private final static String NAME = "Air Slash"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.FLYING; + private final static double POWER = 75.0D, ACCURACY = 95.0D; + + public AirSlash() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + if (Math.random() < 0.3D) Effect.flinch(pokemon); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/AquaRing.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/AquaRing.java new file mode 100644 index 0000000..7c5a533 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/AquaRing.java @@ -0,0 +1,27 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class AquaRing extends StatusMove { + + private final static String NAME = "Aqua Ring"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.WATER; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public AquaRing() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applySelfEffects(Pokemon pokemon) { + double maxHP = pokemon.getStat(Stat.HP); + Effect waterVeil = new Effect().stat(Stat.HP, (int) -(maxHP/ 16)).turns(-1); + pokemon.addEffect(waterVeil); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Confide.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Confide.java new file mode 100644 index 0000000..ba68e00 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Confide.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Confide extends StatusMove { + + private final static String NAME = "Confide"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public Confide() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.SPECIAL_ATTACK, -1); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/DoubleTeam.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/DoubleTeam.java new file mode 100644 index 0000000..a9e229f --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/DoubleTeam.java @@ -0,0 +1,28 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Stat; +import ru.ifmo.se.pokemon.StatusMove; +import ru.ifmo.se.pokemon.Type; + +public class DoubleTeam extends StatusMove { + + private final static String NAME = "Double Team"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public DoubleTeam() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applySelfEffects(Pokemon pokemon) { + pokemon.setMod(Stat.EVASION, 1); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Leer.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Leer.java new file mode 100644 index 0000000..960dbc6 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Leer.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Leer extends StatusMove { + + private final static String NAME = "Leer"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public Leer() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.DEFENSE, -1); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Rest.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Rest.java new file mode 100644 index 0000000..0201d56 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Rest.java @@ -0,0 +1,30 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Rest extends StatusMove { + + private final static String NAME = "Rest"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.PSYCHIC; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + private final static Effect SLEEP = new Effect().condition(Status.SLEEP).turns(2); + + public Rest() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applySelfEffects(Pokemon pokemon) { + double maxHP = pokemon.getStat(Stat.HP); + double heal = maxHP - pokemon.getHP(); + pokemon.setMod(Stat.HP, (int) -heal); + pokemon.addEffect(SLEEP); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Supersonic.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Supersonic.java new file mode 100644 index 0000000..bb8c2cf --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Supersonic.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Supersonic extends StatusMove { + + private final static String NAME = "Supersonic"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 55.0D; + + public Supersonic() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + Effect.confuse(pokemon); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Swagger.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Swagger.java new file mode 100644 index 0000000..31fe6cc --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/move/status/Swagger.java @@ -0,0 +1,26 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Swagger extends StatusMove { + + private final static String NAME = "Swagger"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 85.0D; + + public Swagger() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.ATTACK, 1); + Effect.confuse(pokemon); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Blaziken.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Blaziken.java new file mode 100644 index 0000000..058d3e3 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Blaziken.java @@ -0,0 +1,33 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Swagger; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Type; + +import java.util.Collections; +import java.util.List; + +public class Blaziken extends Combusken { + + protected final static String NAME = "Blaziken"; + protected final static List TYPES = Collections.emptyList(); + protected final static double + HP = 60.0D, ATTACK = 85.0D, DEFENSE = 60.0D, + SP_ATK = 85.0D, SP_DEF = 60.0D, SPEED = 55.0D; + protected final static List MOVES = Collections.singletonList(new Swagger()); + + public Blaziken(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Blaziken(int lvl) { + super(lvl); + } + + public Blaziken() { + super(); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Combusken.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Combusken.java new file mode 100644 index 0000000..c65c1aa --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Combusken.java @@ -0,0 +1,33 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Supersonic; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Type; + +import java.util.Collections; +import java.util.List; + +public class Combusken extends Torchic { + + protected final static String NAME = "Combusken"; + protected final static List TYPES = Collections.singletonList(Type.FIGHTING); + protected final static double + HP = 60.0D, ATTACK = 85.0D, DEFENSE = 60.0D, + SP_ATK = 85.0D, SP_DEF = 60.0D, SPEED = 55.0D; + protected final static List MOVES = Collections.singletonList(new Supersonic()); + + public Combusken(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Combusken(int lvl) { + super(lvl); + } + + public Combusken() { + super(); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Comfey.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Comfey.java new file mode 100644 index 0000000..ef68ef1 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Comfey.java @@ -0,0 +1,38 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.physical.Bulldoze; +import ru.erius.lab2.move.special.AirSlash; +import ru.erius.lab2.move.status.AquaRing; +import ru.erius.lab2.move.status.Swagger; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Type; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Comfey extends Pokemon { + + protected final static String NAME = "Comfey"; + protected final static List TYPES = Collections.singletonList(Type.FAIRY); + protected final static double + HP = 51.0D, ATTACK = 52.0D, DEFENSE = 90.0D, + SP_ATK = 82.0D, SP_DEF = 110.0D, SPEED = 100.0D; + protected final static List MOVES = Arrays.asList(new AirSlash(), new AquaRing(), new Swagger(), new Bulldoze()); + + public Comfey(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Comfey(int lvl) { + this(NAME, lvl); + } + + public Comfey() { + this(NAME, 1); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gligar.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gligar.java new file mode 100644 index 0000000..2c677c6 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gligar.java @@ -0,0 +1,36 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Confide; +import ru.erius.lab2.move.physical.Facade; +import ru.erius.lab2.move.status.Swagger; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Type; + +import java.util.Arrays; +import java.util.List; + +public class Gligar extends Pokemon { + + protected final static String NAME = "Gligar"; + protected final static List TYPES = Arrays.asList(Type.GROUND, Type.FLYING); + protected final static double + HP = 65.0D, ATTACK = 75.0D, DEFENSE = 105.0D, + SP_ATK = 35.0D, SP_DEF = 65.0D, SPEED = 85.0D; + protected final static List MOVES = Arrays.asList(new Swagger(), new Confide(), new Facade()); + + public Gligar(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Gligar(int lvl) { + this(NAME, lvl); + } + + public Gligar() { + this(NAME, 1); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gliscor.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gliscor.java new file mode 100644 index 0000000..ea12427 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Gliscor.java @@ -0,0 +1,33 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Leer; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Type; + +import java.util.Collections; +import java.util.List; + +public class Gliscor extends Gligar { + + protected final static String NAME = "Gliscor"; + protected final static List TYPES = Collections.emptyList(); + protected final static double + HP = 75.0D, ATTACK = 95.0D, DEFENSE = 125.0D, + SP_ATK = 45.0D, SP_DEF = 75.0D, SPEED = 95.0D; + protected final static List MOVES = Collections.singletonList(new Leer()); + + public Gliscor(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Gliscor(int lvl) { + super(lvl); + } + + public Gliscor() { + super(); + } +} diff --git a/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Torchic.java b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Torchic.java new file mode 100644 index 0000000..f914946 --- /dev/null +++ b/sem3/task-custom-make/Lab2/src/main/java/ru/erius/lab2/pokemon/Torchic.java @@ -0,0 +1,34 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.DoubleTeam; +import ru.erius.lab2.move.status.Rest; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Type; + +import java.util.*; + +public class Torchic extends Pokemon { + + protected final static String NAME = "Torchic"; + protected final static List TYPES = Collections.singletonList(Type.FIRE); + protected final static double + HP = 45.0D, ATTACK = 60.0D, DEFENSE = 40.0D, + SP_ATK = 70.0D, SP_DEF = 50.0D, SPEED = 45.0D; + protected final static List MOVES = Arrays.asList(new DoubleTeam(), new Rest()); + + public Torchic(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Torchic(int lvl) { + this(NAME, lvl); + } + + public Torchic() { + this(NAME, 1); + } +} diff --git a/sem3/task-custom-make/lab2_prog.docx b/sem3/task-custom-make/lab2_prog.docx new file mode 100644 index 0000000000000000000000000000000000000000..da39c7bc558127c1fd7c30442a7fe49fbb5ca32a GIT binary patch literal 111853 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%0Dv<8 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 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/Lab2.java b/sem3/task-custom-make/task/code/ru/erius/lab2/Lab2.java new file mode 100644 index 0000000..86991a7 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/Lab2.java @@ -0,0 +1,33 @@ +package ru.erius.lab2; + +import ru.erius.lab2.pokemon.*; +import ru.ifmo.se.pokemon.Battle; +import ru.ifmo.se.pokemon.Pokemon; + +import java.util.Arrays; +import java.util.List; + +public class Lab2 { + + public static void main(String[] args) { + System.out.println("test"); + List allies = Arrays.asList( + new Comfey("Лёха", 1), + new Gligar("Олег", 1), + new Gliscor("Акакий", 1) + ); + List foes = Arrays.asList( + new Torchic("Гоша", 1), + new Combusken("Николай", 1), + new Blaziken("Владимир", 1) + ); + Battle battle = new Battle(); + allies.forEach(battle::addAlly); + foes.forEach(battle::addFoe); + battle.go(); + } + + private static int randLvl() { + return (int) (Math.random() * 99.0D + 1.0D); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Bulldoze.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Bulldoze.java new file mode 100644 index 0000000..1f8e6b1 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Bulldoze.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.physical; + +import ru.ifmo.se.pokemon.*; + +public class Bulldoze extends PhysicalMove { + + private final static String NAME = "Bulldoze"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.GROUND; + private final static double POWER = 60.0D, ACCURACY = 100.0D; + + public Bulldoze() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.SPEED, -1); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Facade.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Facade.java new file mode 100644 index 0000000..5b2258b --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/physical/Facade.java @@ -0,0 +1,28 @@ +package ru.erius.lab2.move.physical; + +import ru.ifmo.se.pokemon.*; + +public class Facade extends PhysicalMove { + + private final static String NAME = "Facade"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 70.0D, ACCURACY = 100.0D; + + public Facade() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected double calcBaseDamage(Pokemon pokemon, Pokemon pokemon1) { + Status status = pokemon.getCondition(); + boolean hasRequiredStatus = status == Status.BURN || status == Status.POISON || status == Status.PARALYZE; + int multiplier = hasRequiredStatus ? 2 : 1; + return super.calcBaseDamage(pokemon, pokemon1) * multiplier; + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/special/AirSlash.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/special/AirSlash.java new file mode 100644 index 0000000..c99c703 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/special/AirSlash.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.special; + +import ru.ifmo.se.pokemon.*; + +public class AirSlash extends SpecialMove { + + private final static String NAME = "Air Slash"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.FLYING; + private final static double POWER = 75.0D, ACCURACY = 95.0D; + + public AirSlash() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + if (Math.random() < 0.3D) Effect.flinch(pokemon); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/AquaRing.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/AquaRing.java new file mode 100644 index 0000000..7c5a533 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/AquaRing.java @@ -0,0 +1,27 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class AquaRing extends StatusMove { + + private final static String NAME = "Aqua Ring"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.WATER; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public AquaRing() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applySelfEffects(Pokemon pokemon) { + double maxHP = pokemon.getStat(Stat.HP); + Effect waterVeil = new Effect().stat(Stat.HP, (int) -(maxHP/ 16)).turns(-1); + pokemon.addEffect(waterVeil); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Confide.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Confide.java new file mode 100644 index 0000000..ba68e00 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Confide.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Confide extends StatusMove { + + private final static String NAME = "Confide"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public Confide() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.SPECIAL_ATTACK, -1); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/DoubleTeam.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/DoubleTeam.java new file mode 100644 index 0000000..a9e229f --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/DoubleTeam.java @@ -0,0 +1,28 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Stat; +import ru.ifmo.se.pokemon.StatusMove; +import ru.ifmo.se.pokemon.Type; + +public class DoubleTeam extends StatusMove { + + private final static String NAME = "Double Team"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public DoubleTeam() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applySelfEffects(Pokemon pokemon) { + pokemon.setMod(Stat.EVASION, 1); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Leer.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Leer.java new file mode 100644 index 0000000..960dbc6 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Leer.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Leer extends StatusMove { + + private final static String NAME = "Leer"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + public Leer() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.DEFENSE, -1); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Rest.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Rest.java new file mode 100644 index 0000000..0201d56 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Rest.java @@ -0,0 +1,30 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Rest extends StatusMove { + + private final static String NAME = "Rest"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.PSYCHIC; + private final static double POWER = 0.0D, ACCURACY = 100.0D; + + private final static Effect SLEEP = new Effect().condition(Status.SLEEP).turns(2); + + public Rest() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applySelfEffects(Pokemon pokemon) { + double maxHP = pokemon.getStat(Stat.HP); + double heal = maxHP - pokemon.getHP(); + pokemon.setMod(Stat.HP, (int) -heal); + pokemon.addEffect(SLEEP); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Supersonic.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Supersonic.java new file mode 100644 index 0000000..bb8c2cf --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Supersonic.java @@ -0,0 +1,25 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Supersonic extends StatusMove { + + private final static String NAME = "Supersonic"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 55.0D; + + public Supersonic() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + Effect.confuse(pokemon); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Swagger.java b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Swagger.java new file mode 100644 index 0000000..31fe6cc --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/move/status/Swagger.java @@ -0,0 +1,26 @@ +package ru.erius.lab2.move.status; + +import ru.ifmo.se.pokemon.*; + +public class Swagger extends StatusMove { + + private final static String NAME = "Swagger"; + private final static String MESSAGE = "использует " + NAME; + private final static Type TYPE = Type.NORMAL; + private final static double POWER = 0.0D, ACCURACY = 85.0D; + + public Swagger() { + super(TYPE, POWER, ACCURACY); + } + + @Override + protected String describe() { + return MESSAGE; + } + + @Override + protected void applyOppEffects(Pokemon pokemon) { + pokemon.setMod(Stat.ATTACK, 1); + Effect.confuse(pokemon); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Blaziken.java b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Blaziken.java new file mode 100644 index 0000000..058d3e3 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Blaziken.java @@ -0,0 +1,33 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Swagger; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Type; + +import java.util.Collections; +import java.util.List; + +public class Blaziken extends Combusken { + + protected final static String NAME = "Blaziken"; + protected final static List TYPES = Collections.emptyList(); + protected final static double + HP = 60.0D, ATTACK = 85.0D, DEFENSE = 60.0D, + SP_ATK = 85.0D, SP_DEF = 60.0D, SPEED = 55.0D; + protected final static List MOVES = Collections.singletonList(new Swagger()); + + public Blaziken(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Blaziken(int lvl) { + super(lvl); + } + + public Blaziken() { + super(); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Combusken.java b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Combusken.java new file mode 100644 index 0000000..c65c1aa --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Combusken.java @@ -0,0 +1,33 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Supersonic; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Type; + +import java.util.Collections; +import java.util.List; + +public class Combusken extends Torchic { + + protected final static String NAME = "Combusken"; + protected final static List TYPES = Collections.singletonList(Type.FIGHTING); + protected final static double + HP = 60.0D, ATTACK = 85.0D, DEFENSE = 60.0D, + SP_ATK = 85.0D, SP_DEF = 60.0D, SPEED = 55.0D; + protected final static List MOVES = Collections.singletonList(new Supersonic()); + + public Combusken(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Combusken(int lvl) { + super(lvl); + } + + public Combusken() { + super(); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Comfey.java b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Comfey.java new file mode 100644 index 0000000..ef68ef1 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Comfey.java @@ -0,0 +1,38 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.physical.Bulldoze; +import ru.erius.lab2.move.special.AirSlash; +import ru.erius.lab2.move.status.AquaRing; +import ru.erius.lab2.move.status.Swagger; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Type; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Comfey extends Pokemon { + + protected final static String NAME = "Comfey"; + protected final static List TYPES = Collections.singletonList(Type.FAIRY); + protected final static double + HP = 51.0D, ATTACK = 52.0D, DEFENSE = 90.0D, + SP_ATK = 82.0D, SP_DEF = 110.0D, SPEED = 100.0D; + protected final static List MOVES = Arrays.asList(new AirSlash(), new AquaRing(), new Swagger(), new Bulldoze()); + + public Comfey(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Comfey(int lvl) { + this(NAME, lvl); + } + + public Comfey() { + this(NAME, 1); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gligar.java b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gligar.java new file mode 100644 index 0000000..2c677c6 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gligar.java @@ -0,0 +1,36 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Confide; +import ru.erius.lab2.move.physical.Facade; +import ru.erius.lab2.move.status.Swagger; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Type; + +import java.util.Arrays; +import java.util.List; + +public class Gligar extends Pokemon { + + protected final static String NAME = "Gligar"; + protected final static List TYPES = Arrays.asList(Type.GROUND, Type.FLYING); + protected final static double + HP = 65.0D, ATTACK = 75.0D, DEFENSE = 105.0D, + SP_ATK = 35.0D, SP_DEF = 65.0D, SPEED = 85.0D; + protected final static List MOVES = Arrays.asList(new Swagger(), new Confide(), new Facade()); + + public Gligar(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Gligar(int lvl) { + this(NAME, lvl); + } + + public Gligar() { + this(NAME, 1); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gliscor.java b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gliscor.java new file mode 100644 index 0000000..ea12427 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Gliscor.java @@ -0,0 +1,33 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.Leer; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Type; + +import java.util.Collections; +import java.util.List; + +public class Gliscor extends Gligar { + + protected final static String NAME = "Gliscor"; + protected final static List TYPES = Collections.emptyList(); + protected final static double + HP = 75.0D, ATTACK = 95.0D, DEFENSE = 125.0D, + SP_ATK = 45.0D, SP_DEF = 75.0D, SPEED = 95.0D; + protected final static List MOVES = Collections.singletonList(new Leer()); + + public Gliscor(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Gliscor(int lvl) { + super(lvl); + } + + public Gliscor() { + super(); + } +} diff --git a/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Torchic.java b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Torchic.java new file mode 100644 index 0000000..f914946 --- /dev/null +++ b/sem3/task-custom-make/task/code/ru/erius/lab2/pokemon/Torchic.java @@ -0,0 +1,34 @@ +package ru.erius.lab2.pokemon; + +import ru.erius.lab2.move.status.DoubleTeam; +import ru.erius.lab2.move.status.Rest; +import ru.ifmo.se.pokemon.Move; +import ru.ifmo.se.pokemon.Pokemon; +import ru.ifmo.se.pokemon.Type; + +import java.util.*; + +public class Torchic extends Pokemon { + + protected final static String NAME = "Torchic"; + protected final static List TYPES = Collections.singletonList(Type.FIRE); + protected final static double + HP = 45.0D, ATTACK = 60.0D, DEFENSE = 40.0D, + SP_ATK = 70.0D, SP_DEF = 50.0D, SPEED = 45.0D; + protected final static List MOVES = Arrays.asList(new DoubleTeam(), new Rest()); + + public Torchic(String name, int lvl) { + super(name, lvl); + this.setStats(HP, ATTACK, DEFENSE, SP_ATK, SP_DEF, SPEED); + TYPES.forEach(this::addType); + MOVES.forEach(this::addMove); + } + + public Torchic(int lvl) { + this(NAME, lvl); + } + + public Torchic() { + this(NAME, 1); + } +} diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/Lab2.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/Lab2.class new file mode 100644 index 0000000000000000000000000000000000000000..46b70f665a42467d9e104a741a2efe246d781201 GIT binary patch literal 2164 zcma)8TUXpv6#g{oxOMih6xYTk}md`F9!XI+EPcoFDOj)wlBxmpa?R~zpFDLx{@8&jum+-lS z=WtcTYa*_tkdY9_kcih)7?zOa%QsTEE}9$bHj{;cQKp1e)li30V3{*xGNwzWZI@bEFj+7H!C2K zb&7_7)|_b@lhsPWaA#P-B8`%BbY{&m*W_|dnegXLPe6Olt*VA=Rz1~Xh0AJ=9vO;N zVWushqxW8Jfh{w#*=05FyQW>vgnKc!Ox|q`%*2aXmT8bV9XVHh(^7M$=kvfNhg*^b z=KGvmH{ahZRUFkb)Fo%ps5rJd8X5`Rv7hRAn3hzkf@fH z^c!_ls%-dKi+SYR)?2fOV-hOqQmBCPd90qoZm?NC)DD%S_pr9*M3YR{jU{4rts%5F zDD~`0Ra^H>8ltRYd)12J64j$&Y95avO+(3XZ!&#e!08&l(0I_dFQmF8AXX;6QJnCQ z6U-;?B%dm$5)Rc35g*HNu`J^gUcygN5O8L%D5kwk^GFv=rBGy4c2;7#@3=HEEtNe< z#C-~zbDYI0?JAGkw&8{e<+sK^^~tQoiyG)Q@vscH8kb5#1@j8B9f5GYfW2d))a|^mi#*8+%EixrW_?@YY0zk$}=P=A-qjf+DSOZ z;S*cv(AIE#^5TH@2q*4rq7&FaR}7bS72P$(z$2XGhlq!V=plNb@2m<1b2v`d#|di2 zPCP&t9-=!uTz_-`T*M{9s)QTBARTXx)+()Hx!{2R~<_;_E#99In%Hm#c*~My{(E^ zVh~D&YBjq~Cjwi$6`DqiR$JEgnx<^4a?5w3d{%{7P()vjAwjqnobSud9{rPb1pHd?L1-kw@_ z2z)Z_WvbFQx570Gu2Y7wf29(ArmnkgBUQ6))zxPj_ZB^qxXA0yF#SJvB*ZZ+A&Gko zs36Jntz!M287$$EX?W(wSD^U?i z@)-!jgl8do-OcBD9g-esRY!5C_ti?FKz;Z8K6ncCCgpM3tulQjw(6A3208T<(SvyY zHw|1OL9B0XY?t%6M%O~3s}MvAQ4CQOqsWJg6ki&MMT)7y^e%-2E}!T5DIOV!g9y;O zB(BgnO4%8NXax+-9mAJ^KY`#0gpWOr6paz$0x@&$tF)5(*%-q(MFC7;(nVUJnIrk* z;s=_1L`?U%w-p~a>OVg^)icLMWa018gy)YD_I*L*PyQrCQq1{B`iU+G5XN=fAQBPN d=bpGC{s_mo@CiN+Mh&B}uZI6=Zc^mK%x_O9{Ko(Q literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/physical/Facade.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/physical/Facade.class new file mode 100644 index 0000000000000000000000000000000000000000..c56fd671c50b01a6eb9755e13fc673514c5a9b69 GIT binary patch literal 1428 zcmah}%TgOx5It9#(Fid>P{0rQf$=K{j3<7C;6Sj1By1c>C=w=xcY`#6F_MOiMy~QM zi5K4Z2l4^7mq|#)q>?IUpOyF@S1RXf#uSSwr&QH_``+%;-KTr>&%b}Z1#lZh4Yvj$ za66Xy`g`60vCL*)BY_co7ROuypJRRickqQ23sNk~w=V~n9Z&gM^->96>7EYJw_<&n-!|lMYn6%-?kj1V;OtS zuGMnd#`@Dei}7k@?VCbXK;#AD*<9{nHJjTMh%MS}+glQdPNg>plye%Ez(~<jF*^m{) z8&;?8+FL{$n@WfEI86Wgve~inX3N~B-@;T_M-{)bg%7=@*`^jyAaM3WuB(;FmTT(peGj&}KU*O{ZbE;z;Cv>EcW4XOQ4u9zV-Fw^n>+nVI;P6@R z_ro7A_=p2!y+JF2oBsiV-8Ods literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/special/AirSlash.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/special/AirSlash.class new file mode 100644 index 0000000000000000000000000000000000000000..3b51a4b93de23a1406fbdd84dd8aa2defc996e5a GIT binary patch literal 1130 zcma)6+fEZv6kVscnKr#>Etet!if9306!1z#no@{K3k^jGkJDiaBh#75bV|ab`sxSx z;72INKr}(0eQM+X826c}m50XICNpQ9v)9^d?|m{qetkIyuz)22Q(-Vnhn6?L(+&_? z-tiU@#BoQ&Oa!x#LeGBAyT1tT;$9eYm>00X5LnNZ3Jl5OOZiBablKRKDvqrg`-=>* zylFHX*>JXHy{U@0&mfcvl}c`n7=f+bGQHA8yD4e4x+yhO$ubYsx@kyT$CgU`V0mMw zu*twy7{pvY|6((j-(?78HA8cj82p*ZZ4%0xdn!Yss2S>dvtCv0ExD@GPO@k!vc4_b z8poZ@fODWV7$$gH)z+E~@?4#h>gJIuH7r%pWL?T>c14#P2V_CqQyYq{RY@+Dne0_$ zLbfdZc*C*^wVJ9pq&=GHRa4okZIN3RI)yR}|0|R_SaD?Kuq0a@_hMGjJHAtZ2#&}BkCBne-+fJMU8 zBRU&GKL)ySe!_zna1a4HOVcjHRf^6cL@OXZbpl@s{uF|z5I(v&hUpohTtJNeaa^NS z)QiRlMhOKl<~rm`Gjzh0{7LZxy?o$wPds^n>hDr-V4Mh?S|%Z$CUJ&v3Xym3Axxhk z%3b(f8PCN4c^Gu1`n~Xu6cKR~6C`%aWw1Cz-0qe*>e>Q?6U08j$5rVv)6+A@zbF|( HK1}`w2e9wM literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/AquaRing.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/AquaRing.class new file mode 100644 index 0000000000000000000000000000000000000000..156921caf3231e040a5a74a11732ecc32efd0c05 GIT binary patch literal 1486 zcmah}OH7~KF+x}`SbVJF@SNr5OK!`hB5EVIyva@qZM~0jQem8 z_x+f_0}&7X@L|$BGkOB?VT!w^`SV9UJjN3dGYsyf$YPu!ka(@`s!CSPZ!0Ow)bra@ z42@AEU$E4?l~%JwO+ti0T#TnukvWQRudXNQ(vdKWioTUIl!B)07;m(kkylptcQlIk zB$wCXD-0~=wYvbdEk&Zymn)IzI)isw&+FD>23IJYri@WzQ)6gO=y`3anA_0IRdpjv zofEk5-PS9;z%an;Yo=Z-Q1csOO3v8T6l&TcN91i$U9qW1n_3}b>Kl|T z7z#U)ZBci2vim75yA|Ks(lQq1?hQGSOWGu-c*|mqF~imKpd>|3eK((E@a?IVW~Mbg z%h2T%Vizazr0GnyCXYX56wQn_t8+0LPgsrci81tF%wI+u+GX_MDML^BXXQirclo${ zRQX&!tb8i}sC?|>Is3R&BBC;4h>Mt&F^72?u)}=qCV9qQ84GwO<2e#C7O^B^Sw<4= z4BZZKsp?!7X+)&NX-#U%QRwOx#bR9NwmQie1g@&%67piCW2ZxCZG<$xZO!61nxA6} z)g0j%?Pj5hny8Oj2%kGnk5x4Dv{OBy3xGa#bJNzho-VZ&sizBE-jF69HTzD@c}r%Vb|UV|&S_C81}X=%D`zu8Z!w&)6=w=^4$P&V7WQgqQ9BdGG*2 zQxL90c)pP>P-XsM66oBB1~j3cqiig$V}L9-Zs2Au&oEti9#_Eol`eL;ojPzP)O8wq z3!z%*duqW$G2x*Dh$To1NARs5!cSHxhz4WtO9_oa2~Cskp$>Nm&HwugP!Ay95;5;5 z-XUVj`y8zL!?j|Rntp>+P9j!Agb@fO;x>i}Ct>7N4Xz45!~?W^hrkQ5st`64{?%5< HCt&m+hR{=9 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Confide.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Confide.class new file mode 100644 index 0000000000000000000000000000000000000000..1452e42d19a2eeaa2cb690fa6b7e28bbd83f675b GIT binary patch literal 1150 zcmah}TW=CU7(D}&UFf!0Y>LHRtruu*S8Khsjd8O@(+DjAtl`NlFw|ApCCk#JkLs&G zMlo8WNqzST{*dt-*pS9hU6L8j>^JA~&18T5{(cHz1KSdAgusvpJ}%M%Jz@GKWh{rV zf}3HiVl4y}wMxWQ@vNOu24D#yTff_)<(Te7C>&vTky zWC(7XmgzoX@F$W7#Hia9&JanP7T;^tOWY|Kr5de7({|aY9T<)&u(ud+UztsYC85t9 zv(+T?rFFG#A90mTyR<;|t7b(wkt@7ecFYoyO(v4VvPO(XqjtRCXr!uDUUrFjJ~1p> zwjXgz7?!-e3^V^KCHd`g&5Ih&+byTepO_+;;yGLs&1YErZxjU=FrgrZJEYn9)_vRg z**Wd}=zi#&bl-Qrbl)v_j1o2!+{HZ!_Z2+ALkXJ-wlKjkJLJ6by?$k=bri~DV3-@) zfZo~e?1=oabEp``^VyWXtEFFRg@UF(JLj4RSvs8f5E`$|bVr)p&Da(4J=9H)V)r~V z!Yfhi?dLLD8jE!M!gLWw5XUGKLSuw{7$+P#gM);r&GasgC@v1_CJ9fS!F~kjT@06K zoTlnc1nD23EVtnspM?JeBcFN-aT>#<1X3I&z00DiUyB*c5(;1r^B&JC&4R}t4SuA_ zN3!s!qi44I2U{0<(S!vJ{+>)|r47mV74qNuG05as=uhk{r-LmU=YSi*7yD(*G0~NS3T+GB0+t z%pOB{!?aEB2}3YFUn0hgv(FiZ^QO&<&03keyGGfflX%{#7*@$}O@aNxkoU@LFwBYi z+%=mG5?@|XYtA88Nwh}?S*I!DxltoA@;+}=T(eAkW9j*Rc1MhQ-8#~_Rn1kayy6l2 zOuC=F?XJyrAzJc1Gfe&~l(^y1Xf2U&5+_`*tdin8u9HvqZb#3C6=8 zX$w$U_|%tsQiErysg5-vK|`=pCbD=8DfAWc-}RG_i9*yL?*{rLKm^xugX+qdJ#!=! YiAOp{TW=CU6#jn;EKT~TzWQSn zqcxh;cc0)78PC9`X$mJOQwYw1hhf7!sl9HCmu2Om9-gih@<# z4Py=K3N+l4aGxPi%oKEnNdB#HXlPBtI?&3lV_F9(hRLjLbzH-8t46cSWo$4=1-)F( zyr7CerM64cT;Azw=6=i8I$Uep?|93$w8~MNQ+;rE=e1s9V7bsp2uPNk$!1@bGT9nK zC~aD%`;5V#NLC3kYwvM}>AY$2Vz*W2PQ|D@X|~e(spv z4vDXCXf6AYYb4sGg*@jD$&mMWr{S1&LW(AmxlFdP=vU!`*_tM{38)7(%=}PlXUk5XGHRA(O{7 zx@Td!azVr~0hOXjihP)&c=}8nqL?~MdvQc?`7|#|@$8w{j{xn(aD~P>%HBeVz5sQl z2j5f_{$m8c3>o4yhKUKpI6-_@Mb;=6^H`uLfJH2MIBPTu9DgMAnI<36!h?>SDfOS0 zE)T5<2^si@G|FlZlJ7g@|M_E(Nw46a9VL1ofP(9|LA)|TXWM!7(Ht%mgR^fO~NG(fdIYONkJ`_a!Crfwjplq;6@?TrI%4`B?xROW6QKm zpW425`ddmEoKBgc?|pLqP^V`tO_~Qee%Re__q&{PzEA$=-@o1hxQg#pT-6|OEpfNT z3;t4=!Y4^w*Kh+jQ@DjCxh%`&Q|WnIp6+P4i=2wjQW!&CLjgs3x+ju*@iuAM|lK&=!_Gk2d6%6hHJZKmAr8qQYB zGdi}h<2|!mo@=bX*s&QuQho5KxF#S9i2yT*E1ApZAFk!{HNKnWVzDYP8-1m@Vjnt39+9jGA-T~JYzQD5tLjBj*&i|+*HB0|i8^c8l2ge3}+iIj3MNri$` z^5l>_0x_vu}@(CG;9((v~By+j~$AHFvyWDutRi|l{kmA5*^#Gcn$I!9#xXK zHLKAGBpOCC9Q9!&r3QpqHEa2mQa-u|fuKV^rQne|Xm!tRIKJb#0yl=j?sk^4QL`Gt zq!50$?Q;6hWJ*Ul;v7HsDSr70q%n=-v`)~9;Uw)-hiv)IQRQ12vp9X=H%I&IAv;c+ zBS}AnJ{&i$@6x)(3WB@7u#4E(G~#<0c}Y8l_qe9G1LGLQ1m2fkfiFHlhL(aX7Q#Fi zxywB9$;2Prg76^q^r6uBLFghr3`2inBKaqGVR08~56Mzyu?KDYrXuZA$`8Nykm7N) z2mOC!Cosa086?STg3KlN^OzfyT3|w^3roq7 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Supersonic.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/move/status/Supersonic.class new file mode 100644 index 0000000000000000000000000000000000000000..8225c2ca890a00cfa5b688c0971154fdaa8ad7e5 GIT binary patch literal 1045 zcma)5U2hUW6g|V&0;Q#5g@XN{S}U}+t5siYH4;D{1lj;%`nYU|x(d6S{bY%%yMxpI*qR(hixD{@=WkK~$TY5LI)!*t%zZAa0ahSGL<5Hf>QF4k(f z=ak{AAMDeXELpCswK|4ubJ;ZB@{Xa)^%Ij*zJGu3Rk6yz3W2@_S{Q=4eEwxMmp@<# z>}tB^JYn!=vJGO)8;6`BTGDi0aXU?J)s<$OPGTiPRoV^3(gYqJ`kdFA&9El)xuv-_ znQv~(9pjkGWZI#Fnrm{)HgruTGr>b{tCrRzzPU_xQn^vZG}|Y8rde#Yxatu3a%NI> z`-3WXglB13GQ+~ZLP>sCZ4avr*9_NE`7=$_7QHmNC7ys`^?wSAAd1-t;AfYj+>{ZLT5>{wBLNp_Oq-a{F2t^2aFim)73mlQ6~snyR|#Jm!(RC4E{+7P^A!CE0r~!#L3mN~$Ii$a}6QnZVCx{P% nh6JJ`E4V?aLEIcwv)uOpNT&#Xg-4LlQ;eL5pMRB*2eJ&>W@(z zh0z&&_o@9ujAz>n_95uYZqC^~-{qX0{670}3SbeMghT`k)8W;fRmuQSbYn)wYy@{O z7sWi(DDL831Piz?VUZ!Up=HwyvCJF&KvyfeSypqdZJ6aGLr=;w9alHqUAoUNYpqHXMd2 z!Ov}@?vVJxf?Bl>xJsg3O61<@ zmRd;WJS2uu-$t}%ytXF#FmM4BO<2q4wbaWCo{6BN;lzE)y*3kq!`-a4PkMb-v>?`n zh#?=8_AJRu(K1VQhg|td6;6m~V{<#JWiUZ+w3}XP7vfORLs2h90rXLPsUr?kOv9kF zIIf`o{N7cH2Rh;)LUcBWAzI^fdkJCs0+g8}1bX`sJVw`-7Q=N~qr?Pa=_b};ajSh7 zBN(M9gfWbJICHcMoM0^cnYI8#c^f*`Q5rlioxr45x{hF*X7&hD=sV=u6GZ-M=%r(j w2bokWq+95?=ILtd5DKSogWzP`Ja;zM(gR3Gh<-&t0J08M;>UE0ask}_1AG<-SpWb4 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Blaziken.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Blaziken.class new file mode 100644 index 0000000000000000000000000000000000000000..34e8b8be68e5447bea88cf0f55e7d5278814e84d GIT binary patch literal 2114 zcmbVNZC4vr5PohTyAU>oMnElCpi&J%8~dWRf)ofrumPf*M)9rQB$u$TFFE^y2S54E z-(!1@wDlZ+fXCm|)497#SfJ&2+z&VRxifcWo|(Cme_lNQ8^9fOG8n-pDn3;fH|c;r zW%1!+ym|0jxXB=eyZyA>%MrdmfJH1xxSRvSeQBU9m(>iuz?zEn3~~|pQpE#?-p!?r zGDEJi#}9bXtWP=NPgj$M$?~`*m&xq7M~@bZxs@))|H({lGWOV#V-$((c!d zw$1&(6%4ay#Pbz5C>lGKQ}jf!-oeuJ$zn;AG+Be@criLpR zqe3k^j_>&{?`#Nv*J*i!3buw&9Zch^A$+YtM@_{;4Rw5@;X1}h@a+(`rKg*6xuxPe z4d3GjhN;tTEy`(;`okyE`Y*iQ7OsXL@e{+uX~pA$mmI4Rc$5vIdrXVAp73?DLRsw3 zuY})BJ%dO1nPDVZq^-uDX!>(f$kAXJ&%d^-WJVRJLgk08{$s5mo;cHIf=rf*Pt z%H|I&;Zo@?g^#1#?9`t-j$7ucGIOA8B_2{jd!guUQY5G+eOVA6isc2~sFjVYm*q2>kVw>UG$qX>;1A3*! z3bz_9PMyPdc++>>LxutC1gW4>Diz1s4>}Cmx@`-$WOC0F6#Bo(NMd_Y53X^$WeRUP zx;S_K9VSjrT?{A2{}M(nldjGijDq z^-uIaMyBu_1HdzADLh7&(4`pt5z;8oI*K%{!%&F0BwZldcZv2aolZth@Buy~MDB1S zOp4qU@ew6P26ZzIYJqTyw3Ncw5e82@$UjaH8A)1N9gVcQR+Z2ejcPdrV_UcBmyvF| zaD<_=rY0yGlc6asQi@IW;da-63{HN-PjUGPGJhereS|ljV)zNN(jFtCKonY*$X_O^ icjzRAkFgs{7^W=}bw}nf`!Iep9As2HwC z+G)+$v$*Fwf?@tO@nXgC3&w8SF1Vu5u@6PtwhHxU9kH-PUnVwc3~ZGlwNkII6gL@^ z)zVt2s!?Dmt@d=KPDgS>rxb!#E0st&xwYMpq5LObTlP`tE464?hPT8pmOD?mJlCL% z6zvvK7_1nUsQT@uaO%8i(#dee*16f>jv;Y$*z4^ZF2jr@C>+CgDTmEFU5-V&-Spi< zVG+$9%iCH>1!pn(aHfSTm&8fv$;LvP3H0M~-3YU)-sv zVq3*kOi-;J*|z6;4)1IUZ{KdYgDKR8@a13eJM|O$x#Aa z;b~-ovYF1U2G3k01CA!cXuMe4%>$u(3sR_~#W0zBV|U5Krns()j>oVZ=)JW_bFseN z^)1~qs88iB@Y}+n5)K5nq}%n>sJpgP;`%vMSVqz!H%-m(1og<( z3o2L(M;`SHZ?$A_;Z9av!A}e~&n5Jt1Tb8GyB=m}@Q>1OAdN|kVVwQ|?+{Ah3SpWB zgeL=hjo#NW)s^=Uo{r%p;h7kg@*6QMlw+$kRH8B&{Pz5phX6Pqgn7 z?Rh$#4xQiwd`O7g;Z~3oxhvo!N{kHZb`;bS;RI==@)IW*JoO;|uply$w6r=FYIUuq z0$ViF<*1Bo-K94p-DLg*L$8~fqHIhDrqoa=GS!E>F$2;mFn)|n&oTTPGJoRo&Iv{W vkd-DGaRtKYvQ+X*#P%MYB=9i~0tv%DY#3Dj&j`!77f5FjpJOT76|wpcchLGZ literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Comfey.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Comfey.class new file mode 100644 index 0000000000000000000000000000000000000000..f3ff22ea760817bb50ec62905c18c71726f2cf48 GIT binary patch literal 2409 zcmbVN3sW0a6#i}?SqMR58mK&qJT-uJwbp8dRze6u8y>PTHlo%`vcSS-H{A!7`oh=v zd!#c`%jgeq{7sJM?k=!}&~eO6cF%Y3+3&pX{p+8ne*(CUpW_%tPQq+#dSRbdfY|gM z?@dB!-;-j~#baUZSSWith$Di0D?R2?v`}cnB9;VPPJyA&f>oiAYlVVh93P=1;bRH+ z;^;wH!Y6U`iT7F@{o?&;90MrF@fkjsaG#-hDZ7|wNENpEE|+y~Y|4sbX~yOxLwn9N zY=;|8iR-S)5G|Hh@(M%JS9TpumkXNhkZP-C4Fc3Im&Eh-Hh#Z0;_DG@GBxFDc|zOj)^~Ez*(@Xq8-0R`PjLjxH{j zge(8a)}p!V+lozThUVO6=*parcVVnV>ByN?3ZbK*8S0W-TUV_jU)O0RRWK`DFL6r~ zI9P0UwltfeUj(RHnrl-6*RP$#m@{h|>K?_|Z15U!H0irK#kxQX8P8f%M%Zkbs_21V zam944iaMtWlWqR@S4CwK)JAVJ^gYi|0$+d>UqyyWG-H~M?O43Ns5)C_)$WL4J&8(3 z6xAfu1U9fKVJiU*+X-AlhBkJRAopUvRSC5O444w?2|R$saJfMhMP?a>pY^Ini?Ur; zD;n43tY#@Xx5?6Vyw5PyNY$anvE}Rom#Zz-a zX^3Njiq>-cU zJK;2AmufE;cx}DPX+Zb}uQ;YfX=lH!~bP}fXitw0+#|cm1wUhlO!mo#L zl1d_r4f5a@w4;gMH^(RX4#CFLXi6iR zhLlEY8f|H`|AvkOB*&lPMc{X&A~?V$Lg@hg>V@$RJ-ZO4XE$PW5BH%LBD8mLh5n!$ z*fWBgc#ja7!=#rKAx+^HB}O=PJ8){6v?HX|GM?(}Jw(^34RP@cHi;4}c)NVP6W$h& zjjkMV_y%k@h>Zno%?;Q_h;7tkOZa*LTMMR7IPQ6|0aFLK`~)vOMpF6%-Q}hu^pp?L ztCX9M&_~i0r5rs%KS?hu<=7DhNE%e0VCXR}i6|IEru-;U)Er&pTb5QLn8CN+4#U^@ Y0pCy_KOijPnr)$56#s2rOTq#vCQpFTefJkcd zr3XAtc|iIn57=@kF$C~1N=K%j7`bkIf=3+9_d`Ig3maU3v=*Zn#Hak&j6p_8#FmKd z7)J4#h|gmf=ihP+6a4#FK&X&j&kE?z@38}x)R^8#%C@QMjRgTc8AG>hrrX<0Ybyf6 zrE)PV3y8bIZCllndDXH>G%BkNo!M=Z#OD9SUd)^Aq*`wpNlQt#jD4kP=*iMyOIcW= zn}M~W0AX1`BwZ?{Gmiv_%h{D|K_;&va`8#JL?jLnm0XaE*(?c%*EhDgEC0#Xx^dvz ziY%(SYA*>GN}P>1H@i*g$QU&Wp)arMN}=7XC}xROG@|t9jVjZ&nW=KzBZll<)evSeYHEX-6k|wdP0|t64m652M}&l9EtudoyB4dO=T}TN+GbT*QMt)( z_x>$j842&&#(iv}hXYhM8s6T>+Dxe-88PUDwrbE^^fw0>{Qw_(Q|~} zx##Euen&ijBU~Yj9!LlK*$LwgokIxIIgALdkeF%M;x9M z4&B4Ylo;;Rg6C9v)xsKj0M;onwzV1A2cS#$! z#I=Ra(Kb!mZaCT`SI*Pch5H>HJ5FrCgYXLsmV-walFOkZ49maa+Arvhyue5~c!JUL zF~*2q*0c!M3ev?;K1Psu<;$*l)`1gd5Bq( NS-~pSJZK$-zX1u_8iD`- literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Gliscor.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Gliscor.class new file mode 100644 index 0000000000000000000000000000000000000000..a41a5519364743cc1e58ec57b0709069d31eedf6 GIT binary patch literal 2112 zcmbVNZBrXn6n<_XSqMv^7^t>Tu(le4HnpuU6-3ey3N}D&Vk%a}OR~ViW;gC`nBkk> z{5`faQtOQ4XUE^<_}twEmKPbve7L#Kx#ym9o^#JR`{&=Ueg|+LZW>qcv4#h!xhH>6 z0;J}i9&Xm>lz@_jAA?OA34GGaWqOFX(1(X8DmXs`fr7I1NG*$LEa7tvkJHG6psZn8 zpnIjTToM>6@5nuwx1_z5ullZOZ%qsI7aiO4rR~?H)iHXoB9N@DRZ3NX!BD^Bn^wMT zdOo##tLBz1{f=u0Or1KODZ8D#x!H2^o{?`myGF~g^R@l9F+IzhiN%V5m={PDYPCY~ zv4A#TS}3hl8Ca@XSufNmQX5JcLbXyVQ8~H1T34a`Ctu6XUg#?|W7?)aD=?BhOL=Ls z&WseDCMgV*P1{)Mv^EU4CO0ffhRRMuT6O7~3P-|jf7|o~#uY)sH9H=2xN-N0<0H%T z8jeen-L`DeNSC!|k?ax$*}z>_RypmNX;@KU>8jIl8^(gEeCm;b+v<6AOd=;RcA+aB ztElK0#TZ}dq2u_T@5=VF;cq)lZy<#)2JvJdiRvI~I=)0*!&4n!VNJ(77~{d$gLtMK z-BZhb4d3Ya7T*b6Kk2o_gyvZsJ{gw{!_~2l?*&FrY8^f`S!_v{?;6n|VbAcZyw2S9 zX6J+7WIYXu4T0hK)2wdn7!7|~9X8OUhwQ)Bl1gMsHX26T7nlw7E_jm3SdDIW?1pc$ zCRN3ET84VCOF>5*RXBs+blj3`Yzs_80S1R>?}oAR_0Eqqs6`d)@Ue%YV_Brh5L7~p zR@>iKZN;L?#^a1yt>0sVT88h~q0-Is5*DKuT+^_rV+*?)EFCTN`Zk^k+&FH0)81oi z=F76R(UhzhxhWgIHdS!p zPQ9vz9|UflN$7bAU_)K3hc`LIuW+RIvX@`S8=U4>i4wR*%9^i4J32GmncM;!+ z;Uw`}F{}~ajA3Q}Rt&5AZ^y8@&(Uz?FN<#OIf=MVF@m4ak1qZ{$W4tNK;$y$${?A6 zmO*d0{{?-|q32#v5x?S60?#o(G#H_u0~+sg9YK<71}O~F=?Go$J4o{HQ92Pi!ENM; z=ni*+q^RBdxXZ+-pzcLM%@QZ5mC9W^z~y5P>T3z6P?1trM?$S5tEs>i2ecY~ku7CY zP&b)7z|d(^3@fqf#T?q^S0IH1YYXATM literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Torchic.class b/sem3/task-custom-make/task/compiled/ru/erius/lab2/pokemon/Torchic.class new file mode 100644 index 0000000000000000000000000000000000000000..d4de0eaee8d0265e04bcf24bf6cd1730cb527575 GIT binary patch literal 2290 zcmbVNYf~Fl7=BJ}OTq$a8m^@+MbH4+Xw_PTB55uX8z5z46sy*gWPydvF79qnyv+2Q zzehSFwH^Hdj=#zAJ-b`jmcTgX!{&Y7^X~KB&;Iq#vp)g6ho2L;in|h)V#}q+qyb{f zYwkY@g%`qu$F3AxE_<2;Lii|7kL468O1=0PD*~2NU?}yVA`I@vv5K_>)=`!4K*B}> zBTyvN5*UM$z^AB7_>3X4mRl_{q$<1ofM<1XY-bh6(v0l|hQ7RM*bX?bw99#Vs@;iTGE71x#khv z6upsg6Iq6<7rK)1IW}e7z$A6)o@qL^WAXh})!8vy_CO3@B=K+{iZ7G+O2*fCB;gww z91R(7Vv-J;NwlZ|zF!Hdj4fp3vmA6F> z^9pMH)6cmRQDZ*CD-nPzRm;&eXC`bSvTGaJ^cc)I)gbKT5T1DR6 zVVLj(bPvzI>&5!*d9k_!En@A~53yM^V5Ra#kzw@QRH;a(;pI(Try5cGRLwq{)?Zg0 z(-6x|t?gFKKYH@E2g>EpBKu#5p39)Cv&8<01@q5yT~{XYj;@gqZ43~{IIiJ3eO)F9g>acLT``1TbMX}6X}o@N9wz)o07nUD z0$3tE6TpIhHh_Bx&jqmHqx(r9N`in`hL3TS2vA!=sAQaJqHmZX&l28)(Gxk6t_q_;W@#( z^yL=6dA#oyMM$^t0To6Bb;l2CnXE%()iayAeB~JFQy=2<3}Tn4xPo`cvpeDKaoOlQ zA#O{b?KZJ7pDogbZGzZtxNNd#=d<phgMK1TqCXWJ&zVr$1 F{|n=GAF%)c literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle$1.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle$1.class new file mode 100644 index 0000000000000000000000000000000000000000..b2e122a5e361d5ef9e889c49b13761eeaa8c801f GIT binary patch literal 709 zcmZ`%TQ37a6#k}~-F7W?DRrrP(bi>2#7jkrB9gkKZ6tz+#bDXa%I>y_pTz?S;RpCp z;!HQ5tn+Z@%zS6QbLN}#_5JnebYe)wu!?jXBN$bR$zLFb zF^P_=m{2jrpsZQK^4A&qv*kOpX&SaEZj7q$TH>a#mpf*NZaG(+AyKvjKWNl1xLY$X zY&y}ZPQ$(AJC@wEZ<@Yu^F_%)$=l-6c0A(P=l-p8r6Qwa8Z$b&(5+(@S%#F`Fs$pk zV|d(naPE2C5yrmLB(C8QWXE#3L{;Q;J;<1U-eC&YQ(dpmdWF=XVxAc=$T5Xvax%3Kvl~j zWo1r*VKn zND|SOr$ELpQ1a0as3&djh@Ctmo`jZog9{su^);Rq!<7I literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle$2.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Battle$2.class new file mode 100644 index 0000000000000000000000000000000000000000..7d0f1084224d7ca514287f6e58b36b42bb908e30 GIT binary patch literal 681 zcmZ`$>n*dXm3S21f*&L# z9>AM;i4$vg;@24~JA2)}{jKb8z5jc81F#IsKng=zDN7ldR$2}N1DzPwkxAkwMzm5Y ztZJ(tcgpS!==h~DqdLZPOfYCGwzPxa41KxECBNa8!{xbE3p`t%7dP|!4DofhE*Ls1 zwiMgV#))O2%4OdzlwkN9YjnI)dQNWDC&zhLSd^A2Bnq6WrH>DKby2E{6 z_zXi4^iU4l`IUINT})+^ZQt!&4w#yw0M#l3_TQ8(SbJdi-noYGgu*w zSnI^Ug4h$Z!YlNHM04Cw9{-$SoHHB_hy$odA(bhcO-ehNB0-lLjKn3h?EnWjI?S2QoUyPyE8Dl* zy?}hBw;LG1E*-n&a)*vP4V2=pQmn<@vfLwA%fKLp3=G3A z#Rx{_I%dGZp2)@@se*q3+bc^_9>)!`rsU+xl9uIOdG$(>fgeRyOxS1OKHM+l2_5?l ztPAol>1XU4o2~`fi`u2Mu^Yqcus@a zlS2U2#>e|i4r@p#TvIY z#1ea~eO5earAFiZzUQPy3DXHv&ynk$l;hu^p`@{C2l+eQVKOaFI4OHec6`wGwpoKo zQgmy0xPwA9tZXc%zfalGEBYvM+9otJ;T@E@5wF!wn5zHZ3B%k50+lzFR*VIqyk4!WSwp@Nn0E@ z)!xM7u9+{a`42W=qmH`9rea+vk94G1c`LrMK$7Enj?eMHInq-c%?_5P>hJ67y73%SOdv9zC{dv= zC^|F(SQCY)jtpj7ujP+1+@6&hc3GM97x(P1nMIt8QBH=m3W)M6!ZE>_ z^S2X^2@LyLkMl=&G95`rVoCKR>tj}COJKo*GVGto__kQ+W+izlbB-JD<7}qao*LwT zS74_`xf)%k^HXzLq$R~B#!`*?YDVGAh7T$G>-H$~?0yj5LLz_itU>YTf zmRNWOi@rnTIP?&9w#*>fJd4tSmXhNzLii44(=d;rToJ>k5i7o+G!30x>!EXv(WWYx zs74)Xuo6r8nXwE#SWXlNPr;5$X@%HP+WZyDTXI-DFGfB^K*lH<2*wAtmu^g&e)plqSRWqorM$Mtup@*jsF8TNj#G9w+ zr-^#!FEX`+f+#Fygno&18`CrX{O(rQjLWBB6v&C@bHFIK029f*EeuQDVMM0T z)yhDr<8=kz94OjnzSYr-r=!!bTniMsM zW~x|#W_44k0@2$7x^*FX3MEpGDxbSp!C-Giu>qCXh!xnxZ_f_qbTd3=d_SxDA(rWr zth=X~>~j6SUbw`pszRojk!?EtoGPvQ2UCfe9Bi`RGSxaBvj zQDvu&#BZq9(JQB4`NdpHp|`5aL4Tp8TV}DA@whC(Lwq21d1du9 z*5$CC*S3M!6_vHqxH5;U==0U{&8Dh#H@&-qU3wQ*;~q4_qVIh{1a8B%++)1AaR+g6 Gwf_mh&kS$? literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/DamageMove.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/DamageMove.class new file mode 100644 index 0000000000000000000000000000000000000000..bda56cd721968f133af3471a42942a5cb5552a0f GIT binary patch literal 3116 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 U{RhOoSbI#DZNOued6rQ50u72VmjD0& literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Messages_ru_RU.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Messages_ru_RU.class new file mode 100644 index 0000000000000000000000000000000000000000..7198ae31ca94dedd02dbf7e36ed36342853b3710 GIT binary patch literal 3186 zcmZ{m`Fm7X8OOgj%gmcFgfOHjWl1MxkyIsWORIut8iK{9fJ{KAsCW}@!i8Dl%$*{2 zgQS$!q+sigwsqf^FeGFlleqgl{&er-AL4)Dhvl%bod=oOb5Jy&!6XXR2!KmO1f})@#@S0J^i#q9I9AAv%lHeu5mjquHd`0k8 z!Pf+r1y=-Pf^osif~$g81lI(w3SJX@T`(b-6ud6DF1R81hTsjsn}Tl&z9sm!;5&lv z3ce@!zTl?d2ZA38-V(emct`Lf!H)$$5&Tr}Gr`XVzYzRV@GHTu1-}veR`5H)?*)Gl z{82C^xFt9(s0eNgrUf&CJAzrkoM2wCAh;`76jTLEf@Q&<1b>d>FLC_ULZj!{xsrv} z{`2;Wc6Zrxv)%n}$=h$CDeaErZLeH(EbM$>_(1fXweut0X|L$!NA@42i3}C;o|E?| z*mnB#syW97&pSgZ8av?TUGJcU`aNBzEHv~M&Qg9uzngcCmUDwnaljtTlB^qXyxtYD z_B~x|%gKSEtPyNZ7s|yU=di2ho1S+{C40mvohg>joH)5xgG<21U;=0Gd4?NCyUKkF zE&f7q*`Ero_|;${xN4!cui$oT9BpbwiyE zt^_xzGF)_=m#C6t)ZsW|(>Ko04mxLFq)3tyV~lT#u~uq>GHMs?>?JjBr~H&=n2XHO zoO$58IyqW!O9d*lh6*~P5~Y^nrL5zO>JZnXHxnvi)*ZIpyl0_N@>BlXtm;%MO#Mot2x=n1^m@3|{5*u(w2|qVaZ)SLgwoht94NiP@fK4_(miU#WnxE_ucB$cUZ? zyIFOuo9Ss*I4bfo3HK@WSPg%XCs@8v)9X;KJK4YOFQxb~lk%rS4~%zBJne?dC0Bd* z3GM7K(x?}?#nec5xOVJx6j2Ct&wUF{}GQZr#>NlH4 zx9^-kpJKWw9bD$@&SJUS9nKZHOHQ|*$GJkj`~GW)C++>W>#XWV{La z9OBn@{#yKPe0&zxExuSd%V#WvaXuXk^Qlv}@mHrdR8Tkdz|5y17^#WY{ReT5qwe3W zQbm2HKG~4YG$b3-nZ{%+orxvm=}bH+>5L?s(wWv+vYF3#a$R~3iQ8D;x~qzoOnqY& z8)(|9rW@0I8jw`5iJ;MdHU$q6#0+Rx@GwE#fXxaXArJ$$DA-ESTC>@vWV@1@QHPR8 zmDH?KN;;J^8J)+J>`>Bd$WA4@l&mvkw~}`$Nf@$6NtcrKhCHt1-AY;vd5@C!D%oJj zUM1a1S`B%hlJ_gwXvhbYJfS3M$dgL;DcNMmQ%asz(q_m9m3&CaLxy}<$$lm6h8$4x z5hV{Ba!|=fm25WTV@i6IJYvW*N_v%SG31bvJ|$ZXIjrR4O12sDEJ+3H6>T@@h)(*1 zk`6GQA3_ra#TsmkYh@YE9o@klS)n~dCU;LHzWs?>@eh{l2b}{8uBS6pH8Q5 Xqwd}oY33dSny?QEZi{o;?{NPI)JVd; literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$1.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$1.class new file mode 100644 index 0000000000000000000000000000000000000000..ca2978b94b17fe27837340fb663f7f7467124524 GIT binary patch literal 598 zcmZ{h(MkeA6o&uNZP&In(=;_9x~R~CwxBzs8!Zqt0;T&^C)-?SWOo&MjOs<|s_3Ez z=%J!BX%M&#%$(uOf4=h{=JV_Q1HcJNCYF#+AY)=3Spzu(c?SK|6>fOOuw8EY6WhHR zNju>7SPuC}3cGVZ=GA(=(WqQAXf@gA45_9o_~m5O<$lNMdX&+fFm!rDhH50_Y6h!D zHTZo~{6wDzJ>TsTFR4VdxE_$8} zNY&!ut?XOSVGvQsnKc6i3q@=)6eFfopq*m|t04sUYn~GXJYdNGBV{N>z3?D#2C6PT z;330ad2xb>p>PC^K1QuLZL$sWO}AY-RZQ+5lnYu;&l#^^FO;Cke}s(A2c%(QWnNOG vjDjr49!X#!IhSowRK_I!-AvMH6oJGyLT7~@ literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$2.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$2.class new file mode 100644 index 0000000000000000000000000000000000000000..1a97fa1008562610e750f3bc75d06cd7925e616b GIT binary patch literal 840 zcmZuv-EPw`7(H&gqzQqoqx)yw24f`awhY8w5kgu)47I3Ir`@})mj=?fijzrw16}}4 zf|md;VB&%Y;Gqy-wn~%0j_l9zcYMxgAOHUI^A~`pcx=PQQW?uORo{glhgg=(=#Yo2f$z&`V&8BzCP&$$W!7$qj zWAQc{^+a;Qdl9Xa2SW9eut(FX>$TqTbM8kx4*YJKgmKWIJ$yWlCS4JoHTj4K1l-iB zb*@z#S9*3=W=UVX3UdvsEziY4PEBkt<9;L+QMW}plmipn4sOArN>rL;K@bTO4;}2_ zkqOsb!-)#}Jj%B)ENKwe znKfNTC`Fe*%*8;Y3_I@scc#5YolH07L{WI%p(E)G%=6^Hof}u$JRLI3Br=N!YTbkZ$yc-EeX7?b?r*x*gM4`EP7#iD^e#%z;K&pTQKMYtlhf1T>1g_m42uu z8V!oTM^rG2xhcFxF<&+23zsN<`3HMJ*b3&S*nMIs5u#H6Mn|b)Mqa}F@EzqF2^$3h dd?NbKRM%aa7f{6l#S#{2yieUGI*TGu{tFg(#3BFy literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$3.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Move$3.class new file mode 100644 index 0000000000000000000000000000000000000000..1b6c3a421f37dbbf83dae1c353b5a022bde3149a GIT binary patch literal 956 zcmaJ<+iuf95IviuabipZrO+m&>4g&P24N(43*sdKwNe6+QuW<&HtB-nwY*NH`~-i1 zkhnZ^c>u%%AHYW;#z_iNyTX=t*E46%oSE5QzkmD$@DO)R7+5P{-9#CcA~tZ-#3rf+ zwhZhrk5O?4!<5*0eDt-+RDd9fl!~n}Mek zR}5PkX!m5Q(u&g%hBXah?%B|JxKh+!V$O~@HLPY|oQ8Hlx-`ASBZ|yHmrBz0HuckN zD;gb(w$trWJn6^*!=`q0Gm1m!826EU$vPoDHpfC;JU~3zeN}v_Lz)DO&qY!8VC{?S=vIz@eH?v9V;Jvrb zc;R@Xz4gWm1(A--_yhb=j?cT}$#p*#E4^fI@I*v803&4gD9|-ZGg3UO(v8dot zWWK;KeB$WAM+!cU%;%pUq{P7|3LZ;P3$|^#xvE~Tn{^3tHs4J42s{@B$15%x6XF*B=^teM(2#G-`;r1X}X5F zXo+UV1j(dGL&2viKEtSr2}}ubN5vRkP;o?G0slN{(2{E9ATj_s~YQXf$WBj@e@$(ghEE>&~ zEQY|-oC8mD6g1Cp2_%9prHlTo5pwL?gWWJo?i+t1ufn52xO zjj|iHcZ-GCYG1R*VP3|UJaBdmpv5z*vh zDB8p^qFRc}u$C6)-iR>uDzu&7X_B`A2UkXnzc>=!?Np?g)e!T#!MxJE{UkE{lbMob zOye#+WZdJvm35xG5YNW6Ul5)+MC@0@_wF2`o!WT@_1mXVPD@BB^Kmjw9 zVYH3ROX$KYc-3bdq85NK86(20Rlt_l1BQDIulvwp9~$ZIc!tDJ7qE|seFL*TwvSfP z0_i;e7Ntel+<(LB=);@1@3Re3i$^|0@?zXCh=~BJpY8(xvx2u->}!; ZvpjE;v<*27Q}@%F5>Xhs$JgC0{TDEhy+Z&1 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/PhysicalMove.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/PhysicalMove.class new file mode 100644 index 0000000000000000000000000000000000000000..7a5c6c450a05a512b2d3f8b70a256277bb475d24 GIT binary patch literal 742 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 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/SpecialMove.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/SpecialMove.class new file mode 100644 index 0000000000000000000000000000000000000000..426b22702197b2653c57ce683060a2e7434c04d8 GIT binary patch literal 756 zcmaJ;T}uK%6g{K1o9pIhW*=(b;78<3Z$==lf@Be_^cvGP%9grftI)5Cd`Re_AJC7A z?x;b?(kz@ibLX6U=HC7K{`drNh9eEDNJvWcNxOwO|9Cf zH18^{R;7B$u;tZ|J<2S4Wl%f9o!3lz4s2FKP9*YcY1HbqYqLg;s`U5e3V_Lh z5QgZqPmxhvDNMoMXv3frYVZ+;h^$kFMn@>=$57}4f`wvkGcbj3SrR6f$V?JmNb;1C z&TBJCQc0>)_?KmI@<|{@(&$2#BX2*+qQwaU?^rpRK%wBgQf~f6g(8q9j8XI<{sWRi Bq9p(T literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Stat.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Stat.class new file mode 100644 index 0000000000000000000000000000000000000000..36408e1cc721d871ec5264ec681fbe5af087fa49 GIT binary patch literal 1325 zcmaJ>`%@B86#gzO?1HNj`2ryynekA`%3hF3xF$*Jw8#whLxZ^58Y~SD|EiiPtZZs( z{JEL_rKWQ)Nc7PC;e7j@d+s^sJNNE>|M~eFfSY*Yf`mJ6+{HZ^(=y_2_>kb{K3`c> z;CB-~;ABZbfMZfYkmExImpG;rjB#96FwRj^Fu`#}!6e5=GFBOEtD6kIOtld+_sW%6 z&4|6Kyfn%cE2h^A^*Dnwnaw6sYYg(TwxX@;8iPaM)U;)WKEhNwnR$L1(tqmcgeu8Y zYU^n-m8bn$E~%$C)+yx+b9dLU7}z$sr*g^6mZmfKpPkpnVWHG8Y7Bu;_`EnNRoOKd z`ZK0wtT)O#Mm1a5DUnAO2{!f^WoZvT9oU@$h-26Q*U>7a4~CvoXCL z&M~-jbKfe|8&xVKg@j8nYpZRU_E4CFDv4sLoroN?DcaSBW;M!*GkaL1b8zdGMzv_H zm|TpDAI=*{1{ac;3mk;C2q#J8Ruq# zn@Nn)LI0i?Z}1wz)ng4H4+UR z!x;&Ffc&mgp^sK+jVkq`2YrYUv*8+5n8)>Y#ULT?(GhtM`E_S&tGPiaxIur9mY5$T zjz4d{K+1a+yZsohBe(_Yky=a@tk=)NiA=kc)dq=>o=p-#c4Erdx*LQ*%f3Q6@Gw z(_)@iJkT)3^`VAou4@`nT-PCk#rtQhiaf8D{KO*9;CDO|$Kr@0xG@ zMl&>>j@Rk73k>q}y=s}Nx2u-*%A%Lu%8pZ^Ox&?8YnMUWEmcdl%h%MU{gS{kJa$VbIxNnEc15JK24PgcBTvG=UcF6wC08R;< z*=^PQ?SOL+TugSABO93I$2n)7)kU0Okc`KU>*x#xIu1_ls|d|_8HPSVjsyd+@z?8HHGRIaqF^P z5?Osr&V51r9P;&giO&m?=)Zs%{fIZWJbMP^)3xSzC?nx6G-N1VKz$%c{=EMN*&S13 zXV6ZO5Js1U84$*Z3o|IpkRr^mFe9okqr!}7!iF|LqD$t=5nTv39%0aNl?cO* ht40`gTrI-5a|(6^suLdZqfGOVaDkgej&c%~e*=@>*7X1Y literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/StatusMove.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/StatusMove.class new file mode 100644 index 0000000000000000000000000000000000000000..0a924926bdd39f554a034dfcfb7a74b627300c0a GIT binary patch literal 1767 zcmbtVT~iZR7=BI?vYT}w5TppGpdxM(OrWK$Z7c%fN0dm~P+PUyF3SNHlI%{hafXZD zwU@o@bb8YZZ@6wpgX7l^=ufIn>-%m%P*-~4Wad44&Uv2aykF zlVp>M;Skaqnb8;4k+@HqcimSUt>iRnmb_?lxN$neYt#$QU71-k@0vRL zF~H_1n?W5Ha8bu4Tvm|RaRpZedKs53o7I(U$*bAbm6?WJUXnE(b0`RiA^y0gV;)6; zP==;oqNw029VIO2_!`$0e52!A+)!{+$1QxP<0OU!)T$%>z!copaR=Y)IKk_Yie0Bz zj|9|Z*L(6SV4ve6fmNH6CGwP0YgJn7)0Wk!nbyX8Rp_Qb=blt-)IC|D_Hr7YK+l}N zV>{U*WyqsENwbpU&Tw5>T@pBLv=Dw8=NH$goVnzlrPne`#Mkhx&3*CelB`=bdy%3) zXuK^Ju)=1JDFc9EOLDuW$3cC;{C4rHkSl=p44#((y>7%y{ zh=Rhz0NKMdJ4U0Ru`RU)@h5$dTVyqad>g?5TA}MjmfoB!oG%#feZ3?&jcPKiB%ZVclL zrSdXHP=tXWk-{%X<5y(RB+L_xlLg|4zCcJkM`5&g=pVFEKInnjPAeCaYqY0mTv^cH RON8I2|AS2tV8qur^%Aedp?ClQ literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Team.class b/sem3/task-custom-make/task/compiled/ru/ifmo/se/pokemon/Team.class new file mode 100644 index 0000000000000000000000000000000000000000..793e1173d5d2d0bc6c7e2f0671ff19eca4f82da7 GIT binary patch literal 1678 zcmaJ>TT>iG6#jZ|vn+#z4J1m)#RSc=NG3|WL=Xuv@wQyzViLR$Y-b&qomppkD6y>a zcf>#7OCB^O#F#3}Cm;Mvsj~cfX2LFz@GyPmbbsgeozwmAe}Dc3;1U`o3}e#3r4llj z?7<6oT`zC+;!V7z|1OtM!rNM%GBB-`cX}{`cMZ&z(1%IATq$Bs%d17aSHd-1*UI}P ze1H#&_(;o-wS$_0c>@aqIVJ6uz(8%?-n6YqIj(ghl98Me=&3tR&sI?&1+4w&)3qS7 zoI5Sw3Z>QdH)PBAtffRw&CuFNHw8uxgE9lpZZSeRiQw8^)2ge$@tSl}n07oz%?J!t z4jzx)r14e1LF4|KhIEO`n z!A>7o(}rx+oKTrKfe{lg;;exs6X$Wm#A%!{@d+kO)Uhlu{Oop^_!Nr<2*M{Zx26Y!KK*KoosuCqzTNVDsbr9I@PNa6w+DqqiQ zSJ3)as3b=`>qiVdlr+WhttHNw;-oQ2J!y8kEj^CRME9gU$>BgJQ_g6(2cHh^!OnN^ zC!RvoybMFTDMKd7`4M=zJBMfbWbmT$lVgFSF`IkqVx!u+N_`u(biJ6%Ypu50!Wq6O z!+dzMd~G;h5I9LKgH!xCT=73AjJ7GICrUt`hxN#~?PSpGPHiQ(>44cg*VV$c;ZlA%j~TYyAWQE%d^p978p=y3gQ( zJ3r9M_y>Jj?4bBFnpN%RA$kPF>43x`%;HZ{b;X$5a z2ZK8p>fjULu>=?&9@j2@W%Nv3;c!e$8w2=`S2JK`A#OtcPTS&Gp*j8{73lIbw5EkGj z=|`H>ZQ7=v>04hqlTN3ThfZ60CS=kn&9u{({)IktGX0o7^atdj<8!kmUjh8^Yf+I^)+Uho=($0dNq-m zN|DQf=^aY(-z_d}lz8f3B)U_aku1-ZG&E-xS4!E9<(X1tvN*HEm4Hf+o7d12$=oX5 zEykCMD+_UFy|TEnFc{tG>Y>Gz#r1OR(4uDmhBvKC6~ zDb+0v?K@>0;RDAh8k$|IDHYqMaB5{^dFZJkoa2}_I^~VZY-w~+`qUt^dqNr%#ASJu zuLSV}{7}RGr_6Z}SMj4DuA>k{7P%mPjCX^02`>k611|o4d`b0u24)9J)fS`sLzo}K zcs$-Gg8`q)-vOO(AkZBi0J&hfSYBYKW!d$#%wz26L(A>%z9>Is>B1AZ@G*w2J*xqGJe%g;XP zmJ)obX)ozpug>0bPjBR4qqjH>JFh}*V zVB<-_y$t3w*Mgs|WwyHQ2TzJVg*Q>cd@Z^{>K1t%Z%)SsjIgoQZ|eR2kUwO;hj7>k z`TGU}k?wF{6T#c*dwv%FuZU>r7TyYzpI7PKK^rPKO6$Z0*FQ&ZXcC+$&ly}0ml^0juNqdj-dX?8_w zMR3pZ9&SrHB0`&06Tuw;S0`6SHjIRnT3!&DvOs2_AZ$7FkS~LJneDL-wR=jrw@b_! zkC2t5)Rz~#a*?CQuKu2`?TMs4lBm;D(QOeAGm)ArZ^I?Y z8Rv$i5OI!pnYqlm+hy5XV)ZKGo9opo8dqAFrM8}-OF3%PpoBKa9_UoPwCfta_TCd6~<>J-8vYES*e zoEMT-)jZ)I#>eZs=}s#fLJcT|H%8uBmPvt+2}hpo_3m;tpqP&~(5;?N&O_xs{~7-y zPV!4Xh*#018EDkr!Jzh23~3+XthR-7+JAALKaRt`J|ukoxZs;X(pScaZw)EmA290s z6UKB6 + + + + +All Classes + + + + + +

All Classes

+ + + diff --git a/sem3/task-custom-make/task/doc/allclasses-noframe.html b/sem3/task-custom-make/task/doc/allclasses-noframe.html new file mode 100644 index 0000000..38f65cd --- /dev/null +++ b/sem3/task-custom-make/task/doc/allclasses-noframe.html @@ -0,0 +1,35 @@ + + + + + +All Classes + + + + + +

All Classes

+ + + diff --git a/sem3/task-custom-make/task/doc/constant-values.html b/sem3/task-custom-make/task/doc/constant-values.html new file mode 100644 index 0000000..914a42b --- /dev/null +++ b/sem3/task-custom-make/task/doc/constant-values.html @@ -0,0 +1,498 @@ + + + + + +Constant Field Values + + + + + + + + + + + +
+

Constant Field Values

+

Contents

+ +
+
+ + +

ru.erius.*

+
    +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ru.erius.lab2.pokemon.Blaziken 
    Modifier and TypeConstant FieldValue
    + +protected static final doubleATTACK85.0
    + +protected static final doubleDEFENSE60.0
    + +protected static final doubleHP60.0
    + +protected static final java.lang.StringNAME"Blaziken"
    + +protected static final doubleSP_ATK85.0
    + +protected static final doubleSP_DEF60.0
    + +protected static final doubleSPEED55.0
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ru.erius.lab2.pokemon.Combusken 
    Modifier and TypeConstant FieldValue
    + +protected static final doubleATTACK85.0
    + +protected static final doubleDEFENSE60.0
    + +protected static final doubleHP60.0
    + +protected static final java.lang.StringNAME"Combusken"
    + +protected static final doubleSP_ATK85.0
    + +protected static final doubleSP_DEF60.0
    + +protected static final doubleSPEED55.0
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ru.erius.lab2.pokemon.Comfey 
    Modifier and TypeConstant FieldValue
    + +protected static final doubleATTACK52.0
    + +protected static final doubleDEFENSE90.0
    + +protected static final doubleHP51.0
    + +protected static final java.lang.StringNAME"Comfey"
    + +protected static final doubleSP_ATK82.0
    + +protected static final doubleSP_DEF110.0
    + +protected static final doubleSPEED100.0
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ru.erius.lab2.pokemon.Gligar 
    Modifier and TypeConstant FieldValue
    + +protected static final doubleATTACK75.0
    + +protected static final doubleDEFENSE105.0
    + +protected static final doubleHP65.0
    + +protected static final java.lang.StringNAME"Gligar"
    + +protected static final doubleSP_ATK35.0
    + +protected static final doubleSP_DEF65.0
    + +protected static final doubleSPEED85.0
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ru.erius.lab2.pokemon.Gliscor 
    Modifier and TypeConstant FieldValue
    + +protected static final doubleATTACK95.0
    + +protected static final doubleDEFENSE125.0
    + +protected static final doubleHP75.0
    + +protected static final java.lang.StringNAME"Gliscor"
    + +protected static final doubleSP_ATK45.0
    + +protected static final doubleSP_DEF75.0
    + +protected static final doubleSPEED95.0
    +
  • +
  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ru.erius.lab2.pokemon.Torchic 
    Modifier and TypeConstant FieldValue
    + +protected static final doubleATTACK60.0
    + +protected static final doubleDEFENSE40.0
    + +protected static final doubleHP45.0
    + +protected static final java.lang.StringNAME"Torchic"
    + +protected static final doubleSP_ATK70.0
    + +protected static final doubleSP_DEF50.0
    + +protected static final doubleSPEED45.0
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/deprecated-list.html b/sem3/task-custom-make/task/doc/deprecated-list.html new file mode 100644 index 0000000..230c4aa --- /dev/null +++ b/sem3/task-custom-make/task/doc/deprecated-list.html @@ -0,0 +1,122 @@ + + + + + +Deprecated List + + + + + + + + +
+ + + + + + + +
+ + +
+

Deprecated API

+

Contents

+
+ +
+ + + + + + + +
+ + + + diff --git a/sem3/task-custom-make/task/doc/help-doc.html b/sem3/task-custom-make/task/doc/help-doc.html new file mode 100644 index 0000000..b1af912 --- /dev/null +++ b/sem3/task-custom-make/task/doc/help-doc.html @@ -0,0 +1,223 @@ + + + + + +API Help + + + + + + + + +
+ + + + + + + +
+ + +
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+
    +
  • +

    Overview

    +

    The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

    +
  • +
  • +

    Package

    +

    Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

    +
      +
    • Interfaces (italic)
    • +
    • Classes
    • +
    • Enums
    • +
    • Exceptions
    • +
    • Errors
    • +
    • Annotation Types
    • +
    +
  • +
  • +

    Class/Interface

    +

    Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
      +
    • Class inheritance diagram
    • +
    • Direct Subclasses
    • +
    • All Known Subinterfaces
    • +
    • All Known Implementing Classes
    • +
    • Class/interface declaration
    • +
    • Class/interface description
    • +
    +
      +
    • Nested Class Summary
    • +
    • Field Summary
    • +
    • Constructor Summary
    • +
    • Method Summary
    • +
    +
      +
    • Field Detail
    • +
    • Constructor Detail
    • +
    • Method Detail
    • +
    +

    Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    +
  • +
  • +

    Annotation Type

    +

    Each annotation type has its own separate page with the following sections:

    +
      +
    • Annotation Type declaration
    • +
    • Annotation Type description
    • +
    • Required Element Summary
    • +
    • Optional Element Summary
    • +
    • Element Detail
    • +
    +
  • +
  • +

    Enum

    +

    Each enum has its own separate page with the following sections:

    +
      +
    • Enum declaration
    • +
    • Enum description
    • +
    • Enum Constant Summary
    • +
    • Enum Constant Detail
    • +
    +
  • +
  • +

    Tree (Class Hierarchy)

    +

    There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

    +
      +
    • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
    • +
    • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
    • +
    +
  • +
  • +

    Deprecated API

    +

    The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

    +
  • +
  • +

    Index

    +

    The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

    +
  • +
  • +

    Prev/Next

    +

    These links take you to the next or previous class, interface, package, or related page.

    +
  • +
  • +

    Frames/No Frames

    +

    These links show and hide the HTML frames. All pages are available with or without frames.

    +
  • +
  • +

    All Classes

    +

    The All Classes link shows all classes and interfaces except non-static nested types.

    +
  • +
  • +

    Serialized Form

    +

    Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

    +
  • +
  • +

    Constant Field Values

    +

    The Constant Field Values page lists the static final fields and their values.

    +
  • +
+This help file applies to API documentation generated using the standard doclet.
+ +
+ + + + + + + +
+ + + + diff --git a/sem3/task-custom-make/task/doc/index-all.html b/sem3/task-custom-make/task/doc/index-all.html new file mode 100644 index 0000000..7394bcf --- /dev/null +++ b/sem3/task-custom-make/task/doc/index-all.html @@ -0,0 +1,449 @@ + + + + + +Index + + + + + + + + +
+ + + + + + + +
+ + +
A B C D F G H L M N R S T  + + +

A

+
+
AirSlash - Class in ru.erius.lab2.move.special
+
 
+
AirSlash() - Constructor for class ru.erius.lab2.move.special.AirSlash
+
 
+
applyOppEffects(Pokemon) - Method in class ru.erius.lab2.move.physical.Bulldoze
+
 
+
applyOppEffects(Pokemon) - Method in class ru.erius.lab2.move.special.AirSlash
+
 
+
applyOppEffects(Pokemon) - Method in class ru.erius.lab2.move.status.Confide
+
 
+
applyOppEffects(Pokemon) - Method in class ru.erius.lab2.move.status.Leer
+
 
+
applyOppEffects(Pokemon) - Method in class ru.erius.lab2.move.status.Supersonic
+
 
+
applyOppEffects(Pokemon) - Method in class ru.erius.lab2.move.status.Swagger
+
 
+
applySelfEffects(Pokemon) - Method in class ru.erius.lab2.move.status.AquaRing
+
 
+
applySelfEffects(Pokemon) - Method in class ru.erius.lab2.move.status.DoubleTeam
+
 
+
applySelfEffects(Pokemon) - Method in class ru.erius.lab2.move.status.Rest
+
 
+
AquaRing - Class in ru.erius.lab2.move.status
+
 
+
AquaRing() - Constructor for class ru.erius.lab2.move.status.AquaRing
+
 
+
ATTACK - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
ATTACK - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
ATTACK - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
ATTACK - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
ATTACK - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
ATTACK - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
+ + + +

B

+
+
Blaziken - Class in ru.erius.lab2.pokemon
+
 
+
Blaziken(String, int) - Constructor for class ru.erius.lab2.pokemon.Blaziken
+
 
+
Blaziken(int) - Constructor for class ru.erius.lab2.pokemon.Blaziken
+
 
+
Blaziken() - Constructor for class ru.erius.lab2.pokemon.Blaziken
+
 
+
Bulldoze - Class in ru.erius.lab2.move.physical
+
 
+
Bulldoze() - Constructor for class ru.erius.lab2.move.physical.Bulldoze
+
 
+
+ + + +

C

+
+
calcBaseDamage(Pokemon, Pokemon) - Method in class ru.erius.lab2.move.physical.Facade
+
 
+
Combusken - Class in ru.erius.lab2.pokemon
+
 
+
Combusken(String, int) - Constructor for class ru.erius.lab2.pokemon.Combusken
+
 
+
Combusken(int) - Constructor for class ru.erius.lab2.pokemon.Combusken
+
 
+
Combusken() - Constructor for class ru.erius.lab2.pokemon.Combusken
+
 
+
Comfey - Class in ru.erius.lab2.pokemon
+
 
+
Comfey(String, int) - Constructor for class ru.erius.lab2.pokemon.Comfey
+
 
+
Comfey(int) - Constructor for class ru.erius.lab2.pokemon.Comfey
+
 
+
Comfey() - Constructor for class ru.erius.lab2.pokemon.Comfey
+
 
+
Confide - Class in ru.erius.lab2.move.status
+
 
+
Confide() - Constructor for class ru.erius.lab2.move.status.Confide
+
 
+
+ + + +

D

+
+
DEFENSE - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
DEFENSE - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
DEFENSE - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
DEFENSE - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
DEFENSE - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
DEFENSE - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
describe() - Method in class ru.erius.lab2.move.physical.Bulldoze
+
 
+
describe() - Method in class ru.erius.lab2.move.physical.Facade
+
 
+
describe() - Method in class ru.erius.lab2.move.special.AirSlash
+
 
+
describe() - Method in class ru.erius.lab2.move.status.AquaRing
+
 
+
describe() - Method in class ru.erius.lab2.move.status.Confide
+
 
+
describe() - Method in class ru.erius.lab2.move.status.DoubleTeam
+
 
+
describe() - Method in class ru.erius.lab2.move.status.Leer
+
 
+
describe() - Method in class ru.erius.lab2.move.status.Rest
+
 
+
describe() - Method in class ru.erius.lab2.move.status.Supersonic
+
 
+
describe() - Method in class ru.erius.lab2.move.status.Swagger
+
 
+
DoubleTeam - Class in ru.erius.lab2.move.status
+
 
+
DoubleTeam() - Constructor for class ru.erius.lab2.move.status.DoubleTeam
+
 
+
+ + + +

F

+
+
Facade - Class in ru.erius.lab2.move.physical
+
 
+
Facade() - Constructor for class ru.erius.lab2.move.physical.Facade
+
 
+
+ + + +

G

+
+
Gligar - Class in ru.erius.lab2.pokemon
+
 
+
Gligar(String, int) - Constructor for class ru.erius.lab2.pokemon.Gligar
+
 
+
Gligar(int) - Constructor for class ru.erius.lab2.pokemon.Gligar
+
 
+
Gligar() - Constructor for class ru.erius.lab2.pokemon.Gligar
+
 
+
Gliscor - Class in ru.erius.lab2.pokemon
+
 
+
Gliscor(String, int) - Constructor for class ru.erius.lab2.pokemon.Gliscor
+
 
+
Gliscor(int) - Constructor for class ru.erius.lab2.pokemon.Gliscor
+
 
+
Gliscor() - Constructor for class ru.erius.lab2.pokemon.Gliscor
+
 
+
+ + + +

H

+
+
HP - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
HP - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
HP - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
HP - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
HP - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
HP - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
+ + + +

L

+
+
Lab2 - Class in ru.erius.lab2
+
 
+
Lab2() - Constructor for class ru.erius.lab2.Lab2
+
 
+
Leer - Class in ru.erius.lab2.move.status
+
 
+
Leer() - Constructor for class ru.erius.lab2.move.status.Leer
+
 
+
+ + + +

M

+
+
main(String[]) - Static method in class ru.erius.lab2.Lab2
+
 
+
MOVES - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
MOVES - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
MOVES - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
MOVES - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
MOVES - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
MOVES - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
+ + + +

N

+
+
NAME - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
NAME - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
NAME - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
NAME - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
NAME - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
NAME - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
+ + + +

R

+
+
Rest - Class in ru.erius.lab2.move.status
+
 
+
Rest() - Constructor for class ru.erius.lab2.move.status.Rest
+
 
+
ru.erius.lab2 - package ru.erius.lab2
+
 
+
ru.erius.lab2.move.physical - package ru.erius.lab2.move.physical
+
 
+
ru.erius.lab2.move.special - package ru.erius.lab2.move.special
+
 
+
ru.erius.lab2.move.status - package ru.erius.lab2.move.status
+
 
+
ru.erius.lab2.pokemon - package ru.erius.lab2.pokemon
+
 
+
+ + + +

S

+
+
SP_ATK - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
SP_ATK - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
SP_ATK - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
SP_ATK - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
SP_ATK - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
SP_ATK - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
SP_DEF - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
SP_DEF - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
SP_DEF - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
SP_DEF - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
SP_DEF - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
SP_DEF - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
SPEED - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
SPEED - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
SPEED - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
SPEED - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
SPEED - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
SPEED - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
Supersonic - Class in ru.erius.lab2.move.status
+
 
+
Supersonic() - Constructor for class ru.erius.lab2.move.status.Supersonic
+
 
+
Swagger - Class in ru.erius.lab2.move.status
+
 
+
Swagger() - Constructor for class ru.erius.lab2.move.status.Swagger
+
 
+
+ + + +

T

+
+
Torchic - Class in ru.erius.lab2.pokemon
+
 
+
Torchic(String, int) - Constructor for class ru.erius.lab2.pokemon.Torchic
+
 
+
Torchic(int) - Constructor for class ru.erius.lab2.pokemon.Torchic
+
 
+
Torchic() - Constructor for class ru.erius.lab2.pokemon.Torchic
+
 
+
TYPES - Static variable in class ru.erius.lab2.pokemon.Blaziken
+
 
+
TYPES - Static variable in class ru.erius.lab2.pokemon.Combusken
+
 
+
TYPES - Static variable in class ru.erius.lab2.pokemon.Comfey
+
 
+
TYPES - Static variable in class ru.erius.lab2.pokemon.Gligar
+
 
+
TYPES - Static variable in class ru.erius.lab2.pokemon.Gliscor
+
 
+
TYPES - Static variable in class ru.erius.lab2.pokemon.Torchic
+
 
+
+A B C D F G H L M N R S T 
+ +
+ + + + + + + +
+ + + + diff --git a/sem3/task-custom-make/task/doc/index.html b/sem3/task-custom-make/task/doc/index.html new file mode 100644 index 0000000..b38fa86 --- /dev/null +++ b/sem3/task-custom-make/task/doc/index.html @@ -0,0 +1,74 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> + + + diff --git a/sem3/task-custom-make/task/doc/overview-frame.html b/sem3/task-custom-make/task/doc/overview-frame.html new file mode 100644 index 0000000..ebe992d --- /dev/null +++ b/sem3/task-custom-make/task/doc/overview-frame.html @@ -0,0 +1,25 @@ + + + + + +Overview List + + + + + + + +

 

+ + diff --git a/sem3/task-custom-make/task/doc/overview-summary.html b/sem3/task-custom-make/task/doc/overview-summary.html new file mode 100644 index 0000000..47dc3ed --- /dev/null +++ b/sem3/task-custom-make/task/doc/overview-summary.html @@ -0,0 +1,149 @@ + + + + + +Overview + + + + + + + + +
+ + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Packages 
PackageDescription
ru.erius.lab2 
ru.erius.lab2.move.physical 
ru.erius.lab2.move.special 
ru.erius.lab2.move.status 
ru.erius.lab2.pokemon 
+
+ +
+ + + + + + + +
+ + + + diff --git a/sem3/task-custom-make/task/doc/overview-tree.html b/sem3/task-custom-make/task/doc/overview-tree.html new file mode 100644 index 0000000..2527ea8 --- /dev/null +++ b/sem3/task-custom-make/task/doc/overview-tree.html @@ -0,0 +1,216 @@ + + + + + +Class Hierarchy + + + + + + + + +
+ + + + + + + +
+ + + +
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • ru.erius.lab2.Lab2
    • +
    • PhysicalMove +
        +
      • ru.erius.lab2.move.physical.Bulldoze
      • +
      +
    • +
    • PhysicalMove +
        +
      • ru.erius.lab2.move.physical.Facade
      • +
      +
    • +
    • Pokemon +
        +
      • ru.erius.lab2.pokemon.Comfey
      • +
      +
    • +
    • Pokemon +
        +
      • ru.erius.lab2.pokemon.Gligar + +
      • +
      +
    • +
    • Pokemon + +
    • +
    • SpecialMove + +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Swagger
      • +
      +
    • +
    • StatusMove + +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Confide
      • +
      +
    • +
    • StatusMove + +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Rest
      • +
      +
    • +
    • StatusMove + +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Leer
      • +
      +
    • +
    +
  • +
+
+ +
+ + + + + + + +
+ + + + diff --git a/sem3/task-custom-make/task/doc/package-list b/sem3/task-custom-make/task/doc/package-list new file mode 100644 index 0000000..1cf5d09 --- /dev/null +++ b/sem3/task-custom-make/task/doc/package-list @@ -0,0 +1,5 @@ +ru.erius.lab2 +ru.erius.lab2.move.physical +ru.erius.lab2.move.special +ru.erius.lab2.move.status +ru.erius.lab2.pokemon diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/Lab2.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/Lab2.html new file mode 100644 index 0000000..a0161be --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/Lab2.html @@ -0,0 +1,269 @@ + + + + + +Lab2 + + + + + + + + + + + + +
+
ru.erius.lab2
+

Class Lab2

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • ru.erius.lab2.Lab2
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Lab2
    +extends java.lang.Object
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Lab2() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + +
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static voidmain(java.lang.String[] args) 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Lab2

        +
        public Lab2()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        main

        +
        public static void main(java.lang.String[] args)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Bulldoze.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Bulldoze.html new file mode 100644 index 0000000..01ceaf9 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Bulldoze.html @@ -0,0 +1,287 @@ + + + + + +Bulldoze + + + + + + + + + + + + +
+
ru.erius.lab2.move.physical
+

Class Bulldoze

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • PhysicalMove
    • +
    • +
        +
      • ru.erius.lab2.move.physical.Bulldoze
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Bulldoze
    +extends PhysicalMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Bulldoze() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplyOppEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Bulldoze

        +
        public Bulldoze()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applyOppEffects

        +
        protected void applyOppEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Facade.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Facade.html new file mode 100644 index 0000000..39d17f4 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/Facade.html @@ -0,0 +1,289 @@ + + + + + +Facade + + + + + + + + + + + + +
+
ru.erius.lab2.move.physical
+

Class Facade

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • PhysicalMove
    • +
    • +
        +
      • ru.erius.lab2.move.physical.Facade
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Facade
    +extends PhysicalMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Facade() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected doublecalcBaseDamage(Pokemon pokemon, + Pokemon pokemon1) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Facade

        +
        public Facade()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        calcBaseDamage

        +
        protected double calcBaseDamage(Pokemon pokemon,
        +                                Pokemon pokemon1)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-frame.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-frame.html new file mode 100644 index 0000000..378d3d7 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-frame.html @@ -0,0 +1,21 @@ + + + + + +ru.erius.lab2.move.physical + + + + + +

ru.erius.lab2.move.physical

+
+

Classes

+ +
+ + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-summary.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-summary.html new file mode 100644 index 0000000..04960dc --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-summary.html @@ -0,0 +1,144 @@ + + + + + +ru.erius.lab2.move.physical + + + + + + + + + + + +
+

Package ru.erius.lab2.move.physical

+
+
+
    +
  • + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    Bulldoze 
    Facade 
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-tree.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-tree.html new file mode 100644 index 0000000..5aafe07 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/physical/package-tree.html @@ -0,0 +1,144 @@ + + + + + +ru.erius.lab2.move.physical Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package ru.erius.lab2.move.physical

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • PhysicalMove +
        +
      • ru.erius.lab2.move.physical.Facade
      • +
      +
    • +
    • PhysicalMove +
        +
      • ru.erius.lab2.move.physical.Bulldoze
      • +
      +
    • +
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/AirSlash.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/AirSlash.html new file mode 100644 index 0000000..2466798 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/AirSlash.html @@ -0,0 +1,287 @@ + + + + + +AirSlash + + + + + + + + + + + + +
+
ru.erius.lab2.move.special
+

Class AirSlash

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • SpecialMove
    • +
    • +
        +
      • ru.erius.lab2.move.special.AirSlash
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class AirSlash
    +extends SpecialMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      AirSlash() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplyOppEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        AirSlash

        +
        public AirSlash()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applyOppEffects

        +
        protected void applyOppEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-frame.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-frame.html new file mode 100644 index 0000000..6fb1523 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-frame.html @@ -0,0 +1,20 @@ + + + + + +ru.erius.lab2.move.special + + + + + +

ru.erius.lab2.move.special

+
+

Classes

+ +
+ + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-summary.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-summary.html new file mode 100644 index 0000000..9b2af21 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-summary.html @@ -0,0 +1,140 @@ + + + + + +ru.erius.lab2.move.special + + + + + + + + + + + +
+

Package ru.erius.lab2.move.special

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    AirSlash 
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-tree.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-tree.html new file mode 100644 index 0000000..9dff216 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/special/package-tree.html @@ -0,0 +1,139 @@ + + + + + +ru.erius.lab2.move.special Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package ru.erius.lab2.move.special

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • SpecialMove + +
    • +
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/AquaRing.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/AquaRing.html new file mode 100644 index 0000000..715c568 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/AquaRing.html @@ -0,0 +1,287 @@ + + + + + +AquaRing + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class AquaRing

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.AquaRing
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class AquaRing
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      AquaRing() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplySelfEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        AquaRing

        +
        public AquaRing()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applySelfEffects

        +
        protected void applySelfEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Confide.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Confide.html new file mode 100644 index 0000000..a11f926 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Confide.html @@ -0,0 +1,287 @@ + + + + + +Confide + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class Confide

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.Confide
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Confide
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Confide() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplyOppEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Confide

        +
        public Confide()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applyOppEffects

        +
        protected void applyOppEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/DoubleTeam.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/DoubleTeam.html new file mode 100644 index 0000000..9c858da --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/DoubleTeam.html @@ -0,0 +1,287 @@ + + + + + +DoubleTeam + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class DoubleTeam

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.DoubleTeam
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class DoubleTeam
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      DoubleTeam() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplySelfEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        DoubleTeam

        +
        public DoubleTeam()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applySelfEffects

        +
        protected void applySelfEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Leer.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Leer.html new file mode 100644 index 0000000..8d38fbc --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Leer.html @@ -0,0 +1,287 @@ + + + + + +Leer + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class Leer

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.Leer
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Leer
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Leer() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplyOppEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Leer

        +
        public Leer()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applyOppEffects

        +
        protected void applyOppEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Rest.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Rest.html new file mode 100644 index 0000000..93dc3da --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Rest.html @@ -0,0 +1,287 @@ + + + + + +Rest + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class Rest

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.Rest
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Rest
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Rest() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplySelfEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Rest

        +
        public Rest()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applySelfEffects

        +
        protected void applySelfEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Supersonic.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Supersonic.html new file mode 100644 index 0000000..8852f4f --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Supersonic.html @@ -0,0 +1,287 @@ + + + + + +Supersonic + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class Supersonic

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.Supersonic
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Supersonic
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Supersonic() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplyOppEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Supersonic

        +
        public Supersonic()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applyOppEffects

        +
        protected void applyOppEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Swagger.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Swagger.html new file mode 100644 index 0000000..bc03bdd --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/Swagger.html @@ -0,0 +1,287 @@ + + + + + +Swagger + + + + + + + + + + + + +
+
ru.erius.lab2.move.status
+

Class Swagger

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • StatusMove
    • +
    • +
        +
      • ru.erius.lab2.move.status.Swagger
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Swagger
    +extends StatusMove
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + +
      Constructors 
      Constructor and Description
      Swagger() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      protected voidapplyOppEffects(Pokemon pokemon) 
      protected java.lang.Stringdescribe() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Swagger

        +
        public Swagger()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        describe

        +
        protected java.lang.String describe()
        +
      • +
      + + + +
        +
      • +

        applyOppEffects

        +
        protected void applyOppEffects(Pokemon pokemon)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-frame.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-frame.html new file mode 100644 index 0000000..78e77a5 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-frame.html @@ -0,0 +1,26 @@ + + + + + +ru.erius.lab2.move.status + + + + + +

ru.erius.lab2.move.status

+ + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-summary.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-summary.html new file mode 100644 index 0000000..e2acffc --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-summary.html @@ -0,0 +1,164 @@ + + + + + +ru.erius.lab2.move.status + + + + + + + + + + + +
+

Package ru.erius.lab2.move.status

+
+
+ +
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-tree.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-tree.html new file mode 100644 index 0000000..fab8588 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/move/status/package-tree.html @@ -0,0 +1,169 @@ + + + + + +ru.erius.lab2.move.status Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package ru.erius.lab2.move.status

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Confide
      • +
      +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Swagger
      • +
      +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Leer
      • +
      +
    • +
    • StatusMove + +
    • +
    • StatusMove + +
    • +
    • StatusMove + +
    • +
    • StatusMove +
        +
      • ru.erius.lab2.move.status.Rest
      • +
      +
    • +
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/package-frame.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/package-frame.html new file mode 100644 index 0000000..92a32e0 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/package-frame.html @@ -0,0 +1,20 @@ + + + + + +ru.erius.lab2 + + + + + +

ru.erius.lab2

+
+

Classes

+ +
+ + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/package-summary.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/package-summary.html new file mode 100644 index 0000000..292b0b2 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/package-summary.html @@ -0,0 +1,140 @@ + + + + + +ru.erius.lab2 + + + + + + + + + + + +
+

Package ru.erius.lab2

+
+
+
    +
  • + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    Lab2 
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/package-tree.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/package-tree.html new file mode 100644 index 0000000..da653bb --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/package-tree.html @@ -0,0 +1,135 @@ + + + + + +ru.erius.lab2 Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package ru.erius.lab2

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • ru.erius.lab2.Lab2
    • +
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Blaziken.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Blaziken.html new file mode 100644 index 0000000..7f3c6e8 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Blaziken.html @@ -0,0 +1,444 @@ + + + + + +Blaziken + + + + + + + + + + + + +
+
ru.erius.lab2.pokemon
+

Class Blaziken

+
+
+ +
+
    +
  • +
    +
    +
    public class Blaziken
    +extends Combusken
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected static doubleATTACK 
      protected static doubleDEFENSE 
      protected static doubleHP 
      protected static java.util.List<Move>MOVES 
      protected static java.lang.StringNAME 
      protected static doubleSP_ATK 
      protected static doubleSP_DEF 
      protected static doubleSPEED 
      protected static java.util.List<Type>TYPES 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      Constructor and Description
      Blaziken() 
      Blaziken(int lvl) 
      Blaziken(java.lang.String name, + int lvl) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Blaziken

        +
        public Blaziken(java.lang.String name,
        +                int lvl)
        +
      • +
      + + + +
        +
      • +

        Blaziken

        +
        public Blaziken(int lvl)
        +
      • +
      + + + +
        +
      • +

        Blaziken

        +
        public Blaziken()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Combusken.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Combusken.html new file mode 100644 index 0000000..770b80f --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Combusken.html @@ -0,0 +1,443 @@ + + + + + +Combusken + + + + + + + + + + + + +
+
ru.erius.lab2.pokemon
+

Class Combusken

+
+
+ +
+
    +
  • +
    +
    Direct Known Subclasses:
    +
    Blaziken
    +
    +
    +
    +
    public class Combusken
    +extends Torchic
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected static doubleATTACK 
      protected static doubleDEFENSE 
      protected static doubleHP 
      protected static java.util.List<Move>MOVES 
      protected static java.lang.StringNAME 
      protected static doubleSP_ATK 
      protected static doubleSP_DEF 
      protected static doubleSPEED 
      protected static java.util.List<Type>TYPES 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      Constructor and Description
      Combusken() 
      Combusken(int lvl) 
      Combusken(java.lang.String name, + int lvl) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Combusken

        +
        public Combusken(java.lang.String name,
        +                 int lvl)
        +
      • +
      + + + +
        +
      • +

        Combusken

        +
        public Combusken(int lvl)
        +
      • +
      + + + +
        +
      • +

        Combusken

        +
        public Combusken()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Comfey.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Comfey.html new file mode 100644 index 0000000..b40e93a --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Comfey.html @@ -0,0 +1,434 @@ + + + + + +Comfey + + + + + + + + + + + + +
+
ru.erius.lab2.pokemon
+

Class Comfey

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • Pokemon
    • +
    • +
        +
      • ru.erius.lab2.pokemon.Comfey
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class Comfey
    +extends Pokemon
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected static doubleATTACK 
      protected static doubleDEFENSE 
      protected static doubleHP 
      protected static java.util.List<Move>MOVES 
      protected static java.lang.StringNAME 
      protected static doubleSP_ATK 
      protected static doubleSP_DEF 
      protected static doubleSPEED 
      protected static java.util.List<Type>TYPES 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      Constructor and Description
      Comfey() 
      Comfey(int lvl) 
      Comfey(java.lang.String name, + int lvl) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Comfey

        +
        public Comfey(java.lang.String name,
        +              int lvl)
        +
      • +
      + + + +
        +
      • +

        Comfey

        +
        public Comfey(int lvl)
        +
      • +
      + + + +
        +
      • +

        Comfey

        +
        public Comfey()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gligar.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gligar.html new file mode 100644 index 0000000..d11cde6 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gligar.html @@ -0,0 +1,438 @@ + + + + + +Gligar + + + + + + + + + + + + +
+
ru.erius.lab2.pokemon
+

Class Gligar

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • Pokemon
    • +
    • +
        +
      • ru.erius.lab2.pokemon.Gligar
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    Direct Known Subclasses:
    +
    Gliscor
    +
    +
    +
    +
    public class Gligar
    +extends Pokemon
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected static doubleATTACK 
      protected static doubleDEFENSE 
      protected static doubleHP 
      protected static java.util.List<Move>MOVES 
      protected static java.lang.StringNAME 
      protected static doubleSP_ATK 
      protected static doubleSP_DEF 
      protected static doubleSPEED 
      protected static java.util.List<Type>TYPES 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      Constructor and Description
      Gligar() 
      Gligar(int lvl) 
      Gligar(java.lang.String name, + int lvl) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Gligar

        +
        public Gligar(java.lang.String name,
        +              int lvl)
        +
      • +
      + + + +
        +
      • +

        Gligar

        +
        public Gligar(int lvl)
        +
      • +
      + + + +
        +
      • +

        Gligar

        +
        public Gligar()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gliscor.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gliscor.html new file mode 100644 index 0000000..13f9db3 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Gliscor.html @@ -0,0 +1,439 @@ + + + + + +Gliscor + + + + + + + + + + + + +
+
ru.erius.lab2.pokemon
+

Class Gliscor

+
+
+ +
+
    +
  • +
    +
    +
    public class Gliscor
    +extends Gligar
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected static doubleATTACK 
      protected static doubleDEFENSE 
      protected static doubleHP 
      protected static java.util.List<Move>MOVES 
      protected static java.lang.StringNAME 
      protected static doubleSP_ATK 
      protected static doubleSP_DEF 
      protected static doubleSPEED 
      protected static java.util.List<Type>TYPES 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      Constructor and Description
      Gliscor() 
      Gliscor(int lvl) 
      Gliscor(java.lang.String name, + int lvl) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Gliscor

        +
        public Gliscor(java.lang.String name,
        +               int lvl)
        +
      • +
      + + + +
        +
      • +

        Gliscor

        +
        public Gliscor(int lvl)
        +
      • +
      + + + +
        +
      • +

        Gliscor

        +
        public Gliscor()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Torchic.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Torchic.html new file mode 100644 index 0000000..5d937a3 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/Torchic.html @@ -0,0 +1,438 @@ + + + + + +Torchic + + + + + + + + + + + + +
+
ru.erius.lab2.pokemon
+

Class Torchic

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • Pokemon
    • +
    • +
        +
      • ru.erius.lab2.pokemon.Torchic
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    Direct Known Subclasses:
    +
    Combusken
    +
    +
    +
    +
    public class Torchic
    +extends Pokemon
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Field Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Fields 
      Modifier and TypeField and Description
      protected static doubleATTACK 
      protected static doubleDEFENSE 
      protected static doubleHP 
      protected static java.util.List<Move>MOVES 
      protected static java.lang.StringNAME 
      protected static doubleSP_ATK 
      protected static doubleSP_DEF 
      protected static doubleSPEED 
      protected static java.util.List<Type>TYPES 
      +
    • +
    + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + +
      Constructors 
      Constructor and Description
      Torchic() 
      Torchic(int lvl) 
      Torchic(java.lang.String name, + int lvl) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + + + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        Torchic

        +
        public Torchic(java.lang.String name,
        +               int lvl)
        +
      • +
      + + + +
        +
      • +

        Torchic

        +
        public Torchic(int lvl)
        +
      • +
      + + + +
        +
      • +

        Torchic

        +
        public Torchic()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-frame.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-frame.html new file mode 100644 index 0000000..3639df1 --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-frame.html @@ -0,0 +1,25 @@ + + + + + +ru.erius.lab2.pokemon + + + + + +

ru.erius.lab2.pokemon

+ + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-summary.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-summary.html new file mode 100644 index 0000000..4c43b1b --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-summary.html @@ -0,0 +1,160 @@ + + + + + +ru.erius.lab2.pokemon + + + + + + + + + + + +
+

Package ru.erius.lab2.pokemon

+
+
+ +
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-tree.html b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-tree.html new file mode 100644 index 0000000..6f0da0b --- /dev/null +++ b/sem3/task-custom-make/task/doc/ru/erius/lab2/pokemon/package-tree.html @@ -0,0 +1,161 @@ + + + + + +ru.erius.lab2.pokemon Class Hierarchy + + + + + + + + + + + +
+

Hierarchy For Package ru.erius.lab2.pokemon

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • Pokemon + +
    • +
    • Pokemon +
        +
      • ru.erius.lab2.pokemon.Gligar + +
      • +
      +
    • +
    • Pokemon +
        +
      • ru.erius.lab2.pokemon.Comfey
      • +
      +
    • +
    +
  • +
+
+ + + + + + diff --git a/sem3/task-custom-make/task/doc/script.js b/sem3/task-custom-make/task/doc/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/sem3/task-custom-make/task/doc/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/sem3/task-custom-make/task/doc/stylesheet.css b/sem3/task-custom-make/task/doc/stylesheet.css new file mode 100644 index 0000000..98055b2 --- /dev/null +++ b/sem3/task-custom-make/task/doc/stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/sem3/task-custom-make/task/fatJar/.makefile.swp b/sem3/task-custom-make/task/fatJar/.makefile.swp new file mode 100644 index 0000000000000000000000000000000000000000..a4f0ee5e5c28a0acdc82a9828193391c5784f49b GIT binary patch literal 12288 zcmeI&%Wl&^6b9haN-QeGtvmn&1c@MxCv6v0RwK1IE+kEAQ^%E9p{XxXiCssI%VotH zUWTVYLP)Tr4*|~r96OE#m0C7zK)$b5Fb~GzAtVB-$vI+ zUL=Y}Szb>6>FC(r&d_mX|Gv{}?R3s8SLsoq0_9Jme5%UkYTvW6FjA95PNP(D)>Nv; z(bGat$Ex~>bUU43CT#n-0;9TJR;2tNOFPx8@vgZd5 z4hTR10uX=z1Rwwb2tWV=5P-m65zt9ulHopbcAuDnFNl_&>0HPlPDNu=G&Y2^MB}dI z4BT$t?lk%Q;hy8WOcXxMp4esvl?(XjH?oO}(!O0`tecnB{?>+s-_&yl? zwW`)wd#|clb5_+4S&7deD4!r8AU<^(3o3p3w;#w)AfKd!6#1ydq=jkU$3A`f{7F^< z9OAbH@Ly)K|Ir!c!{YxsOYupI2@5GG(nty4N==MQN>J0x!b(t6OifJJ%hN3|?i||F zh)Yq4NzFQyfk3LBU<_cT1ISH5P>hm*22nG_86D)A+*&xpFghJ zJJJ4^0pH&YApbNlvNv;b_y;q%e>bz#(`Wd@_Rnwi@3#c}4_nC(2O0xQJqL$OWi5pb zMSwRPRXTA&4VXBzRc+D|O+(Gvvs`-!sJgo2(~QuXs?fA?y~LMv-8i9AZP$HC+OqxO z!u;+YXb$ry`5}wp@atgg?RYBSK87gH_zZ`w2e<57@67nO{pv{SPqaG<7}Gmx0V+hA zGG7SuaX%wzOX;y#!!;Ap>Y64yR6v7&ZnZ-uqiu2)vLk#2W@7@F`8F@C*yZ?#2LpLg`*z)6ujh zdO7lASeLY8>bMd$k>e#87pdARD1-NmQ~Cy@P4P9`$*|-m*LQIaiE0?L@r?$IHHC-z zThGw=DVjouE{nB7$rf}M3ByhIkhIsmBqPiMY2mdn8}-wQ(qD|YN|^;T8&fLsr2|j zuzb_;&jw5_2)efk$PzzNtUxHAs6j6gcjWKzY*m`ET(mrAl!oJU!8SGFfl<1?_A#RgWI#Z8hMLlekA z#yPAI95Wdra3RYsFVa|P%QWS*sY+B`g$GrMo6xz1O4)Rot|wxdZ^ z}F0Ar#cvL;+b!?2K;fs;j-V0Rhsq?ticjE!5Cj>Mz5qc7Ggk{5tSIBjda+}Dsi zVnLzIuCt@)tbNdS)#9k1Hr7rF2_M38&IXOTri4*%)ennIVI9f)KvF-3&OC$jqo1MU zHdgOQchv$TjPvjpc|LV?(*=78PVP9p$@89bylXC;i9uEA-H$KLlv<+ zJoIs1h`(T+)Za+Xn3>Tugao9+tq7`0k*JZ_EA@~g(9*TW^dfE1VccagHau|>#%%nDul zb=8}dqzpo~@kq-vI`80f+=N&P+IGr)Y6%$EV=r+6y9=}SH=RrR4bG#%V)%dywCVRsp zzfCHMZa<~R&?%|^VEZ>_w>`#?DS>?Y#Hrar3b?@67}&CF_*x#Wu5%^U1ZHdCl?JGAGHr~mqY%TqORc(OsY!lTscN)> z;<-xSjOz-`Ybw{6al%f0aW0L;tg2$f={Dp9KH4f$_#m>VYI%ZH^P8%|MOmSeDN|Ys z-hsWU8PnZ9e}3%dwn{mipA0EjDuweBbCuc&8V1SxqWIlt*_IO)MY>dZ8P9S{xp1&UavwWMyG zGF}ngrjUAGBJZv6Ky>E~oNIy2!a7!_-Q>+IiW0k&?F|Uuv`WDHQFLrKJ-T7T{0ivq zEbImm0I{B1W}XJ|OUBNei7Ol6T%rFLQ?sUjEAQ{z>5gktcKaYa{vY}CUwr59Wu5H* z5zxYV26~2ng>#^ymIAWMN10!pB+&!nLkI;nuO#_mjVeeX3JIxdiKOq(=Gsg|X*mjR z%`)X`vL3#52mkollvd-k!SO6&%LDa2djBzF60TpU$MEQlPsjD>4!n6{QO_XsZgOp!3D`Iu-MCT8|LZ0nm zHAif&MJbgkMK&h4qurQW-;c^`e=Pvv4>kN@#}m7O05P?yw4R9$F|c<|l~9pL<(Ji< z)mRrfR&-dAnr?!ylj&S}tRh8YB0aKkU9PIoL`EarAw3NbrNvd9g7j9P zc?6u@8Ea!9&^gAxSyb?2OeShrW1uy-ZQWq6Zh;9=omzJz4qW?!uHeLeA!63GXWj3hUOsz>1Bs0yU_={aEC9yq>ySelHWxx8nm*^+_=Yuq7ly7W4DDX3Q97pA{rXqHJ zKL`jNAm)JEhJVh^Mt|j9_-ty^v7vXhKEt;<=))>(dRl22v4_;y_f++mNK$gBoDeGQ#f5Y3?Xs(fq^0GSqe;eZ=M6;k@gewA9Lb@0 z{cMy{ImoPJN*jj8vC+}D|ar|}>pPw!|4{z*W z7=NdtUjA-8^9N~90R5*jhV{RvqJyoGf!RM6CGvlE^i=xdNkoF@Xh{2b%oMmmRn_mE# zc6Mj_NUOPrjQL~sk6*8KyzZ`y&#FCfzNH9&qR-Q;UHz@V)6E*f0J#lFeUb<@Q9l#j z<4wwl_7?O$>?2Sry2mAkKx_f7UtxImV*AfoignaV+Zu);hOnK+4x3wh>ROO{Jl|wT z62()M^dDJV!WxKfm9^w4l?2Mjq& zkhuF+-wJj4v_s_7_k}(HKojed$_2l7pmX};+rfOq2rfS_7>6D0(>JXyJf6CE6r&dL zSSDaYpxIJnSEOr_9o|6O@A|=;@Z$p05SwzEgc6py^!{?{UH}JFj#Oh)r!BYr-e??m zO1F;ivkO@p-3}@0xZ{M-O#Fnek8j`*^Ck$>!sM|BqU_3)XBYh zOi}BZXd;_!zPA1&q^=ni6%rY@B4Vxnq&}a2r^#u)noROX#WMe^V*M$8|6Z{$|3kDp z>N)-;cK>$)`yVQu!=HY9c20WoX4WQuCP|>8m;y2%$~(t8k=}}af)^??kP(6$3PPxu zY65W_#GqXq6I+_0Edvm{t88^rw@?j;MA`Kv`IA6WHK`su5uMWf=GElG)=Sqi_uIqv z74jzoSK{3+aG3n6R9Mw$^hwv9p%ifVn~`ukuB7V$Xm}D$M#5qQc#=Un;x68MUCe2s z2|BhU0SP&N`pwght2DC&HjM-oX5l3z@IfjDw0^y z)sISG6-Rj2l~a{e*fP(R&Coyu`uw@qTt9u`;$lKO!-OS2J)O%){xa(;vt8{EE^;yn zR8oOsBUy7HH} zl{&)E>PC+H>;f(~DyIrJGB*XTn$PN76kg=-R9=^;BicZT2uX;1ihUIk>=W}~%S7Z1 zKSxx1pfPA`$qXRJk(3PwX2xceh-s{E)Cs~CLhI86%gpmD6;MJ$c$ybPhjfv(D%~Ll zUCsl;ubOOfuwb6c1%ur|D`JGF19DdVG+MMq9iokICNCYl zc%f;Fe`-NAW(RKZ<=&~nY0TT za`5I62bsGdIeaVN{3@55paj2f1%h~&rq(&e=CJ~c8%^vh$JcrI zm7kT+SDK+Mji}|1BR;=#QDj8}^Zg?ir~WEg|9ei6{$nl**jO8z{TF%EutEArDKIkV zmO`|2{aTgtz^111#;vuXmeoA7gCu`uF9v8BCsgOrI;PY7=dhmjoT(e;-22O`Bzz<2ZqM}o+kfm+@P2;Gg@awt7!Zdvy`CQl-_L36=K23 zGTWfo2E8Aa<=T7Ba;rX*~^HXvn4o3n30N&W8-l6(?l<7<1YI_2vlxDL8Cs6NN>ii zM{1EM6-io0GO)XRKT)b6_+T7b6lo_bNM zmg`H4@Mxjk^@|90CDPLx0u#n4dM2Z8A;Q=rRKNx9cie`x^;xf^-sR=_6o#)pQruw0 z{3cF~rgZV-Ye3*`=7RL?A!-zwM>W4!;RJ6j2?LAbowb#B5^rG<*gFn;#hc zi^7Kxf|nZ;nL6YfGfOwi{0fuoeosF(Jbma5Vu~|t>Yn+B#DPPzFC0(eLk4DWGgW8T86@-q1LH-ze#3u3FqhQ*jWG&Bp>jU)xl%}bVbYRKrba$aG&uvw68FY{k9c2iB{ux61a@tKVE+n%?R z-`Tr=y|RJV_*p@^^y!9xXJ7SeAi5{$J)it7^(~*KlLF>LkG&Wm}{pIHdv_oy@qz8X;DMy_3-`(=o`yU`Gct} zZKhTPlVr#G9L}KY^GiD?mO%;lth#vth;a8xA?pmcHDtY3&EFL9S zun_tvU+pY%Z@$R2)S@PxINou9^y1l};_;NUiIi999HV!nBU{$3#jt)M%+!9F@CYq% zM{l2NFBPJ%`j{PM7@;pYgn~;qfVrK1h1HFD9GN{S6Ip*WJhXfitO|{VtP6?7fV&qP zFwBs(QyL(Jp#d;RxyV(!H8(1u>eoew?$?~QbM@g&MVU`I6A*C_M^&^UO}=o@2MGy6 zx!~pJpkcl={{9(hQz1yCc3vhBK@4Se!&+Es9}H&z0%sUVkRBqn1OJC7fW)U@96nCQ zp~wqmzhy2|CWd$Q@C7mF4W(+qsj!3$S(`l&hygEQ=y5KVgzBhS|C(1D|yb9ualJGji8?(g6*^_ZBvrN!nqt|`IaD+ zEFPL1V4GMD${>MJpKl5-C1B=IXw-2mC7?1kOfBu|g8z#|%TSjbJ_!9AYpi4!4N065 zn2hE;^EvxB#x`aAp@Q0Jj3b7$DThqs$aJH|r5*kZITb9_#f1P~n6`>$^>loKGY5t9 z1~E@74Kqv;P5fCjP=<_jqW<>jbti>#L{t1WmeN`F#zk}NV~xtYUZ83XL98h0vvRr` z`dnp9FpMNx@xmWB?glHx-G+`69NY7PpLy_YBueyDJ6j+zlIdv)LxP#Ex1!&Jx30F- zu2gpW#)pMUt>ZB! zB5{KkU(YbfpLRM{FpCBOW=Jj5+S1dU7!63ieE+suY0O86)fZ`o5QP6%f9}r&)N6B;*YF5x?hJY{uw2 zT!AkGQ!uN;lYG+{WnAGF1Qs#jMintmdZ@ej(Hm-Tl{a#5{8#*{eXw41FX}X4p zktWomzU8AdiI!Yrr1y(In#q!S=P0}$$Y1ftFQuT|L|1}WFHfjemZ`7&VlGs13L5PF3qf6xu~6GwGSETN*R#LC)I`)d;^6~q{ybHKBr zNJ4`cBegd4eEr$_G`BEb)LDRKy;zq_0@_4`(|(lJ#A%as&JYpd8z+G!ya#3kas=h} z3~N&Ew5eXf<}P(MJ_W62XX$l0Sy%9?`~I`@uEJL|aONGP@1rqwX-S}#<3yM)eGDqh zu_#JQGnOZz#IKNK)tU_YTKmX#k?tripF?Z0YG0(S7PH9ikV}>7ufQ~ZYrLr6&5dE3 zt;Xy}zs09q=^jZ&ld(WKB~gmZoJ?YD6xj@!Y*?w1{CbLmwJz zaTEC*gnRp0hC#ECo1CsqjVx4-UPmS#;Ab*Ng`82U-#W>u&vtJvr`?GAl!RbQac75%IK1$wJLI8~&lo8XKuzDBHm>G~V zPZ!jQd8x16%MJU0SjeFz6UMq$oztTR&%`xA2pfGPsH+l;(l3xo*dv%Chmaa2@1B_; zUK_{Rwt#qDYmI{yyDYYD>T-A*kW{c<#<+&)uR@rWhn)9yEA%<0LsqJdy;$(I&BO@M zY@Q@e9oiOa+3e05R{_*Jffab*NV56_qweqADqblx$4AZKJZeu}L;A-d^f@*a2 zJs@`mD&1A)bo*8If`N7A9fv=_{Yn-lKA8Ak0RDa9kG}CYY6vIsk7ku4*gy4+|CuZ) zIN2K6JJ?v88T=br`XK*B%~lqtI&`( z+S+gQ{`3e^*PF#Z;W4HySqt$OTi_jzGT66Wx)?oDzaMX$>2ihs;N+AJ)FdO7-KXPK~7=r^>49$c{*zA2I~ zo(G}_gna+5G-^2BL~1daM9!(%G~v==g!yACb`TP;(z=^w5wKzm(>shnixOUK9=L}q zU@5@J^gu4amb^_ol-D|qF=sTnqoG~idx2A!>wrI{i0Y+M%e)KT8}cIT06-J+vbM+) z*u%20ALlw?2z4fxeW0@DEXpk z^3w5^f7|M{_O$T6^u*>8OS$U}Wswqp{Y5CBzK@RktNA9aT&_949{dCy<2BN&PDd;G zL?qIgzU;O+AHH}*3C}Szbr=l|vg7jkZ?tvXBZul^9-+IH>51nnLcw!{MGO+$v9qH+ zu%Z!Ry2w;tlfVi#XcK)M_iGxbB6!S8J`;NMuh}uEMtS2VF*M7##S4(xx)tdt2qBwX z)?v-xG&-$~-w1pi{U22VqTYs`as|2GLA!e{{)koLb!33zM;$@^$2#)QDpkQn&&1?k zR47nULt*|a%6k*Flm`E77;qw|HWY;109H;M`J$esUoL3yaD$~qgA|8YSpRR0iijOJ zi{bfD`X&%%GB3G{Z;Jc#JG;k}OP3Ap)7$Ydxi4r5lDr(9WS~lu%9k!c8$C|1B#H|i zRzG$E;BrqJ<+g=Z&kw($>WBd*^t*P{l{j=LVcF}K3a7$ibI z)~B%PBk0G8X|2Zre!JL4YMh zKH%2Ycr>h0m*BNfVJk>FgA&$Re3*VWu}W^iiqQdt{0=8J67gyIb*iq=;& z15pABtvEwuI)<;y?&|@oPxJ-*+>*m95Ux-BFlRl` z+_ir6i=Ol4hDY|xM)K<0c{aKaa7(Z;aQ~xd|M1NqbqQ(LqiJp9>Z6bq(n;SNkNS~3 z5%>3Df~10$4B&nNNZFWibKq<}seX6hQqf1velUUQr8#3ie5H-!U@jB8;#fxDX-CXk zn9+{&M<5q}sAm4zZ~}pf4h0GT%(qxCK#Fpe=`)bp1BP+`F5d}cP%7L#|17k_QPstf zXRJjVc%O5o=2Hpz5nhbRvU;drCEY;s*kK`8?VK`Hc_8(-kip2g{lXu@4Y>+=x(QIA z3{h6rDnyAYVU4G_!nJ$QMFwE-0O7e~1?_3Y5(2koX>u48DG|#+XC+r7?Z$wLSdD$< zK#!sXjbQHHtW!qGk(@q8f$UG^^~H9{)bI6fU$DbA_HEO#+bRXZ>$Hl$HH0l^CRtqZ zPny$90IW|I2g=BA;z=Qzi8XMp2qtZB&vZFhY76(lgiGbdtFRvZhSSptRvgaXzhbX{ zBZD2d9{kd^pqEpz8yf}HHAf#QC-2D}f`f5drD@FUnZK{$IZXFtubOV2mj48C((@R~ zirF`R!|kmL=uXkuYAnx{0U_T+u4=d!(nWw$s-^AB%aSDa8-9${Yv~kQU-XiLJ}QjM zAEQg^ax60x+V4Rd+tt)H^a)^oGAq@(m#L9rRFl}2ZB;xc0i*uotAOol&>al*yCo`qUWcN9blN|@HL0m%J!F1Xq!06=8OY+;%=d#_?ON2FyT)=j=bRY@oa2H?*?N)|IAzjzTe2$Ckv`{D|JRj#vx zZC#!>q6Oyy!57!IPH^vgK=U*_5ru28L&eXZ8C6zbq9|zO6o#pyDycWwRKp|7fH010 zP=joqQAVGeb2m}~x+q~y`pG4MnD{5mayG#YxIE{u>jg$o76JKu zzKj{bSudZj^H+h8dzK~IH90Zn#Shgd^xr5{Uin1#v0M3x|F3PFKYPM|M-<}!h(ZE3 zR{Bm3{{|@*3Rp@2Z|N^;NGxB;(KSr{pfLSe(8|&HpkRRr@CDHXIMKTa88Q(t*Zy!8n)nkbE7vkLR9&jCVU)}Ot8M*v=e>l|ngxe>j3&68@Bx;fm zcpg;Fs%l`-;4PH`M&t^cucH$^v7=S4q1cV*qvJ{fVQ;M%uJxM)`SF1#%D}9(Rk=Mg zTAG_v^e|{}PxRBO8(Y%}Uds&+=ooQo!#_Q(UzDst^T5|(X2-0_Rg3`;SKwV{Mo>k^ z^B1nG8_lhFE&h5{{T+(7-y&Lve zG{!5B!;Fy7D3i0Qm7DrtGvfm6$&>TPXD>3#5`GBRHf8S9DO-*#TfP?UmfKVtDoX3#fBsF z{iG$5{%jHXk7d3|t6e-cr)u7yxldgu(R<@S2~LXFiULZ*Dv#>JFhe6XoW3Ru3!hsj zEFOi2n;)h7A2_o1!Glg!_E}3hFfdWG;l}tBTCxn%!TK}Djg+yM*uJRww+1Imo>^m>zRJ=y~o-`KmE%G@3_sZ;#AlZ5Mh?*85& z_)iKErSM-yFap|FoF21jhe=8-UaP+A$#+F4@ADnk?%bBe8>3YgA3%B(3Dsl!@a&P2 zhyIJs3v3TC3?Y09eT|k2VU1Yi0<>!vcs27&OEP1%9YUsQmu$Bb?xhp%WgX||DN6-n zmf44LYcrFvp;0$EJuo2}1y>cFj?DHi44z>QFkLTu3wne^I!!(SefP!fg^UY$RzE=( zN-uH>82BU*BDcqI%2fCkV))U&Hw1uO?Rwo;YW8?3p|p=}M85a?(6jPf~C5m_-(OsFt8SzVF)z*!nW?jWDE z<%Sc?M`%xGV}pAz23SmNbd4;2;Rja2g#hXqAvOhcKM;1x!n=${8~W)K5>LKnzZROs zuRq$F=UFLXa326;{f_`c@J|3^Y~=PY!UFx9u)GHaP(kwPW0r7*aWVTkqc*DNCLs71 zfP`2^M3y+kQPtF}N&8U+dGC~PVusY*NB|D^D#F(khHo;uBpruN^ zo4ApfwAMALF&b$ko*z}IGs3pk=%^H%n3;^rXZcan1;_{TQ*=&zp*BQgEQhLvB7gEI z?W?1mp^}sRkqU#+TvdSznt1%9QUCI(i=Qzqm%SclbF}`(csM*EszI#~fx{s!x2mnN z&K%WMO-0Cm0%|#YV=iDT1%_iiZIbRwMp@F)8i;BZ$4xqmMfw@f6D($j@DY%gOtES` zQ|w&_Xx!d9i^42c2SM1WI;xW#^2x>f`?YMgvh-qG47{F5~!Ot#6H?EZ@VS=ab-DFTcDIu<$n<5H5irSNoZ zsm;|orjl5ei&LjLk0SAk9GfkM`!s&`g9wFhB?r{50(t)^=oPDWgf2Whpe>ElsIntp zIm4`$&7ZaudlXtj1BGRP61DM?ZbMvq3x8iqtK$?CRpfRFX1%f$?S2}1nuQ%FR%(9i zdW@xC_s3i(&*EEni94x)EO&Ja0UU=}ciob;7&G#~-4ywWJ)hRG35*W%m}#bZqcLn_{k!jb2*y3$U*3Ibmj@nfaqt zQgHL-B4*p~q0FdH2r@4z=Z3kx{O`m%oa=DEyxo&@Cf=P(wF$Ou6hObSrrkNuZClQ9 zie{VtctGB0$-ESMw zrWdFxCdt&a+r8#$t~q@Km>Xi2b0eCEw&B4x@|};i<~ZPe>p}Z5J>_Q{K>@}F0SKRY z6Q6lhg@&nRdWg$CPTtFc$Ur(?0TYZ{%VyUmq;-1m5Ld%GYy(!n5T={>|}qRxs0eh~nX znW&rp?r;miYaL0q9fdZlorIg`(M@G@-!-#$4{O3OJmw8`tQ49{%|^_R$7`M61PVr8 zJ|pG>-^@PFXZ+`t%>RsUB9>+*dVdXVGL`;hPf40d0ig0@g_;Fl!@*{%mehsFi2q0iLM z@Vp}QK|+Y3*ZS6ouh6vCU3a0wzr>Kb9|w|1L-Syx2^xqzLL^*v7%S{p=05|SI$PR) z=ARUr37&qc!wB^62%$z?mxI}bM${3e@B0-oIMHVbJce$@b6aw%0V5p{Sj z;w-~=s=#aojxockh*c3N*AqWk9%O)PKPdmyUbr5IA(BjeQCGU3pgz^%>?vX~rcr$I zV?DVl{l$Ee>EKmQD^nvU)2f^us4vdfmLOY(Xc;6#qV!NvIk%)w{8Egd`v{S!5FtU6 zLTD)WKGF(z4C_gq6`o6H*X?7285HR4Cj6IZNt zaghz9#C``Y3`ct!wQd5Z67|O_z3$Cr={BlXIYam>7_2hkt*>{ELX{cPfR>FPo6h>N zL>r!pB0ZL}nAQ@TdvNnFxM;;b@D@tlf%)jErLdL z! zB(|Z2(zb4+WWs$e^6fgxT_L+HB{qqo9F{E}8?MgK-|DBMOk8Lq+~MoEr;}ucwJg+2 zz>ai$&0sdCz)P%JK2DVu7;KQQXrR=k+On@kKXXwDJi`TMT}Ygatfb1!?WJTS$Ul_C z&(zB0<8Vl=p>j68)wH5*7=4@~M&BY)?ks-gMOJ7zwMXT&!;mwT1`3 zmql7*yeH2&th!$<2wBCQw&k&R{3M`kH^v=&A=x7>`-ycZ+AL?m88I(FFKiY{sozy*Pp^~nQ| zFYh!h|6U-DOMvtO$hg=(e>qFC1tD8TMp2An*mz#~ZiV@QEP7V^gM@TCB!1g18M^yHob{|?{e6CZV)6V}^$ zu}2j=UjD;`$USa(f2V+pm{@2Sgyy04Dwjgix@v5QU!(4&^`88ZGM@vPZ` zS+`$3ET?0evi5IUi~r~wX^7_PM!ThK*c@$LwL2V7eGm7^`UR>BW{s_K-5Rud()Xg^=E;qOw0iL0wE}k}iT5OnyYgaG|mZcx+2kOyX+q@JdQm1Cg zY}JOf8aQ-cKn0a5jNcMBXEHaZOD`d>Ce_oXMP*jvHVtS-5ws_b!&t`Rr&TN81}cGB z)wU>VR?F(oin~$jXu-my6{1ia>c?gfT3|7!j%k=xvV;36J8m^d@eb2vaI_yLI!02+ z+hR5Z`o)=r-#gdSY*18d@Gp(fw)hgbF6}*}Jf(s)kiy^2q++1SjTC&e+dDaq2um0$b5M40SfNjk5 znzJwRI$(R@v`B)=Br&-=FDM2Px7jxhlYe~F)UU;{OeeNhL;4C8sBocQDs(Tgyth-r z2;+o1DeNT!c+b#en)wpA(Ar4^jd2)+ug)VtbB`wycX^V2(PZ^VLOm8`!y3p{BT?Oq zO5ApA*(A=1ZG)=K@Wersoe-ZLGmYaf^4j#(xq2raSo zfbGSK;SO~j&AN9liIWslDlkbY!pujpKpta!q#U3qj|1K%0l5O0+RyjeC${hTWW6agX* zNu)cRg30Z?)zGgX&9O?`ooX9$La|H3EfO#crKfbI*t;}OsS^>{yFWttH7BD=q&DTl z#?Dii%UV+Q(jZ%lP{9aN35lc?A{CfPP!e(30u?(S4^nobeiTG<4|2-n{0codLJZ2% ze}n`h!aLtNFGiu6SLRjX$kvmor2F3ICx(>;AO9ZbY5xcXovSo3_Xni3=FBSre?ZFD z{{|_4-|PL)kfLZ~Z(#bbQQ`;hQNdC|*<>ZcKmrq;zqT|bmxq~P6?RvdnGq8+JAFXr%eez3N3xfqMj@z;z$(K-BVJ-)o{aCv_|KF$8L zH7H{zxs&Bvcw&EQa!uOS5%raf3munBhvFrTjsKBOxcZPNS00b24=VVO2q4~BV*Aa5 zzCw>X3RV%63!w&Mn2ZRhk!=Wn@CNb>n8ygB`gkb}W^^pelgz|vb!AjMst|({8s^Py zz6NL2_N?x*3?_C>xsi;X$kSkX_Rdo1H{}sqi^Auu5;At6rKVM;VlB67o~WoahM(|i zG{Rh6oAqm}5#$u0R031h4LLGz)bvi|BSVoGbPCN26JHc*T`QxFN#c(w8zjIGSzKUHXpH;Zl^6aY<|JVHQ|q6SOwJUeI#vr%z$ib&Tzh4Z`Qky)Z^{!^v1}x<&n6r6 zaahB+WhnEvm=j!S*_@hfNYIkPAJ!AFj`fQ6E>Wm6k~idX;l_Bs)Ka|rQqyACmXw#o zBuxtj((GD6V2wXcXO~Nfn5`!<;3O%Re3|~ic#=G8ia6Sh=W!$UZb5M2gs+8wb;2H@ zqCq^V`Go}rq$FqkdcY8Bm5tNA>1$HU8=E;}%cDppCrc)3 za0R;sm2X%C&TDE*R9s#g-p(^~LVE!yE`yk~<+ff2}j+cf=N8dl$f zPHNi|Gv$aQx)oVcL3ZZXUz6|@-8JP1v)yDt79|}1I?+PCm{$eg!IrMLVl_`OHb&EL zc+}VFU9s&LzKCUtd+zqO6FTFYIF|0{Kh#zvE@Une!|J4Uub*T7bKMc!agiRD_w4jG z%B)57|7})#EFzWn|aI{8t~BBBbl5Vgn(Tv^H~@7cBHCZTL+V z_rX78TKL0MhSubG8;u#m(-OW z6dHg(p@2!4tU_*M5MUkeJm=!?axx7o<33FZm3+D5rN6_s3G1&;a*p8TVG^HQo$+Py zC*s4M8AX4MGYkXV zKXex$GRp+8$pR5P5(7gTpk-b>q-dQoe~DFD_DYg z477EFG@Z+h5^Qc*_3e*-Hf_gjnaBq&{rC%){`aZc$Hm`=?ahp>Z2s*?>EFBF(En!T z@b70&|8Dr#Vbwow_hI<2Y1@Cv!M{7;|Mxrp%Yk3d(b3X~i2l!Rmy`Uuc>h-fZViFC zCDTsD^TMt2CM7J;8=+WtkrMO@h&&!aEeod21S0B3wdb6i6Yxj5JxhO?CV{&8RR=ak zcFt|yE1geCdIPaNIqDN%AR1e+t@lm_VuJKwPXWSoWoYp}Ur`K@aF*$E^}_hH>H`j| z8ShLa;Eg}Zt%71i-IaP?U0XJ%foxNT##9WMnm^uB`SJ!gbF~#mXmVzoN52d8(`=X7 zbJrxa{I?O#y&-3=IkuhmPKR>*d;?5Ij<%Uf12nau1P#`T_A&$4jS}|gjx&h;9`m+D}cMDGP=QN*xZ_}i0HZ65tI?;^rz z*?zM7G_e}oC>rtvAe+L6BfudHXdsqQe`gR7A@P~KYB6(gGeh%Qj!O<-M-GOWbt)zT zr2R-jX;1u-Y776ED)rGRP_UaGOe$o#x7c{FqR(f8=pdiA8YYbLzpl=Ri)!$bi@-4D zEBCWA1h{X8nQ0~9%p)IFIuMRUF*Q@Epk#378uWcdi-+Ph(#2$4ywRJz^*zTvlwE+0<18csYC{UX@j~uboLIn zII;Ydis8=0oJ7DmGg(|5El5$RWNh|=P9hUlW6Csc;b5JNA_vIn;J7ZnRHeoeDOOkT zm;VTK!*|ZRe3OB=5K_5cVL|9jJfMoBI|f3g+kK{~2-^2b{){l~YA_fIMP*T$6cxrTxh_OA?jm!Vx>wy#2xbaLPVq`F3Vom@OM?+Iq3I~hTB){1_W?c z)Aiej9xq;9%NNZ)Hk+U|fM#NAu7ZL z1|A$}JIvb7*GjQ7QE-r%vh%Zn)?GhEXKLn~_TT|{Xy=E6^O%(_$+|64} z2%$4}qO950_Wq$4A|6D{`J1;=^$kUC3?`DULWg!F{1Yzs-cp+=hR8)=0==6Nc+aX5Q4ValT9@qa<_H zkd8=Bbt1Rrk%&6&WzA$4+Ib=3CML`nsIn)L_ulcXDz%7Mqf4NoVrM6EobKmL+$dX0w^JWdVI$nDh^V%c9%5yq-SdwK zZz0;(5H#`}9)BoFx?#|cz4`2&V3%6WyBijfZ6`FKgt2U!X^*v}7<3aJg2e##xC#J+ z{NXBDPLS5Dut*-5wmrZTkPaL`02Oow9rR+jp)W)!64bPrmJQ7icx)U2iXu5eNrN7P z&Wno&SjEE&fse+{deQ?uo@ns>N)SS*X^1yCnn{f%`w4y@PY*;kGT>osMnW zwr$%<$4*vkcWm3X?WE%s+jcre$9&m)pL6ehr|#ZW?^R{}0bl)QYRoz27-Pn5Wfwe= zt=R&vhOb7-M5?3MvR0W4^_P28F7leD(%Kf3e=p~S2urul25wrVO+cm{%PLvq+}Nq5 zcMJN62uWLD9;%>RdxqDNMes17h324$@Wt2A!y8X&+R*bCR?S1gTk@Q#@Mot&lK_xN ztsLfT<`(k`DzoAIb+f3=r7Gx6%+yYA+3%TQWwZsC`+bIS%N6M4@FwIIH&lOidInGp z6Z7Vb6j1T89L_KfN~_1Z7VR1YB46g)pGEv;*tV`7Ys@?KazxLqYCo9 z)#iYBo`B-DQEIEr0pGJz`6L} z3QxXcNL|tFmi*o-lPncWtCQws2fPFpY$9i7k$}ubOkY|}`nvrFDx2V|qZikYooGEDz#kffK>rd*Wp?*%ONLS{lF`60r zl#b_Kjs1QB_O!%EdR<#OQy$r?yy8(Q9lxN1M_P+tL8@DBLw~pL%Az;dVo=`#xuH%k zEf%g{oD~M5UWqe`PFzk^87Ny*hEo5)4{gb&fYl`Z{EK8efrY12Jm{F;QH=Hagy033 zB`>~A7SY8uJ6B^!ONfBs`De%0g?4NTPt*ez&AHmzg?4I+V9<$)SAqZcb)D0M)u!~8 zO(FeejK_+CDie$o2;UyD^$7ZFS8FFmga?0;%L{%ZpNpRK8= zp^c%rsoYnj%D*%?a^ zb5qaL&!3G9pTB-}yiUq}12}9(KwF#dn9kT%d>n#)%4^sE;E`jKe4}*-jm@;;?vYVa zU>u;QaW#$wQ`n;-&t+f4mAw9W1Dn$}9-#}32{^ab}?^*_eKF}MZ^{IcwZ zFQ-nf0O_yHQxU>ADfiI6mqdTW=~p5f*mJr;GukTgpndm{`-q!EhH<5gcWoyT0urNr`$;G{198(%1fjG2P)=pO{p{rM) zaz46)Oq)Dq2V_W`RHXW3U`uHmWV-0;Mko{tx*N+3);>e6o|b0g){?)zWE|Qv*Lh6r zCI>=C#YCI;Ywq#(T8#`?gSl^YaMshB65;Aa^hlIz=cxWnN95lh2{L= z)g7(`?H~`T(qluvp}O~tp=N@jUd^>IYY4E;CY;W0G=*tCiu5B0=8jRf4kH zqeHTjafi5y;3VJW+)BLW=SRHB4~k`^+%txvuvhk5O_ePUQy|Uiw?q;_p4zDja;mb# zJSOvwfJstsxqu(Zw{6vkd=lAgX8M(<5-!;mhV)$+iX@d(XBh3f7ERb2tOn_VL1U0M zI6nA2EH;+4;Wbx{w1s$NkUF@&L6Q!1d4!%dls>Z!>`S2%)G}uXlQ&r&r-<-87qJ3M z)>o30f<83&28+$_M3v2mrJ_5U?>;rypeCV<-Oy}hf~X>g|k6Y6kPL~3sa>ti4qR-)Z}+_*>72Yx2uHD`MD|nUBSgtF-;j1rB-4&TuD2M@<8o+J;n0$%1ORZraMha3niJPu*IWxAhBT#XwSzy3q!FJo zNZR7dl(oUM8+G>)YmkTy5`v8zT1^WzjN4Y!4IJI_49MYzttUrW*S+(L+z{bKwf6UGUI_t4=MX{iPm% z4_X{_#xas?|B@n;k>sL@mz1ZDC83DfC{M_g>`zRvkjc>1VGrrzG+Sqs==N_96d551 zq}%rWfiSpA;lLV;W_l8_;$(nR{k30YAaj8@wE%w0Pl`EJS&Kz6&2Q$ejpxG_=>x0! zV({2aFwC}f%$ciDE($hTqr`$&T^;Vho$}M4>HGJZ^6P4E;wYmwUMJIAx)6!`@C)9O z`t&$wLe(G*_;xc9m%1qfcJYryP;bh@s_*O&X9*Smh_%Ma!L!LrYY@AK6So-pPlp(7 zFF0S6YV(DZ1O+jQVwVvF5sRoXd30E4*0qmO&XQ4F^BkW2OuEDd2BPlny^%T4x(wAv zrM!hg4({g3o^HtFb=*N~V8TRkYb~V;kI(K=j(bE36j(hMUq_bn@|cOA#9*%2r21z(l!?} zZbn9&#yr0QV*0jkd;QwJd8h=+WQr!e#gwVHK;?0P)LWVNJn8p^hNo}S7bljC6G26% zJ?mGSUQ?S}GCe&vH)`Mh+K)wo-?`W0mwq(>qR-Mdt2J&{8M9bo1ey&8zTf>nHKJ+}pqn`GJU2f}k?DpPg!K4KWi`3XRTS zEFmE6%t%ftsxB)-hq%G)XwzAOo(cDXNg-c(Eo zm(ZLwi(_MzY6su5!cs(0LOOfzd~*ul(h-YP*Su(74G6I88uP zy79y}54WdPbU=JnYwEAvLxit%{~@8;75;;I3%PShvuMwT$wT5HW^9XTHYSpjJeNW= z3$@iHtu#-W*($>7=4*uTSsy7g*f>gej_RBTzyzQYA+epAN>G{fSYNL$|66RY#?<>*SK7pd9k`XkpF39UF3 zheit7F3x!r?Jf89#@)D7X>Ko0#c6waYQF>iw24hSZ{OpO{!Ln9`S_`ztg8h0dx_bI z4+;Lpr)%R|kzK7@-6z*AJF~ip1&KJhb#$BxP}3kJT(6mmX}OGX<+_3b4QK%W@qKBv zFnGX25nhk$lk%JVipfm*s>xDx^1f|V<7D!{R5NtM2Ey3$n>GRun?c1DGwL?lN{#O+ zp5LZ9f!}}z)3;K{)GOkRAC#SfB4CdyOMP;ykPzf7epHyjUQFmJN|BZeW(Gkz;E6`i zs>yenRM%=VT>h^ViHE>I0z6IjFIcrLV4h`YyxN$nq8D{U!SaUBp z>NmK)(D&Wvn_e=rds&XXdQ03zSM}npaM!<{%owRT6NorC+L$o~Mr-^$mjM9e3p?sv zFO48h&KF~Fc^_ilT@TME0cM5}$*%#k^hD{f&nno)KKoT3QO$A;PSmS6H+aTu`n1w73r$(#x+U9gmzk$u%h%DoeBX^Q{EBc2seT&X|jn6#Q#tyFxLm zL?JF|_j~~mPjS)>jXTwvQ=b^N%B`LCb8vd-nFVbdVs2Qs)GtROIl%a2QSrD%53qrl z9ss!0RKb+F=Um=iGcg*H`cKHlNl$o+fPGP@t4HXq0oW_{aW8+5?F#SAKbMe?@JZm$ zdEb~52=RHt*vKWbq$G2-Ir**N2NVoGC@8m`vCuG-(gz@a!jlA^kCu($aH-aFH2poY zpY9tQqvT+J(Y&0+0AGATrttj6Ho`PKj{6x4>nh$Ev>_D9Gf20aBQwDS-a5U9FLOz) zdd%2^C=`t(MfFB$Aq+ftCyfwZ`oZH@-ulZ^IJ1Zo;nG zapSThP~=5m?Dwv9CxLw*f@~iLG=DMrmb45KtBy%RUw+a*FJIZEToPP5W3{_|Li~fE zV|Zoz=$) zQaRTB*9~nkb?RJqIw3TODpf0sMFKWl?Z+Tr+}fuf_8*`k;r~d8={k;b{BUx3;dZRB=y ziGLTmEfb!>K zIJ_E`VmQ=(Z4pWkK+Wd zL&5Zk;2#Acbp)5$|HarceOX@rKlAc(rcO>@v$4~^2IJu5XD^%~EZ}c|%$i1o5lzG> zo~DTKx!_^S91D>F4Lqo9OeD|o8#-=WroTvT$PEY=!1($YSFn%1WB-Qsd zVFX)fK0krt>G{&DPVDr-w9?-bU4PTvww|XtS+06swvY9`*^~26>@p8(=|s4~zt-tz z*o|C&+ck)Jwaa)y-(3&7LaZUwk!p*uXWPZ@cXN8e?_rn{V05SsKZ9IGu_fG)Yzwz% z*+uWK4qAt7MY$y0kZOyx=hzJmB0#z%+K_3BwHMe02IV5+6Y@&Bhg~!7mImb_;S=#n zyGLC+^)o=mqT~?1C0x_=*Fya!;+1lbun)6OyZ+ffA7lhi*Dgo{suoF)qD#m<@fv;C2IVU4sncJ!`C^&R z)L>{3-#nLPE=JeRBs3zxRa3=ybOZdyi6+TY;y z#p&$?i3eWym*)Vvo^W$-Y%+mUum5Ie?9Hm)W}y`_Yvb(wrhB6QR{pLoxbk7%)b1;V zj=l|mqmnwyv4Xh6O?wDj9`EIee}F&&H)Yc!_Vc%q`Ur@gQjS`uiG{mwcT@e5WD}$RZAkBm+t_G=N+Gvb&%sE8QJZjTCMxa`8#YLQXgRMz8 z8Ra}=GItqw9TGT%m@#*b!-Gs%(J`;eI27KM-_zl0ElRcp zL0QK{Th5wk?a888=`H|Un0brypI*%MlquFoq%nHFW4T+2183={gGzJp(h~7;jJn-H zhXgUFzfUPQHV>RXT^1F6NwHcefIyDOq!eT+A6|MpyzI8F&W>0LtD1eSP0DxO*j0;n z-PF}GR&DyL4JPfHx|0Q~iJ7bv(Ct?j`BX-^2c;Qb?7^2e7tzGbW ziee6k(BtHKuIKh34K8Xh$%#)1PgdtIjVtFCXrYww>+|!DE)BXWbp+0_iM0^a4c_ur z32(Flx8j|JHe97F4Q3l=MO`6>FH1~LxI%2$quJUA;vXF=jtTh{Kh^lHDo(^5(N9bU zQ1vs&1!zyI+{Lw&)1M~Z1l26^((aU)RZLBDun#zpJ855=4!kIWCme-M!7f&yu~T|_ zl}6XFYxl7tvpwX7?@JR#%Bi}A8qpeailrRsxMGh*9o)F|vs5LZV`O8E8KJG{_(P6L3 zdsvI&5nj^Za`UT#t zFm|T z^hQ@QwTabaX9s`XQPjV#L$vfwG^*!~G{LgtYRN4N+kLu|^KX96qQ&y6!-= zItGu_1B*dYm?QypI=#@~Sa9mlnnS${2F-pbSaIMKP<7U;I*CF=6fh_B++rixM4M`W z;4Es=%29425n;y+SQsq^6MynjC@x(|y+j2lDk!b8(XcoLn3MSf7U3zxx!O_l;4G@5 zywT$zZ@m#>xgNrUNa2VKZ>f>gVA>^X7pQFNkXXs!HF58)PQt@6=lVS2;{=|m{ZKJwjnB_z>IU$2APr33?1478e#d_BH{yNA^__u-9crG59Ud1jv>Ks zb4w^02Xu8txWr}L_kXSpV?cA8*}uAyk}ny-zXu`G|NGkTzd=atvT3t`8CfQx~X=Zy>cAwl|sgGjLxDxgo88yGCEP4%`R(N4mXuJ#6;3nu)K zWMQ%g`Fbk^q*G&9S;g1O_P&1q{_X$e;s2l9^#6Lhql><>+P`4fCFR`GhQ~|joxq=Yr^^jFVd-BZ6H~`qf4h%!Qoa68e@>`>--!Lyv?G;e zA&yO9Jc8H&ni@wEh3qRig2EfH9RQM(B2{YSP9E}wi%`=@zM@Y|yA(mkQ09>4P{u(H z{V+jJK^RcSPz*?VYW;wqTohlSC$e3a{#wZ2I!L#!dvhu?iy*=xSt|O0V)^iL-2`YS0RY%OY?&y9B&_N zpR7o%Ln4bZ7KGJLyUT4Dqe!F*_4f;g`D4GNvL8lyv#r%t=7h7q`aRc9>7V3FI=64$ z@W3BQVM`8qd{ zELTdri}`^K+`fL~jM?$(ip;#^s?T!3lyIW3xjDsC&oZq&deYss=;T@+yOsQTO+9~N zPn-tB(2#kq#W>&^7~BOg5K&asn`q=vv8L(lpqvUZABe1C&T73dx4CiW#y;*IWym2y zbKc-S95YCU8^%o4l1G>;OKxQ@9cs%yEG6yll1!hhv`XRR%5dt!r6ElUn4lETH+5hz zUN2;3r7JhAJ;qqVYr#!@-0A}~h{O+2ZHXlxtBYo&QrYZt<4-&TA4L-hAh(XH|dJ-gCr7LIV!U5q1T^}z_*3BQJHpBKA zoOGi`1q(g$YV9~^Zjc+}k*}<1vkne!6tA{&J_^}}GY_9`7J-ra{&QIhbX><~G>XOAYjC?}9Cc0lAu{3dF8grM)B#{lEmivpU z_R)EvWV|iGNpsV~+(b>uz^N0I^iowN8WR|OB3Tj-k_*N%VfD3Xb7gJ1vVoBm$7AQ` z$noUkkJb5!%I`4#vr9R-3{g=d9`+RGx&_sM3>I865B^h?rG0BqC+qzqD^I+N?DoV! z8X>kJf?`zj-$kCJj=2h*y8*|N7h4$Fcrfv0lDvh?i4on{tCWN^sR!0dm8$~-6~V0% zFbmk{-jjJ{(n?F&O1ENEl2pqLkWMh>c(Dp2E`43p<6IAW8%FL0;I^1k#|_?DlH0`v z*%d)La1?E%&tc7f!Izw*WUPPyx?w;msdb+$1;KL9fFWz(vNG&}&OzWMIF%NMSUN-^JZGpUX7n3qyGXR({|Q!8cQ(Wj)0 zzGEZ%lXMMRThoHTQ7P_nqEXs%W?M^Inh~|PSoV~Y)%kT7aN^z36YrQ!59vZ|0z z2mh);2~I+^SqIaqNl9h`6APY9LVAfwW4b&m+0Q2|nHt9NF#W!+J zv>Nv3av|kjZ18C8CaAVxp+xWt5L;8kd4p=db<8;MGtepyQwKSA$W_WBvjw69S0c8` zq&Rt^$&3vmlf*c5Id+&;Vv}HUH|Ta5Nu9)M;f|oHg#%lnM@Y-X0~z5ob?!$)aQkd#h*7lwyCSvYVYf(YKo4_8%p6dWO!gNNdxHEAT@M!OBN)Dzk?ifppi z_&&K3! zl7NX|6+y0!V#lT@h=R;Wj(AmE)eO>EL`Uiy@W=_`AX90NdYh557J<3-qI#X1o6Qki_elC^bLYu1yv+`r8X$yYGkc3MNc2R3F8%49a?sH)qvi7p|Lo&@EQybQevt|4|9|9P|NKt>OX7E7JI{#9XWLl> z=U-h|$FO9>DBjRuD)L4nEJ+iV@0zh-`MJ3y^P^mMXtb#3I|HL!KJM1W;8tSvfPCA zxg(7b`i?5Pttst+QIH&3?nW;{Fe%URWJHNIE;`0yNqbolVwSA?qe6_9Q52AD!C02^ zB6bjf@i_uw)_tcH+A$nYyf!(Zi?)j}`SC*&YakW0y$5|jYK|)KKAIm zDwIyjRO+*pQPu&g2+8E9F=3%r21c91bSp{WF@=MVB8GeQ(Qv#>yDRqfmIa3UR4uaB z>(_Myb#WxQR#gJVb&tiUvw9=V=oyA&4D-995I*=NM6gaAaZI#_*^t%ckb^pRViR?{ zZ~BcJ%txcn#`37at)b4vT?r+}sGi3eH3R!Z1FA*HTzNIzbdPugdy|`a90g(EkUnM z{1c3KgAEho|B9!z$*G?_`KlVp|42dor~hu2e|5e-%ImiCUn=0tA_pVcAH_4|#V5hY z=ir8|l9lf_9oSC-8UY^J($7#I--sMMj&8q&LGb&<3P){%D4#8*xGgoB zPi3XA{;O&b-Q+MesSQ^}(VCgn?dJ!nPr;X9tr<}Xps4nMur8fAa=J_zlp0PPstnJf zQf|M{Z`DipaT!t9tVXb?b%~xEPfU6Xee4k9N?8xqVh8@9aS49vn_ zs+*Q4aT3(Be5sc}ZO`VTrmAcmfww0R>nIszksxTs zX2oB#iTf?t(zV%?3bWnIKaVg#rX6YGzuX25ld7=e(h%O-7WW$SR;seX5tJ=)2)Zul zuh(nsE7a$EkLL8*E_YzzBg4EEe+)f@2V5A*rO2%G<{f&^X+!^T&^VE4n;v-=++9Wn zq22R@?hrcj%t$Ey`l|mbBr(kW{iUm`g!ga8$p0K97iT0VV3)5K2o^1lr3Ja%A`H>eX}J3Zn>#? zNl%-NuF+TDj{$v~V%qXGuIS6w&+Hg&)o1V8EF4U#QlFz_&OG6GL@mfZPMDxx3-HwH zmDV_ykF3=xHns)7BN1UJT^o8P*usx*<&CtIsq_ecNR4`t?_5(wt8m+yv3CK|#&Kgu z+TjBfnoPtRrANItnW~Z1xC$1nk`phqZMrpCotLssXbO!yU>!5Nl&D&w1DxHb0H>VU z3!T+S!bke2=Y&#o3}3t13XQIZkXzS**=V@LLrjxXu#}J}22}5GEHEfqX69N0^jgZc z(Gj|?3WJz<%ZZU0RMfn2PE~`vvb;fd320f|aY~x9yow!mBj~-Tvanf;2g%)~Ikb*W z+Jpl%KQEA)#~CFe`qxHX&XRsth^yOi%A*#iv(4|Um?qeg#q(YWDkp*X%Tf7d1RS0m zKm8^$hq~mPv!O3Zj>R}V$ zQ5w)cTq#{Jckj`5+a}(*f)O@|&r6$#^gheQ&Qsd+1E1lR%%=A7HMj`;ddK8QuM7Qw*X& z_suaoWN9aO9`WQ39~aJYDX$*gA1tY9GaU)!K%V5nJ-yq8KEeOdgZ9u#x*~tMWjy|0 zF24WiR{5{=r~k>*DE`-Jwg0Um^if*>M<>b$Q=F`gh}cC4?Jgx4)%B!qEKEx(%1Vy7 z4O638ys%)@uYu(eHwYon8_PU}ZWLACGRifd?PTU!LXc~B^)05Z(&+m*$Q%f>Qk8+) z5cZN-l3HCpA&`*Zr^q;uA!O>92JBq9(&%eVzqqMF2+q1wnx70B?3fEJERJ4X zhT%Bm40ga+^kz=CoTuIFXA`S1VKhV(M2)&~Ll_S*FgP)5z=}`~5y8TN1Xal7w_w9H zv)t+1%J0uD=AKQP+NCNye8!pxUs=x1A?MpF%#>fTzgCAJ8i&h>or+POg}$>j^Cr;m zb~lm+Mn8fg@6<@m2IJqUR$#zjvGXJ1Vv)mxc-d30gi0{NE;Xb9bEx^-DVQ$duPIL( z$|WeXTt`2d9mUg$-_}!#ID=VJ;?mZo7kFf|%47+kD71F#QD~pVafZKW}_EJpXDzvOwGe zw|^s@jD`tQ*{9#_b|)7%A6-VD6cD*$IDhxxE7v6mE=^9;pBew<-n?tdQ$ zXfp!0ZL@nIruaKdmkU8c6H}-;AcE9F6h$>bQpG|$oKCgIjAEP9Y?@Qd!Cs!^ih1i! zW1kqLQuw0UBfz_(Cym8`ZjdH$e7!wWWXv%V^hde7ez~3TnhWlBaVig}_-Yr2J47Pj z9O(UWhpP-Q(7K}Y#OUO*aNUB^Xn3_LRZuo9HP&kBksY@WPYFCxW0Kqz>NA}{J{^=- zBt=+xhIf5Yc@OE=xIt4;q`ns@Y|2&%xA2fQEtpH97Coe@MpScr0W(!)49yHut1?Ko z{|a1Ay2i?Im$T>#5z*{LqZS#9d=9EK0Vr;dwS`=Ag;eAe#(~uAgByk``yu;v6w8qW z)x7;Py=kXj`}FTu31R%l?t}0@me9ZY*l0~C_n(W&AF*^NQn!&8l&-`;SK;2l$SlkR zVSC&J&KQxb75OkZ!XUB;()9?NQAtO_s$#IYbgCxn;(WpJxisdJZ|TDhe#{eVDW)MO zy%Ww4#q-SbS~3`tR5_nrkE9Io^JBSJosV5kSA53;m3J>dhHmH`6vtSC)_t2Fzb+-d zZ$0d?duxRLX1tCez|Xv`f&W!Lpnr0`?CXv2tFZC+y&>F34dk!bU)O~QpJh$IZk?XY z89s($e+@ml+}QEoehPBDE1F-OTwig&g~AKW?F#VWX!O7QDgG=T_;ptQsS@-#^m%e^ zEU*Ps;Kd1K&pd86Ncr@7DmOQd7TMBF$#!oCh4E9dnw;*^wA(pDG z>AT;=Be?CP`YQYW83O9bdV=X8)uKKXDe8o@y{|;Ia)kkDLioG6pWgOTiSE;^Qp(!jycL!8!cABSI>vuTDFqa%4c_Rp2>B6G(@$mr=G$1 zUq=UJ63qwPV*VT})#~Jx>Xr>qdxlm$j8hyC*XmSFvxVpwNj4Gzz|16wkz|_Tg6B^( zwRfb0LX86ikNvOv?B^9ZXSWv;rG`-6=|J3$X2Nch))*vMZt_c}+_?uddUD)<5ock^ zIoMe&ow;O}&z87v+c!|*0kEauheHy>OZ4y;8}tzH)QO)&r zh8jT_i-@}X;*>*zey~M%Um8NWnegoE?_d$SEZdg5Y%xjNAj`fHt@3hq|3$lqvn3!Z zZJ6EjP-2{(BddA%chRPWU(2!7NjKYNiq}yLytAKV%C&HNi?Xa@yfmx_P`+)=B@sz< zmd4*^NtmT>JlQo#OYPA7`mWvq#= z;FP7+FQQsV$CIGbn?xCFB=|cri4<|00rJ#}dH(mDAomoQ5Uzo9x zG>WSyuY|&KNoyIM>=kE3?eZvc{9&ZaO#I^TK225Q#lf%C)9`_|$Y(=&JJy?@PgUVw zE^P|W1ikNfzAEg}mEjOKaa5T_lW~(JP2=b)^aD8LmxHCUydgl#Nl|5#5~81S!>{bg z$1o+ewF@)?ZM^is&6Htq!nDiTO0*_YV^+ZUJuLo>lvbKPw|ACCh>G0 zKGeu)Ok|c~1q(m1#@TIFY=Vekg1O$} zRW5!dtb|mLtTo+T%7(d2{&+oi0@fM|h?2CqS*n1-u-6v8oOI~AS_|ex=xyAe#IxYU zPZcWLuEK9RQYzOD!!R#Q9Zlu7Pe;w=MsLuUjcfz__@N$Boss$bsQ-<7oe`qMs5nqN zB%Rw_CoXyj44o>+dTo?#T$~ymKW7|Wp41CIBvgDlMWi}Qrn}S4xpi8pDVy~tZ{sDi z2lG4RSZS&(4s_*1l4dd;+uF9kLDA-zx6$yNWeW&uUEEv1p$D}67N~08Wu}IX1PMuc z#4w5>I+y~$&JM8dn!w&_XL)s*pEJbAv%b!)%~LzwLp_S@NNcOSrq!r(qOX<1!)g~R zPP`Dzgfg9OZ^-U8#b^_$+uLc(VcOK%h|khk6=;O+7`cQt1xtDG+DufnUbVP@qhJ>; zQCJ@Y?IA*)C{Vg~m`>?@wX(Rl#w9VIOtZ(v#>X+t692u0lC69e`>;|9XocI8ac&9b z#beg-C*PS|+?-bSOM-Db#hX*Hg^7<9PWFeD=9X&`%gmKocbxWvYttxV8*|nx6uEJO zr8ALiHW8YlKuY@D#s<)7qybpRzqH!kT$`^i%p8t|9qOm*1e_`EyJcOpu$iBkO|9)= zr<(w%(aglFjN1iJ5_nnJTyc8J)C%aHs-RMJW8=@-TWSA zZ&h36@-4Xl7|u)ZQvRC_mEG@F;Bl!J1|eLUJ`89$E%b}(lP`J$ChP-;bi`z|>0$+0 z)=QeR2yhe<^YE5AB`HtWBZ^g-!T94(7q_lwnHK&n-?Pvxa=-U&F1_J@5ahIczfOxcg7i^kYDso!*Mr9u)Gm6yZ0@m!U0t8 zAUS}+u?zDrr`|UVFd88;pjB2ZSrM%m%a+z~8)e zE!w5vU0Q0FT_<$44$3t)mkVS}T!z5#YRG~>Zkxh`_4@DGZ)XLR)=#)f>?)#Yj)ui& zRBgIv)G~$By(-wc%ZgGa`b|-#=HQgf_FxKI(aOZiF_qV#RP?BrdO0KDqx|)GU%5{z zNr$Fomz1`y<#9w2?uLz_Dh#DE2pnF4di37=oX3#T&Svqz9qJg?Gn`KIP9UO;5PRs=ENtSh461P4g|8|O|wuLSm3;1+Z&aLb6_TPM0tC1lO4yXylo zYL7`ZDC||~?6P3M)FMoiHhR)GGdNRSI|(LZG7osfCOxcZldFZx8n`7nBO8++rlLy< zk;(UCL0(q@TbYP-R?)|-lVtq>$|v+olwkT8aSQaF&O!hw8u5@4 zDR!3N^$-7h8}<*$*-vo?zkKcyd+cFOpPO~bJs@U0^#Nw2^ zaVa)4rS?{LJ0jh~O3qVG{h*4tZwY51;-}c7~6)e@e~1 zW@(axPRA|Rt3vY3%yxYYl+>#a?pFoN@q-NPDpYFFjnq5m}j!%=J0 zc$Q-1{a)t*R>`h7g)!L9JPtNR^peMaY8C5_tz+fNY5(egT~7q%&oIn6>dMfY@?O!v z<$2cf)l8JJKpOwbvwU_}8i@aQlRX~Ri!<40JI2M|;pAOInK?k1DY@t=Ia4_Gf*u`( zCNmj?M*#tucDJ^~?acFRuZu#-wTaF;n}P)@xdY+s@LdHN5d01(7mu#0~X{SAcY8fo*u7*=^#2`Ne{{}4U3 zUmzU3?IH~$KhSUBN**~HYY+taxhieDLXOnD20_c_cpryzS5QxZ2~|E?PGgs&{s{E} zeFmx~{ZMxAxW(ZC>7m66c)yWh5j$xFcRdlFrDT_HWtAag^V#MKsJ>uWhPRzW%e_RC zr>@Y9ujH-K9*Wa3PTa1|mflQZ7!`ImMFK(o(gXX;m@sJ<%}Ggu{T59opPi?j`s+Y_ z45YxDmTH9Ph+*noD{$%efnJ8e3Gs-EoI_dR2+>pK$?avPk?+^{hK+op?$?0xdg@0r zU5Lsr@4NJ9Iga7v<@EpKQ;Mka_EMGjwy`q3n$(^;AaMgwB6ZOuy;tQAQkx4i)AFaA z6IH1dm!@w}z3FYPDj60b)9W9PLB`2KEazqsEsGU8c99$3XyIGZDs5M)b1%HE)3}y9 zuFK^NXVneyhr->_yGVGjG{P^SKp+qzG~tW*vs>jK3`}~V3?MpV%3TngyS=ahH4#U( zPej`DZ})?YS`jjM{e6~J92{x^D~|wr;wRBEK(W4)N>3YyCu%`qb?CStgRmsYux83Z zQ@4p!9WraUqefevC7SNZqx&i4^O1uFHxdtRgIszjy3?Gc(51kM=FdQtb(+eavftL{ zI=6td#+bV0txhIGFeH`&F!_T`bZnD@ipa^SyPs9-7J{o^i(u;0En{alp}T3Z3AnB| zw!Y1#+SU>~4$+ByZa_#zKB7W;kwe8H3#q%?cg5;8CyRkN{DvP-#7jMZEfd&_sHMT>fk->LZ`tY(}rA^8-$Jv6IMRNox5dvwgE5uO{&U2b)_3& zdFIOdIEUd^DVc)cw>e9(I*GHj#8qzb8iD4AH!L2-O|mu-oKEGd&wpM5%fe{NJ4X2S zZ2|v3slWb>@=fJmr?LM}Qt_t@$X7DT@VITwS#hN9gmR~!_JNF@IAKkI2@+-Za9ebJ zam@<#U1b42vgaR&yTSsNO0kh8TJP=j^eZ0osnyu&R=01!mH9e9Qz#l_WTGk~xdCo= zlO)ypa^j)9EKQ$rF4ODdTMbzM2pR5H&)Yw!sR~HuU+S5Oj=RHyvl~f)FJlu1fJf^w2I)8uq zzC!K5=XeqB^k5)dD-ITgC1HFoYWEoA`->c)*AL91m4tMdkc4#dCN>N*R_~_-ia{CU zqCxHBrjm+s@}t#H>}cwlLmr$}7uBm&li_&Y+FV5IRi{fem$RwBUdrajjn*)RMUEvj zR8YgxyXY#RV|hY0w#$AjDoI|&+v8H3HmpWtq+5sICL4)QR#z*JE)PGn*fQ72B~V19 zzl9VqgX-%o4fm*9p1_4Dvbt(z#Z}v!El6!K-Y=@V$kbvqRYOx1s2SLV8ggfB&p$Mq zh_Sd)RokX@mamvfl)}whOtHY`B&MxLp<(e>)B~(0)wAJ|3sOk2qD{SI%~{0*rB57( z=tV)qNaa;kCe+z{3=#e=1Zz|`pPKrN?hLrM@ea(J>KtR3D2u~Smkq&4k4PGb4YS@d z*BAzTX2c^6)^#7!{{9DUZz7vY z_Q>8VyK8i>k(rgf_fAG3J1ZeFqa;}&$=*a(HsMN{31x-;AAKvIEBv14f9~UXKKFT? z*L}awd4JCNe9k%V_gmOzCh6XcAVj#K{wb!9bd4aK)5{4}jk_uI3fA_FeW3518S+Oo zp*&6Pl^p3QaN;DOhfhJ z7-V!yvMYAb4*9N=KQv)15n(_i*6CRM{94HO>-m$P$=F4WdZp8cGi4>_F|pqX8jQyE z1m`E{+wbVckK1p(j~foY!J%mX?HMDDA}U%o{xeJ?%U85nQnCXtE_-b7guEg9@Z*<1 zQmcJF>pS44;6TW;d~{dkguVZR8^is#^NH^@dzF4wip!phqXi@wGw#$};kndUr0A37 zgiNg1iW3Q%3VG=r?Ad^8ESJw}$d*tkg9$&C#E-|3-PPyav?SxI(_?TwDk7-}J(#=-R zex=TG=*xx-t?+@Y*{_$)jSH=olLZ^Ujn%+rO<#TZK8p8pMBo2u>448?9tL*FuSydw zHACLZUxuu&5OH*1;z0&QU7`&hf58aR7+wo(^eOnc6+p960dC{ zOR<;zh8k{}ccIO;Of01v^<9ZZL90g=LT_Fqzgk`&NBvBFsp@W&^}dLun|Ld3@cVoA zZk_anrpTV|k)|@O3?ZxptOV8slu&LwgD6P)Gc899eoyw4H-vAh{67we#@p|~vF!#X zJjDDbtPQ^;PwMB`@>Fll-81hb{pIp)6s=dOO)O&ycIbDjuwMHUsO_kIXwI2eZ@W>D zv_b@NqG2lu`YbDx;4>nG0EEkyL_ry_@+|#NsvoYeT5Q zr92f17$zIA<#+P2Z2IF@^ZzrqiXsxjQbMu(RyAFX6*X#SI&4j!JvWL|$<*S8t18AcaHb(=RA840CZzc0b7F+jVjR>RX|il-UB0 zt~rnEehggS$tp0xEywBSfJTS+Q>Z&*STZtbK5D!f>~SZ;^82ox_zX$s?oxZ)!_-gc zq^yyAMTV;`(#>dncxlo&Tyz}Map8DOnm{NGY;8^bMt5u>jqxT9(!Dv;m~}GGhGU6Pl0vZN6)0-}7OdN#VOP!>-6D@TsEMsexMweL`oa@O-7T*xDFN zLO4Np?`nw>fvjFfSCW=EjM&9WS-+dHslCWPE!|=`Cns+_?Agr)Q6l9Rd?QU%K8)AN zxm4D()VQDK{Uux8*-WRno7pTcXTR~f&Ce#Eq8wUY14-IP*0W6|G-O|RnT5v1%7eGtpFunf`I$%% z+IohG6MsZGygb(OBQ@P6Bd)o-9dys@W^`$&47@hks?z8D*6t{1j4kQivE<0X=1n$G z>Skkv-Y|=GX0_iJv_}6>R*J7mL^rlbCdW^fRpuMNJ#~IQyeeQt#85t~n3pOIK7Dm- zQo6DRMMM{JF+0AOf>oB0+=fma;z}t^S4QY3OPTqJxf@GbdXd*dyS+I5V^52a74Zj6 zx(keXbiH{B>@xLF%)brfUVLvz^o)?kYh-OR+p2%2Ttp!dtz7+$SWmdbxh%D`W~9Cz zCmJGg8IovhO{UIUOSHIX(?4;}{0LapxwT@+-y=SU`BHR{K%1)8F?n*Ly%BBkr`VG4 z2(r-Y^`BpvQ;R=+|T;sa>dnv+wi!&ub7fS*#v$8TcBPd8$ zuE?oYCCHMm@D0{lJ2|d-7f^*?7^z;N z-}&gmbeGmTL|ynf{2V0P)vy^|A37aZn#d?+Sf3lf6C5-Jd6+38Y1&Cy$pyVy3wKTb zOtFA#(JmOY;(}4VQzN;uQ@NeHG(mQr8v2qEb(Qzd6OTDzRKXfyj>I6G9XwPdE z;l0Tw53(I)tbD#GWUr3LU23sk^QA_)y-_(fE@kaWSL^N?i6`?t)(B-dq`0k!{-xG3 zQr#yN^u`V7<|sQgZbMSqc>y+}nziAtEdlSnp8OD;ZX*%pbmk%Z)-Mw(AbJfqYDIaS zNIifbk5Wd*r#7;`C(Kz%Z{VSK@@#X}JT|^wZ-Fth2WwJK5xF-1l2l0W^SJ@lItJOX z+7a7|U}y9pf$=(6Fl-<{*r%V(MZ1whl|EnA;ftz#wEollse<5J6@}Bt1T0>;^-|=r zabq$T(9Eli{NC7QkiB-J(!s((>h$F4{!B9lU-bb6&FWchVdiE{=t`vdyHzQRw|Qhj z;n~88w;E#CcjS8;s+fgWL&YQ>IN+~C<e*rmbX@LcagJ8#+vQ%`=7OSJ#bzGov&-!zug(PmUkyICYQSK8)I-JG5T}y59D#DE2kb|vAq+{ zSJKULbvqbhoe<-F_nH>mNA7Z?c5Z}fLrO5ZReG-i$)XU$-^gUlE@eQ(z z*{-y|Ogq+v$EBU@h0VB16}FY~0LNW=$tQ?xl7c3Ff1gyK{EAikWYaK>b@zO)a|Xn! zMD!c_3(Ua05Wim=HF=QvA+T6fkpUZ=) zPE*OK&EDdH?qr_ZW{=aFp7`QDkhEYV)5E}^yxV&jwJ~y%m%Cvr?v7eZBEG(bPjel` z%q#pLids{nN2_lz8X_n8xa+s_?qJPq;>%Iq;Nx!Js=UM6LPHVC^Fhez?rI3e6H0%x zi|@9A?@+b~y)JomPJwqnsdioU!&LBP67xM-G=%~dEU%eYe4D)WK2M6MN|mTzH!Q@gFi5= z*jc%B?H1!3HI1*On?G@%RwuRh2bIpk2kFYnk~yxJ(Jaefd6a<}Rc__Q%EdfeNTrco zR3^BqGpW|0>qz=aFrlRPoTqB*!uryeCQZNiLXlNYzr2iP9@%$baj z{aVo@orWx8O0u^Z_2&zh)6(wb_!LWZrGDMXW4fc_71>r&JF4)ZF*<(cryTn33s>){Q9D)~;r8NU5Vsa~lO=Pi7R3TY!qt*fPTsDnOJneIz>y;#PZTev-8 z?m55GxIC!8u`eC+YG`>lcwKp^CY9=E;^s_si(ck^eP$2x3*qhwMdXaVyTnDlSBQ(m zij;^|n@MhSIft)RD`+#XjnRZ-_555Fvzq^e;ZEI3lc7eaPMob6V_^_OCapY-?u^~H zK$s1SVaAgl4|v3X$>T!3@p@cUVH zqKyn+N^_?hRey4>-wjCRqejQY^7z1yj*H__Z+A9drO5B)^`fVp36sRyZ>>uEbSYt4 zx?GQ&mHJUC^GhE`3SP30pDyoXdM1vRZOeSo98=nWG8OHch6mBPOOI3Pu0zg9%Th`N z%$RRs&kR7Ai7Q$ZHmH(pBWR$aGfrNO4jCfO8Bd(fqQo{mMA_OM1UxE=K5hP9f4?1_oSXb8*p zubU$yP_e@p{NYu+VA+cYOhLur77_5p1>aoLbc1lx4%_k(#ndEE9x4YFv!7=;~*U$ zV;*=Y02MfJ4Mdy=S2&t114tkSDyYE9Dp0}P#oFEV)M`K*fC?M9nw_x;@2|Rl8tC9B zE4N};G=X+;1J3+XfNBCBPXE+}0)YQkX-^aUApHGdSp`HiOsjJutknWOjbXE3lO9W<2j#$=t=&(cw=DpQBuGc6-E*BBDE$ z>uGFh30D8ly>oQ=9OxNP*#=qzQP@8@HNb)$Fu)0~5u1>M@g#C z+y5CM4{+dE;|Kdzhb2qy6x_dK_yG(YG#0V1MXnwTI~uI~sIuVre~8jms~rmjN1it?2&D&kUM^WI7Qba51k313e zXV?BH47`B2V*h#O&SqZn{Yhp?~=9ZRdnDf S6bXqR_}m0u4fxXzzWpC`a+cr# literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/MANIFEST.MF b/sem3/task-custom-make/task/fatJar/MANIFEST.MF new file mode 100644 index 0000000..4c3a9ea --- /dev/null +++ b/sem3/task-custom-make/task/fatJar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Verison: 1.0 +Main-Class: ru.erius.lab2.Lab2 diff --git a/sem3/task-custom-make/task/fatJar/bild.sh b/sem3/task-custom-make/task/fatJar/bild.sh new file mode 100644 index 0000000..e69de29 diff --git a/sem3/task-custom-make/task/fatJar/build.sh b/sem3/task-custom-make/task/fatJar/build.sh new file mode 100644 index 0000000..890f55a --- /dev/null +++ b/sem3/task-custom-make/task/fatJar/build.sh @@ -0,0 +1,7 @@ +cd ~/prog/lab2/task/fatJar +mkdir -p ../compiled +javac -d ../compiled -g $(find ../code -name *.java) -cp ../Pokemon.jar +cd ../compiled +jar -xf ../Pokemon.jar ru +cd ../fatJar +jar -cfm Lab2.jar MANIFEST.MF -C ../compiled/ ru diff --git a/sem3/task-custom-make/task/fatJar/jar b/sem3/task-custom-make/task/fatJar/jar new file mode 100644 index 0000000000000000000000000000000000000000..739323b25c3e06b2cae7758f6d843ba67ff24c75 GIT binary patch literal 44483 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 QffxAP23`$#QxCuWA4PtZ`~Uy| literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/makefile b/sem3/task-custom-make/task/fatJar/makefile new file mode 100644 index 0000000..209158c --- /dev/null +++ b/sem3/task-custom-make/task/fatJar/makefile @@ -0,0 +1,15 @@ +COMPILED=../compiled +DEPS=../Pokemon.jar +GROUP=ru + +%.javac: %.java + javac -d $(COMPILED) -g $< -cp $(DEPS) + +jar: MANIFEST.MF + cd $(COMPILED) + jar -xf $(DEPS) $(GROUP) + cd - + jar -cfm $@ $< -C $(COMPILED) $(GROUP) + +.PHONY: all + diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle$1.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle$1.class new file mode 100644 index 0000000000000000000000000000000000000000..b2e122a5e361d5ef9e889c49b13761eeaa8c801f GIT binary patch literal 709 zcmZ`%TQ37a6#k}~-F7W?DRrrP(bi>2#7jkrB9gkKZ6tz+#bDXa%I>y_pTz?S;RpCp z;!HQ5tn+Z@%zS6QbLN}#_5JnebYe)wu!?jXBN$bR$zLFb zF^P_=m{2jrpsZQK^4A&qv*kOpX&SaEZj7q$TH>a#mpf*NZaG(+AyKvjKWNl1xLY$X zY&y}ZPQ$(AJC@wEZ<@Yu^F_%)$=l-6c0A(P=l-p8r6Qwa8Z$b&(5+(@S%#F`Fs$pk zV|d(naPE2C5yrmLB(C8QWXE#3L{;Q;J;<1U-eC&YQ(dpmdWF=XVxAc=$T5Xvax%3Kvl~j zWo1r*VKn zND|SOr$ELpQ1a0as3&djh@Ctmo`jZog9{su^);Rq!<7I literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle$2.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Battle$2.class new file mode 100644 index 0000000000000000000000000000000000000000..7d0f1084224d7ca514287f6e58b36b42bb908e30 GIT binary patch literal 681 zcmZ`$>n*dXm3S21f*&L# z9>AM;i4$vg;@24~JA2)}{jKb8z5jc81F#IsKng=zDN7ldR$2}N1DzPwkxAkwMzm5Y ztZJ(tcgpS!==h~DqdLZPOfYCGwzPxa41KxECBNa8!{xbE3p`t%7dP|!4DofhE*Ls1 zwiMgV#))O2%4OdzlwkN9YjnI)dQNWDC&zhLSd^A2Bnq6WrH>DKby2E{6 z_zXi4^iU4l`IUINT})+^ZQt!&4w#yw0M#l3_TQ8(SbJdi-noYGgu*w zSnI^Ug4h$Z!YlNHM04Cw9{-$SoHHB_hy$odA(bhcO-ehNB0-lLjKn3h?EnWjI?S2QoUyPyE8Dl* zy?}hBw;LG1E*-n&a)*vP4V2=pQmn<@vfLwA%fKLp3=G3A z#Rx{_I%dGZp2)@@se*q3+bc^_9>)!`rsU+xl9uIOdG$(>fgeRyOxS1OKHM+l2_5?l ztPAol>1XU4o2~`fi`u2Mu^Yqcus@a zlS2U2#>e|i4r@p#TvIY z#1ea~eO5earAFiZzUQPy3DXHv&ynk$l;hu^p`@{C2l+eQVKOaFI4OHec6`wGwpoKo zQgmy0xPwA9tZXc%zfalGEBYvM+9otJ;T@E@5wF!wn5zHZ3B%k50+lzFR*VIqyk4!WSwp@Nn0E@ z)!xM7u9+{a`42W=qmH`9rea+vk94G1c`LrMK$7Enj?eMHInq-c%?_5P>hJ67y73%SOdv9zC{dv= zC^|F(SQCY)jtpj7ujP+1+@6&hc3GM97x(P1nMIt8QBH=m3W)M6!ZE>_ z^S2X^2@LyLkMl=&G95`rVoCKR>tj}COJKo*GVGto__kQ+W+izlbB-JD<7}qao*LwT zS74_`xf)%k^HXzLq$R~B#!`*?YDVGAh7T$G>-H$~?0yj5LLz_itU>YTf zmRNWOi@rnTIP?&9w#*>fJd4tSmXhNzLii44(=d;rToJ>k5i7o+G!30x>!EXv(WWYx zs74)Xuo6r8nXwE#SWXlNPr;5$X@%HP+WZyDTXI-DFGfB^K*lH<2*wAtmu^g&e)plqSRWqorM$Mtup@*jsF8TNj#G9w+ zr-^#!FEX`+f+#Fygno&18`CrX{O(rQjLWBB6v&C@bHFIK029f*EeuQDVMM0T z)yhDr<8=kz94OjnzSYr-r=!!bTniMsM zW~x|#W_44k0@2$7x^*FX3MEpGDxbSp!C-Giu>qCXh!xnxZ_f_qbTd3=d_SxDA(rWr zth=X~>~j6SUbw`pszRojk!?EtoGPvQ2UCfe9Bi`RGSxaBvj zQDvu&#BZq9(JQB4`NdpHp|`5aL4Tp8TV}DA@whC(Lwq21d1du9 z*5$CC*S3M!6_vHqxH5;U==0U{&8Dh#H@&-qU3wQ*;~q4_qVIh{1a8B%++)1AaR+g6 Gwf_mh&kS$? literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/DamageMove.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/DamageMove.class new file mode 100644 index 0000000000000000000000000000000000000000..bda56cd721968f133af3471a42942a5cb5552a0f GIT binary patch literal 3116 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 U{RhOoSbI#DZNOued6rQ50u72VmjD0& literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Messages_ru_RU.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Messages_ru_RU.class new file mode 100644 index 0000000000000000000000000000000000000000..7198ae31ca94dedd02dbf7e36ed36342853b3710 GIT binary patch literal 3186 zcmZ{m`Fm7X8OOgj%gmcFgfOHjWl1MxkyIsWORIut8iK{9fJ{KAsCW}@!i8Dl%$*{2 zgQS$!q+sigwsqf^FeGFlleqgl{&er-AL4)Dhvl%bod=oOb5Jy&!6XXR2!KmO1f})@#@S0J^i#q9I9AAv%lHeu5mjquHd`0k8 z!Pf+r1y=-Pf^osif~$g81lI(w3SJX@T`(b-6ud6DF1R81hTsjsn}Tl&z9sm!;5&lv z3ce@!zTl?d2ZA38-V(emct`Lf!H)$$5&Tr}Gr`XVzYzRV@GHTu1-}veR`5H)?*)Gl z{82C^xFt9(s0eNgrUf&CJAzrkoM2wCAh;`76jTLEf@Q&<1b>d>FLC_ULZj!{xsrv} z{`2;Wc6Zrxv)%n}$=h$CDeaErZLeH(EbM$>_(1fXweut0X|L$!NA@42i3}C;o|E?| z*mnB#syW97&pSgZ8av?TUGJcU`aNBzEHv~M&Qg9uzngcCmUDwnaljtTlB^qXyxtYD z_B~x|%gKSEtPyNZ7s|yU=di2ho1S+{C40mvohg>joH)5xgG<21U;=0Gd4?NCyUKkF zE&f7q*`Ero_|;${xN4!cui$oT9BpbwiyE zt^_xzGF)_=m#C6t)ZsW|(>Ko04mxLFq)3tyV~lT#u~uq>GHMs?>?JjBr~H&=n2XHO zoO$58IyqW!O9d*lh6*~P5~Y^nrL5zO>JZnXHxnvi)*ZIpyl0_N@>BlXtm;%MO#Mot2x=n1^m@3|{5*u(w2|qVaZ)SLgwoht94NiP@fK4_(miU#WnxE_ucB$cUZ? zyIFOuo9Ss*I4bfo3HK@WSPg%XCs@8v)9X;KJK4YOFQxb~lk%rS4~%zBJne?dC0Bd* z3GM7K(x?}?#nec5xOVJx6j2Ct&wUF{}GQZr#>NlH4 zx9^-kpJKWw9bD$@&SJUS9nKZHOHQ|*$GJkj`~GW)C++>W>#XWV{La z9OBn@{#yKPe0&zxExuSd%V#WvaXuXk^Qlv}@mHrdR8Tkdz|5y17^#WY{ReT5qwe3W zQbm2HKG~4YG$b3-nZ{%+orxvm=}bH+>5L?s(wWv+vYF3#a$R~3iQ8D;x~qzoOnqY& z8)(|9rW@0I8jw`5iJ;MdHU$q6#0+Rx@GwE#fXxaXArJ$$DA-ESTC>@vWV@1@QHPR8 zmDH?KN;;J^8J)+J>`>Bd$WA4@l&mvkw~}`$Nf@$6NtcrKhCHt1-AY;vd5@C!D%oJj zUM1a1S`B%hlJ_gwXvhbYJfS3M$dgL;DcNMmQ%asz(q_m9m3&CaLxy}<$$lm6h8$4x z5hV{Ba!|=fm25WTV@i6IJYvW*N_v%SG31bvJ|$ZXIjrR4O12sDEJ+3H6>T@@h)(*1 zk`6GQA3_ra#TsmkYh@YE9o@klS)n~dCU;LHzWs?>@eh{l2b}{8uBS6pH8Q5 Xqwd}oY33dSny?QEZi{o;?{NPI)JVd; literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$1.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$1.class new file mode 100644 index 0000000000000000000000000000000000000000..ca2978b94b17fe27837340fb663f7f7467124524 GIT binary patch literal 598 zcmZ{h(MkeA6o&uNZP&In(=;_9x~R~CwxBzs8!Zqt0;T&^C)-?SWOo&MjOs<|s_3Ez z=%J!BX%M&#%$(uOf4=h{=JV_Q1HcJNCYF#+AY)=3Spzu(c?SK|6>fOOuw8EY6WhHR zNju>7SPuC}3cGVZ=GA(=(WqQAXf@gA45_9o_~m5O<$lNMdX&+fFm!rDhH50_Y6h!D zHTZo~{6wDzJ>TsTFR4VdxE_$8} zNY&!ut?XOSVGvQsnKc6i3q@=)6eFfopq*m|t04sUYn~GXJYdNGBV{N>z3?D#2C6PT z;330ad2xb>p>PC^K1QuLZL$sWO}AY-RZQ+5lnYu;&l#^^FO;Cke}s(A2c%(QWnNOG vjDjr49!X#!IhSowRK_I!-AvMH6oJGyLT7~@ literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$2.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$2.class new file mode 100644 index 0000000000000000000000000000000000000000..1a97fa1008562610e750f3bc75d06cd7925e616b GIT binary patch literal 840 zcmZuv-EPw`7(H&gqzQqoqx)yw24f`awhY8w5kgu)47I3Ir`@})mj=?fijzrw16}}4 zf|md;VB&%Y;Gqy-wn~%0j_l9zcYMxgAOHUI^A~`pcx=PQQW?uORo{glhgg=(=#Yo2f$z&`V&8BzCP&$$W!7$qj zWAQc{^+a;Qdl9Xa2SW9eut(FX>$TqTbM8kx4*YJKgmKWIJ$yWlCS4JoHTj4K1l-iB zb*@z#S9*3=W=UVX3UdvsEziY4PEBkt<9;L+QMW}plmipn4sOArN>rL;K@bTO4;}2_ zkqOsb!-)#}Jj%B)ENKwe znKfNTC`Fe*%*8;Y3_I@scc#5YolH07L{WI%p(E)G%=6^Hof}u$JRLI3Br=N!YTbkZ$yc-EeX7?b?r*x*gM4`EP7#iD^e#%z;K&pTQKMYtlhf1T>1g_m42uu z8V!oTM^rG2xhcFxF<&+23zsN<`3HMJ*b3&S*nMIs5u#H6Mn|b)Mqa}F@EzqF2^$3h dd?NbKRM%aa7f{6l#S#{2yieUGI*TGu{tFg(#3BFy literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$3.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Move$3.class new file mode 100644 index 0000000000000000000000000000000000000000..1b6c3a421f37dbbf83dae1c353b5a022bde3149a GIT binary patch literal 956 zcmaJ<+iuf95IviuabipZrO+m&>4g&P24N(43*sdKwNe6+QuW<&HtB-nwY*NH`~-i1 zkhnZ^c>u%%AHYW;#z_iNyTX=t*E46%oSE5QzkmD$@DO)R7+5P{-9#CcA~tZ-#3rf+ zwhZhrk5O?4!<5*0eDt-+RDd9fl!~n}Mek zR}5PkX!m5Q(u&g%hBXah?%B|JxKh+!V$O~@HLPY|oQ8Hlx-`ASBZ|yHmrBz0HuckN zD;gb(w$trWJn6^*!=`q0Gm1m!826EU$vPoDHpfC;JU~3zeN}v_Lz)DO&qY!8VC{?S=vIz@eH?v9V;Jvrb zc;R@Xz4gWm1(A--_yhb=j?cT}$#p*#E4^fI@I*v803&4gD9|-ZGg3UO(v8dot zWWK;KeB$WAM+!cU%;%pUq{P7|3LZ;P3$|^#xvE~Tn{^3tHs4J42s{@B$15%x6XF*B=^teM(2#G-`;r1X}X5F zXo+UV1j(dGL&2viKEtSr2}}ubN5vRkP;o?G0slN{(2{E9ATj_s~YQXf$WBj@e@$(ghEE>&~ zEQY|-oC8mD6g1Cp2_%9prHlTo5pwL?gWWJo?i+t1ufn52xO zjj|iHcZ-GCYG1R*VP3|UJaBdmpv5z*vh zDB8p^qFRc}u$C6)-iR>uDzu&7X_B`A2UkXnzc>=!?Np?g)e!T#!MxJE{UkE{lbMob zOye#+WZdJvm35xG5YNW6Ul5)+MC@0@_wF2`o!WT@_1mXVPD@BB^Kmjw9 zVYH3ROX$KYc-3bdq85NK86(20Rlt_l1BQDIulvwp9~$ZIc!tDJ7qE|seFL*TwvSfP z0_i;e7Ntel+<(LB=);@1@3Re3i$^|0@?zXCh=~BJpY8(xvx2u->}!; ZvpjE;v<*27Q}@%F5>Xhs$JgC0{TDEhy+Z&1 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/PhysicalMove.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/PhysicalMove.class new file mode 100644 index 0000000000000000000000000000000000000000..7a5c6c450a05a512b2d3f8b70a256277bb475d24 GIT binary patch literal 742 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 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/SpecialMove.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/SpecialMove.class new file mode 100644 index 0000000000000000000000000000000000000000..426b22702197b2653c57ce683060a2e7434c04d8 GIT binary patch literal 756 zcmaJ;T}uK%6g{K1o9pIhW*=(b;78<3Z$==lf@Be_^cvGP%9grftI)5Cd`Re_AJC7A z?x;b?(kz@ibLX6U=HC7K{`drNh9eEDNJvWcNxOwO|9Cf zH18^{R;7B$u;tZ|J<2S4Wl%f9o!3lz4s2FKP9*YcY1HbqYqLg;s`U5e3V_Lh z5QgZqPmxhvDNMoMXv3frYVZ+;h^$kFMn@>=$57}4f`wvkGcbj3SrR6f$V?JmNb;1C z&TBJCQc0>)_?KmI@<|{@(&$2#BX2*+qQwaU?^rpRK%wBgQf~f6g(8q9j8XI<{sWRi Bq9p(T literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Stat.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Stat.class new file mode 100644 index 0000000000000000000000000000000000000000..36408e1cc721d871ec5264ec681fbe5af087fa49 GIT binary patch literal 1325 zcmaJ>`%@B86#gzO?1HNj`2ryynekA`%3hF3xF$*Jw8#whLxZ^58Y~SD|EiiPtZZs( z{JEL_rKWQ)Nc7PC;e7j@d+s^sJNNE>|M~eFfSY*Yf`mJ6+{HZ^(=y_2_>kb{K3`c> z;CB-~;ABZbfMZfYkmExImpG;rjB#96FwRj^Fu`#}!6e5=GFBOEtD6kIOtld+_sW%6 z&4|6Kyfn%cE2h^A^*Dnwnaw6sYYg(TwxX@;8iPaM)U;)WKEhNwnR$L1(tqmcgeu8Y zYU^n-m8bn$E~%$C)+yx+b9dLU7}z$sr*g^6mZmfKpPkpnVWHG8Y7Bu;_`EnNRoOKd z`ZK0wtT)O#Mm1a5DUnAO2{!f^WoZvT9oU@$h-26Q*U>7a4~CvoXCL z&M~-jbKfe|8&xVKg@j8nYpZRU_E4CFDv4sLoroN?DcaSBW;M!*GkaL1b8zdGMzv_H zm|TpDAI=*{1{ac;3mk;C2q#J8Ruq# zn@Nn)LI0i?Z}1wz)ng4H4+UR z!x;&Ffc&mgp^sK+jVkq`2YrYUv*8+5n8)>Y#ULT?(GhtM`E_S&tGPiaxIur9mY5$T zjz4d{K+1a+yZsohBe(_Yky=a@tk=)NiA=kc)dq=>o=p-#c4Erdx*LQ*%f3Q6@Gw z(_)@iJkT)3^`VAou4@`nT-PCk#rtQhiaf8D{KO*9;CDO|$Kr@0xG@ zMl&>>j@Rk73k>q}y=s}Nx2u-*%A%Lu%8pZ^Ox&?8YnMUWEmcdl%h%MU{gS{kJa$VbIxNnEc15JK24PgcBTvG=UcF6wC08R;< z*=^PQ?SOL+TugSABO93I$2n)7)kU0Okc`KU>*x#xIu1_ls|d|_8HPSVjsyd+@z?8HHGRIaqF^P z5?Osr&V51r9P;&giO&m?=)Zs%{fIZWJbMP^)3xSzC?nx6G-N1VKz$%c{=EMN*&S13 zXV6ZO5Js1U84$*Z3o|IpkRr^mFe9okqr!}7!iF|LqD$t=5nTv39%0aNl?cO* ht40`gTrI-5a|(6^suLdZqfGOVaDkgej&c%~e*=@>*7X1Y literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/StatusMove.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/StatusMove.class new file mode 100644 index 0000000000000000000000000000000000000000..0a924926bdd39f554a034dfcfb7a74b627300c0a GIT binary patch literal 1767 zcmbtVT~iZR7=BI?vYT}w5TppGpdxM(OrWK$Z7c%fN0dm~P+PUyF3SNHlI%{hafXZD zwU@o@bb8YZZ@6wpgX7l^=ufIn>-%m%P*-~4Wad44&Uv2aykF zlVp>M;Skaqnb8;4k+@HqcimSUt>iRnmb_?lxN$neYt#$QU71-k@0vRL zF~H_1n?W5Ha8bu4Tvm|RaRpZedKs53o7I(U$*bAbm6?WJUXnE(b0`RiA^y0gV;)6; zP==;oqNw029VIO2_!`$0e52!A+)!{+$1QxP<0OU!)T$%>z!copaR=Y)IKk_Yie0Bz zj|9|Z*L(6SV4ve6fmNH6CGwP0YgJn7)0Wk!nbyX8Rp_Qb=blt-)IC|D_Hr7YK+l}N zV>{U*WyqsENwbpU&Tw5>T@pBLv=Dw8=NH$goVnzlrPne`#Mkhx&3*CelB`=bdy%3) zXuK^Ju)=1JDFc9EOLDuW$3cC;{C4rHkSl=p44#((y>7%y{ zh=Rhz0NKMdJ4U0Ru`RU)@h5$dTVyqad>g?5TA}MjmfoB!oG%#feZ3?&jcPKiB%ZVclL zrSdXHP=tXWk-{%X<5y(RB+L_xlLg|4zCcJkM`5&g=pVFEKInnjPAeCaYqY0mTv^cH RON8I2|AS2tV8qur^%Aedp?ClQ literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Team.class b/sem3/task-custom-make/task/fatJar/ru/ifmo/se/pokemon/Team.class new file mode 100644 index 0000000000000000000000000000000000000000..793e1173d5d2d0bc6c7e2f0671ff19eca4f82da7 GIT binary patch literal 1678 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 UY!3v4`SP2G00I*E@cQ5X1AQl+SO5S3 literal 0 HcmV?d00001 diff --git a/sem3/task-custom-make/task/modular/MANIFEST.MF b/sem3/task-custom-make/task/modular/MANIFEST.MF new file mode 100644 index 0000000..5d87186 --- /dev/null +++ b/sem3/task-custom-make/task/modular/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Verison: 1.0 +Main-Class: ru.erius.lab2.Lab2 +Class-Path: ../Pokemon.jar diff --git a/sem3/task-custom-make/task/modular/build.sh b/sem3/task-custom-make/task/modular/build.sh new file mode 100644 index 0000000..bc7fefd --- /dev/null +++ b/sem3/task-custom-make/task/modular/build.sh @@ -0,0 +1,4 @@ +cd ~/prog/lab2/task/modular +mkdir -p ../compiled +javac -d ../compiled -g $(find ../code -name *.java) -cp ../Pokemon.jar +jar -cfm Lab2.jar MANIFEST.MF -C ../compiled ru/erius diff --git a/sem3/task-hex-make/lib.asm b/sem3/task-hex-make/lib.asm new file mode 100644 index 0000000..1464127 --- /dev/null +++ b/sem3/task-hex-make/lib.asm @@ -0,0 +1,32 @@ +section .data + +codes: db '0123456789ABCDEF' + +section .text + +global print_hex +global exit +print_hex: + mov rdi, 1 + mov rdx, 1 + mov rcx, 64 + .loop: + push rax + sub rcx, 4 + sar rax, cl + and rax, 0xf + lea rsi, [codes + rax] + mov rax, 1 + push rcx + syscall + pop rcx + pop rax + test rcx, rcx + jnz .loop + ret + +exit: + mov rax, 60 + xor rdi, rdi + syscall + diff --git a/sem3/task-hex-make/lib.inc b/sem3/task-hex-make/lib.inc new file mode 100644 index 0000000..c70c4e0 --- /dev/null +++ b/sem3/task-hex-make/lib.inc @@ -0,0 +1,3 @@ +extern print_hex +extern exit + diff --git a/sem3/task-hex-make/lib.o b/sem3/task-hex-make/lib.o new file mode 100644 index 0000000000000000000000000000000000000000..a398cec41585eaaf340f10637dddb660eac47295 GIT binary patch literal 928 zcmb<-^>JfjWMqH=Mg}_u1P><4z~F#jLfH-s>|3sncB(Ct?TN}z`cNNodDKg=GG8jzFF?KdzqGBzAtk=>Q}GJeps!cwGMB(foklqjv*Pgkc9rGLWA&GQy+vWa+)bJ3v9~VfddPGD|>K$wBSo2GW?WWncgRVb4E^ literal 0 HcmV?d00001 diff --git a/sem3/task-hex-make/main b/sem3/task-hex-make/main new file mode 100644 index 0000000000000000000000000000000000000000..c8034ed4026f07613d6229f9f7693459653f40e8 GIT binary patch literal 9024 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 P?a#;yXTHtACc-}fn|&<1 literal 0 HcmV?d00001 diff --git a/sem4/hello.c b/sem4/hello.c new file mode 100644 index 0000000..0fa5266 --- /dev/null +++ b/sem4/hello.c @@ -0,0 +1,12 @@ +#include + +extern void print_string(char* str); +extern void print_file(char* fileName); + +/* hello.c */ +int main() { + print_string("Enter the file name: "); + char input[255]; + scanf("%s", input); + print_file(input); +} diff --git a/sem4/hello.o b/sem4/hello.o new file mode 100644 index 0000000000000000000000000000000000000000..e45472bdd02caf598304100921eb0f535d48fe8b GIT binary patch literal 2000 zcmbtU&1(};5T7Ld@S`8G^iZkD3RWuEN1_EyK}lQEE*Na7&8@I((@hhb?3UdZXg&CG zP$;F)|HP}ug5bx^qyK>5!GofQB4V6*`(FC8-CT5Fc4mGv^X9#IZ}w@SxR6XFKv4qj z!HK0%faRVOJulQe48b7$7{2_gWbS=7pMOnb-iEo~Gck#NbFXlmJu(mOQtTJ{m;~Tu{7?oPxF9M(#ykd{BZUz!707WTMefK;rQV zBzDq?@qzv`hj_qCh!Yce^eGIbUnb`V`;rxmARwNor#|4Ixv1qjVL4I6T`0&v(J^cfq0R)axEA zL&L7QU@aDx=4Ol5(!#>S!m718J69}NuqHrTI?XX587~z&31d16vOQV7?a`Wv|h2T=cmfcNosb zlxTyrH{B-N_PuS#=ew9gD>+rG;^QE;OaG5zU^2~0^rhtyBU0}xw8B`WlN?8;p5~Et z%E(bVl;C-kR7Xv~n8fKG36D2 zqX(h>UfQ%jom9S(bLdpM9`{o>G(8%-fCL6ZO@qSS<#k=H;b%lSpSKA@d@( z6sjoVAc6}QE?u~C(Nz~i7Kv0ay3N{!%K=enX`#4qJm>y7$vhRIE_*M`JHK=8IrqNz z&3yy!&HeSjk%KLX1Z-=;Ua&XNo>w7#1iH5>*Ti-qi9FU~jmllM+(nc(p0;)4S&McZ z;5kx^#)p~D+Iu<;*4jL-`-uB8e4v)eD`Rb1d$?n)t+TGPP64NYQ@|Ba=t4x*{3s55q5d*w9%tA5FF%M+R`91tOMDaBg*(w9yanrpyO0syicaCr z&@H?TJA}KD6aE}|;U4T4&cYM!#c|<2d@tOOVd0$^5&jCJ!n;ur-h-lW4(Elx#zo=1 zxFWnCSA_>~Q+N<}g%992;Y0Xc_*>M3k6>Q-D3*ke;fe5fcq)7Xb>U&W5I&8+h0oxn z@L6D8p1(~DVgzYnAM1rjkrDm@UBctoE*zpqxPYwi1a=8eVz=;*$O#v5P`Hf4hSeJ5 z6H^P(FO`DnY)~n2YUL5yYI<%$5-|?>R3Y`TW{BEI-@IYX(PvYeGm2U{PEVB(UD(h zsdMAEyxeSkhj!IEwsV`1GS@n_7r);4TakJ=xyfXXVaC|oy}23td8!qbzp{Uv9irH~4xek;Y6I7IV7=P> zJ>-DpXi(|f&c7LZ?4FSEEc++flWb_6cK+?i?3m=zX8$GrapEU)ttTTa58<=g`p>b0 z-EZ;to$-~%$1>_`v;Q2ggKX%m#a8yOT&z~d$$?920EOG%iAA4Tx)J4w+gxbT5B!{7 zvFM`P-#$LD7QCq2Y5(-+qTBr4ZT`K&BArd|Z_&@bgb$AOZ7jOGc{$Vk(e(kr7Oe{L zMQTvl{rVTlp%XQld8m1HsQ>Fs^Op-WWBLM()VdB|vFNbd{1Q8s-s*HZITWqyeT+l5 zXb)r2^uhFjMO2}ZDCE67B)sCZ2Z_n@q&MN^$50)q1vR%Piq*UraYud(jUnOpOcMLA zLTl}Y-#V+=tXcJj(7E&F2szPtM?&^AE|uH-_rLA8GT-Fa%dZ{GdzX=~_AuXO_$YI^ z@6sJd(Sz%x*bA2iHi$nShNS%qm8;eAjYNL31|{4%FE=(-DnW6&;z47gQulJWv6cEE z2&!DQSU=>ISGE$>@$rU1#d<;fr|4{Gh+w=@rCJOYGQ#VjeGBiF+;Pi;{oRSbC5Yn! z`%~q>t=e+%1UQtCZ`3^Cz$V=r2kr#AkyISG%O5k)y+E-P=)2)2)%U{S=f`55r;A`=F*e3oonQ zule4AgK$jw2)w2`2XCq#g&Ea(IH7tBW>r5A@2W1q`>Mvxpa`d$%5YGry~K^2z1UM+QYieq-`$a*L)Ig) z-eb7L{YJx6JZ_)ik`Ep*T)qb>!zE8-440hotl^SB3WiHAX&9d6b-rr2%o=`*=N&a%;;?GCzHan2Yn`FP%NiT}3Ymw23S3~w|4-tYzH{{Xxc3*7(! literal 0 HcmV?d00001 diff --git a/sem4/makefile b/sem4/makefile new file mode 100644 index 0000000..b7d48a0 --- /dev/null +++ b/sem4/makefile @@ -0,0 +1,25 @@ +GCC = gcc +ASM = nasm +ASMFLAGS = -felf64 -g + +# Если есть код на C, то компоновку тоже нужно производить +# с помощью gcc, а не ld +hello: hello.o hello_mmap.o + $(GCC) $^ -o $@ + +# target : dependencies +# do this +hello.o: hello.c + $(GCC) -c $^ -o $@ + +%.o: %.asm + $(ASM) $(ASMFLAGS) $^ -o $@ + +clean: + $(RM) hello + $(RM) hello.o + $(RM) hello_mmap.o + +all: hello + +.PHONY: clean all diff --git a/sem4/string.asm b/sem4/string.asm new file mode 100644 index 0000000..8587d36 --- /dev/null +++ b/sem4/string.asm @@ -0,0 +1,39 @@ +; string.asm +global world +global print_string + +section .rodata +message: db ", world!", 10, 0 + +section .text + +string_length: + mov rax, 0 + .loop: + xor rax, rax + .count: + cmp byte [rdi+rax], 0 + je .end + inc rax + jmp .count + .end: + ret + +world: + mov rdi, message + +print_string: + push rax + push rdi + call string_length + mov rsi, [rsp] + mov rdx, rax + mov rax, 1 + mov rdi, 1 + push rcx + syscall + pop rcx + pop rdi + pop rax + ret + diff --git a/sem5/ast.png b/sem5/ast.png new file mode 100644 index 0000000000000000000000000000000000000000..c8caa842506d83c99b4ec41e1d84e6ec04075791 GIT binary patch literal 21244 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 Pzj}?WG0$V*Vb#9@q%xX9 literal 0 HcmV?d00001 diff --git a/sem5/generic_list.c b/sem5/generic_list.c new file mode 100644 index 0000000..a306987 --- /dev/null +++ b/sem5/generic_list.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include + +#define DEFINE_LIST(type) \ + struct list_##type { \ + type value; \ + struct list_##type *next; \ + }; \ + struct list_##type *list_##type##_create(type value) { \ + struct list_##type *list = (void *) malloc(sizeof(struct list_##type)); \ + if (list == NULL) \ + return NULL; \ + list->value = value; \ + list->next = NULL; \ + return list; \ + } \ + void list_##type##_free(struct list_##type *list) { \ + struct list_##type *temp; \ + while (list != NULL) { \ + temp = list; \ + list = list->next; \ + free(temp); \ + } \ + } \ + void list_##type##_push(struct list_##type *list, type value) { \ + if (list == NULL) return; + while (list->next != NULL) list = list->next; \ + struct list_##type *item = list_##type##_create(value); \ + list->next = item; \ + } \ + void list_##type##_print(struct list_##type *list, char* format) { \ + while (list != NULL) { \ + printf(format, list->value); \ + list = list->next; \ + } \ + printf("\n"); \ + } + +#define list_create(value) \ + _Generic((value), \ + int64_t : list_int64_t_create(value), \ + double : list_double_create(value), \ + default : printf("This type is not supported\n")) + +#define list_free(list) \ + _Generic((list), \ + struct list_int64_t : list_int64_t_free(list), \ + struct list_double : list_double_free(list), \ + default : printf("This type is not supported\n")) + +#define list_push(list, value) \ + _Generic((value), \ + int64_t : list_int64_t_push(list, value), \ + double : list_double_push(list, value), \ + default : printf("This type is not supported\n")) + +#define list_print(list) \ + _Generic((*list), \ + struct list_int64_t : list_int64_t_print(list, "%d "), \ + struct list_double : list_double_print(list, "%lf "), \ + default : printf("This type is not supported\n")) + +DEFINE_LIST(int64_t); +DEFINE_LIST(double); + +int main() { + struct list_int64_t *list = list_create((int64_t) 5); + list_push(list, (int64_t) 2); + list_push(list, (int64_t) 1); + list_print(list); + + struct list_double *list2 = list_create((double) 2.2); + list_push(list2, (double) 0.1); + list_push(list2, (double) 5.7); + list_print(list2); + + return 0; +} diff --git a/sem5/print_var b/sem5/print_var new file mode 100644 index 0000000000000000000000000000000000000000..d15ca4584a9a8aea915a5f4fd4073169d76679bd GIT binary patch literal 16704 zcmeHOZ)_Y#6`#9{lgq#JB_yqrlz3YlDQWS>P95VkHMz6zoIT|HX=2krn{Lj&wSDOR zn7h5!E~o^#t#l-&`2wvVA3#EY1V~YZQ20_D+@?V)s1Xths!Bsez(r|sLW)A0lc z5{`{xqgV{`BFS0h5euNyN*DZ23=$szM7sve)WEweS}<}85z%hJgbl*PNauleb;y(K z#_iNjMlP?`r=T$;MINg-iVBbz?RMCN)6KG2obGhuA*$~PA={ydcIU|M9N96>QhkgZ zPmBqEJ1CxRRG`jD6hpDlCivL+0NKi^@DH5UjF>KZ!B+k@Ir2+k$qsDsDlaZxl5qT{Q-5X z^ZzQ+)$V=X_)S(43mkR(;hQ5Hf4q_PF#b_a& zGlzt(4~`}Ep>!^pNk3_Th#Gp)OcqQ%n@s1#?%qUKx4uo?rfwH{qHm9$G783Ux@a1O zzCGQUe9q`g4rI`BIGfLrrEaO#RK#ZaDasscpTN)D9zv0WShx1pcog@b~(SA7~SogW9pW-)|K{duGb?S6ge(WSWS3jtO_a|+rj_5;CjK@Oh9ro`$0fp$OAM7BQ;aB4~aO{07 zexrOA8hA1U{{w(5X8v%iQhDiKtYEV9xhi`O**h$DqRPGqthD;o^pINL_%u2YGTzaL zdnY?TyibVeXA|Y$Mf(%w_oIE$@{N9NviUO52Ya{N#A`a!2rjfUHv?v4>l+lW-tyJn z@_VuJU!s*YZ)p?LK5fUFrN83!e&lfU(dgmmV^Mv2Xs$v$E$j)1vY%9YhHQ^_@FL(v zz>9zv0WShx1iT1%5%415MZk-I7lHqg2>9S_(3p}gDw|TvMB6sbJ)SIZ7G}H~0y`sc zKKSnF#@{Lx6Y#FtO64TrCjoy7_#oh;fSayVDz5<^2fPe;1F#LI`S>mrlkdp`!Z#N7 zZCJ4+c!GF*$A1C*;v`(emdIDPO^|Ja?@{0tKoJV}gc?3mzx;{dQL$_N1NYwFBwsJ0 zU#xcw^!S}Gsv~d0chtpWUB}`35VcptL*Zxr-76RS4?>HedMNubd|!Za15osY!q52= zp@y#q;vr>nQ9QKycwH>i^6X+Q)G@JScPNqzbwoog(a`3ukkS=u=n93qLP7a%_!^i` zfgk((IdthIF9Kc!ya;#^@FL(vz>9zv0WShx1iT3RClTQFhrHeprcyF7u3%?0DOySL zW?J;Qj$~ffxPfF|uehFMUf+oGCQMxZ{;f(L$|e+_s&xZ7cieG=?0yp7E3Q+IcF zKcH;xA1LL_lCnc>Q(Kx_OHyimYFmri(x$d`L+LaE7zM5HEPFZS2u!`1y7&U#k~zTcfZJOmUwW90+lW7YNe_R;|Sn=(>Ue{FSN zgH!(w!OsmRf2XL`Zv*fY;QQRE4^OFxow4!(v0j90^86H=v%&jwk+@QsW2_uLAN_Dq zPPpO;%P%B9<>K!qo}agt7a=|c8K12^{5`Jx#yeM_n&bwaI!295->b_pDkv{)!a20RK%>4dyRr;BKeNVv&_{IGD zA_)9yh>rqY6chihGytzi#(5Z({QQ1`|2c-mx_SL%HSnwb^Y4qD$U9w2Y2N~Tj{Lj( z=a+z2YWVpY@T>gm1V3k4<$2_>W-_9m4}mMBFb=0^KY>98F9C+3zcoaNATUY)2=&{o z#QzL<)DOG#e@XfY@{j+aVtN&LY^PiQx4!+CfYc=<=HlNMsIU>401tRxx~bNe-P zGpi5cj*TMh)=1^`;Y@xYnbA{bzEISYr7&yHpc(@3cuE$ywfm2j^}T2B@V$#LDt znT2sNR7hqGJyptP$HBxV>7Z#kROO}<9sb^icIkT0f#{yN9^V_&VZVq|IVJSi=k`YT zB)Xj?a$^cmuwh4!Yve(T9T58N-hExsUVUFr&%t<~-WToajiXn&on^3ClFh#T1{Ncg zG?TP1CK7S%dvWiIaTlYdwesq0B_3}v^0=Lfr7q_YKLKC+o**8VF)FBJOFTYi zsvR|&*NIgDN^M6-RJ*2*>{oN4E-#Y_IBjHV^@rj!v=aVd>jf@_;P#rxv~^EZoA$7 d5dJVhTIzDn^;)Gk_O5N8?65S}y9`{S_!p%KQ{Mmp literal 0 HcmV?d00001 diff --git a/sem5/print_var.c b/sem5/print_var.c new file mode 100644 index 0000000..ccd7752 --- /dev/null +++ b/sem5/print_var.c @@ -0,0 +1,11 @@ +#include +#define print_var(x) printf(#x " is %d\n", x) +#define var 22 + +int main() { + int x = 6; + print_var(x); + print_var(42); + print_var(var); + return 0; +} diff --git a/sem5/printer b/sem5/printer new file mode 100644 index 0000000000000000000000000000000000000000..1813e59b32a5915e44de3e2e327c1a43a20ec5cd GIT binary patch literal 17656 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 I3|y@GA5GiQ(*OVf literal 0 HcmV?d00001 diff --git a/sem5/printer.c b/sem5/printer.c new file mode 100644 index 0000000..452c706 --- /dev/null +++ b/sem5/printer.c @@ -0,0 +1,119 @@ +#include +#include +#include +#include + +struct AST { + enum AST_type { AST_BINOP, AST_UNOP, AST_LIT } type; + union { + struct binop { + enum binop_type { BIN_PLUS, BIN_MINUS, BIN_MUL, BIN_DIV } type; + struct AST *left, *right; + } as_binop; + struct unop { + enum unop_type { UN_NEG } type; + struct AST *operand; + } as_unop; + struct literal { + int64_t value; + } as_literal; + }; +}; + +/* DSL */ +static struct AST *newnode(struct AST ast) { + struct AST *const node = malloc(sizeof(struct AST)); + *node = ast; + return node; +} + +struct AST _lit(int64_t value) { + return (struct AST){AST_LIT, .as_literal = {value}}; +} + +struct AST *lit(int64_t value) { + return newnode(_lit(value)); +} +struct AST _unop(enum unop_type type, struct AST *operand) { + return (struct AST){AST_UNOP, .as_unop = {type, operand}}; +} + +struct AST *unop(enum unop_type type, struct AST *operand) { + return newnode(_unop(type, operand)); +} + +struct AST _binop(enum binop_type type, struct AST *left, struct AST *right) { + return (struct AST){AST_BINOP, .as_binop = {type, left, right}}; +} +struct AST *binop(enum binop_type type, struct AST *left, struct AST *right) { + return newnode(_binop(type, left, right)); +} +#define DECLARE_BINOP(fun, code) \ + struct AST *fun(struct AST *left, struct AST *right) { \ + return binop(BIN_##code, left, right); \ + } +DECLARE_BINOP(add, PLUS) +DECLARE_BINOP(mul, MUL) +DECLARE_BINOP(sub, MINUS) +DECLARE_BINOP(div, DIV) + +#undef DECLARE_BINOP +#define DECLARE_UNOP(fun, code) \ + struct AST *fun(struct AST *operand) { \ + return unop(UN_##code, operand); \ + } +DECLARE_UNOP(neg, NEG) +#undef DECLARE_UNOP +/* printer */ + +static const char *BINOPS[] = { + [BIN_PLUS] = "+", [BIN_MINUS] = "-", [BIN_MUL] = "*", [BIN_DIV] = "/"}; +static const char *UNOPS[] = {[UN_NEG] = "-"}; + +typedef void(printer)(FILE *, struct AST *); + +void print(FILE *f, struct AST *ast); + +void print_binop(FILE *f, struct AST *ast) { + fprintf(f, "("); + print(f, ast->as_binop.left); + fprintf(f, ")"); + fprintf(f, "%s", BINOPS[ast->as_binop.type]); + fprintf(f, "("); + print(f, ast->as_binop.right); + fprintf(f, ")"); +} +void print_unop(FILE *f, struct AST *ast) { + fprintf(f, "(%s", UNOPS[ast->as_unop.type]); + print(f, ast->as_unop.operand); + fprintf(f, ")"); +} +void print_lit(FILE *f, struct AST *ast) { + fprintf(f, "%" PRId64, ast->as_literal.value); +} + +static printer *ast_printers[] = { + [AST_BINOP] = print_binop, [AST_UNOP] = print_unop, [AST_LIT] = print_lit}; + +void print(FILE *f, struct AST *ast) { + if (ast) + ast_printers[ast->type](f, ast); + else + fprintf(f, ""); +} + +int main() { + struct AST *ast = binop(BIN_PLUS, lit(999), lit(728));; + print(stdout, ast); + printf("\n"); + + ast = binop(BIN_PLUS, lit(4), binop(BIN_MUL, lit(2), lit(9))); + print(stdout, ast); + printf("\n"); + + ast = binop(BIN_MUL, binop(BIN_PLUS, lit(3), lit(5)), binop(BIN_DIV, lit(9), lit(7))); + print(stdout, ast); + printf("\n"); + + return 0; +} diff --git a/sem6/README.org b/sem6/README.org new file mode 100644 index 0000000..84cf710 --- /dev/null +++ b/sem6/README.org @@ -0,0 +1,201 @@ +#+LANG: ru +#+TITLE: Семинар 6: Аллокация памяти, арихитектура + + +* Что такое куча + +В рамках этого семинара мы познакомимся с тем, как может быть устроена куча. + +С данными связана такая характеристика как /время жизни/. +Это тот промежуток выполнения программы, когда обращаться к этим данным корректно и не ведёт к неопределённому поведению. + +Данные в C могут быть выделены следующими способами: + +- Автоматически: локальные переменные функций создаются в момент их запуска и живут до их завершения. + Правильно сказать: гарантированное время жизни переменных от запуска функции до её завершения. + + Зная, что компиляторы оптимизируют локальные переменные, мы больше не будем говорить, что они выделяются в стеке. + +- Глобальные переменные и локальные переменные функций, если локальные переменные помечены =static=. + + И те, и другие создаются в глобальной области данных. + +Других гарантированно возможных способов выделить память в "голом" C нет. + + +Чтобы выделить память в стеке или в глобальной области данных необходимо знать, сколько именно памяти понадобится, уже в момент компиляции. +Однако иногда мы не знаем этого заранее; например, когда принимаем по сети размер строки и саму строку; её нужно где-то выделить, а сколько под это выделять байт --- неясно. + +В таком случае приходится использовать =аллокаторы= --- специальные программы, которые умеют резервировать области памяти и управляют тем, где будут находиться блоки памяти, которые программист запрашивает. + +Функции =malloc=, =calloc=, =realloc=, =free= --- это интерфейс к аллокатору из стандартной библиотеки C. +С помощью вызова =malloc= можно выделить память, время жизни которой будет неопределённо долгим. Она может существовать до завершения работы программы, как глобальные переменные, или быть возвращена для переиспользования с помощью функции =free=. + + +Некоторые советы по работе с памятью: + +- Если вам нужно выделить память, подумайте, нельзя ли её выделить в стеке. Это всегда проще, чем в куче. +- Не стесняйтесь передавать не очень большие структуры по значению. + + +* Аллокатор блоков + +Самый простой аллокатор возвращает блоки фиксированного размера. +Их можно заполнять не полностью, остаток будет теряться. +Помимо блоков нужно хранить карту их занятости; здесь она хранится в виде массива =bool='ов, но для компактности можно было бы упаковывать булевы значения по восемь в каждый байт. + +#+begin_src c + +#define HEAP_BLOCKS 80 +#define BLOCK_CAPACITY 1024 + +struct heap { + struct block { + char contents[BLOCK_CAPACITY]; + } blocks[HEAP_BLOCKS]; + bool is_occupied[HEAP_BLOCKS]; +} global_heap = {0}; +#+end_src + + +*Задание 1* Изучите файл [[./heap-0.c][heap-0.c]] и реализуйте в нём недостающие функции для резервирования блока и для возвращения блока в пул доступных. Почему =block_id= содержит ссылку на =struct heap=? + +** Аллокатор множества блоков + + +В предыдущем аллокаторе есть несколько существенных недостатков: + +- блоки и заголовки перемежаются, и размер блоков фиксирован, поэтому нельзя занять несколько блоков подряд. +- размер блока фиксирован, и потому мы можем нести накланые расходы по памяти. + + +*Задание 2* Модифицируйте аллокатор так, чтобы он умел выделять несколько блоков подряд. +См. файл [[./heap-1.c][heap-1.c]]. У блоков теперь будет статус с большей гранулярностью, нежели "занят --- не занят". +Придумайте тесты для вашего кода для проверки всех особых случаев. + +#+begin_src c +enum block_status { BLK_FREE = 0, BLK_ONE, BLK_FIRST, BLK_CONT, BLK_LAST }; +#+end_src + +Блоки будут связываться в одну из следующих конфигураций: + +#+begin_src c +BLK_FREE // свободный блок +BLK_ONE // единичный занятый блок. +// после него или свободный или занятый другими данными. + +BLK_FIRST, BLK_CONT, BLK_CONT, BLK_LAST +// последовательность блоков с началом, серединкой и концом. + +BLK_FIRST, BLK_LAST // то же, но без серединки. + +#+end_src + +Выделение памяти должно привести к выделению адекватного количества блоков; освобождение памяти должно привести к освобождению блоков начиная с указанного, если этот блок -- начало. + + +** Чего не хватает для эффективности? + +Чтобы аллокатор стал более эффективным, можно отказаться от фиксированного размера блока, снабдив каждый из них заголовком и организовав в связный список. +Затем из единой непрерывной кучи можно сделать несколько фрагментов и добавить довыделение памяти (а именно страниц от операционной системы) в случае, когда куча закончилась. +Это и будет темой четвертой лабораторной работы. + + + + + + + + +* Задание 3 + +В качестве последнего задания на 2 балла вы можете выбрать одно из двух заданий. + +** Первый вариант + +Первый вариант задания - это развитие принтера, который вы увидели на прошлом семинаре. +Добавьте туда: + +- вычислитель, который умеет вычислять формулы. Сделайте его расширяемым, так же, как сделан принтер. Подсказка: в отличие от принтера, который не имеет состояния, для вычисления потребуется накапливать состояние, поэтому функции будут иметь больше аргументов, нежели принтеры для узлов. +- парсер, который сможет распознавать верные формулы из сложения, умножения, деления и вычитания. Не забудьте про скобки! +- принтер, который будет выводить выражение используя постфиксную запись (обратная польская запись, без использования скобок). + +В качестве стартовой точки для выполнения этого задания можете использовать расширенный вариант принтера ([[./ast.h][ast.h]], [[./ast.c][ast.c]], [[./main.c][main.c]], [[./makefile][makefile]]), +в который уже включен базовый токенайзер ([[./tokenizer.h][tokenizer.h]], [[./tokenizer.c][tokenizer.c]]), а также реализация стека и очереди для абстракнтых типов ([[./ring.h][ring.h]]). + + +** Второй вариант + +Второй вариант задания - это реализация несложной структуры данных как абстрагированного модуля с непрозрачным типом. Ему посвящена эта заметка. + +*Изначальный код* + + У вас есть код внутри одной функции =main=, который реализует расширяемый массив (вектор). + Изучите его. + +#+begin_src c +/* bad.c */ + +#include +#include +#include + +int main() { + int64_t *array = malloc(sizeof(int64_t) * 5); + // вместимость -- сколько памяти выделено + size_t capacity = 5; + // количество -- сколько памяти по факту используется из выделенной. + size_t count = 0; + // заполните массив квадратами чисел от 0 до 100 + // если не хватает места, расширяем в два раза + for (size_t i = 0; i <= 100; i++) { + if (count == capacity) { + array = realloc(array, sizeof(int64_t) * capacity * 2); + capacity = capacity * 2; + } + array[count++] = i * i; + } + + for (size_t i = 0; i < 100; i++) { + printf("%" PRId64 " ", array[i]); + } + return 0; +} +#+end_src + + Расширяемый массив в отличие от обычного имеет нефиксированный размер, в конец такого массива можно добавлять элементы. + Как это работает: + - Мы выделяем память с запасом. + - Мы храним два дополнительных числа: количество выделенных слотов под элементы и количество заполненных слотов в массиве. + - Пока у нас хватает выделенных слотов, мы просто дописываем элементы в массив, увеличивая количество занятых слотов. + - Если слотов перестало хватать, то увеличиваем количество слотов в 2 раза (или линейно на некоторый фиксированный размер). + Для этого используем =realloc= чтобы скопировать выделенную память в расширенный участок. + + *Вопрос* Прочитайте раздел =man malloc= про функцию =realloc=. + +*Задание (второй вариант)* + + + Ваша задача --- выделить из этого кода как минимум модуль с реализацией вектора, снабжённый заголовочным файлом. + + - Вектор должен быть реализован как [[https://stepik.org/lesson/408352/step/6][непрозрачная структура данных]]. + - Доступ к его элементам должен быть контролируем и осуществляться через getter и setter. + - Постарайтесь максимально переиспользовать код и ничего не дублировать. + - Вывод вектора реализуйте как отдельную функцию, которая принимает =FILE*=, в который нужно вывести его содержимое. + Эту функцию можно также разбить на функцию =foreach= и принтер одного элемента. + - Стремитесь сделать настолько маленькие функции, насколько возможно. + + Ваша реализацяия как минимум должна позволять: + - Получить доступ к любому элементу. + - Получить информацию о текущей длинне массива и количестве выделенной памяти. + - Добавить элемент в конец массива. + - Добавить другой массив в конец массива (скопировать данные). + - Изменить размер массива на заданный (при необхоимости выделить память). + - Изменить размер массива на меньший с освобождением неиспользуемой памяти. + - Освободить память. + - Вывести массив в указанный поток вывода. + + В результате должна получиться программа из нескольких файлов, которая делает то же самое, но в которой =main= содержит только заполнение вектора числами и вызов функции, печатающей его в =stdout=. + + Прочитайте заметку [[[https://gitlab.se.ifmo.ru/c-language/main/-/wikis/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D1%81%D1%82%D0%B8%D0%BB%D1%8F-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC-%D0%BD%D0%B0-C][Правила хорошего стиля]]] --- ваш код должен им соответствовать. + diff --git a/sem6/ast.c b/sem6/ast.c new file mode 100644 index 0000000..c6940d7 --- /dev/null +++ b/sem6/ast.c @@ -0,0 +1,77 @@ +/* ast.c */ + +#include + +#include "ast.h" + +struct AST *newnode(struct AST ast) { + struct AST *const node = malloc(sizeof(struct AST)); + *node = ast; + return node; +} + +struct AST _lit(int64_t value) { + return (struct AST){AST_LIT, .as_literal = {value}}; +} + +struct AST *lit(int64_t value) { + return newnode(_lit(value)); +} +struct AST _unop(enum unop_type type, struct AST *operand) { + return (struct AST){AST_UNOP, .as_unop = {type, operand}}; +} + +struct AST *unop(enum unop_type type, struct AST *operand) { + return newnode(_unop(type, operand)); +} + +struct AST _binop(enum binop_type type, struct AST *left, struct AST *right) { + return (struct AST){AST_BINOP, .as_binop = {type, left, right}}; +} +struct AST *binop(enum binop_type type, struct AST *left, struct AST *right) { + return newnode(_binop(type, left, right)); +} + +static const char *BINOPS[] = { + [BIN_PLUS] = "+", [BIN_MINUS] = "-", [BIN_MUL] = "*", [BIN_DIV] = "/" }; +static const char *UNOPS[] = {[UN_NEG] = "-"}; + +typedef void(printer)(FILE *, struct AST *); + + +static void print_binop(FILE *f, struct AST *ast) { + fprintf(f, "("); + print_ast(f, ast->as_binop.left); + fprintf(f, ")"); + fprintf(f, "%s", BINOPS[ast->as_binop.type]); + fprintf(f, "("); + print_ast(f, ast->as_binop.right); + fprintf(f, ")"); +} +static void print_unop(FILE *f, struct AST *ast) { + fprintf(f, "%s(", UNOPS[ast->as_unop.type]); + print_ast(f, ast->as_unop.operand); + fprintf(f, ")"); +} +static void print_lit(FILE *f, struct AST *ast) { + fprintf(f, "%" PRId64, ast->as_literal.value); +} + +static printer *ast_printers[] = { + [AST_BINOP] = print_binop, [AST_UNOP] = print_unop, [AST_LIT] = print_lit }; + +void print_ast(FILE *f, struct AST *ast) { + if (ast) + ast_printers[ast->type](f, ast); + else + fprintf(f, ""); +} + +int64_t calc_ast(struct AST *ast) { + /* TODO */ + return 0; +} + +void p_print_ast(FILE *f, struct AST *ast) { + /* TODO */ +} diff --git a/sem6/ast.h b/sem6/ast.h new file mode 100644 index 0000000..9d11657 --- /dev/null +++ b/sem6/ast.h @@ -0,0 +1,56 @@ +/* ast.h */ + +#pragma once +#ifndef _LLP_AST_H_ +#define _LLP_AST_H + +#include +#include + +struct AST { + enum AST_type { AST_BINOP, AST_UNOP, AST_LIT } type; + union { + struct binop { + enum binop_type { BIN_PLUS, BIN_MINUS, BIN_MUL, BIN_DIV } type; + struct AST *left, *right; + } as_binop; + struct unop { + enum unop_type { UN_NEG } type; + struct AST *operand; + } as_unop; + struct literal { + int64_t value; + } as_literal; + }; +}; + +struct AST *newnode(struct AST ast); +struct AST _lit(int64_t value); +struct AST *lit(int64_t value); +struct AST _unop(enum unop_type type, struct AST *operand); +struct AST *unop(enum unop_type type, struct AST *operand); +struct AST _binop(enum binop_type type, struct AST *left, struct AST *right); +struct AST *binop(enum binop_type type, struct AST *left, struct AST *right); + +#define DECLARE_BINOP(fun, code) \ +static struct AST *fun(struct AST *left, struct AST *right) { \ + return binop(BIN_##code, left, right); \ +} +DECLARE_BINOP(add, PLUS) +DECLARE_BINOP(mul, MUL) +DECLARE_BINOP(sub, MINUS) +DECLARE_BINOP(divide, DIV) +#undef DECLARE_BINOP + +#define DECLARE_UNOP(fun, code) \ +static struct AST *fun(struct AST *operand) { \ + return unop(UN_##code, operand); \ +} +DECLARE_UNOP(neg, NEG) +#undef DECLARE_UNOP + +void print_ast(FILE *f, struct AST *ast); +int64_t calc_ast(struct AST *ast); +void p_print_ast(FILE *f, struct AST *ast); + +#endif diff --git a/sem6/ast.o b/sem6/ast.o new file mode 100644 index 0000000000000000000000000000000000000000..c0efedb069b70480f0590f5d7358f22c407bc1b9 GIT binary patch literal 22576 zcmb_k33wdEm9C!Fj7HatWciSgY>zF;mTYTuT0SD%@;$O;*+!Bhf}F9Aku8u$%FM{J z2@4M9h%gWnlMNdTc#|wgAc1U1LVzXCI)r@r_`q4nhHMf(=g#u6;cy^qIK1ywz1ONK zjfgk6K2KM@zur}^s;jEIOTKzz%O;m)2~L(+EhZ>Ng&5g6QErmOCQ&3V5@-E${u(;c z>J8mI1JNf@w&vuyG9>(Sn^gVbSG?a10B}z7ob?ZHD9wdyOKHHLC;WM#+|c3gdr$f2 zZV-~c-~Z~#(D>W_ymWuw=G>>#T_747A43jV-=-Me2_1f=$zPFH8XCW{R2g_WtrVI2 z{lnR%{tB?-uRtSEs#dl`<6WiYP~BBp{q%;?05P|tBb~YaJanY#(o_BYLI2!qK~ZXd zu#MnOX#AtOr?CAU=+F3jZK3hA;8F-(lE!tnP)52H8c&qwLaE(xuAQA5A1p0L2dkmF zPdP|pUFhH*aIgRz3|+eWRKM=u)9L6bM2wsYjc+f2SRFzX{af3V<8ZfLx-;L_b|yY$xgAC>)k-CGI&k(r^J-N=8g^fdIt2laOcRffjj zt2rs7a&rz!%E18<@={+MiG$Hs|Ar6`M+ ziwaQ=xmYX~i7E`og-afv5NT4K7srywHdQaRClI_Hg#F`LD=_oQQI(eF9*8D@l6}va z<&~T+$zrFe%`=ryNpvb=!^|%5bB`i6P459>pCUri>k&mXOCq6&Em=6t98kozXZ0tPr zD+dP;qT7KWwyP$J<4}~mUuNEX0YenJaoqPXKpxrIek>~ZMhUC(5n0Yf_Vlz~xMpN| z-v-V+MAX%iWtY&IeAy*1$R{&N#8$(sAR{Nc6S!p4Gkj}NEfN0wgHYjBHU5i`$Q9Gp zwzZ2uMy3}@Rh3oyJPPHXL2hUWs!Lbg0F%ShvhM^~`Jyc6X5?i*di!L~T~dbkvoByfR6F?JOX~EJUrc>1zPO#tLhpZ!eS!#^6$jy;g`V7TGrdjX!C~ z1%@sKLfL4{L*@w^7fC%^nlI>c-#u*PH6K;0Zryk;gUo+H(+DU+Vhl|0Mkf`vtC1aj~O zgaRP6d^QSk3P|DQOQbM?^JZz&tekeSqJV0x754mkV90c$e0NE?CQwRz;tg=3%<8bu zS{-FpyH!(W?VN}jFez8-99P@f!12FAFwxbzIg?$jtJGaxpt~yNt$OL!@gX4dd z{p5wPlH|V{HZ^uJbl(LTHWfUOaoE&@RvJ1fhm)FY=H}?bqs|#pZ-De7q^!9ma_OKN z!j|e%gl*Qb#s4FhN+qQl8ptepUjvt5U1g?rQ#x+GujUDtH-J1ryjaC@HM7cL!InEp zt62I)W$6!V_I%QjG1`CdIZ04qygQu8Bh{`hkss+ylys4q4P zu!56n>a@&j0V_G9RfrUwJMBZYNNrUt44P_1j&e(NeY$Lgg%gZg+0p~J6;VsKcgEGY z?9`ywt{$riGJ73xNyOy$N>Sbl3oo!&Q#Q4W%I{00!3j|0?o>v;^zIz3Wy z8J0@Ef=Vz}u$tHD<0gPcAX&#>Ko%S=0n109$|tu5fi`FXJ-CAhMIUfc> zsmRJ&4IJ>uNJW^$-F`q}V~!ber7sYedGjsXmzAZYEdVldG-b;{B6C7JJPG7OZ6kD6 zwq-TvBY)03&{G9`zIsh?O(8P*mq{DBX<%b@7TTS#lUEMx#UM8gJn-rsfzx+LqP z5PRZ zE67s8EJ!Q@_ngs0?k#o%S+fvJvaAm9ys{pBRIUY+3b^=j2inEOUI*&nVjn>t)Ic^; zHqe5*s+AkokFEcu&Q62hsw#^DOIwnv*)GKOgH=)D%8ENueduNTS%0g#BT1O2yQX%pxgk6X{@Yaz%{{^)3qaF)!B)5oZzy zggI59TZorsrVR85`E(2A5NIyG;6QC${0TuWG1f#yCqs(~qF9Bdjn`b5Djg9nSoc%u z8OpOntqcOTZt{S)9x~Wdwyuttwo;ywN!6X9X#JUTaGQ&75~LOgrm|>$0Y)xn6ZAnV zi4c=5wWqSwem7f6b1b!UQMZ(8g%N^<*|+m{6OH}d!uSBFyiLCI^)F%67c%3)!ucpw z9;Eyb<>QopfpQ)!L^|12e9t)?$pyZPId@Z6XHcF`d4Td{X(1TrJDBs4DfsUvoYxJW zWO*_)_0OQLFQ%L~U-O7Aqn!7DONr*4n5mC9V4QCy{vDL_rg1mXygTEqn5l1+_^za! zcPgJE`Z~&avxJ|`F!8oUQ4?3*UU2>x@$;%b!Kq5T$a8MfUd~H7@5p8l%{u^I?oECD z@C0BBAM}!Cz2nP)t31Dfbk%4)Ry7dq9USe8R2^8}5N@ci92|&_9;n_ZccJ);AID8Cvh;jR%G)D;k*WtPWs z+n%jyF1KY@KykV|(__7HO`7E{^XQCUx*96C0+{D6-U29@WSz7`Shn4Oe`?6G?&jT3?xB`Kody&VU^Pi-{1G(FC zi8~MTpxfj5f!jS(hJP-H|1k`IZBqERQ$GQm2h5pvO#pf9?Fkh1*j0_xbqWnCo-L0l z(ju}SNZVuYv>rz(dkGo@2;|!oOXU_M?Y2%SP>D8xdWO^-^QVC(Xwg>1QD;iF zkjfe*iY;wbR%=yDTUASIRZCk{OKSsYxFo5iJ*uTGanOFuY|+H{r%yD z2sdvJ$0FT*;gLj440R6<4)=<1@4oJVDBbVj_`cy-qGz;UR1HNFRlQXm@klIQ71=u+ ztJ>AJei&w>k-^G%WT*;$4RQ_;@Wwq7>mHQKK{DLa9gl#z@Mv^+M1;dID>T%jZG1By z?gbUS`x7EIuyq=RCtQz2`^38D z*6lmmlsHO`#Net7^bdCLjXS;|bGUaj26hKWhoTZ^7nD%XfOKt=PgWFd`pnbjFgS}y7*xx-k3VuVVhq_~zM`CgYjf&AI zwGSN*_s1fUSR@|CQ1?sa{Sd2o0(xgiwJVt)w2j3e(6Z-bCj}-k#Jl%LRP?D)(7l&~ zDU3+12oFK%(U;*-4j6hHjf_RH0{vAMD8S)u9W4??Ei`s;8kYgs(E{yPF_GO2npB8j zw16eqZYV(WU}7JL0wTxS@Cb|)=n}_u+1Jv(YLko&dNR-#3HNm;x*^Ee)8YMz?w-L2 zca8KT9Hzj*2!>`-o25IOTRQ^lYnBC81nYyqhURQ5-QD@O(sQ0R^yjP~w}4M&GZmGMM( z@8y*vvEf9dH!&Ood0+%xRM9)w9pA^*1H)0M= zMkQ5qRc&>!x;|J_p>SC2@hvDmap4CW=r-J0oJ5TFP!r#2uDDoO2Xd{V>~!x@*ovSG zzhmWmI$+iC!?YMLAzyBf&ntODNJHXpRw&aY5g{U&Z}jCJc5U_TaJBhz*ZRDu|4OP4 zP+ki8Q7VsN4l>ufHv0+=+narRT;0BcwT|qg#K)ht%7NymP5Gp_$(MVRtJzm@y}iK~ zIGolch1Y?%s%>wRJb&dv+u6`=Ozn7)wzr|}HeXDA;)TaJQc3@O_=LNrl_zPdF1 z-1m4A%M#AnBj=FL9OCEq*fMs2RS?cETV<>OTM9qa6M!63Kwi}a&RJ>HM3Ii3O#oD~ z)iJviIDD;0k!%59B2y$=_*0-5AMCNo$rjTlgMir1-IQEytHWiQ`4MGapD zq{0saJ`F}h0CG%nUV;1w{8I5}1CIQv9TW2n_AKHfkYkc_4&){9L;MWnm;&-DW8FJfD1)@BmG;JO|uCcs1cpPs0)q4}@yX z$E{q_lCNzAR8cJjv`-7RtgjYusliJfUTX1DkC&x*X%OMfE!)?vZ3%DRw5e@ld$@h= zx|WS$*g)t@Ja1KKGvREw^xc^=p6~$@NAJ7mRN~jpc;C;}aEu!!#OJ|}`5!nYc891Dyun?lce!tp-EHHrD# zH9dHclkq)M=sBSA;}=ZkKRN~fal%czU)A*JcE2%&o~JZ^j3>|kr!^cg_UFYZ^!&HR zulxV%6#VZHZu*~1_X$?({udB#_9L*#gx!xay#C<2kBRYIvd41_&C@{_;LF+Z=TwFW=? zvBtoEO*DVFVm&j-pGyq>7s&s91CNqFaRcZ3=#YUwPVK+hz~3eM3kE)q=z9(PJ<{`t zfq#$u;rMa8_`c$o|BSyy@;^89R1*D110N^5{MCl_)KlDCWS{W`g!>KrR?^EK8<_tu z6z2+qpFc)582J0d&*PW%oF={<2LB48I}M!sk3TA~9{xDP9~Btqb?aXYJy%h?o-puC zqJL=M=@g$A4E$dy&c8SC6V%>U416=`dBeb;A^!h0@TKHu7S(gRwh>>Rf%APb%fR_# z&};+8KR>}#YT&Pt-5LYu`FFK}he^*?1IPU*&~rQKzs112iT@5mKdBdAHu#$;&JSq(sDhs}erfRc5&s_zetur@(Sr&5 zpGW@G8u%GaJI|(4^M&Lso_+V znjRnm+lzi)Mfx8yaNa*WqUpi*@_O`R4X2{i^h-?-?(23@kbbN2Ba};c8f_5SpYKX7 zaGcn{zfE|7ftOPM7902+!r|MVOdPklWH+esaMZ&e$3I6n`h)FaKkwD}QGXu%Fnv?w z$M(KNetyTmUnKlVO%K}TkL*9!a9#iJHC*@e9Zf%ulNqF6{R#2J^UDYdL7Go57C6qe zgfB4gMT9pP_~!{LVJikDpT- zj{fuElxH-%IR2YxT)m|6>;3qO#*h87h5UKVz&8;7rlto~^C6dM89+e7`0M&-YdG@r zIA3bu?EeFb;6H(eAPpM)yiXg`aBSCc^8b?t{*Qzo(r~oP`_Cg9j(T1p z{?8cr?+L$6!%@#?;fLvN4M#nV7$itvGVlh%A0(W|GausmrpAx``8D_1{Q( zo-*+33ICCX>w2EoaMbf_;{U0EpCSAggtMP~^7gF8k8$96H4Qr!68A6nSFV9`{EH2o z<5^+gyl<~3oc)ml66|d?_}T6*4afFo(K`1r19uZ1)^KbW@Bc5;aMaU9{80nnMfe!u z>?a=%Jf!hszZ`-erlT5;`tK(_w;4F^8}2mlXNmux4g49xA0V9l;X{Ux7dpHv;Gl~!L-HT=jXT%4M+bIc!eo`*FY_3--rh=DJp_2WB)bDSR{ ze@<)s*k9KY{wo9L`2Weki>TkT=!G@+`(1<=m^h8+3Io4~@TCU+D_Y+-6VCnz$j{3( zevAX}KcWWSLUD*2diXv0O$N^W^^k#|A-g{_@I&N(COw$2pJxa!BOK#{ejX%$Dh&J+ zgx4DQZwPNN@ShXDhH$p~HrWkLfnR3m!T;j{Q`EpW5t?_=?geKGMk zA0s{2QM@rje@I-sP4$fP^T-|=*NpS?<~IzS?RqGH%+Gpgx|jaYkVN;KZ|2BPE=YVf z0+39c*B{0Ml1m8w4#+q^Uvz1HqJDl3-K6=6IKM|?eTeD))B}x)@qna+XrY{Oz907( z_z2O54Ezkyw;8x>IABj0_#ukRX#+n&_`3#vhVWd<*-wtoas%i1>@jeTPr|_YeVqu# z4-Ua;ILH$*mG9$HEHc;~OhgVOL{OgL3--k0A{ZM+0@-VVa1uZ=Nd!tz8H96&aEg@h zNYChAI6B%t3@T)~yQe1>*`HL6r&o3MZa7=G7Y?$M1XIe8R02onBU}xBh+yyV&`<=< zV+NyejxPx3&)^&%oQNYD&e{jzgdZGQOdKRjk$rGVu6rm#QUCk10El8}`95JyO;j-d zh$WX9D93NsIHa41=FD58N++=6Ar-(6?a*}Wd?#K&INdHlsWfT=gwrr!Hn9XssMBOW zUwL#Bb=Ja9Pb`n;w)DjIIo}ACST^mSAfQPXhH}85n}ALgzx!z6y^r`Ye%ME5{P4X# z`$DWTJ45y}X+GvUlNa}&sqF8diRXv(fgJ6lZPWe$V5Uxh#LF~cZ!rR6@?JTGd_7I< z-=*~rbz(B*#{f&^e?hBc7Y9@(#~W_VO#g2J%+!e@XQ|_>k^OVG8=$w{J-ut00mH#JG#1HR%)Bnc+ zL!I1CD9SV&Z)`|IQ`l!eo&ug!@;5G$;`07hC3R&v&YvZDod?U`B6$;MImTat0zOI@ zVHS^)e1I7#=k_!F78FpYDgPqLA2JM@@~?wzs`xM8t}O66iQ@;)k+D3|m{QqByb~uz sNM4FR-o`kjO?kY%j9U~CA@)#*-Ycnzi_skU9Uztb$PSV*1PoIAA52s**8l(j literal 0 HcmV?d00001 diff --git a/sem6/bad.c b/sem6/bad.c new file mode 100644 index 0000000..ad7a9bf --- /dev/null +++ b/sem6/bad.c @@ -0,0 +1,27 @@ +/* bad.c */ + +#include +#include +#include + +int main() { + int64_t *array = malloc(sizeof(int64_t) * 5); + // вместимость -- сколько памяти выделено + size_t capacity = 5; + // количество -- сколько памяти по факту используется из выделенной. + size_t count = 0; + // заполните массив квадратами чисел от 0 до 100 + // если не хватает места, расширяем в два раза + for (size_t i = 0; i <= 100; i++) { + if (count == capacity) { + array = realloc(array, sizeof(int64_t) * capacity * 2); + capacity = capacity * 2; + } + array[count++] = i * i; + } + + for (size_t i = 0; i < 100; i++) { + printf("%" PRId64 " ", array[i]); + } + return 0; +} diff --git a/sem6/heap-0.c b/sem6/heap-0.c new file mode 100644 index 0000000..446c725 --- /dev/null +++ b/sem6/heap-0.c @@ -0,0 +1,91 @@ +/* heap-0.c */ + +#include +#include +#include +#include + +#define heap_blocks 16 +#define block_capacity 1024 + +struct heap { + struct block { + char contents[block_capacity]; + } blocks[heap_blocks]; + bool is_occupied[heap_blocks]; +} global_heap = {0}; + +struct block_id { + size_t value; + bool valid; + struct heap* heap; +}; + +struct block_id block_id_new(size_t value, struct heap* from) { + return (struct block_id){.valid = true, .value = value, .heap = from}; +} +struct block_id block_id_invalid() { return (struct block_id){.valid = false}; } + +bool block_id_is_valid(struct block_id bid) { + return bid.valid && bid.value < heap_blocks; +} +/* find block */ + +bool block_is_free(struct block_id bid) { + return bid.valid && bid.heap->is_occupied[bid.value]; +} + +/* allocate */ +/* find a free block, reserve it and return its id */ +struct block_id block_allocate(struct heap* heap) { + for (size_t i = 0; i < heap_blocks; i++) { + bool* block_occupied = &(heap->is_occupied[i]); + if (!*block_occupied) { + *block_occupied = true; + return block_id_new(i, true, heap); + } + } + return block_id_invalid(); +} + +/* mark block as 'free' */ +void block_free(struct block_id b) { + if (b.valid) b.heap->is_occupied[b.value] = false; +} + +/* printer */ +const char* block_repr(struct block_id b) { + static const char* const repr[] = {[false] = " .", [true] = " ="}; + if (b.valid) + return repr[b.heap->is_occupied[b.value]]; + else + return "x"; +} + +void block_debug_info(struct block_id b, FILE* f) { + fprintf(f, "%s", block_repr( b)); +} + +void block_foreach_printer(struct heap* h, size_t count, + void printer(struct block_id, FILE* f), + FILE* f) { + for (size_t c = 0; c < count; c++) + printer(block_id_new(c,h), f); +} + +void heap_debug_info(struct heap* h, FILE* f) { + block_foreach_printer(h, heap_blocks, block_debug_info, f); + fprintf(f, "\n"); +} +/* -------- */ + +int main() { + heap_debug_info(&global_heap, stdout); + block_allocate(&global_heap); + struct block_id bid = block_allocate(&global_heap); + block_allocate(&global_heap); + + block_free(bid); + heap_debug_info(&global_heap, stdout); + return 0; +} diff --git a/sem6/heap-0.exe b/sem6/heap-0.exe new file mode 100644 index 0000000000000000000000000000000000000000..7c378c2fbed3ef19aa683e37175934432650b79c GIT binary patch literal 42278 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 a1jDE86bJMUrUlN?mbz@`<)Uk==l>T6 +#include +#include +#include + +#define HEAP_BLOCKS 16 +#define BLOCK_CAPACITY 1024 + +enum block_status { BLK_FREE = 0, BLK_ONE, BLK_FIRST, BLK_CONT, BLK_LAST }; + +struct heap { + struct block { + char contents[BLOCK_CAPACITY]; + } blocks[HEAP_BLOCKS]; + enum block_status status[HEAP_BLOCKS]; +} global_heap = {0}; + +struct block_id { + size_t value; + bool valid; + struct heap* heap; +}; + +struct block_id block_id_new(size_t value, struct heap* from) { + return (struct block_id){.valid = true, .value = value, .heap = from}; +} +struct block_id block_id_invalid() { + return (struct block_id){.valid = false}; +} + +bool block_id_is_valid(struct block_id bid) { + return bid.valid && bid.value < HEAP_BLOCKS; +} + +/* Find block */ + +bool block_is_free(struct block_id bid) { + if (!block_id_is_valid(bid)) + return false; + return bid.heap->status[bid.value] == BLK_FREE; +} + +/* Allocate */ +struct block_id block_allocate(struct heap* heap, size_t size) { + if (size <= 0) return block_id_invalid(); + enum block_status* first_status = NULL; + enum block_status* last_status = NULL; + for (size_t i = 0; i < HEAP_BLOCKS; i++) { + if (i + size > HEAP_BLOCKS) return block_id_invalid(); + first_status = &(heap->status[i]); + if (*first_status != BLK_FREE) continue; + bool not_enough_space = false; + for (size_t j = i + 1; j < i + size; j++) { + last_status = &(heap->status[j]); + if (*last_status != BLK_FREE) { + not_enough_space = true; + break; + } + } + if (not_enough_space) continue; + if (size == 1) *first_status = BLK_ONE; + else { + *first_status = BLK_FIRST; + *last_status = BLK_LAST; + for (size_t j = i + 1; j < i + size - 1; j++) + heap->status[j] = BLK_CONT; + } + return block_id_new(i, heap); + } + return block_id_invalid(); +} + +void heap_debug_info(struct heap*, FILE*); + +/* Free */ +void block_free(struct block_id b) { + if (!b.valid) return; + if (b.heap->status[b.value] == BLK_FREE) return; + bool is_last = b.heap->status[b.value] == BLK_ONE; + b.heap->status[b.value] = BLK_FREE; + for (size_t i = b.value + 1; !is_last; i++) { + is_last = b.heap->status[i] == BLK_LAST; + b.heap->status[i] = BLK_FREE; + } +} + +/* Printer */ +const char* block_repr(struct block_id b) { + static const char* const repr[] = {[BLK_FREE] = " .", + [BLK_ONE] = " *", + [BLK_FIRST] = "[=", + [BLK_LAST] = "=]", + [BLK_CONT] = " ="}; + if (b.valid) + return repr[b.heap->status[b.value]]; + else + return "INVALID"; +} + +void block_debug_info(struct block_id b, FILE* f) { + fprintf(f, "%s", block_repr(b)); +} + +void block_foreach_printer(struct heap* h, size_t count, + void printer(struct block_id, FILE* f), FILE* f) { + for (size_t c = 0; c < count; c++) + printer(block_id_new(c, h), f); +} + +void heap_debug_info(struct heap* h, FILE* f) { + block_foreach_printer(h, HEAP_BLOCKS, block_debug_info, f); + fprintf(f, "\n"); +} +/* -------- */ + +void heap_free(struct heap* heap) { + for (size_t i = 0; i < HEAP_BLOCKS; i++) + heap->status[i] = BLK_FREE; +} + +void allocate_block_test(struct heap* heap) { + printf("allocate_block_test: "); + block_allocate(heap, 1); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void allocate_big_block_test(struct heap* heap) { + printf("allocate_big_block_test: "); + block_allocate(heap, 5); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void allocate_multiple_blocks_test(struct heap* heap) { + printf("allocate_multiple_blocks_test: "); + block_allocate(heap, 7); + block_allocate(heap, 1); + block_allocate(heap, 3); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void allocate_more_than_available_test(struct heap* heap) { + printf("allocate_more_than_available_test: "); + block_allocate(heap, 17); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void allocate_limit_test(struct heap* heap) { + printf("allocate_limit_test: "); + block_allocate(heap, 16); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void allocate_middle_test(struct heap* heap) { + printf("allocate_middle_test: "); + block_allocate(heap, 5); + struct block_id id = block_allocate(heap, 3); + block_allocate(heap, 7); + block_free(id); + block_allocate(heap, 2); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void free_block_test(struct heap* heap) { + printf("free_block_test: "); + struct block_id id = block_allocate(heap, 1); + block_free(id); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void free_big_block_test(struct heap* heap) { + printf("free_big_block_test: "); + struct block_id id = block_allocate(heap, 5); + block_free(id); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +void free_multiple_blocks_test(struct heap* heap) { + printf("free_multiple_blocks_test: "); + struct block_id id1 = block_allocate(heap, 7); + struct block_id id2 = block_allocate(heap, 1); + struct block_id id3 = block_allocate(heap, 5); + block_free(id1); + block_free(id2); + block_free(id3); + heap_debug_info(heap, stdout); + heap_free(heap); +} + +int main() { + printf("\n"); + allocate_block_test(&global_heap); + allocate_big_block_test(&global_heap); + allocate_multiple_blocks_test(&global_heap); + allocate_more_than_available_test(&global_heap); + allocate_limit_test(&global_heap); + allocate_middle_test(&global_heap); + free_block_test(&global_heap); + free_big_block_test(&global_heap); + free_multiple_blocks_test(&global_heap); + printf("\n"); + return 0; +} diff --git a/sem6/heap-1.exe b/sem6/heap-1.exe new file mode 100644 index 0000000000000000000000000000000000000000..e12e3e192778f7994b4cf700b490c9112ad72ef2 GIT binary patch literal 45422 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 literal 0 HcmV?d00001 diff --git a/sem6/main.c b/sem6/main.c new file mode 100644 index 0000000..8625bd3 --- /dev/null +++ b/sem6/main.c @@ -0,0 +1,58 @@ +/* main.c */ + +#include + +#include "ast.h" +#include "ring.h" +#include "tokenizer.h" + +void ast_print(struct AST ast) { print_ast(stdout, &ast); } +void token_print(struct token token) { printf("%s(%" PRId64 ")", TOKENS_STR[token.type], token.value); } + +DECLARE_RING(ast, struct AST) +DEFINE_RING(ast, struct AST) +DEFINE_RING_PRINT(ast, ast_print) +DEFINE_RING(token, struct token) +DEFINE_RING_PRINT(token, token_print) + +#define RETURN_ERROR(code, msg) return printf(msg), code + +struct AST *build_ast(char *str) +{ + struct ring_token *tokens = NULL; + if ((tokens = tokenize(str)) == NULL) + RETURN_ERROR(NULL, "Tokenization error.\n"); + + ring_token_print(tokens); + + ring_token_free(&tokens); + + return NULL; +} + + +int main() +{ + /* char *str = "1 + 2 * (2 - -3) + 8"; */ + const int MAX_LEN = 1024; + char str[MAX_LEN]; + if (fgets(str, MAX_LEN, stdin) == NULL) + RETURN_ERROR(0, "Input is empty."); + + if (str[strlen(str) - 1] == '\n') + str[strlen(str) - 1] = '\0'; + + struct AST *ast = build_ast(str); + + if (ast == NULL) + printf("AST build error.\n"); + else + { + print_ast(stdout, ast); + printf("\n\n%s = %" PRId64 "\n", str, calc_ast(ast)); + p_print_ast(stdout, ast); + printf(" = %" PRId64 "\n", calc_ast(ast)); + } + + return 0; +} diff --git a/sem6/main.o b/sem6/main.o new file mode 100644 index 0000000000000000000000000000000000000000..5e39faaf23ed0d2b8cd9b302443771d1729d2596 GIT binary patch literal 22776 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 literal 0 HcmV?d00001 diff --git a/sem6/makefile b/sem6/makefile new file mode 100644 index 0000000..d7fe0b0 --- /dev/null +++ b/sem6/makefile @@ -0,0 +1,21 @@ +CFLAGS = -g -O2 -Wall -Werror -std=c17 -Wno-unused-function -Wdiscarded-qualifiers -Wincompatible-pointer-types -Wint-conversion -fno-plt +CC = gcc +LD = gcc +TARGET = parser + +all: $(TARGET) + +$(TARGET): ast.o main.o tokenizer.o + $(LD) -o $@ $^ + +%.o: %.c + $(CC) -c $(CFLAGS) -o $@ $< + +clean: + $(RM) $(TARGET) *.o + +run: + ./$(TARGET) + +.PHONY: clean all run + diff --git a/sem6/parser b/sem6/parser new file mode 100644 index 0000000000000000000000000000000000000000..6c392308e381bca806225e62d5ad4ca42a463339 GIT binary patch literal 41072 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 RM3Ucqi{cteVMs}e{|)dLo}2&x literal 0 HcmV?d00001 diff --git a/sem6/ring.h b/sem6/ring.h new file mode 100644 index 0000000..ce6994f --- /dev/null +++ b/sem6/ring.h @@ -0,0 +1,144 @@ +/* ring.h */ + +#pragma once +#ifndef _LLP_RING_H_ +#define _LLP_RING_H + +#include + + +#define DECLARE_RING(name, type) \ +struct ring_##name { \ + type value; \ + struct ring_##name* next; \ + struct ring_##name* prev; \ +}; + +#define DEFINE_RING(name, type) \ +static struct ring_##name *ring_##name##_create(type value) \ +{ \ + struct ring_##name *item = malloc(sizeof(struct ring_##name)); \ + if (item == NULL) \ + return NULL; \ + item->value = value; \ + item->next = item; \ + item->prev = item; \ + return item; \ +} \ +static type ring_##name##_last(struct ring_##name *ring) \ +{ \ + if (ring == NULL) \ + return *(type *)NULL; \ + return ring->prev->value; \ +} \ +static type ring_##name##_first(struct ring_##name *ring) \ +{ \ + if (ring == NULL) \ + return *(type *)NULL; \ + return ring->value; \ +} \ +static struct ring_##name *ring_##name##_push( \ + struct ring_##name **ring, type value) \ +{ \ + if (ring == NULL) \ + return NULL; \ + struct ring_##name *item = ring_##name##_create(value); \ + if (item == NULL) \ + return NULL; \ + if (*ring == NULL) \ + { \ + *ring = item; \ + return item; \ + } \ + item->next = *ring; \ + item->prev = (*ring)->prev; \ + (*ring)->prev->next = item; \ + (*ring)->prev = item; \ + return item; \ +} \ +static type ring_##name##_pop(struct ring_##name **ring) \ +{ \ + if (ring == NULL) \ + return *(type *)NULL; \ + struct ring_##name *item = (*ring)->prev; \ + type ret = item->value; \ + if (item == *ring) \ + { \ + *ring = NULL; \ + free(item); \ + return ret; \ + } \ + item->prev->next = *ring; \ + (*ring)->prev = item->prev; \ + free(item); \ + return ret; \ +} \ +static struct ring_##name *ring_##name##_push_top( \ + struct ring_##name **ring, type value) \ +{ \ + struct ring_##name *item = ring_##name##_push(ring, value); \ + if (item == NULL) \ + return NULL; \ + *ring = item; \ + return item; \ +} \ +static type ring_##name##_pop_top(struct ring_##name **ring) \ +{ \ + if (ring == NULL) \ + return *(type *)NULL; \ + *ring = (*ring)->next; \ + return ring_##name##_pop(ring); \ +} \ +static void ring_##name##_free(struct ring_##name **ring) \ +{ \ + if (*ring == NULL) \ + return; \ + struct ring_##name *tmp; \ + (*ring)->prev->next = NULL; \ + while (*ring != NULL) \ + { \ + tmp = *ring; \ + *ring = (*ring)->next; \ + free(tmp); \ + } \ +} + +#define DEFINE_RING_PRINT(name, printer) \ +static void ring_##name##_print(struct ring_##name *ring) \ +{ \ + printf("-> "); \ + if (ring == NULL) \ + { \ + printf("NULL -> \n"); \ + return; \ + } \ + printer(ring->value); \ + struct ring_##name *next = ring->next; \ + while (next != ring) \ + { \ + printf(" -> "); \ + printer(next->value); \ + next = next->next; \ + } \ + printf(" ->\n"); \ +} \ +static void ring_##name##_print_back(struct ring_##name *ring) \ +{ \ + printf("<- "); \ + if (ring == NULL) \ + { \ + printf("NULL <- \n"); \ + return; \ + } \ + printer(ring->value); \ + struct ring_##name *prev = ring->prev; \ + while (prev != ring) \ + { \ + printf(" <- "); \ + printer(prev->value); \ + prev = prev->prev; \ + } \ + printf(" <-\n"); \ +} + +#endif diff --git a/sem6/tokenizer.c b/sem6/tokenizer.c new file mode 100644 index 0000000..90faf94 --- /dev/null +++ b/sem6/tokenizer.c @@ -0,0 +1,99 @@ +/* tokenizer.c */ + +#include +#include + +#include "ring.h" +#include "tokenizer.h" + +DEFINE_RING(token, struct token) + +static const char *SEPARATORS = " \t\n"; +static const int NUM_TOKENS = 6; +static const char *TOKENS[] = { + [TOK_PLUS] = "+", + [TOK_MINUS] = "-", + [TOK_MUL] = "*", + [TOK_DIV] = "/", + [TOK_OPEN] ="(", + [TOK_CLOSE] = ")", + [TOK_LIT] = "", + [TOK_NEG] = "-" +}; + +const char *TOKENS_STR[] = { + [TOK_PLUS] = "PLUS", + [TOK_MINUS] = "MINUS", + [TOK_MUL] = "MUL", + [TOK_DIV] = "DIV", + [TOK_OPEN] ="OPEN", + [TOK_CLOSE] = "CLOSE", + [TOK_LIT] = "LIT", + [TOK_NEG] = "NEG", + [TOK_END] = "END", + [TOK_ERROR] = "ERROR" + }; + +char *skip_separators(char *str) +{ + while (*str != '\0' && strchr(SEPARATORS, *str) != NULL) + str++; + return str; +} + +struct token next_token(char **str) +{ + int i; + char *buf = skip_separators(*str); + + if (*buf == '\0') + { + return (struct token){TOK_END, 0}; + } + + /* Serarch for an operation */ + for (i = 0; i < NUM_TOKENS; i++) + if (strncmp(buf, TOKENS[i], strlen(TOKENS[i])) == 0) + { + *str = buf + strlen(TOKENS[i]); + return (struct token){i, 0}; + } + + /* Serach for literals */ + if (isdigit(*buf)) + { + char *str_end; + int64_t tmp = strtoll(buf, &str_end, 10); + *str = str_end; + return (struct token){TOK_LIT, tmp}; + } + + return (struct token){TOK_ERROR, 0}; +} + +int is_binop(struct token token) +{ + return token.type == TOK_PLUS || token.type == TOK_MINUS || + token.type == TOK_MUL || token.type == TOK_DIV; +} + +struct ring_token *tokenize(char *str) +{ + struct token token, prev = {TOK_ERROR, 0}; + struct ring_token *tokens = NULL; + while ((token = next_token(&str)).type != TOK_END) + { + if (token.type == TOK_ERROR) + { + ring_token_free(&tokens); + return NULL; + } + if (token.type == TOK_MINUS && + (tokens == NULL || prev.type == TOK_OPEN || is_binop(prev))) + token.type = TOK_NEG; + ring_token_push(&tokens, token); + prev = token; + } + + return tokens; +} diff --git a/sem6/tokenizer.h b/sem6/tokenizer.h new file mode 100644 index 0000000..cc8091e --- /dev/null +++ b/sem6/tokenizer.h @@ -0,0 +1,25 @@ +/* tokenizer.h */ + +#pragma once +#ifndef _LLP_TOKENIZER_H_ +#define _LLP_TOKENIZER_H_ + +#include + +#include "ring.h" + +struct token { + enum token_type { + TOK_PLUS = 0, TOK_MINUS, TOK_MUL, + TOK_DIV, TOK_OPEN, TOK_CLOSE, TOK_LIT, + TOK_NEG, TOK_END, TOK_ERROR } type; + int64_t value; +}; + +DECLARE_RING(token, struct token) + +struct ring_token *tokenize(char *str); + +extern const char *TOKENS_STR[]; + +#endif diff --git a/sem6/tokenizer.o b/sem6/tokenizer.o new file mode 100644 index 0000000000000000000000000000000000000000..b067de18cded70a8c3b21ad8ea44844e1f3b0227 GIT binary patch literal 15080 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 + +void print_int(int x) { printf("%d", x); } + +int main() { + + int x = 42; + volatile int y = 42; + + print_int(x); + print_int(y); +} +#+end_src + + +*Вопрос* пометьте функцию =print_int= как =static=. Что произошло в оптимизированном коде и почему? + + +** Пролог и эпилог + +При трансляции функций нередко используются понятия /пролога/ и /эпилога/ --- шаблонных фрагментов ассемблерного кода в начале и конце функции. +Их цель --- установка регистра =rbp= так, чтобы он указывал на начало стекового фрейма, где лежат все интересные для функции данные. +Пролог устанавливает его, как правило следующей последовательностью инструкций: + +#+begin_src asm +push rbp +mov rbp, rsp +sub rsp, <сколько выделить байтов в стеке> +#+end_src + +Эпилог возвращает =rbp= в исходное состояние. Напоминаем, что =rbp= --- callee-saved регистр. + +#+begin_src asm +mov rsp, rbp ; отмотать стек в исходное состояние +pop rbp ; восстановить rbp +ret +#+end_src + +Иногда используется также специализированная инструкция =leave=. + +*Вопрос* Что делает эта инструкция? + + +** Red zone + +Указатель на вершину стека =rsp= делит память на две части: в старших адресах лежит сам стек, в младшие он растёт. +Мы привыкли к тому, что нельзя обращаться к младшей части памяти и что-то там хранить. +Однако соглашение вызова на самом деле допускает использование части "рядом" со стеком, а именно 128 байт от =rsp= в область младших адресов: + + +#+begin_src +| | +| ... | +| | +├--------┤ ← rsp-128 +| | +| red | +| zone | +| | +├---^----┤ ← rsp +| stack | +| | +#+end_src + +Чтобы использовать red zone необходимо, чтобы функция не вызывала другие функции. + +Если функция не вызывает другие функции и выделяет N байт для хранения данных в стеке, то хранить она может на самом деле N+128 байт. + +Рассмотрим следующий файл: + + +#+begin_src c +/* prologue-epilogue.c */ + +int maximum(int a, int b) { + char buffer[4096]; + buffer[0] = 0x7; + if (a < b) + return b; + return a; +} + +int main(void) { + int x = maximum(42, 999); + return 0; +} +#+end_src + + +*Вопрос* Скомпилируйте его без оптимизаций и объясните содержимое функции =maximum=. Почему =rsp= уменьшается на это число? + + +** Предподсчёт значений + +Скомпилируйте следующий код с максимальным уровнем оптимизации и объясните, откуда там берётся строка для =printf=. + + +#+begin_src c +/* precompute.c */ + +#include +#include + +int main (){ + char buff[1024] = {0}; + strcat(buff, "hello"); + strcat(buff, " world"); + printf("%s", buff); + +} +#+end_src + + +** Хвостовая рекурсия + +*Вопрос* Вспомните, почему пару инструкций =call= + =ret= можно заменить на =jmp=, например: + +#+begin_src asm +... +call f +ret + + +f: +... +ret + +; то же, что и: +... +jmp f + + +f: +... +ret +#+end_src + +Скомпилируйте и запустите следующий код: + +#+begin_src c +/* tail-rec.c */ + +#include +#include +#include +#include + +void print_size(size_t i) { printf("%zu" , i); } + +struct list { + int64_t elem; + struct list *next; +}; + +struct list *c(int64_t head, struct list *tail) { + struct list *h = (struct list *)malloc(sizeof(struct list)); + h->elem = head; + h->next = tail; + return h; +} + +size_t list_length(struct list const *l) { + if (!l) + return 0; + return 1 + list_length(l->next); +} + +int main(int argc, char **argv) { + const size_t len = 1024 * 1024; + + struct list *lst = NULL; + + for( size_t i = 0; i < len; i++) { + lst = c(i, lst); + } + + print_size(list_length(lst)); + return 0; +} +#+end_src + +Что выведется на экран? Объясните это поведение. + +*Задание 1* Как можно переписать функцию (какую?) чтобы программа корректно считала длину длинного списка? + + +** Copy elision + +Скомпилируйте следующий код с максимальным уровнем оптимизации. + +#+begin_src c +/* return-value.c */ + +#include + +struct string_buffer { + char data[1024]; +}; + +__attribute__((noinline)) struct string_buffer sb_init() { + return (struct string_buffer){.data = "hey"}; +} + +volatile struct string_buffer sb; +int main() { + sb = sb_init(); + printf("%s", sb.data); + return 0; +} +#+end_src + +Объясните, зачем в функцию =sb_init= передаётся аргумент, хотя по сигнатуре у неё параметров нет. + +** Restrict + +Скомпилируйте следующий код с максимальным уровнем оптимизации. + +#+begin_src c +/* restrict-0.c */ + +void f(int *x, int *add) { + *x += *add; + *x += *add; +} +#+end_src + +Эта функция прибавляет к первому аргументу второй два раза; оба аргумента являются указателями на числа. +Мы могли бы прибавить к первому аргументу удвоенное значение второго и это было бы быстрее. + +Посмотрите внимательно на ассемблерную функцию; есть ли там эта оптимизация? Если да, то почему она верна, если нет, то почему неверна? + +Модифицируйте код следующим образом: + +#+begin_src c +/* restrict-1.c */ + +void f(int *restrict x, int *restrict add) { + *x += *add; + *x += *add; +} +#+end_src + +Как изменится скомпилированный код с оптимизациями? +Прочитайте стр. 281--282 в "Low-level programming" смысл ключевого слова =restrict= и объясните его влияние на код. + + + + + + + + + + + +* Smash this stack + + +** Уязвимость форматного вывода + + +*Вопрос* Как в функцию передаются следующие аргументы после шестого? + + +Скомпилируйте эту программу. + +#+begin_src c +/* printf.c */ + +#include + +int main(void) { + char buffer[1024]; + fgets( buffer, 1024, stdin); + printf( buffer ); + return 0; +} +#+end_src + +Запустите её, передавая ей строчки вида ="%x %x"=, ="%x %x %x"= и т.д. +Что это за числа? + + +Прочтите стр. 285--287 в "Low-level programming". + + +* Перезапись адреса возврата + +Напомним, что адрес возврата лежит в стеке на границе стекового фрейма, сразу после сохранённого значения =rbp= (если оно сохраняется). + + +*Вопрос* Что такое ASLR (address space layout randomization)? + +Отключите ASLR следующей командой: + +#+begin_src +echo 0 | sudo tee /proc/sys/kernel/randomize_va_space +#+end_src + +Рассмотрим следующий код. + +#+begin_src c +/* stack-smash.c */ + +#include +#include + +struct user { + const char *name, *password; +} const users[] = {{"Cat", "Meowmeow"}, {"Skeletor", "Nyarr"}}; + +void print_users() { + printf("Users:\n"); + for (size_t i = 0; i < sizeof(users) / sizeof(struct user); i++) { + printf("%s: %s\n", users[i].name, users[i].password); + } +} + +void fill(FILE *f, char *where) { + size_t read_total = 0; + for (;;) { + size_t read = fread(where + read_total, 1, 1, f); + if (!read) + break; + else + read_total += read; + } +} + +void vulnerable(FILE *f) { + char buffer[8]; + fill(f, buffer); +} + +int main(int argc, char **argv) { + vulnerable(stdin); + + puts("nothing happened"); +} +#+end_src + +Скомпилируйте его вот так (это отключает некоторые механизмы защиты): + +#+begin_src bash +gcc -fno-stack-protector -z execstack -no-pie -g -o stack-smash stack-smash.c +#+end_src + +Программа принимает на вход символы, записывает их в стековый буфер и ничего с ними не делает, выводя =Nothing happened=. +Но в ней есть интересная злоумышленнику функция, которая печатает содержимое базы пользователей, в том числе их пароли. + +Злоумышленник может воспользоваться тем, что программист не проверяет, насколько много данных прислал злоумышленник и влезут ли они в буфер. +Если же они не влезут, то программа написана так, что начнут перезаписываться... сохранённые =rbp= и адрес возврата. + +Злоумышленник может подавать на вход программе любые символы. +Если вам необходимо передать нулевые символы или символы с необычными кодами, вы можете использовать =echo= вот так: + + +#+begin_src +echo -n -e "\x11\x40\x00\x99" # четыре байта с кодами 11 40 0 и 99 (16-ричными) +#+end_src + + +*Задание 2* Попробуйте переписать адрес возврата так, чтобы вместо возвращения из =vulnerable= в =main= запустить функцию =print_users=. +Программа может аварийно завершиться, главное -- чтобы функция отработала и вывела на экран список пользователей и их паролей. + +*Задание 3* Исправьте уязвимость. + +[[img/output.png]] + +Вы не можете переписывать программу, можете только подавать ей на вход разные данные. +Вы *можете* изучать скомпилированный файл с помощью =gdb=, запускать его, смотреть содержимое памяти. +Также можно пользоваться =objdump= или =readelf=, =nm= и любыми иными средствами для узнавания адреса =print_users=. +Не забывайте, что он может меняться после каждой перекомпиляции! + +Также не забудьте, что в памяти многобайтовые числа, в том числе адреса, хранятся в соответствии с Little Endian. + +** Уязвимость форматного ввода + +Аналогичная уязвимость присутствует и при чтении строк привычной многим функцией =scanf= или =fscanf=. Рассмотрим следующий код: + +#+begin_src c +/* check-pwd.c */ + +#include +#include +#include + + +int check_password(FILE *f, const char *password) { + char buffer[10]; + int okay = 0; + fscanf(f, "%s", buffer); + if (strcmp(buffer, password) == 0) + okay = 1; + + return okay; +} + +int main(int argc, char **argv) { + if (check_password(stdin, "password")) + puts("Access granted."); + else + puts("Wrong password."); +} +#+end_src + +Мы читаем пароль пароль используя функцию =fscanf= и спецификатор =%s= в буфер =buffer= никак не ограничивая количество читаемых символов. +Далее прочитанный пароль сравнивается с сохраненным и устанавливается флаг =okay=. При переполнении буффера может произойти замена значаения флага и пароль будет считаться введенным верно. + +*Задание 4* Исправьте данный код так, чтобы исключить потенциальную уязвимость. diff --git a/sem7/a.out b/sem7/a.out new file mode 100644 index 0000000..e69de29 diff --git a/sem7/check-pwd.c b/sem7/check-pwd.c new file mode 100644 index 0000000..6941e40 --- /dev/null +++ b/sem7/check-pwd.c @@ -0,0 +1,23 @@ +/* check-pwd.c */ + +#include +#include +#include + + +int check_password(FILE *f, const char *password) { + char buffer[10]; + int okay = 0; + fscanf(f, "%s", buffer); + if (strcmp(buffer, password) == 0) + okay = 1; + + return okay; +} + +int main(int argc, char **argv) { + if (check_password(stdin, "password")) + puts("Access granted."); + else + puts("Wrong password."); +} diff --git a/sem7/img/output.png b/sem7/img/output.png new file mode 100644 index 0000000000000000000000000000000000000000..081895710b46c80f3df9e452a02e0c97e08a6677 GIT binary patch literal 20662 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 Z8cNv}Ki!PHrqcH{`0>1n+Zn5wM6+A1jz(C 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 +#include + +int main (){ + char buff[1024] = {0}; + strcat(buff, "hello"); + strcat(buff, " world"); + printf("%s", buff); + +} + diff --git a/sem7/printf.c b/sem7/printf.c new file mode 100644 index 0000000..3a01717 --- /dev/null +++ b/sem7/printf.c @@ -0,0 +1,11 @@ +/* printf.c */ + +#include + +int main(void) { + char buffer[1024]; + fgets( buffer, 1024, stdin); + printf( buffer ); + return 0; +} + diff --git a/sem7/prologue-epilogue.c b/sem7/prologue-epilogue.c new file mode 100644 index 0000000..6fc4d90 --- /dev/null +++ b/sem7/prologue-epilogue.c @@ -0,0 +1,15 @@ +/* prologue-epilogue.c */ + +int maximum(int a, int b) { + char buffer[4096]; + buffer[0] = 0x7; + if (a < b) + return b; + return a; +} + +int main(void) { + int x = maximum(42, 999); + return 0; +} + diff --git a/sem7/restrict-0.c b/sem7/restrict-0.c new file mode 100644 index 0000000..bbac59c --- /dev/null +++ b/sem7/restrict-0.c @@ -0,0 +1,7 @@ +/* restrict-0.c */ + +void f(int *x, int *add) { + *x += *add; + *x += *add; +} + diff --git a/sem7/restrict-1.c b/sem7/restrict-1.c new file mode 100644 index 0000000..e2f0e2d --- /dev/null +++ b/sem7/restrict-1.c @@ -0,0 +1,7 @@ +/* restrict-1.c */ + +void f(int *restrict x, int *restrict add) { + *x += *add; + *x += *add; +} + diff --git a/sem7/return-value.c b/sem7/return-value.c new file mode 100644 index 0000000..77805e2 --- /dev/null +++ b/sem7/return-value.c @@ -0,0 +1,19 @@ +/* return-value.c */ + +#include + +struct string_buffer { + char data[1024]; +}; + +__attribute__((noinline)) struct string_buffer sb_init() { + return (struct string_buffer){.data = "hey"}; +} + +volatile struct string_buffer sb; +int main() { + sb = sb_init(); + printf("%s", sb.data); + return 0; +} + diff --git a/sem7/stack-smash b/sem7/stack-smash new file mode 100644 index 0000000000000000000000000000000000000000..13c9936b18e3694a9557f041866012b0c0203a30 GIT binary patch literal 20384 zcmeHPe{dYteSdpDq+3fq{j@FF1}`zDCZLmSY$4m&UdfWYqOwu21!nlMKHaUPtM6Ct z_H2uR;9#IRjH%qt0GT+{&6I|jPG&MClQPhuc1$p|GZ{l>7*f)SLqlQ;rNV(mlLFVz z_w9S9y|pxL^GBxBxu?1PzVGMz<9*+E-`>5qyH5`c3=jGgg~{S$+Zb`vjXH;%BV*bi zX9d>77Bih)!`84GAOU=IE+OjFBz?>02qX;&JwGVfwNZsry@Iaf9AlEo2#J#2T+v0< zp+|xaD=BMqc(UUn!86f6Ne4t6lDh49dz#~iX}VL9RP>KY>S~X2Gt=Ry&un$eZp>^u#>c3=u1j% zP}%dY9sgb08xeN8#@#So(|JYGyBwHFD%<-K>}rMVe?sJGzE!lh(0OPS`Il4?&O4Kd zvF;6>$#_RHkuDtWINa0S(Y+y(&qUU94T_7}pfR;`_b8qI(}amM@^jHDc#>~k`47G= zQ=1;R_Uu=G_}IG-zdifsAMKSss7=zLLiQpg&QqPn1L+W@GkAnkho2aY%B~8ulGK51 zu7o&u#RB-!1@P4i;Jv^#e7uE%YGNyxuIpSR#~VXlW0b~jmMz$Mmbc@HG|T1^X?vWF z=d5U)nI`F&c{`f3%~TZPox?+YJIwWw^^uK`PNXtvAvNLKC;ptgDaaJ%N+zYSJfV_g zBaZ^t<940bD3_FfS!P|h_zK}789!l8{vC@p(Jva4)SfJw3#W4@%UTyM$B2|wX*C1Y z3{*2v%|JB+)eKZKP|ZL!1HZ2f{JP=F-x^0h2pPwM?{zX}Jbc>rmChSSUk;t+A(S@0 z1Nc&D&A)&&tYV};Ns>$N{k&8vO>>?mz?a^8z0A|Z_tJZ3BoFKFaO-}??ZH3e;lJtT z*Ztd2@%4L*;ycFCU(Af`9XfZqt3_wVxihDmiJW@?q_ku`Og`rApB;}hta^xoV$;vl zgx%OmN4w>Df~ZUC-xE-}Fg|^Dd``JxmCjz``d|H!lj4kV=ELpAnOVP~ykflmx!qLu zP%Aum?WzAqwthyd^+L<2QGEB}z3BEU!S{hEcb~niJ<@;wQ96<`GT&$%-}+>jv5Rkf zUMd;q24*Sd_Xmt)1GC1N3jw3}1LJt`p6k(%W39e9^bAm)qXESzz5*wAzzGlc;DSJ>TI@24_g^%Mg$qV;^ex$UhvyO^ZG zQ4v;S@%~Q{)eJ`Bw{g>il%9hUdiKYQ5yEqyl}fyOuenb5I6wcrw+|oRy81fCdT$#l zzS%oERQ#lOZ*TF_QR8?=E8soD*M3H0{9*%q7-v57+pE^S-LUEiqG7|uOT)zv`-{Ko zEw%p4IC@qwHvMzqUupc`d3Wz!y?6KC(`&lVIpvYA45IwHDPJk%ty-!XsAiy=focY- z8K`EUnt^Htsu`$epqhdIyBSdMY-~r=X1lD+p%gxB&jBlG*_j;MJr&L6*l6C$Eomw-<}PWE&1SXuru;13|jQglu}#>Ko3 zzX1Fj$oVr$=|Abn`ymUUzir5wMfQW?#y{~5h1(wY4}`Vjfr0Sa$AbOgu19K&aL>`& zonbv4?&%G8^@i8>g|)tLTVJ@bFC60e8ipSoeq?UQUA0s*P|ZL!1Jw*vGf>SyH3QWQ zR5MV`!2jP2WSex}IbG0z=I|jwn*?1hs91*4a*daILFIeXcr?dL51!CcY3E0*;l%sS zD+EuE{-`W>2%8mhT3=C-@=rc5Wr#oJ*NHgqY=dS4In=hl5? zeOIJwLuB2x4$iKJt&?siX$Qp++$MA3@%>OhzM>maz6G87XP|HcKJyv+XdwAsU$zaz zPw(6ZLbZ7!fm*r+5ex;C&;VKw_-gy%E1=Zu|32!yHB#Xz?@4H8mcA?8NTG^*3k z4fJrPO)U|#i8GqImIB+%nYC(>m@S;?QlsSHCeHMz|3u7I&gd%LFA3Jx_JQnI>6!=(wi;k2)t87dc+^?dCT~NWvDME>a&sM}@38tyVsIcN!&BJ+CT|qYYsKe0yuKL#`F&EM4d|theB>Q=6r`5k9$yn%Kke8Y7PKbiF z?cajlq9;l1x^Ueh(Av;eDAa~XP){d};#y2YgwTy(>MrqWoT_)@P#enN$aNn@h3mGk z@DezyDTbfm8g#P54-)byN5U@xs5$1;w@|ao>uC_wzX|*w@o8ZG(;&5>Zvyq7M>TvM z@hg^-6r=7*;25uIGNLep_?F^L*Rqffl}05L>Hwy8!@Ht3kPD{n!$DD(5))#6vZ*Jf zK548l|9aFLkCEOYm2lP1w&`H;ZvJm!rhG9-fztalR5tP>;FC{7xA|9GBTO2;6UpWu zaCQZWd?)s!H#D|ep2I;|Q?pmN;J3I4I{7o`wT?r!jI!oCv2V!(R7cP7S^duv~1bKs44X|^1CAkmWpz+?Qs#nZ4ScP6HEy=IF^&7(xj{jx77K=E5c1m zb8RDj5`0UUKfJkaOWmfrp%$FeYZ#Hh)vT^=8x(N{8&Jil5D2~vY6&5&P>bRZ*VQ@J z3IKJn%UKVs7R`Cbuxx?!Cj6|{E6Pv{=`X$tt#v{#yuoF-y`7XAu0p_#mADVTMNJW9 zd%Fzz588)Xs3&^c6MgOEu{r2+MCvV->J`eZP!7qylkyUGa|A4{Q$~@bWo{>B7x-ze zLq?nNL)s3*3Qvr_fBfv%lyv1k!;5j`ThnONcNX$F+LY5d5sP(VH;&o8L2S*LNEbRc zbtclWWFc-bt|yqw^~Ms|bMoJ-blOu{t5T6+t4cI>pd+7(<|iXD8Y|el61T=9lQcQv z2B>1# z+{m)geEv`-hdn)T3@dXinzvXogC_|5P)O$!6L^fE(a$g61Y{QIfdh64r4qJFk>r*6 zKUhentz2|0iJ-<4Nh_V1i{473#qnfxB42KpL$N~6jAfFARGQ;4gd01EUT2bVNTE~ReF`mwJIQh!vGPV`N108_T{8TzNnaiXzg?vXLeJGKRci5D|JcN#VEQ#UW zA&e54Gz7767w;ao2%Tpt&*-GFa@R3#WIE`)Q5Fs*;+7eY+EIpcm1O2Y-mFYIQacU@ zd=z$XaF0ViUdRE@9?yxHjmEJJtdK^d@%5BA%6>FAaggz$YiH~zT7b+7 zbT`E7emo_V>sq(ak5#5z&sO4?i-`GFCBBT!x9;*|)hhQVR_f!IUDw?Zuluo@?wS{$ z+jr?U@|Sm0yHWbZy`mBjoS$8}0KRGgTw4IYY61KUm*EPK0Q;!q70`VLA7;|$J>vm$ zEsnD$y~2cABz<|GLke$1MZvyQL*$LxqcVt(GS7KT0VhB5z6t44nZiezXFNOwe7^V> z>epX!KP~Ljt8~;V%Y1&m$5mP{8*e`ZuCU9;)sKX}cijG*lUe|OjN=W=yE-`moZ|6bcTWSCZMmEI4)7-5a@OOCpI)wS!k_$J!iaW+&k9nN)eE-LCcHYMCKc>|9A-5**qip3&J7vZ&L&O~1G~*d_BAFSB zCe1jeF?lmuILu<1R2HwPSn)_tSNFR4l`t(#CrrG=5}h)ww4Iy6{&LLN%y=P{nu3Xo zGofi$s8&ukO>^+p-dzLc!0vw2glUC3=9>L??C#w)w4+i27dgy+OibO(0Yi8&`fp|C z&f#17dWX$h1_$>H>^1lH_6-k^SHA5%mM`$Y`Sy5ScW-^?+v6)CK1Z#DOpDL6oGtYp zk#}c(rP!I8@oAc~zaBAFY_`X_$Y;#SXgW@_Zkm*f+VsCu80&yIWTLiFaamg^aL&+!6wq<Ek!lDRLex|L@C6flETV?y?#T-E)`ra=tA8&xz(%M%}r! zJO_58>b95jYWe?8uAWonHTgX(;USN`oPXbkbv+f0ALkBU``aP<58UII@t^YRT=|r+ zm+jXG7vA`zz;Uam+l9%g<^TJ*uV-#=v4$9bZR7h3Y%k{>Lus4LF zY~S1eCxv~V(39(u9`Qrzw#TgJvi$u8Fv^Ma&*c2G(QzoBZ#kS3tE>|}iI3Y}6ZV?0 z*Gb7$1dQKer+gd4ZNFdG?-vSPE?cTfJ4wImv6u6KX`%3pOsw!D?F7rd@3EKbs~+4o zq_Wr{<)b()W&ZC_qxj3sXu2cQ93nV}!O?5~GBCHj{69gu=9t{&kn+)M{{|#(d%3PV zr8y@1N$4ta{7C4hsL&V}ms@%LC;y+2S6}jyUW9Ff%U-S%XX*YjiqvzsIbPzXUj;sq2CkKQ>uV1e&Jx}st`{qQc(W&zc^`J}gg+! +#include + +#define BUFFER_SIZE 8 + +struct user { + const char *name, *password; +} const users[] = {{"Cat", "Meowmeow"}, {"Skeletor", "Nyarr"}}; + +void print_users() { + printf("Users:\n"); + for (size_t i = 0; i < sizeof(users) / sizeof(struct user); i++) { + printf("%s: %s\n", users[i].name, users[i].password); + } +} + +void fill(FILE *f, char *where, size_t const limit) { + size_t read_total = 0; + for (;; ) { + size_t read = fread(where + read_total, 1, 1, f); + if (!read) return; + read_total += read; + } +} + +// void fill(FILE *f, char *where, size_t const limit) { +// size_t read_total = 0; +// for (;;) { +// size_t read = fread(where + read_total, 1, 1, f); +// if (!read || where[read_total] == '\n') return; +// read_total += read; +// } +// } + +void vulnerable(FILE *f) { + char buffer[BUFFER_SIZE]; + fill(f, buffer, BUFFER_SIZE); +} + +int main(int argc, char **argv) { + vulnerable(stdin); + + puts("nothing happened"); +} diff --git a/sem7/tail-rec.c b/sem7/tail-rec.c new file mode 100644 index 0000000..a5a95de --- /dev/null +++ b/sem7/tail-rec.c @@ -0,0 +1,40 @@ +/* tail-rec.c */ + +#include +#include +#include +#include + +void print_size(size_t i) { printf("%zu" , i); } + +struct list { + int64_t elem; + struct list *next; +}; + +struct list *c(int64_t head, struct list *tail) { + struct list *h = malloc(sizeof(struct list)); + h->elem = head; + h->next = tail; + return h; +} + +size_t list_length(struct list const *l) { + size_t i = 0; + while(l != NULL) i++, l = l->next; + return i; +} + +int main(int argc, char **argv) { + const size_t len = 1024 * 1024; + + struct list *lst = NULL; + + for( size_t i = 0; i < len; i++) { + lst = c(i, lst); + } + + print_size(list_length(lst)); + return 0; +} + diff --git a/sem7/tail-rec.exe b/sem7/tail-rec.exe new file mode 100644 index 0000000000000000000000000000000000000000..0abd4d6745d383287b7df8208c6f9ebedd2a2eb4 GIT binary patch literal 41869 zcmeHw4PaE&weCLilME!}BoGu8b)Z2(ArJ%v4LXx#@+0{(Kl~_o$j^jCLK2fR{3#MT z6U({N^wQQoz4y{rDYlPyueYVGja02S5KKVPMoJZhT2!ht1}(LU0n~Zl+UJ}(b27o+ zdtcvs_ubnAXZGG}ueJ8tYp=cb&pBtO za?DFp_6fx=O{r>Z>TtHTx2|cgS?8>)X=!PdowZ(PyRXIB)Z)x5t8}hwt@mb*8#gvX zV_oiHtXLSw#vSUaV=`l}3XGj%i9(WKnanbQbO&w=VB-;{;&$PtABqD`a)X422mnV4 zz|%PbuNPxZ6_*Hz2A3A7iB86zwX4y8&#&z<#wLwIIDH#q$47zdpiJ4j5!Ge#O#F~Q zR9C7@%(a@8ug)Uv5PeCAqG4AVP9d z+s0fRPj2SrItl(5Zo(_Z9di-h>@2k+T=c!jB)rlXBt%`zl{0(pA`Xm@0()^^gPZgd zbGcY*&g^+v95P!#a0)l^Yr!3JalHBSIph%GoyARfZ5$N+;dl#f=4n;6KqkEQC<>3D z9yw;n|NWHz%;aERhBL^5Z1Fdtp$(;ryAgD(UW`uBD|Q`$NCSBp+%gAj8A(WnPTjzm ze^?L$g{W5-klq8d`^oD_`mA36!N~_~Y=@R!{4m(aMT`F%aSJHGSp027eXqqZbpRR) z>P-I`sjgnR2c=O)WN=>u*U+Bs9;9Mr;bc`RneQdyM{S~!g>FR#rwp$JxpJ=i+3SgZ z@zuOq)qurFK-CM4QCZ0=P^G{;La_0AYZ8RN0?-ak2RcmD_{5gHe+HL=N(=q7s7vwt zFVqq>OkUz6!1N!Agb$nZxRUSJ^8Oil-STxzlfPQ|eWm|Q`mV-u7inoSDnWYSdLa{o ze3Xm~`p+a&Jk^EvB35T?q0~gib~#)wrr0t<6ChdW9=QHp&Nj{}CwTSa+gxmSG9f^j z!Q52BTLNN^qQd47>}E5poM2x8ER>I*;6%7XRt9p&1Y`G>>wKuVWWOdBkj& zjUpgj4#AbakN^~Aaz^Nz6zc8eKa<^^mobyK70{_kC;*762{x&_Y!KLgN!Q!{oqtK!=x0Gn#7!W~LKRdI#}Eak|K-3(RhIwz-5 zo`VQ&8T(edSmf1RlPITGz6B6Bh(Z~9xlf~1CQl@aGU5jPGL@ThpzEkS1_VSKIf}@f zbWmOi6Ylm7-+j-jK2&qSPG!>d9Q_P!8yXj_D@9OW|Cvd_B~gJt zMpuIp4)^K!L63u497WcXuus8N>^R)Vc`c+o m%S@E0(LMloP{Rjw(=i^|>$3bLO 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 z + +void print_int(int x) { printf("%d", x); } + +int main() { + + int x = 42; + volatile int y = 42; + + print_int(x); + print_int(y); +} + diff --git a/sem8/README.org b/sem8/README.org new file mode 100644 index 0000000..2f46c61 --- /dev/null +++ b/sem8/README.org @@ -0,0 +1,448 @@ +#+SETUPFILE: https://fniessen.github.io/org-html-themes/org/theme-readtheorg.setup +#+INCLUDE: "../common/org-header.org" +#+TITLE: Семинар 8: Процессы, взаимодействие процессов через общую память, конвейеры, многопоточность, модели памяти + + + Сегодня мы познакомимся с многопоточностью, общей памятью и с тем, какие эффекты вносит слабая модель памяти. + + Процессы изолируют программы друг от друга; каждая из них получает своё виртуальное адресное пространство и ничего не знает про другие программы. + Однако процессам иногда необходимо общаться. Набор средств для общения между процессами достаточно широк: + + - Общие файлы + - Общая память + - Конвейеры (pipes), именованные и неименованные + - Очереди сообщений + - Сокеты + - Сигналы + +* Создание новых процессов, fork + Прежде всего необходимо понять механизм создания новых процессов. Для этого служит системный вызов =fork=, создающий точную копию процесса. Затем вместо копии мы можем заменить образ приложения с помощью вызова =execve=. + + Если же нам нужно просто сделать копию родительского процесса, которая ведёт себя немного по-другому, =execve= даже не нужен. + + *Вопрос* разберите этот исходный файл. + + #+BEGIN_SRC c + /* fork-example.c */ + + #include + #include + + int main() { + // pid_t это, как и int, численный тип для идентификаторов процессов + pid_t pid = fork(); + // в зависимости от возвращаемого значения, которое попадёт в pid, + // мы поймём, находимся ли мы в родительском процессе или в дочернем. + if (pid == 0) { + printf("I am a child, pid was %d\n", pid); + printf("Child's pid is %d\n", getpid()); + } + else { + printf("I am a parent, pid was %d\n", pid); + printf("Parent's pid is %d\n", getpid()); + } + } + #+END_SRC + + *Вопрос* что именно возвращает =fork()= в родительском процессе? А что в дочернем? См. =man fork=. + + + +* Создание разделённой памяти + + Общую память можно использовать через =mmap=, с которым мы познакомились на семинаре 4. + + Рассмотрим пример создания области памяти, которая разделена между процессами. + + *Вопрос* изучите данную программу. Скомпилируйте её, запустите. Проверьте правильность PID дочернего процесса с помощью =pstree= или иными способами. Изучите содержимое =/proc/PID/maps= для родительского и дочернего процессов, найдите общую область памяти. + + #+BEGIN_SRC c + /* fork-example-1.c */ + + #include + #include + #include + #include + #include + + void* create_shared_memory(size_t size) { + return mmap(NULL, + size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, + -1, 0); + } + + + int main() { + void* shmem = create_shared_memory(128); + + printf("Shared memory at: %p\n" , shmem); + int pid = fork(); + + if (pid == 0) { + while (1); + } else { + printf("Child's pid is: %d\n", pid); + while(1); + } + } + #+END_SRC + + Наконец, попробуем что-то записать в эту память! Для этого нам, вообще говоря, необходимо синхронизировать родительский и дочерний процесс с помощью мьютекса. + В целях простоты мы пока сделаем код, который *В ПРИНЦИПЕ НЕПРАВИЛЬНЫЙ*, так как не имеет синхронизации. Однако он продемонстрирует обмен информацией между процессами через память. + + + *Задание 1* модифицируйте программу выше следующим образом: + - Необходимо выделить память для 10 чисел типа =int= и сделать её общей для родительского и дочернего процессов. Внесите туда числа от 1 до 10. + - Родительский процесс будет ждать завершения дочернего процесса с помощью =wait(NULL)=. После этого он должен вывести все 10 чисел на экран. + - Дочерний процесс считывает два числа с помощью =scanf=: индекс в массиве и новое значение. Он меняет соответствующее число в массиве и завершает свою работу. + + +* Конвейеры (pipes) + +Другим способом обмена данными между потоками являются конвейеры. Конвейер создается с помощью функции =pipe=. +Конвейер --- это пара дескрипторов файлов, один из них предназначен только для записи данных (номер 1), второй только для чтения (номер 0). +Все данные, записанные в дескриптор =1= буферизируются и становятся доступны для чтения по дескриптору =2=. + +#+BEGIN_SRC c + int pipe_fd[2]; + pipe(pipe_fd); +#+END_SRC + +Все необходимые конвейеры должны быть созданы до вызова =fork=, тогда они будут доступны как в родительском, так и в дочернем процессе. Если мы хотим отправлять данные в обе стороны (от родителя ребенку и обратно), то следет создать пару конвейеров. После вызова =fork= и родительский и дочерний процессы наследуют все дескпиторы конвейеров, поэтому нужно закрыть ненужные дескрипторы, используя функцию =close=. Далее мы можем передевать данные посредством конвейера между процессами: писать в один конец конвейера, используя функцию =write=, и читать и другого конца, используя функцию =read=. + +#+BEGIN_SRC c + /* pipe-example.c */ + + #include + #include + #include + + int main() { + // Создадим два конвейера + int pipes[2][2]; + pipe(pipes[0]); + pipe(pipes[1]); + // Создадим дочерний процесс + pid_t pid = fork(); + if (pid == 0) { + // Сохраним нужные дескпиторы конвейеров + int to_parent_pipe = pipes[1][1]; + int from_parent_pipe = pipes[0][0]; + // И закроем ненужные + close(pipes[1][0]); + close(pipes[0][1]); + // Отпавим один байт родителю + char c = 'A'; + write(to_parent_pipe, &c, 1); + // И будем ждать, пока родитель не пришлет 1 байт в ответ + while (read(from_parent_pipe, &c, 1) == 0) + ; + printf("Recieved from parent: %c\n", c); + // Закроем дескпиторы + close(to_parent_pipe); + close(from_parent_pipe); + return 0; + } + else { + // Сохраним нужные дескпиторы конвейеров + int from_child_pipe = pipes[1][0]; + int to_child_pipe = pipes[0][1]; + // И закроем ненужные + close(pipes[1][1]); + close(pipes[0][0]); + // Будем ждать, пока ребенок не пришлет 1 байт + char c; + while (read(from_child_pipe, &c, 1) == 0) + ; + printf("Recieved from child: %c\n", c); + // И отправим ответ + c++; + write(to_child_pipe, &c, 1); + // Дождемся завершения ребенка + waitpid(pid, NULL, 0); + // Закроем дескпиторы + close(from_child_pipe); + close(to_child_pipe); + return 0; + } + } +#+END_SRC + +Можно регламентировать обмен данными через конвейеры, используя фиксированный формат сообщения, состоящий из заголовка и данных произвольного размера: + +#+BEGIN_SRC c + enum + { + MESSAGE_MAGIC = 0xAFAF, // magic signature value + MAX_MESSAGE_LEN = 4096 // maximum message length + }; + struct __attribute__((packed)) message_header + { + uint16_t magic; // magic signature + uint16_t type; // type of the message + uint16_t data_len; // length of data + }; + enum + { + // maximum data length + MAX_MESSAGE_DATA_LEN = MAX_MESSAGE_LEN - sizeof(struct message_header) + }; + struct __attribute__((packed)) message + { + struct message_header header; + // payload + uint8_t data[MAX_MESSAGE_DATA_LEN]; + }; +#+END_SRC + +Тогда, отправка и получение сообщения в конвейер будут выглядеть следующим образом: + +#+BEGIN_SRC c + int send(int fd, const struct message *msg) + { + int msg_size; + /* Check if the input data is not empty */ + if (fd < 0 || msg == NULL) + return -1; + /* Calculate the message size to send */ + msg_size = sizeof(struct message_header) + msg->header.data_len; + /* Check if message payload size is valid */ + if (msg->header.data_len > MAX_MESSAGE_DATA_LEN) + return -1; + /* Write data to the output pipe (we assume it is ready) */ + if (write(fd, msg, msg_size) != msg_size) + return -2; + return 0; + } + + int receive(int fd, struct message *msg) + { + int msg_size; + /* Check if the input data is not empty */ + if (fd < 0 || msg == NULL) + return -1; + /* Try to read header */ + msg_size = read(fd, &msg->header, sizeof(struct message_header)); + if (msg_size == 0) + return 0; + /* Check header magic */ + if (msg->header.magic != MESSAGE_MAGIC) + return -2; + /* Check if message has payload */ + if (msg->header.data_len > MAX_MESSAGE_DATA_LEN) + return -2; + if (msg->header.data_len > 0) + msg_size += read(fd, &msg->data, msg->header.data_len); + /* Return number of bytes read */ + return msg_size; + } + +#+END_SRC + +*Вопрос* Рассмотрите [[./pipe-example-1.c][пример программы]], которая в дочернем потоке читает строки со входа и отправляет их родительскому процессу через конвейер. Нужно ли было в данном примере использовать специальное сообщение о завершении ввода из дочернего процесса? + +*Задание 2* Попробуйте синхронизировать процессы из *Задания 1*, используя конвейеры. Теперь дочерний процесс будет сообщать родительскому об изменении данных, отправляя сообщение по конвейеру. При получении сообщения родительский процесс должен вывести массив на экран. Дочерний процесс будт продолжать ожидать ввод от пользователя и менять эллементы массива пока не получит на вход отрицательный индекс - тогда он завершается. + +* Многопоточные приложения + +Вспомним базовые сведения о многопоточных приложениях. + +** Создание новых потоков + +Для создания новых потоков мы будем использовать POSIX Threads (Pthreads). Для этого необходимо использовать дополнииельно ключ =-pthread= при выозве =gcc=. +Новый поток создается функцией =pthread_create=, аргументы, передаваемые функции создания потока (4 аргумент) передаются вызываемой в новом потоке функции напрямую: + +#+begin_src c + /* thread-example.c */ + + void* my_thread(void* arg) + { + for(int i = 0; i < 10; i++ ) + { + printf("%s\n", arg); + sleep(1); + } + return NULL; + } + + int main() + { + pthread_t t1, t2; + pthread_create(&t1, NULL, my_thread, "Hello"); + pthread_create(&t2, NULL, my_thread, "world"); + pthread_exit( NULL ); + return 0; + } +#+end_src + +Используемая в примере функция =pthread_exit= ожидает завершения всех запущенных потоков и завершает текущий поток. Поэтому код, идущий после неё никогда не будет выполнен (если бы он там был). Для ожидания завершения рыботы некоторого потока без завершения текущего следует использовать функцию =pthread_join=. + +** Мьютексы + +Мьютекс (mutex - mutual exclutsion) --- один из вариантов синхронизации потоков, позволяющий, например, исключить одновременное использование одного ресурса различными потоками. Мьютекс может быть в одном из двух состояний --- закрытом (locked) или открытом (unlocked). + +Мьютекс создается, используя функцию =pthread_mutex_init=: + +#+begin_src c + pthread_mutex_t m; + pthread_mutex_init(&m, NULL); +#+end_src + +Далее мьютекс можно закрыть, используя =pthread_mutex_lock=, и открыть, используя =pthread_mutex_unlock=: + +#+begin_src c + pthread_mutex_lock(&m); + // Тут можно спокойно использовать общий ресурс + pthread_mutex_unlock(&m); +#+end_src + +Для освобождения (удаления) мьютекса следует использовать функцию =pthread_mutex_destroy=. + +*Вопрос* Рассмотрите [[./mutex-example-1.c][пример работы с мьютексом]] (файл =mutex-example-1.c=). Что будет если [[./mutex-example.c][убрать использование мьютекса]] (файл =mutex-example.c=)? Объясните поведение. + +*Вопрос* Подробнее про мьютексы читайте на стр. 374--377 учебника. + +** Семафоры + +Семафор --- это целочисленная переменная (типа =sem_t=), с которой можно совершать ряд действий: + - Инициализировать её некоторым значением, функция =sem_init=. Семафор может использоваться в том числе для синхронизации процессов, для этого его следует инициализировать до вызова =fork=, используя общую память. + - Войти (wait, enter) --- если значение переменной не 0, то выполнить декремент (уменьшить на 1) и продолжить выполнение. В противном случае ожидать увеличения значения переменной, после чего выполнить декремент и продолжить выполнение. Релизуется функцией =sem_wait=. + - Выйти (post, leave) --- выполнить инкремент. Релизуется функцией =sem_post=. + +Семафоры позволяют организовать синхронизацию между параллельнымы потоками различными способами, напрмер: + - Запретить более чем заданному количеству потоков выполнять фрагмент кода параллельно. + - Заставить один поток ожидать выполнения действия другого потока. + +*Вопрос* Подробнее про семафоры читайте на стр. 382--384 учебника. + +*Вопрос* Чем семафоры отличаются от мьютексов? Чем семафор с двумя состояниями отличается от мьютекса? + +*Задание 3* Используте семафор для синхронизации между потоками в *Задании 2*. + +При выполнении задания 3 для синхронизации паралельных потоков и корректного завершения работы программы вам может понадобиться использовать несколько семафоров. Также может пригодиться функция =sem_trywait=, которая не блокирует вычисления в случае, если войти не удалось, а возврящает код ошибки (подробнее см. =man sem_trywait=). + +* Что такое модель памяти + +Для начала подумаем про компилятор языка. +Описание алгоритма в программе включает в себя операции чтения и записи в память. +Программист использует эти операции в том порядке, в котором ему удобно, но этот порядок может быть не самым производительным. +Например, такие операции: + +#+begin_src c +int x = 10; +int y = 993; +int z = y + x; +print(y); +#+end_src + +можно перемешать многими способами, например: + +#+begin_src c +int y = 993; +int x = 10; +print(y); +int z = y + x; +#+end_src + +или: + +#+begin_src c +int y = 993; +print(y); +int x = 10; +int z = y + x; +#+end_src + +Чтобы повысить производительность кода компилятор переставляет операции, оптимизируя программу. +Такие перестановки называются /реордеринги/. +При реордерингах результат выполнения программы (например, ввод-вывод) должен остаться неизменным, иначе такую перестановку было бы делать ошибочно. + + +/Модель памяти/ определяет, какие перестановки чтений и записей допустимы. +Можно классифицировать их с помощью спектра: + +1) Очень слабые --- любые перестановки разрешены, пока они не меняют поведение однопоточной программы. +2) Слабые с зависимостями по данным --- нет перестановок, которые вмешиваются в косвенную адресацию. + Если операции описываются как =a <- load x, z <- load a=, то между ними не будут вставляться другие инструкции. + В первой категории даже это свойство не гарантируется. +3) Скорее сильные --- порядок записей сохраняется, чтения могут менять своё место. +4) Sequentially consistent --- вообще никакие операции чтения-записи не переставляются. + +Слабые разрешают больше перестановок, сильные --- меньше, и стремятся к полюсу sequentially consistent. + +Зачем эта градация? Реордеринги не видны когда код выполняется в одном потоке, но если есть несколько потоков и они взаимодействуют, то реордеринги начинают играть роль. +Например, в такой ситуации: + +#+begin_src c +int x = 0; +int y = 0; +void thread1() { + x = 1; + print(y); +} +void thread2() { + y = 1; + print(x); +} + +#+end_src + +*Вопрос* в чём проблема в этом коде? Какие пары чисел могут быть выведены в зависимости от того, в каком порядке будут выполнены инструкции разных потоков? Какое влияние оказывают перестановки компилятором? + + +Модель памяти может строиться для любого языка программирования или вообще вычислительной системы, где есть память. +Мы взглянем на две модели памяти: для абстрактного вычислителя C и для Intel 64. + +Реордеринги в C можно увидеть через действия компилятора, который меняет порядок инструкций. +В C достаточно слабая модель памяти. +Это роднит её с, например, моделью памяти процессоров ARM7. + + +В аппаратуре реордеринги случаются, например, при трансляции ассемблерных инструкций в микрокод, при которой порядок чтений и записей может измениться. +В конце мы увидим пример того, как их увидеть. + + +*Вопрос* Пусть произошли некоторые опасные реордеринги при компиляции. Будет ли из-за этого результат работы программы различным при каждом запуске? + + + +** Барьеры памяти + +/Барьер памяти/ это место в программе, в котором заданы ограничения на реордеринги. +Например, барьер по чтению может означать, что все операции чтения, которые были по тексту программы до барьера, должны произойти до него. +Реордеринги не смогут перекинуть никакое чтение до барьера в текст ассемблерной программы после него. + +Барьеры бывают разные: + +- Чтение +- Запись +- Полный (и то, и другое) +- Acquire (как полный, но операции после барьера не могут просочиться сквозь него) +- Release (как полный, но операции до барьера не могут просочиться сквозь него) + +GCC использует конструкцию =asm volatile(""::: "memory")= для общего барьера (реордеринги при компиляции). + +*Вопрос* если мы используем ассемблерные вставки в программы, как это связано с необходимостью добавлять в неё барьеры памяти на уровне компиляции? + +Intel64 использует инструкции: + +- =lfence= для барьера по чтению +- =sfence= для барьера по записи +- =mfence= для полного барьера + +Соответственно, самый полный барьер будет выглядеть как инструкция =mfence= внутри ассемблерной вставки, для которой также указан атрибут =memory=, запрещающий компилятору реордеринги: + +#+begin_src c +asm volatile("mfence"::: "memory") +#+end_src + + +*Задание 4* разберите пример =cpu-reordering.c=; он дублирует пример с чтениями и записью в =x= и =y=, но прогоняет его множество раз. При этом семафоры используются чтобы программа запускала вычисления в каждом потоке и по завершению итерации ждала, пока второй поток завершит свою итерацию. +Объясните, как в этой программе используются семафоры и как происходит детектирование реордерингов. Затем попробуйте вставить полные барьеры времени компиляции туда, где это необходимо. Попробуйте также вариант с полным барьером для компиляции и с соответствующей инструкцией процессора для полного барьера. Объясните результаты. + + +На низком уровне мьютексы и другие примитивы синхронизации реализованы с помощью барьеров. Действия, которые в коде происходят до работы с мьютексом или семафором, не должны оказаться из-за реордерингов после них. +Не пользуйтесь =volatile= для синхронизации между потоками! Полное объяснение на стр.362--363 учебника. + diff --git a/sem8/cpu-reordering.c b/sem8/cpu-reordering.c new file mode 100644 index 0000000..170a029 --- /dev/null +++ b/sem8/cpu-reordering.c @@ -0,0 +1,72 @@ +/* cpu-reordering.c */ + +#include +#include +#include +#include +#include +#include +#include +/* + * В этом коде происходит та же логика, что и в примере ранее. + Семафоры используются чтобы при каждом запуске итерации + в thread0_impl/thread1_impl в момент sem_post потоки + подождали друг друга. + */ +sem_t sem_begin0, sem_begin1, sem_end; + +int x, y, read0, read1; + +void *thread0_impl( void *param ) +{ + for (;;) { + sem_wait( &sem_begin0 ); + + x = 1; + read0 = y; + + sem_post( &sem_end ); + } + return NULL; +} + +void *thread1_impl( void *param ) +{ + for (;;) { + sem_wait( &sem_begin1 ); + + y = 1; + read1 = x; + + sem_post( &sem_end ); + } + return NULL; +} + +int main( void ) { + sem_init( &sem_begin0, 0, 0); + sem_init( &sem_begin1, 0, 0); + sem_init( &sem_end, 0, 0); + + pthread_t thread0, thread1; + pthread_create( &thread0, NULL, thread0_impl, NULL); + pthread_create( &thread1, NULL, thread1_impl, NULL); + + for (uint64_t i = 0; i < 1000000; i++) + { + x = 0; + y = 0; + sem_post( &sem_begin0 ); + sem_post( &sem_begin1 ); + + sem_wait( &sem_end ); + sem_wait( &sem_end ); + + if (read0 == 0 && read1 == 0 ) { + printf( "reordering happened on iteration %" PRIu64 "\n", i ); + exit(0); + } + } + puts("No reordering detected during 1000000 iterations"); + return 0; +} diff --git a/sem8/fork-example-1.c b/sem8/fork-example-1.c new file mode 100644 index 0000000..a172a51 --- /dev/null +++ b/sem8/fork-example-1.c @@ -0,0 +1,30 @@ +/* fork-example-1.c */ + +#include +#include +#include +#include +#include + +void* create_shared_memory(size_t size) { + return mmap(NULL, + size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, + -1, 0); +} + + +int main() { + void* shmem = create_shared_memory(128); + + printf("Shared memory at: %p\n" , shmem); + int pid = fork(); + + if (pid == 0) { + while (1); + } else { + printf("Child's pid is: %d\n", pid); + while(1); + } +} diff --git a/sem8/fork-example.c b/sem8/fork-example.c new file mode 100644 index 0000000..419f7c7 --- /dev/null +++ b/sem8/fork-example.c @@ -0,0 +1,19 @@ +/* fork-example.c */ + +#include +#include + +int main() { + // pid_t это, как и int, численный тип для идентификаторов процессов + pid_t pid = fork(); + // в зависимости от возвращаемого значения, которое попадёт в pid, + // мы поймём, находимся ли мы в родительском процессе или в дочернем. + if (pid == 0) { + printf("I am a child, pid was %d\n", pid); + printf("Child's pid is %d\n", getpid()); + } + else { + printf("I am a parent, pid was %d\n", pid); + printf("Parent's pid is %d\n", getpid()); + } +} diff --git a/sem8/mutex-example-1.c b/sem8/mutex-example-1.c new file mode 100644 index 0000000..992ee5e --- /dev/null +++ b/sem8/mutex-example-1.c @@ -0,0 +1,34 @@ +/* mutex-example-1.c */ + +#include +#include +#include +#include + +pthread_mutex_t m; +pthread_t t1, t2; +uint64_t value = 0; + +void* my_thread(void *_) +{ + for (int n = 0; n < 1000000; n++) + { + pthread_mutex_lock(&m); + value += 1; + pthread_mutex_unlock(&m); + } + return NULL; +} + +int main(void) +{ + pthread_mutex_init(&m, NULL); + pthread_create(&t1, NULL, my_thread, NULL); + pthread_create(&t2, NULL, my_thread, NULL); + pthread_join(t1, NULL); + pthread_join(t2, NULL); + printf("%"PRIu64"\n", value); + pthread_mutex_destroy(&m); + + return 0; +} diff --git a/sem8/mutex-example.c b/sem8/mutex-example.c new file mode 100644 index 0000000..478dc81 --- /dev/null +++ b/sem8/mutex-example.c @@ -0,0 +1,27 @@ +/* mutex-example.c */ + +#include +#include +#include +#include + +uint64_t value = 0; + +void* my_thread(void *_) +{ + for (int n = 0; n < 1000000; n++) + value += 1; + return NULL; +} + +int main(void) +{ + pthread_t t1, t2; + pthread_create(&t1, NULL, my_thread, NULL); + pthread_create(&t2, NULL, my_thread, NULL); + pthread_join(t1, NULL); + pthread_join(t2, NULL); + printf("%"PRIu64"\n", value); + + return 0; +} diff --git a/sem8/pipe-example-1.c b/sem8/pipe-example-1.c new file mode 100644 index 0000000..2b29dcc --- /dev/null +++ b/sem8/pipe-example-1.c @@ -0,0 +1,180 @@ +/* pipe-example-1.c */ + +#include +#include +#include +#include +#include + +enum +{ + MSG_STRING = 1, + MSG_END +}; + +enum +{ + MESSAGE_MAGIC = 0xAFAF, // magic signature value + MAX_MESSAGE_LEN = 4096 // maximum message length +}; + +struct __attribute__((packed)) message_header +{ + uint16_t magic; // magic signature + uint16_t type; // type of the message + uint16_t data_len; // length of data +}; + +enum +{ + // maximum data length + MAX_MESSAGE_DATA_LEN = MAX_MESSAGE_LEN - sizeof(struct message_header) +}; + +struct __attribute__((packed)) message +{ + struct message_header header; + // payload + uint8_t data[MAX_MESSAGE_DATA_LEN]; +}; + +struct message simple_message(uint16_t type) +{ + return (struct message) {(struct message_header) {MESSAGE_MAGIC, type, 0}, 0}; +} + +struct message string_message(const char *str) +{ + struct message msg = (struct message) {(struct message_header) {MESSAGE_MAGIC, MSG_STRING, strlen(str + 1)}, 0}; + strcpy(msg.data, str); + return msg; +} + +int send(int fd, const struct message *msg) +{ + /* Check if the input data is not empty */ + if (fd < 0 || msg == NULL) + return -1; + + /* Calculate the message size to send */ + int msg_size = sizeof(struct message_header) + msg->header.data_len; + + /* Check if message payload size is valid */ + if (msg->header.data_len > MAX_MESSAGE_DATA_LEN) + return -1; + + /* Write data to the output pipe (we assume it is ready) */ + if (write(fd, msg, msg_size) != msg_size) + return -2; + + return 0; +} + +int receive(int fd, struct message *msg) +{ + /* Check if the input data is not empty */ + if (fd < 0 || msg == NULL) + return -1; + + /* Try to read header */ + int msg_size = read(fd, &msg->header, sizeof(struct message_header)); + if (msg_size == 0) + return 0; + + /* Check header magic */ + if (msg->header.magic != MESSAGE_MAGIC) + return -2; + + /* Check if message has payload */ + if (msg->header.data_len > MAX_MESSAGE_DATA_LEN) + return -2; + if (msg->header.data_len > 0) + msg_size += read(fd, &msg->data, msg->header.data_len); + + /* Return number of bytes read */ + return msg_size; +} + + +int main() { + // Создадим два конвейера + int pipes[2][2]; + pipe(pipes[0]); + pipe(pipes[1]); + + // Создадим дочерний процесс + pid_t pid = fork(); + if (pid == 0) { + // Сохраним нужные дескпиторы конвейеров + int to_parent_pipe = pipes[1][1]; + int from_parent_pipe = pipes[0][0]; + + // И закроем ненужные + close(pipes[1][0]); + close(pipes[0][1]); + + // Будем читать строки и отправлять их сообщениями + char str[MAX_MESSAGE_DATA_LEN]; + for (;;) + { + // Прочитаем строку + if (fgets(str, MAX_MESSAGE_DATA_LEN, stdin) == NULL) + return 0; + if (strlen(str) <= 1) + break; + + // И отпавим её родителю + struct message msg = string_message(str); + send(to_parent_pipe, &msg); + } + + // Отправим сообщение о завершении ввода + struct message msg = simple_message(MSG_END); + send(to_parent_pipe, &msg); + + // Закроем дескпиторы + close(to_parent_pipe); + close(from_parent_pipe); + + return 0; + } + + // Далее выполняется только родительский поток + // Сохраним нужные дескпиторы конвейеров + int from_child_pipe = pipes[1][0]; + int to_child_pipe = pipes[0][1]; + + // И закроем ненужные + close(pipes[1][1]); + close(pipes[0][0]); + + // Будем ждать, пока ребенок не пришлет сообщение + struct message msg; + while (1) + { + int ret; + while (ret = receive(from_child_pipe, &msg) == 0) + ; + if (ret < 0) + return 1; + + // Если это строка - выведем её + if (msg.header.type == MSG_STRING) + printf("Recieved string from child: %s\n", (char *)msg.data); + // Если конец ввода - прервемся + else if (msg.header.type == MSG_END) + { + printf("Recieved END from child\n"); + break; + } + } + + // Дождемся завершения ребенка + waitpid(pid, NULL, 0); + + // Закроем дескпиторы + close(from_child_pipe); + close(to_child_pipe); + + return 0; +} diff --git a/sem8/pipe-example.c b/sem8/pipe-example.c new file mode 100644 index 0000000..5811e63 --- /dev/null +++ b/sem8/pipe-example.c @@ -0,0 +1,54 @@ +/* pipe-example.c */ + +#include +#include +#include + +int main() { + int pipes[2][2]; + pipe(pipes[0]); + pipe(pipes[1]); + + pid_t pid = fork(); + if (pid == 0) { + // Сохраним нужные дескпиторы конвейеров + int to_parent_pipe = pipes[1][1]; + int from_parent_pipe = pipes[0][0]; + // И закроем ненужные + close(pipes[1][0]); + close(pipes[0][1]); + // Отпавим один байт родителю + char c = 'A'; + write(to_parent_pipe, &c, 1); + // И будем ждать, пока родитель не пришлет 1 байт в ответ + while (read(from_parent_pipe, &c, 1) == 0) + ; + printf("Recieved from parent: %c\n", c); + // Закроем дескпиторы + close(to_parent_pipe); + close(from_parent_pipe); + return 0; + } + else { + // Сохраним нужные дескпиторы конвейеров + int from_child_pipe = pipes[1][0]; + int to_child_pipe = pipes[0][1]; + // И закроем ненужные + close(pipes[1][1]); + close(pipes[0][0]); + // Будем ждать, пока ребенок не пришлет 1 байт + char c; + while (read(from_child_pipe, &c, 1) == 0) + ; + printf("Recieved from child: %c\n", c); + // И отправим ответ + c++; + write(to_child_pipe, &c, 1); + // Дождемся завершения ребенка + waitpid(pid, NULL, 0); + // Закроем дескпиторы + close(from_child_pipe); + close(to_child_pipe); + return 0; + } +}