From 0af4eb8f1bdc55be463a846601029ed3e4d0b6d2 Mon Sep 17 00:00:00 2001 From: Yanis HAMOUDI <yanis.hamoudi@etu.u-pec.fr> Date: Tue, 4 Feb 2025 17:31:25 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9liorations=20du=20code=20+=20Du=20mode?= =?UTF-8?q?=20debug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bakefile.jar | Bin 0 -> 8694 bytes src/fr/monlouyan/bakefile/BakeCLI.java | 6 +- src/fr/monlouyan/bakefile/BakeEngine.java | 16 +-- src/fr/monlouyan/bakefile/BakefileParser.java | 21 ++-- .../monlouyan/bakefile/CommandExecutor.java | 33 +++-- .../bakefile/DependencyResolver.java | 15 +-- src/fr/monlouyan/bakefile/Rule.java | 116 ++++++++++++++++++ src/fr/monlouyan/bakefile/Target.java | 30 ----- .../monlouyan/bakefile/TimestampManager.java | 39 ++++++ tests/bakefile.jar | Bin 0 -> 8694 bytes tests/test-01-depuis-rien/bakefile.jar | Bin 0 -> 8694 bytes tests/test-02-existe-deja/bakefile.jar | Bin 0 -> 8694 bytes tests/test-03-circulaire/Bakefile | 19 ++- tests/test-03-circulaire/bakefile.jar | Bin 0 -> 8694 bytes 14 files changed, 215 insertions(+), 80 deletions(-) create mode 100644 bakefile.jar create mode 100644 src/fr/monlouyan/bakefile/Rule.java delete mode 100644 src/fr/monlouyan/bakefile/Target.java create mode 100644 src/fr/monlouyan/bakefile/TimestampManager.java create mode 100644 tests/bakefile.jar create mode 100644 tests/test-01-depuis-rien/bakefile.jar create mode 100644 tests/test-02-existe-deja/bakefile.jar create mode 100644 tests/test-03-circulaire/bakefile.jar diff --git a/bakefile.jar b/bakefile.jar new file mode 100644 index 0000000000000000000000000000000000000000..a268f9af06935865663b73b441a7c79f27806997 GIT binary patch literal 8694 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 K28MDu5Dx(CMf=YH literal 0 HcmV?d00001 diff --git a/src/fr/monlouyan/bakefile/BakeCLI.java b/src/fr/monlouyan/bakefile/BakeCLI.java index e3462ee..34d1981 100644 --- a/src/fr/monlouyan/bakefile/BakeCLI.java +++ b/src/fr/monlouyan/bakefile/BakeCLI.java @@ -15,7 +15,7 @@ public class BakeCLI { /* * Mode debug activé ou non */ - private boolean debug; + private static boolean debug; /* * Liste des arguments passés en ligne de commande @@ -30,7 +30,7 @@ public class BakeCLI { * @see Main */ public BakeCLI(String[] args){ - this.debug = false; + debug = false; this.targets = new ArrayList<>(); parseArgs(args); } @@ -54,7 +54,7 @@ public class BakeCLI { * Permet de savoir si le mode debug est activé ou non. * @return true si le mode debug est activé, false sinon */ - public boolean isDebug(){ return debug; } + public static boolean isDebug(){ return debug; } /** * Permet de récupérer les arguments autres que "-d" passés en ligne de commande diff --git a/src/fr/monlouyan/bakefile/BakeEngine.java b/src/fr/monlouyan/bakefile/BakeEngine.java index 7751a62..574058b 100644 --- a/src/fr/monlouyan/bakefile/BakeEngine.java +++ b/src/fr/monlouyan/bakefile/BakeEngine.java @@ -2,7 +2,6 @@ package fr.monlouyan.bakefile; import java.util.List; - public class BakeEngine { private BakeCLI cli; private BakefileParser parser; @@ -12,15 +11,16 @@ public class BakeEngine { public BakeEngine(BakeCLI cli) { this.cli = cli; this.parser = new BakefileParser("Bakefile"); - this.resolver = new DependencyResolver(cli.isDebug()); - this.executor = new CommandExecutor(cli.isDebug()); + this.resolver = new DependencyResolver(BakeCLI.isDebug()); + this.executor = new CommandExecutor(BakeCLI.isDebug()); } public void run() { - List<Target> targets = parser.parse(); - List<Target> targetsToBuild = resolver.resolve(targets, cli.getTargets()); - for (Target target : targetsToBuild) { - executor.execute(target); + List<Rule> rules = parser.parse(); + List<Rule> rulesToBuild = resolver.resolve(rules, cli.getTargets()); + + for (Rule rule : rulesToBuild) { + executor.execute(rule); } } -} \ No newline at end of file +} diff --git a/src/fr/monlouyan/bakefile/BakefileParser.java b/src/fr/monlouyan/bakefile/BakefileParser.java index 07cae52..6202da4 100644 --- a/src/fr/monlouyan/bakefile/BakefileParser.java +++ b/src/fr/monlouyan/bakefile/BakefileParser.java @@ -26,8 +26,10 @@ public class BakefileParser { this.filename = filename; } - public List<Target> parse() { - List<Target> targets = new ArrayList<>(); + public List<Rule> parse() { + List<Rule> rules = new ArrayList<>(); + Set<String> phonyTargets = new HashSet<>(); + if (!Files.exists(Paths.get(filename))) { System.out.println("*** No targets specified and no makefile found. Stop."); System.exit(1); @@ -44,30 +46,29 @@ public class BakefileParser { Matcher commandMatcher = COMMAND_PATTERN.matcher(line); if (targetMatcher.matches()) { - // Sauvegarde de la précédente target si elle existe + // Sauvegarde de la règle précédente si elle existe if (currentTarget != null) { - targets.add(new Target(currentTarget, dependencies, String.join(" && ", commands))); + rules.add(new Rule(currentTarget, dependencies, commands, phonyTargets.contains(currentTarget))); } - // Nouvelle target détectée + // Nouvelle cible détectée currentTarget = targetMatcher.group(1); dependencies = new ArrayList<>(Arrays.asList(targetMatcher.group(2).trim().split("\\s+"))); commands = new ArrayList<>(); - } else if (commandMatcher.matches()) { - // Ligne de commande associée à la dernière target trouvée + // Ligne de commande associée à la dernière cible trouvée commands.add(commandMatcher.group(1)); } } - // Ajout de la dernière target après la boucle + // Ajout de la dernière règle après la boucle if (currentTarget != null) { - targets.add(new Target(currentTarget, dependencies, String.join(" && ", commands))); + rules.add(new Rule(currentTarget, dependencies, commands, phonyTargets.contains(currentTarget))); } } catch (IOException e) { e.printStackTrace(); } - return targets; + return rules; } } diff --git a/src/fr/monlouyan/bakefile/CommandExecutor.java b/src/fr/monlouyan/bakefile/CommandExecutor.java index dd37dfc..786ecd3 100644 --- a/src/fr/monlouyan/bakefile/CommandExecutor.java +++ b/src/fr/monlouyan/bakefile/CommandExecutor.java @@ -9,20 +9,31 @@ public class CommandExecutor { this.debug = debug; } - public void execute(Target target) { - if (!target.needsUpdate()){ - System.out.println("bake: '" + target.getName() + "' is up to date."); + public void execute(Rule rule) { + if (rule.getCommands().isEmpty()) { + System.out.println("bake: Nothing to be done for '" + rule.getName() + "'."); return; - }; + } + + if (!rule.needsUpdate()){ + System.out.println("bake: '" + rule.getName() + "' is up to date."); + return; + } + try { - System.out.println(target.getCommand()); - ProcessBuilder pb = new ProcessBuilder("sh", "-c", target.getCommand()); - Process process = pb.start(); - int exitCode = process.waitFor(); - if (debug) System.out.println("Executed: " + target.getCommand() + " with exit code " + exitCode); - if (exitCode != 0) System.err.println("Error executing " + target.getName()); + for (String command : rule.getCommands()) { + System.out.println(command); // Affichage de la commande executée + ProcessBuilder pb = new ProcessBuilder("sh", "-c", command); + Process process = pb.start(); + int exitCode = process.waitFor(); + if (debug) System.out.println("Executed: " + command + " with exit code " + exitCode); + if (exitCode != 0) { + System.err.println("Error executing " + rule.getName() + ""); + break; + } + } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } -} \ No newline at end of file +} diff --git a/src/fr/monlouyan/bakefile/DependencyResolver.java b/src/fr/monlouyan/bakefile/DependencyResolver.java index 133d492..8ca21fc 100644 --- a/src/fr/monlouyan/bakefile/DependencyResolver.java +++ b/src/fr/monlouyan/bakefile/DependencyResolver.java @@ -10,16 +10,17 @@ public class DependencyResolver { this.debug = debug; } - public List<Target> resolve(List<Target> allTargets, List<String> requestedTargets) { - List<Target> targetsToBuild = new ArrayList<>(); - for (Target target : allTargets) { - if (requestedTargets.isEmpty() || requestedTargets.contains(target.getName())) { + public List<Rule> resolve(List<Rule> allRules, List<String> requestedRules) { + List<Rule> rulesToBuild = new ArrayList<>(); + + for (Rule rule : allRules) { + if (requestedRules.isEmpty() || requestedRules.contains(rule.getName()) || rule.isPhony()) { if (debug){ - System.out.println("Target " + target.getName() + " is requested"); + System.out.println("Rule " + rule.getName() + " is requested"); } - targetsToBuild.add(target); + rulesToBuild.add(rule); } } - return targetsToBuild; + return rulesToBuild; } } \ No newline at end of file diff --git a/src/fr/monlouyan/bakefile/Rule.java b/src/fr/monlouyan/bakefile/Rule.java new file mode 100644 index 0000000..c15ab74 --- /dev/null +++ b/src/fr/monlouyan/bakefile/Rule.java @@ -0,0 +1,116 @@ +package fr.monlouyan.bakefile; + +import java.io.File; +import java.util.List; + +/** + * Représente une règle dans un fichier Bakefile + * Dernière modification : 04/02/2025 + * + * @author Moncef STITI, Yanis HAMOUDI + * @version 1.0 + * @date 04/02/2025 + */ +public class Rule { + /** + * Nom de la règle + */ + private String name; + + /** + * Liste des dépendances de la règle + */ + private List<String> dependencies; + + /** + * Liste des commandes de la règle (actions à exécuter) + */ + private List<String> commands; + + /** + * Indique si la règle est une règle phony + */ + private boolean isPhony; + + /** + * Constructeur de la classe Rule + * @param name Nom de la règle + * @param dependencies Liste des dépendances de la règle + * @param commands Liste des commandes de la règle à exécuter + * @param isPhony Si la règle est une règle phony ou non + */ + public Rule(String name, List<String> dependencies, List<String> commands, boolean isPhony) { + this.name = name; + this.dependencies = dependencies; + this.commands = commands; + this.isPhony = isPhony; + } + + /** + * Permet de récupérer le nom de la règle + * @return Le nom de la règle + */ + public String getName() { return name; } + + /** + * Permet de récupérer les dépendances de la règle + * @return La liste des dépendances de la règle + */ + public List<String> getDependencies() { return dependencies; } + + /** + * Permet de récupérer les commandes de la règle + * @return La liste des commandes de la règle + */ + public List<String> getCommands() { return commands; } + + /** + * Permet de savoir si la règle est une règle phony + * @return true si la règle est une règle phony, false sinon + */ + public boolean isPhony() { return isPhony; } + + /** + * Permet de savoir si la règle est vide (sans dépendances ni commandes) + * @return true si la règle est vide, false sinon + */ + public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); } + + /** + * Détermine si la règle doit être mise à jour. + * Une règle doit être mise à jour si l'un de ses fichiers de sortie est plus ancien qu'un de ses fichiers de dépendance. + * De plus, les règles phony sont toujours mises à jour. + * + * @return true si la règle doit être mise à jour, false sinon. + */ + public boolean needsUpdate() { + if (BakeCLI.isDebug()){ + System.out.println("Debug : Checking if rule " + name + " needs update"); + } + + if (isPhony) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Rule " + name + " is phony, always needs update"); + } + return true; // Les règles phony sont toujours mises à jour + } + + File targetFile = new File(name); + + if (BakeCLI.isDebug()){ + System.out.println("Debug : Checking if target file " + name + " exist and is up to date"); + } + long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0; + + for (String dependency : dependencies) { + File depFile = new File(dependency); + if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) { + if (BakeCLI.isDebug()) { + System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update"); + } + return true; + } + } + return false; + } +} diff --git a/src/fr/monlouyan/bakefile/Target.java b/src/fr/monlouyan/bakefile/Target.java deleted file mode 100644 index 29b32ca..0000000 --- a/src/fr/monlouyan/bakefile/Target.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.monlouyan.bakefile; - -import java.io.File; -import java.util.List; - -public class Target { - private String name; - private List<String> dependencies; - private String command; - - public Target(String name, List<String> dependencies, String command) { - this.name = name; - this.dependencies = dependencies; - this.command = command; - } - - public boolean needsUpdate() { - File targetFile = new File(name); - if (!targetFile.exists()) return true; - long lastModified = targetFile.lastModified(); - for (String dep : dependencies) { - File depFile = new File(dep); - if (depFile.exists() && depFile.lastModified() > lastModified) return true; - } - return false; - } - - public String getCommand() { return command; } - public String getName() { return name; } -} \ No newline at end of file diff --git a/src/fr/monlouyan/bakefile/TimestampManager.java b/src/fr/monlouyan/bakefile/TimestampManager.java new file mode 100644 index 0000000..fc37bda --- /dev/null +++ b/src/fr/monlouyan/bakefile/TimestampManager.java @@ -0,0 +1,39 @@ +package fr.monlouyan.bakefile; + +import java.io.File; + +/** + * Classe utilitaire pour la gestion des timestamps des fichiers. + * Dernière modification : 04/02/2025 + * + * @author Moncef STITI, Yanis HAMOUDI + * @version 1.0 + * @date 04/02/2025 + */ +public class TimestampManager { + + /** + * Récupère le timestamp d'un fichier. + * @param filePath Le chemin du fichier. + * @return Le timestamp du fichier, ou 0 si le fichier n'existe pas. + */ + public static long getTimestamp(File file) { + if (file.exists()) { + return file.lastModified(); // Récupère le timestamp du fichier + } + return 0; // Le fichier n'existe pas + } + + /** + * Compare deux fichiers en fonction de leurs timestamps de modification. + * + * @param file1 Premier fichier + * @param file2 Deuxième fichier + * @return 1 si file1 est plus récent, -1 si file2 est plus récent, 0 s'ils ont le même timestamp + */ + public static int compareTimestamps(File file1, File file2) { + long time1 = getTimestamp(file1); + long time2 = getTimestamp(file2); + return Long.compare(time1, time2); + } +} diff --git a/tests/bakefile.jar b/tests/bakefile.jar new file mode 100644 index 0000000000000000000000000000000000000000..a268f9af06935865663b73b441a7c79f27806997 GIT binary patch literal 8694 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 K28MDu5Dx(CMf=YH literal 0 HcmV?d00001 diff --git a/tests/test-01-depuis-rien/bakefile.jar b/tests/test-01-depuis-rien/bakefile.jar new file mode 100644 index 0000000000000000000000000000000000000000..a268f9af06935865663b73b441a7c79f27806997 GIT binary patch literal 8694 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 K28MDu5Dx(CMf=YH literal 0 HcmV?d00001 diff --git a/tests/test-02-existe-deja/bakefile.jar b/tests/test-02-existe-deja/bakefile.jar new file mode 100644 index 0000000000000000000000000000000000000000..a268f9af06935865663b73b441a7c79f27806997 GIT binary patch literal 8694 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 K28MDu5Dx(CMf=YH literal 0 HcmV?d00001 diff --git a/tests/test-03-circulaire/Bakefile b/tests/test-03-circulaire/Bakefile index 369b433..b458a3d 100644 --- a/tests/test-03-circulaire/Bakefile +++ b/tests/test-03-circulaire/Bakefile @@ -1,14 +1,11 @@ -main: a.o b.o c.o - gcc a.o b.o c.o -o main +main: a b c + gcc a b c -o main -a.o: a.c a.h b.h - gcc -Wall -Werror -Wextra -c a.c -o a.o +a: a.c a.h b.h + gcc -Wall -Werror -Wextra -Pendatic -c a.c -o a -b.o: b.c b.h c.h - gcc -Wall -Werror -Wextra -c b.c -o b.o +b: b.c b.h c.h + gcc -Wall -Werror -Wextra -Pendatic -c b.c -o b -c.o: c.c c.h a.h - gcc -Wall -Werror -Wextra -c c.c -o c.o - -clean: - rm -f a.o b.o c.o main +c: c.c c.h a.h + gcc -Wall -Werror -Wextra -Pendatic -c c.c -o c diff --git a/tests/test-03-circulaire/bakefile.jar b/tests/test-03-circulaire/bakefile.jar new file mode 100644 index 0000000000000000000000000000000000000000..a268f9af06935865663b73b441a7c79f27806997 GIT binary patch literal 8694 zcmWIWW@h1HVBlb2knDDeVn70%3@i-3t|5-Po_=on|4uP5fRu_baBy&7C>3E~Kq&Qf z^z(Fc4Gz)sb^Gjl=CqHuuHHpnZ(Xf(XU=a9GPq*=;AxSbm#>be@5RzpTY?Ojx?V_X zX8aIWReQcf%i_7X=o4|(X$+#-pNc*fF){>rvvY($a_DkmU|;~@0G!ShV_;xNE7H%+ z&&$a#txU|*PfE;AP0P$l)d%Up?rvqAdYlroQ=NT0^^$WEi;GKxV*M{Ch}7NN8oNCx zfsc)6hLS>Fa)6!Cez!D%q@<uPNi2`|RBfNSG{EXjl<>PfAN(s`^P0zX$P1W0WUqMJ zZ+L9MbKT%W7u0I+7yHeh_j%6qIqTKu_cQ7w2RgG%;)-l<(r`}dwtwDs_-@<B6}wWe z*0jBt^!8R=r{k$-W{)})*EwCj$U0YX^Giu<-|Lxd)ptx+)!e?dMfUU#_hVf@8yr_g zUtMtUfR<L3#IHkd8uP7>ZF>IE_Hy1&sa=YlTc($&Ts*$u*PZN$y6zJ*(kmEsvsk=e zN*qvdu9;q~n|(7|pg`gG6&vNaZ??B{MT(^jmq;oZm+~r0gigFzC>eh4YX#R*xwYwx z<r=|S*=1S*XF_)sh(6X*EAi=Kv3;I7(P&Scx?Ae*heh@ublOhxz48|SIkk)Dlh<ay z7jc)%*0vw?yZY%`<<*5A<u{*ieQUZ;`j^%+&pq{DJhE=Cy&Bw`X(P(kyCnL*a)Qz9 z*Hb1WzH<6t|71&%@rSHywb25XZX3@P4Va|tR?S>xx{+g{>tW`@TQAIO^4ZqpXtln* zTdnm+$v+OCDt^=dtattUF8mhk{PRWe7yk=o=V|8{fALBzW?6K?LUrx|ftPZE$@$Bx z9pk3Fi@u!Q`gl@_v){>?*EK|fJ{^)(U8~a0XZVL}mQU-qi?jbXxJ3PI*~lTcf6C2& z>+{(aJp*$s&ICKyr)5~Cb^eoic5;8G>k}ulPn=0wpL+g^Setxej=kTRILE*^*KBb~ zw|gD?*R%KS7A1Z$o4eUy#Vm)k6T*S60adpd_ujsi*SF{Ag{U9ApoIPR#H)!RObiUm znek;VHN1(`H7`9gFBOtbYeQ}a2|Ehd3NvvhDhfEYXtY&NE9h(rZxZ5Ikip?`L91e; zSz-tG$+lZ>f<C+n|G{b(oZ6Hz_37sQ595C{e9Lii)mxagI=yO{{_`&-@7Hh6w`Vx> za4k3A70-fGE8Ll#Z?CIb(6)KiJkIsY$|`TAWX!l&a<=AN!1A6w*-px{RCc78IH$e1 zYj|kqo_S}Z-B-!^t*owbKmF;0O|ID2o@K?KywXkE9QJHW)!8RA@xm#Ch}&*C*FqK_ z=yls-Xfkj9&I?Ta2ksrbu=2?27n7GQd^yuYvT!+%e4gOcT5FcWA9xE^t>g$bZ!X&V zlIi~QUuM@YyT9Hu;k;bI;nv$bloz@mi)E3h%1b$;klD&QZ<A43;`W#qPV*HmoqrIr z?bHtTRG!2cFQlf5@GO)%vHp<a7p}t>zCPPnqqqFk?e2D)+?kb4axU{vSZF2lJf1Q! zJWry@)F_TiP|#m+S|R^;$yaZkj4P&0{4_ga*)-ncTbm>WLuXC;=rCia(VaU1ypvcD z{-4-$yuxYf$_uG8LiBdWUt519|CmX~ub!Ut1<P{xR`{MVnJm5P?3r@LyG2juD7hG_ zC&sz?>{<ML6{q8$1!6*fE{JUFHk$UKX`b(LX14d0SN<>SV7S=*d%gaXU8=t<I<6Z% zidcB#=`G>E4MB^)9crzby>S1uqdyZkmD6?h`(C_LD0QM`s&`?svv2Cr9I0vNE=)4H z`sH5Nu6WB*)z8x=KJ%UxaOY~|Jb^VA++!atsBfRF@|QW|xxnGn^;gz>^U_UOe}%(i zLX7I$y>A(PTKx_<Eq3)-_&($2mmU5W;##IpS$B5*hxrS(cQ9URO3hu;alvq>;hKqG z7B{9Cw@$j~^7omuHrvBvDz{EN;=Ma<a;=N(Qnp14^*>BA5L{lGFr_8rPzoo1_%Xka zQxpyBx+2^BKU_|0e5fAhXMIxZ%3Ga>SD)|S-=8aW^^B~`J@2`%4vPfNTX<Jz*G50{ zw*_+)6%ud#TU0Ngpy7GD_OU!D+wkU{zWJDmfgz6-U$)W0n{7Z9LqK9tacU7H>$HZw z4i`z4_`mn`CS&U!r3bBnmqP=;Kiae?_0%Lz4zGhwI!R24hu<+M?>2sYW{qR&t*h_C zqGW%w|H%rA`E=!Fu>7wZ@)wT(YdW{`vgX^$^y!BW>8YRl6gU6*_n3RnjrQC8`RC5? z_D4_?dnnT$qg4-+Z<KiMU3AQ7m7(bC`8$>@m0^pYo%iCLXWOcTj2rxdb&QjGq)zbo zP7c$_mXb8KUoN$gv(#<&72~Kii+4x_=tggraM@>gWzDgG`@5ACUq<XQ6cyhvap6JR zbJkUA*YYA?#jMY>7BVZi`%2<fSl;<n-%5fO@AmzZ_gQNycZ1Njq}dH_l3d&Lm8Ew{ z7MDr~%*~wLGxO4kZ5110=3e}?I3VAWZROs{3k$!xuFpI3<+;pV6O}iI@)#K<t2b=- z>CBVz;GA#fop$Mw$A(EQ7w>(&@OYu1{j3e~2N)&U1!LZ}THe06DP_@2b>ZzI4jjo1 zIfW;be9s<pZISG2J^aw&5Rb(w*Lxe7%ly1wPTn<*Z-tvx!i>h8kFv~@)9!hgvom=f zKV#}`(Xyf;P0~;%&Meo|u6e@a-93(6As-4eB9y-NpRnjUF1hCk+odbgZyrA1UEp(U zvc)+C;gDUnlNERG+|CzL67(_m&W#6-!s{KiUliU-v0?4H)w_DVrbMax=8)q{cHEKD zdHPOsp70^fE!;0AT<p9ovgxTx%Ka@_>RTd@`*sVSyQuq^=iDU8w(32VlDk!AKC-Eu zH}RuRmFLEV-wqnbI*YU4YH!=cCd}j2sW;7R>DeM?&jo_hCpheHV3a(cI3e-2Rmqaj zu+pH*Hc$JeRqZW~+B)gh(>-ZRwuJI&Z}=`cBj#;e%ACiyu9kiK{&lOmpZ;p~hc@%X z3mlJeeD|EmReQRrTk8hXF^O&A>-d|0_JlPT#)y1a#3L%qBOS&t*~a+jluV0Nc{j3| zR=hZIp`#^mN#)f=i;C7bb*$y>-uipu1%v)6nv$1e>ZZ=}E0)$jIm5ASVbv+4&z5?7 z)I<367BaT+2)jI7y7<kl?|PRy75YPZZwj7!aN@*cF2~zDdHTOMPZe71^mU>^w<V+g z=?d2Mdg;HsmOd$U*~-0fuf0Xo!SHO~=cQjw-|fm4DLFXlwx982MZWC^c(^O}s_d-( zwL2|1YU7sJ<Fk$KJ^H)IEZn2Y)YLd-rKax@>nR404{l6RF-dEWerbP0hR^gPM_u@_ z>WcYFDyeD3B5XVtz2qXyxm{{bJdjt<XPd3OQ0-IA@|kK=qT=L*e!gi*<6S8%v)$^r zG{2^h&gQvFXRmJaKP%e#*R%Fiz}!8quMem4<nDdlUhqfdU}x@1pN)=Qp2qo0x8z;l z)^^o*!_31$`T{HOGliN2F)zJZ7RPhv=N#+s#w*7YrR*2Q&Uj(5S0s*s+kId22h+C_ zcFPKtFE&NZnO^bthU0SckDP(R^N%|hWpxz1XU^HN!9lL7!Pn&a_tyQb0biM=#5T4r zlkKi}qkZMx@qNE8*eKm|-7-Z$=TRq1_E#~*sMXWO_q`DEGuXn_wV`FX<huuA@uh}; zTH3-s+Es}Z%GIv@_uE4(Y|^9o$3MvOXx*E?(fSj^VsVl6L2G~TY2H)a^WY#;koSx) z5B5Cze$H8+BlOSJE%V&B{rhC|#&yq@hSjQ3cUl*D=;h3P6s&SC{J@Ui9{=Ml%N5lY zeXdY0>i=`?kkm~+uB`so;mtLiubh<1E}I{ddviR_Wh1}tl?;DH4_ieSebHs#typH~ zty?5%{^DrfBaXaa=iTmSvjvZT)b@K|zRF<#V&3`(D*u+8Ut53Spj2VolG2THU!*b4 zIl5dWSKwd$MWqS;hW|JOJDC1|oNH~iL;0^CBfsGbxjD<@zv$=ul%D6#@gaYq68i<k z2fM`Q3$A0|exmR82hqoxUdI1dudc5aG~egw|CjyUoET2+le{~ul5V@H&)=;O|A!q^ z-fs}C**b%jfx&=_0Z$)9n*mq*-#I@wH!&~8wIVgSv?L!|;P;0950-Wn`LENG!x65r z@WLn89orVxWM*y&4QcY|OjtZ2$$4eK*0@Qm>tfzLx+}-J|6BYA_VgwH86Ni-^Q}lI zEctWO{$$~reEp3ks&fnT((>=Wd%m~!eeJ#5e?QMZe4jDqaI?m%fb)WvE;JY%K3RRN zZQ=%=YSTjHa{ni)&J}mI_*xzeu(#N9qk}`ra*@=m1%_YN@912V9No7+^+xBMje21| z-YP+U8#8XSzVw~=ed%K(6A_nl@u>-?15FmUK3>umc0^)Vmh_I7(M=08Lr-*R_A8oM zm`GPV_rC0PX4X6(vxg$LEUirD9FuH&_9~Yxuj=yANq4wv;`3a@cUe}M>}j~SDqwT; zJP}tXOS{ai)B6qQ9@&$9%SbymQDpL|!q~%+bCh>Ki8!V)seAdq;#E2BlMZDWxvlKY zesP?&?Xqi^=F=OM&iBloN}aXIyfNv~PJ@b=&21Ys*bI*tu6d}WXSn6+hh7;i&6Ar> z{)`F}pZa;asY=MSSviVa_tpj-oS?+kw&T<zQQq*6M$Sj395Q7(XSM3n+;wY$&$)lp zI-V^R7k(}2xZ;y@vmT}%Sr&3*Nn7Ebg94i}AKq-4nyqv4W16Xa<9(Uy66a*rp4;sg zS8;DjeiZ9Nw+TrrK3`LsvFyKxU6<#cwX1&YD*Eg9R>$X&EbsfIX<Cyq3Pf*){tM|_ zuq3^pIXUid^^TJls(2g?@0t5pE?%_sme=tWy<#Fyw@a{P1x#3XaLuaYx25idAC1tD zF>k9nV)@R-wdmKeFKKa8mb|<nBX9IYPSW%Cl)UTuo`DrjosabFo*9@t2{GO-yKugP zM3mRlQ-+^jbFZ7YT#1iYk6-ta{!<Z;teK{{6F+uaKGc)2yxJba((AK%-@%*D&2xez zEd?d!8GDJ|&A9gQ?w%QjQwv_r?0&eZXu^#7MKUivuWOv;-1$so566mS=d~UuR~?&} zJw-Rxs><&L>v6GPU5{Te=R7E4;S=?cbla3ywJSczA@tUk-<;0=KQ#g+F3+r+FBKp@ zd)bxGA}h}+Dab`HkDdNzs&feY#%TtBG|UR-CkF?5U3dSZF?reEhikgI+MgbqXZT5k z=it8DSwFcp$XqJzx+N4>bFJ{&-=I$whBp3%iK|tz4!oDiU$pSCT2NbR>dM8Fd7^G@ zYn{D`=e)4o@#iJw|MkNy_pQ;|9TiZed@5m=tnw9(1<_0WYz0hKFRo<%WFqDvr55?t zy`BF++wOX{`@9#Lj-_eUPpISQ{o<Ng%DOt$HcgqwZ}<L~JI6cSGm>w(-IlZRd}Dp2 zGC`hsw@QyqP1et&>Zg}{5;}Zmse6TMW|WC!@(*TVNv3{*7vVm7t@VeG1l8tf?H1|U zJ2f^-;-p+cn$8u;TkchB7H&?IFJAoc;rs*JFRr?B>u~!CHuo*<+b`~GKl*8-_rY6y zhphYe-*ZfPcgfD~*3uR0AF;nl-1+H$Ls-Za^Ov7k{Q}m_y4WlBMZxXkmWNzx<Bv+7 zSuDK$<)VVj^6oPE3y;6@R(%wx{lRCo@3`fr>;7WrAG;qZY~YSi?ta|yrR2}rd#^4Y zPiZK2v6$ugXvTvXPfi#-FtobzIQ}N%Kc~AQ$L|UlCbHeRd)Vsl?hav3pNNAQ?8%xE zu{Eo1EV-HfgDHOD=Xg+&Xlb-od>0D?LnH^jB2f=#k?4|IkeZj0nwMM|lv<phQwD1W z_l8852fK>=Q=2|7#!r9C7oh;2fGnY?MIGChg?VQzoz-^fN*I&=<P;CTY9sY|#xIT5 z|KoZs|KXr`Dd!r6?x&mWJD=wIPg-|r$qN4TwD*?P`~KE${(k0ty=^UD0xQ4LhlBYF z2}&J`Z5wUt4qP^ye)Y@TOY=0e+ZL*NM`g`CIN#%4i=fjDha)Z`YR-=q&R%DIsce?6 z-euK&`f^d*JnjqeDr!4Ti;g~2{D%3V5sUVsD{G84ENT>N>-1Z+Y}1=BU9Ufdo%<BR za`=OLA=_g%HJ>?0RSushoWqyM5$Uxf#*)Qys>idw`t{$h83+0#A9FZ!#Bxr$ggj58 zLDrqq-Rnc$Lj&Je+&#j&=b*rZxlcE{-_W1ydhCE}Tk-Pjds(-fiudOvg)KML$=`Y} zU@ga^8O9&ggtml<YMp<*NPgdf81FFSs_IimLeES-vq@QW`;y}ZGbK_c>15r>R=cz} zX11yOwnG)t*Ln9OKVrLQ8+gX)bnqg-ths8Pv)?d9`BhC8()QA?ur>CR{kX4_|AXS; zlDQ?RvXRfSt_PWJvN^g`$*j23@zL^(PK9PwX8D;B$Bw%{wVOGi!hB2mX}ezc71qBT z!hG&rVSn^|Dp#m_pwGJtQ%bc;x)xh{chzi;6MAQ+e{)OHj=OEiJLa93n={vE|NJ-c z2@-l5arf>&=#`7vkr1jH?mPWW{x8PqMeE<SoGGf`wbZfkG_%M*=1Gb{1+(%Z*F?^` z`{jY{?qwfWd@`4HuRQg%mv>>7-%;*|e4>trk3`=2^l06WRhlbQwH7<?kUl8J#kQ^V z?f!%rwrW`?nbYIH{3yGf*gO3t+g6EvwL4Sx9?08vJ0>jW;n`<0>HBY<;NhyjdhBhO z^BkeN|5N_Sx11=tt#{$E!}64M-kNvToVE3@VB43n<J0~XQW{1vKfVW43G6<&!y|uT z|2v+=6XTpW)ugabT>4S0QuEW-{~oV6BVPScmas2f6rL&5IRBUdQ^y5~rB_XBye?MV zH=fm=aqqY2;qUVjOzOAx8nzvE(7A9-<gntqtk<S(_XXm4&TTL3d}w{-S@OZ-J1)6h za*qqK=5F6H=NIcSMYXzP(R1(nf0X+m(apUvL3;j=4Zr{1x7Yb|<Keo>SS8<Cu^h=W z7T@09Rrti9k$pzXg78gkl6RJMNV5DtGNaL$ZQ1_=yv!e0igWB$nDUkHTKbarpZlgB zW;?4Gw8JxA&ia?jiCaf)@3_AKcXXF_Yo~QFGca_q;mhR;ICHsgVrCwsds`b2>&+A> zVEcGo-n!^n^HVvlPOiQ1k3m^OljB;I0n^Ku>tdhYsuCA7f06!m(u52AFWg;=RX;4< z#cW)h{%p?SGtaO8W^X8dv*W~pqJ-)bO70rIM>c;@UU>XpuEoT|l8WW4w#=F<xaQlz zz0Iah*;9U8j&LvhrL;x9OWiVP;un33mu%PdWOlTzb6BxmzDYE>ewv2uJBewfhu+=S znO?PKOUc898693Nf6G3s*O)x(<EHkm$irSiZx^^_{Ofzgxs<caylzTM(t#xNmnKtA z&gD>EcjI#E{kO+6ji!X3y7GywIBD8Jxm7i$pN$lX&A*lY+iD?n{LMp|FQ+&c9<<x8 zv+G1MckBF%d^%<eHZ~YP_*k={!Q5h2^5XJ8ZD&Py@XW4lJs5f}n`d2ddiBb?f7n39 z>!Q!s;<OnV7>+ZN7w|!)InW`w-Z0;A;c$sMJrzlg<_v~hfwvifo({qG*`2P2T}jMQ z%`0x)ikswZlwu^Do_FO>!@J!t7Uk@EaZE2}i|wQ5mU7qsy1!kSd*7OKLd%U^C+1ea zw|W1$ZvW)_|LcBA9S~WSSh674*}+{vvF)w)A3OhuJLlBb>8<Tplfp6AFgMuGsHE?h z*shDMdAy0TwihJZrrmWpxlwm{(9^P{PVu9gGCPla?NXIsGSk1PJn7z(GalEseD*xL z$=6+eoAC?FK(R8v8<D{kDGt1`6PHc(m_6^yMnT!XT(_r|da33;w<)z;k*r>3n6a#U z?SmVkY};-$YqXiXxn|g7%X53y&YCwzgCfIf)5Q+|5NK<wwfd(0W!|@QbC&yR**@lu z7x121WA0YqaM)3{-QbqUCZDU57r8v~Yn{S-Eyi%}5z|jmlioK?pCs5-9dlgbm}J>h zk?qOpJNIOsVtQ+HGS@TF!eW<c*2cBri878(hmTwJJ(6&)mu^idkDRMBTPN%IE&)d8 zn8Ti@j_&$nVkviwvu4q$M-eSqD(m`$ttM#&DSn)A=w<6iNj1|sR}1-qQ;L88I6GU_ zF>mUr&3B$vKAbdb&jji1Jl1ZPd#fgI)Yj_Nloc<SSd{1Wu;}H4JLfJ&IG3Ke@_w@I zj+WC>X(cg%$6U8LX|S=rJKNbFlz7=H&2agv$$AoOZqm%rtA8zN%RW2vYqO}M`nuJ3 zQYHMhcRsCt+OyC)`B|=>wqEIR5AVJ6Z)zEMDlNaaGIw)u)cNj>tVKpopLqDj-`a9C zX6Y7{JC*yE?E3ufzwx%MPiqbKrS)#IdG6ovj3d8gVLyZTtXcM#rX<|wyvnt9`umPR z{*OyvF*hwVSFYS<ar$&=eRYmv(Y@ZHK5wg5W51(kxkB@&@SCph)9^d>v-0@Fc_o#V zVJDg<f8Mp>Ou>o#n&d+sqAuG!xOj_i7I>aYXgi-BQu9bpMB>=>gV(beE*qc9a_E)5 zQ*~f<T=x;K!^_{kP%S^H==@b+;t$#M3E5rig3OjAUpb=NcCz$iZ$?;lR_;fK9c?-V zyJzO^IoYyL;EjRI6w^DwM}6NKZIVp5yzjk;tL?e1k)~%iUkNdBsn1xm&}xI&w$mvq zRrgHX@>oRssafwwy@NlqBDXZ&zj<rX#<e1vd6AN{#6x&~_2hD!rxu<Up4Y~8xbeGD z=warzz5jWaGDa{b%h$GBWh`LNSjw;T*6K=lFWaj<`}aHU|2NIJc1y<ki?IUSCHp*= zXI8Pjv=pgl6O)f_7L$*6&j0g4s_Y0mbGF2fsrQWT1WB}9QEw^fTPXebM%&>fk2!kJ zxWt~$b<%spx3;UA-&WGL`J?)Ux|<6)e@<7={3{fH^=wAVw{1?7OTX<d`L%29iN3Ij zE7>N_wc8S!@}RK$glbf~`GVlm7jdZ<xN8n<=&D<~a^H1OW3}du_RS|Vj+%GL$sT?_ z#Ug%r@?{Z|-nhM$eS24T{AueC@rhGnvpJfWdQPh?>YnWP`>b;N4|U#t^-R)lX|%%f z+7mZ|Yj$;gxKTVuaq+I@S!(msXK=VM>l>_nvv*C|eB(U_uXZj->S625R}$g<d5C?n z;v}<u{{;{4>tYNN<h?efCUE=Xi}wCfGW(dm)<06StmAH;@+tAuvpTPHfnFC2bsp*z z?ci{%JaPHlk?j!&%QYUUNBodf-Lqg{eQR|E?{)rL9EX~B-;95if3fpkapU$EoEba5 zh#5<*yL44Pp?;Np&yh7cCxn)3onSCDytL@rp8d1_MYXuUKfGn~j{f$Jf83zLw)^3> ze0f#|h6*lxg{=<GS}r6rH?_DVF}J`sF)uM4){>14I_-BTK)_a<Yid>H&ja6uO&U6V z?`*g*Lqb@X^M%vnLw8yAo-pNlYP#7Ut)I{;ZL0T&!TywmE(>q$nL9J*Sr(_g`}^<b zAEtt~IgJ8`tW5ei7V)gyRw0lUena>3u4~gu`xUDe<vg8h)bhF2n%TJHrGZ7-LCFe+ z@V?50yCyC86!>*-9mC%53px8#f?8g8?F%oJTD3Ao`A4joL3^bvw@mj5gE!`}my6!4 zGp-QY7AY)yQ^o6ZSmdVnoU6k{w`F)vUlDa_c8cVspQq}1kK27T3M*Mtv?g(`;z#qq zqZ^}ns_t&AI;6UDV$IH&9Vr*i&1Gvn*|q8E)dQ<MzlUA<Q~Ahz-iq>7i_H5jKfdHy zFIAfDbzq9jBJ;dCjnUH=i|YFMm%Mnq(fKyV!T*O6{)JAsyC9?4Mp<5SU-RBejfs<U zOgxSWex7dLHm&2pd9|+m3-b+~_3V0hHHEpdgj{$Jy$(5;=^ni}ZH~vbmH#`Qa7ayL zE<Vb?<UHSrDO=w5d}~}f-Se|x;IxouFGSx2mYHWv`pXK6=$9vMTlF(CFoZFIBAStj zivjn<GtxXX^4v0H8k&(wgaI+3i#$CHnutbd1q}(oXRv({)6xOnxGfh$XlGzxSdTN+ zfy_X51@c@TXj&Oz%wwEpI3Z6mqZ^1k%K@4KL>Sn?%z$I28)P8zgdn<^$RlZ>`4NPf z``PfBi9TC`ZZ2|n6cp$PbJz3WGS?Z~s2sY%$Sq({Zx&(jAwgUQ<LcX@n~mJa1GS+M zX0H&%Wj3NkjcyupDTZpAqBt(o5Y0q%(~z?YsN_SqtxpD*Y1qrb0B=?{kZx`UZiY-| K28MDu5Dx(CMf=YH literal 0 HcmV?d00001