From de3a902fc556669b9fa375f0dd555ed7575bdc34 Mon Sep 17 00:00:00 2001 From: gwen Date: Mon, 21 Aug 2017 10:44:20 +0200 Subject: [PATCH] mise en place des cours poo et algo approfondie --- .../INFAL24-AlgorithmiqueApprofondie.pdf | Bin 0 -> 53799 bytes AlgoApprofondie/cours/Makefile | 216 +++ AlgoApprofondie/cours/_static/cesi.jpg | Bin 0 -> 60367 bytes AlgoApprofondie/cours/algo.txt | 291 ++++ AlgoApprofondie/cours/annexes/agile.txt | 83 ++ AlgoApprofondie/cours/annexes/exercices.txt | 19 + AlgoApprofondie/cours/annexes/index.txt | 10 + AlgoApprofondie/cours/annexes/scrum.txt | 176 +++ AlgoApprofondie/cours/annexes/surete.txt | 93 ++ AlgoApprofondie/cours/apercu.txt | 79 + AlgoApprofondie/cours/cesar.py | 61 + AlgoApprofondie/cours/code/factorielle.ml | 17 + AlgoApprofondie/cours/code/factorielle.py | 12 + AlgoApprofondie/cours/conf.py | 370 +++++ AlgoApprofondie/cours/control.txt | 294 ++++ AlgoApprofondie/cours/donnees.txt | 577 ++++++++ AlgoApprofondie/cours/fonctions.txt | 588 ++++++++ AlgoApprofondie/cours/fondement.txt | 198 +++ AlgoApprofondie/cours/index.txt | 19 + AlgoApprofondie/cours/langage.txt | 336 +++++ AlgoApprofondie/cours/modularite.txt | 200 +++ AlgoApprofondie/cours/modules.txt | 313 ++++ AlgoApprofondie/cours/presentation.txt | 72 + AlgoApprofondie/cours/programme.txt | 476 ++++++ AlgoApprofondie/cours/tp.txt | 101 ++ AlgoApprofondie/diapos/Makefile | 47 + AlgoApprofondie/diapos/beamer.tex | 268 ++++ AlgoApprofondie/diapos/graphics/Logo-EOLE.eps | 133 ++ AlgoApprofondie/diapos/graphics/Logo-EOLE.svg | 1277 +++++++++++++++++ .../diapos/graphics/Logo-EOLEienne.eps | 318 ++++ .../diapos/graphics/Logo-EOLEienne.svg | 779 ++++++++++ .../diapos/graphics/Logo-MENESR.jpg | Bin 0 -> 9572 bytes AlgoApprofondie/diapos/graphics/Logo-PCLL.eps | 927 ++++++++++++ AlgoApprofondie/diapos/graphics/Logo-PCLL.svg | 585 ++++++++ AlgoApprofondie/diapos/graphics/debian.eps | 318 ++++ AlgoApprofondie/diapos/img/cesi.jpg | Bin 0 -> 60367 bytes AlgoApprofondie/diapos/img/logo-cadoles.png | Bin 0 -> 17924 bytes poo/INFAL26-ConceptsDemarcheObjet.pdf | Bin 0 -> 39272 bytes poo/cours/Makefile | 216 +++ poo/cours/_static/cesi.jpg | Bin 0 -> 60367 bytes poo/cours/algo.txt | 291 ++++ poo/cours/annexes/agile.txt | 83 ++ poo/cours/annexes/exercices.txt | 19 + poo/cours/annexes/index.txt | 10 + poo/cours/annexes/scrum.txt | 176 +++ poo/cours/annexes/surete.txt | 93 ++ poo/cours/apercu.txt | 79 + poo/cours/cesar.py | 61 + poo/cours/code/factorielle.ml | 17 + poo/cours/code/factorielle.py | 12 + poo/cours/conf.py | 370 +++++ poo/cours/control.txt | 294 ++++ poo/cours/donnees.txt | 577 ++++++++ poo/cours/fonctions.txt | 588 ++++++++ poo/cours/fondement.txt | 198 +++ poo/cours/index.txt | 19 + poo/cours/langage.txt | 336 +++++ poo/cours/modularite.txt | 200 +++ poo/cours/modules.txt | 313 ++++ poo/cours/presentation.txt | 72 + poo/cours/programme.txt | 476 ++++++ poo/cours/tp.txt | 101 ++ poo/diapos/Makefile | 47 + poo/diapos/beamer.tex | 268 ++++ poo/diapos/graphics/Logo-EOLE.eps | 133 ++ poo/diapos/graphics/Logo-EOLE.svg | 1277 +++++++++++++++++ poo/diapos/graphics/Logo-EOLEienne.eps | 318 ++++ poo/diapos/graphics/Logo-EOLEienne.svg | 779 ++++++++++ poo/diapos/graphics/Logo-MENESR.jpg | Bin 0 -> 9572 bytes poo/diapos/graphics/Logo-PCLL.eps | 927 ++++++++++++ poo/diapos/graphics/Logo-PCLL.svg | 585 ++++++++ poo/diapos/graphics/debian.eps | 318 ++++ poo/diapos/img/cesi.jpg | Bin 0 -> 60367 bytes poo/diapos/img/logo-cadoles.png | Bin 0 -> 17924 bytes 74 files changed, 18506 insertions(+) create mode 100644 AlgoApprofondie/INFAL24-AlgorithmiqueApprofondie.pdf create mode 100644 AlgoApprofondie/cours/Makefile create mode 100644 AlgoApprofondie/cours/_static/cesi.jpg create mode 100644 AlgoApprofondie/cours/algo.txt create mode 100644 AlgoApprofondie/cours/annexes/agile.txt create mode 100644 AlgoApprofondie/cours/annexes/exercices.txt create mode 100644 AlgoApprofondie/cours/annexes/index.txt create mode 100644 AlgoApprofondie/cours/annexes/scrum.txt create mode 100644 AlgoApprofondie/cours/annexes/surete.txt create mode 100644 AlgoApprofondie/cours/apercu.txt create mode 100644 AlgoApprofondie/cours/cesar.py create mode 100644 AlgoApprofondie/cours/code/factorielle.ml create mode 100644 AlgoApprofondie/cours/code/factorielle.py create mode 100644 AlgoApprofondie/cours/conf.py create mode 100644 AlgoApprofondie/cours/control.txt create mode 100644 AlgoApprofondie/cours/donnees.txt create mode 100644 AlgoApprofondie/cours/fonctions.txt create mode 100644 AlgoApprofondie/cours/fondement.txt create mode 100644 AlgoApprofondie/cours/index.txt create mode 100644 AlgoApprofondie/cours/langage.txt create mode 100644 AlgoApprofondie/cours/modularite.txt create mode 100644 AlgoApprofondie/cours/modules.txt create mode 100644 AlgoApprofondie/cours/presentation.txt create mode 100644 AlgoApprofondie/cours/programme.txt create mode 100644 AlgoApprofondie/cours/tp.txt create mode 100644 AlgoApprofondie/diapos/Makefile create mode 100644 AlgoApprofondie/diapos/beamer.tex create mode 100644 AlgoApprofondie/diapos/graphics/Logo-EOLE.eps create mode 100644 AlgoApprofondie/diapos/graphics/Logo-EOLE.svg create mode 100644 AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps create mode 100644 AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg create mode 100644 AlgoApprofondie/diapos/graphics/Logo-MENESR.jpg create mode 100644 AlgoApprofondie/diapos/graphics/Logo-PCLL.eps create mode 100644 AlgoApprofondie/diapos/graphics/Logo-PCLL.svg create mode 100644 AlgoApprofondie/diapos/graphics/debian.eps create mode 100644 AlgoApprofondie/diapos/img/cesi.jpg create mode 100644 AlgoApprofondie/diapos/img/logo-cadoles.png create mode 100644 poo/INFAL26-ConceptsDemarcheObjet.pdf create mode 100644 poo/cours/Makefile create mode 100644 poo/cours/_static/cesi.jpg create mode 100644 poo/cours/algo.txt create mode 100644 poo/cours/annexes/agile.txt create mode 100644 poo/cours/annexes/exercices.txt create mode 100644 poo/cours/annexes/index.txt create mode 100644 poo/cours/annexes/scrum.txt create mode 100644 poo/cours/annexes/surete.txt create mode 100644 poo/cours/apercu.txt create mode 100644 poo/cours/cesar.py create mode 100644 poo/cours/code/factorielle.ml create mode 100644 poo/cours/code/factorielle.py create mode 100644 poo/cours/conf.py create mode 100644 poo/cours/control.txt create mode 100644 poo/cours/donnees.txt create mode 100644 poo/cours/fonctions.txt create mode 100644 poo/cours/fondement.txt create mode 100644 poo/cours/index.txt create mode 100644 poo/cours/langage.txt create mode 100644 poo/cours/modularite.txt create mode 100644 poo/cours/modules.txt create mode 100644 poo/cours/presentation.txt create mode 100644 poo/cours/programme.txt create mode 100644 poo/cours/tp.txt create mode 100644 poo/diapos/Makefile create mode 100644 poo/diapos/beamer.tex create mode 100644 poo/diapos/graphics/Logo-EOLE.eps create mode 100644 poo/diapos/graphics/Logo-EOLE.svg create mode 100644 poo/diapos/graphics/Logo-EOLEienne.eps create mode 100644 poo/diapos/graphics/Logo-EOLEienne.svg create mode 100644 poo/diapos/graphics/Logo-MENESR.jpg create mode 100644 poo/diapos/graphics/Logo-PCLL.eps create mode 100644 poo/diapos/graphics/Logo-PCLL.svg create mode 100644 poo/diapos/graphics/debian.eps create mode 100644 poo/diapos/img/cesi.jpg create mode 100644 poo/diapos/img/logo-cadoles.png diff --git a/AlgoApprofondie/INFAL24-AlgorithmiqueApprofondie.pdf b/AlgoApprofondie/INFAL24-AlgorithmiqueApprofondie.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3308e9207d7b5aa011a7ae9594bd97adafa23762 GIT binary patch literal 53799 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

VlVdR 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/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/AlgoApprofondie/cours/_static/cesi.jpg b/AlgoApprofondie/cours/_static/cesi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dafbe55de24691c42c68b12402a75d4f863000ee GIT binary patch literal 60367 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 literal 0 HcmV?d00001 diff --git a/AlgoApprofondie/cours/algo.txt b/AlgoApprofondie/cours/algo.txt new file mode 100644 index 0000000..c2f8ed7 --- /dev/null +++ b/AlgoApprofondie/cours/algo.txt @@ -0,0 +1,291 @@ +Algorithmique +============= + +Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur +des manipulations algébriques (algèbre = **al jabr**). +C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre +mathématicien arabe du 9ème siècle, mais l'algèbre existe +depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne). + +.. glossary:: + + + algorithme + + terme désignant une suite d'opérations constituant un schéma de calcul + ou de résolution d'un problème. C'est un processus systématique de + résolution d'un problème permettant de décrire précisément des étapes. + C'est une suite finie d'instructions permettant de donner la réponse à un + problème. + +L'algorithmique est l'étude et la production de règles et de techniques +qui sont impliquées dans la définition d'algorithmes. + +Implémentation d'un algorithme +------------------------------ + +.. glossary:: + + implémentation + + Adaptation de la méthodologie de calculabilité au calcul effectif + sur une machine abstraite ou via un langage formel. + +Il n’y a pas de parcours à sens unique de l’algorithme vers l’implantation. +La quête d’une implantation efficace nous amène souvent à effectuer +un retour vers les algorithmes eux-mêmes, et à en modifier des points +essentiels. L’aspect théorique de réflexion sur les algorithmes, +et l’aspect pratique de l'implémentation sont donc en symbiose. + +Un existant émerge de la décomposition structurale d'un +domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les +uns à partir des autres. + +L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée +(un langage). L'origine d'une matière fait naître les formes (concepts) +que sa structure dessine. + +- Notion structurale de non-contradiction +- Notion extensive de "réalisation dans un champ donné" + +Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une +matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa +structure dessine. + +Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites +qui posséderaient en eux-mêmes comme une nature de matière et une nature de +forme ; cette conception tendrait, en effet, à stabiliser les existants +mathématiques dans certains rôles immuables et ignorerait le fait que les +existants abstraits qui naissent de la structure d'un domaine plus concret +peuvent à leur tour servir de domaine de base pour la genèse d'autres existants. + +L'algorithme comme généralisation de la calculabilité +------------------------------------------------------ + +L'importance croissante de l'informatique comme outil scientifique +impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes) +susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité +d'implémenter les calculs sur un ordinateur. + +Exemple d'algorithme +--------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{L'alorithme de Bellman-Kalaba} + \begin{algorithmic}[1] + \Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \EndProcedure + \Statex + \Procedure {FindPathBK}{$v$, $u$, $p$} + \If {$v = u$} + \State \textbf{Write} $v$ + \Else + \State $w \leftarrow v$ + \While {$w \not= u$} + \State \textbf{Write} $w$ + \State $w \leftarrow p(w)$ + \EndWhile + \EndIf + \EndProcedure + \end{algorithmic} + \end{algorithm} + +Exemple d'algorithme avec son implémentation +--------------------------------------------- + +Soit l'algorithme de factorielle suivant, + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme de la factorielle d'un nombre}\label{factorielle} + \begin{algorithmic}[1] + \Function{factorielle}{$n$}\Comment{La fonction récursive factorielle} + \BState \emph{parametre} : $n$ entier + \If{$n = 1$} + \BState \emph{Sortie} : 1 + \Else + \BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même} + \EndIf + \EndFunction + \end{algorithmic} + \end{algorithm} + +et son implémentation en python : + +.. literalinclude:: code/factorielle.py + :language: python + +En voici une autre implémentation (en OCaml) : + +.. literalinclude:: code/factorielle.ml + :language: ocaml + +On remarque que le **pseudocode** est très proche de +la syntaxe du python : + +.. function:: factorielle(n:int) + +:: + + if n=1 + return 1 + else + return n * factorielle(n-1) + end if + +Qualité d'un algorithme +----------------------- + +- correction d'un algorithme +- complétude d'un algorithme + +Sémantique + + Étude du sens, de la signification d'un langage + Définir la sémantique d’un langage formel consiste à lui donner une + signification mathématique. + +Sémantique opérationnelle + + on définit la sémantique par sa mise en œuvre sur + une machine abstraite. + +Sémantique dénotationnelle + + on associe à chaque construction syntaxique un + objet mathématique + +Sémantique axiomatique + + chaque construction est décrite par la manière dont + elle transforme des propriétés ou des prédicats. + +Proposition + + une proposition est un énoncé qui est soit vrai, soit faux + +**exemple** : ``2 + 3 = 5``. Proposition vraie. + +Prédicats + + Une proposition dont la valeur de vérité dépend de la valeur d’une ou plusieurs variables + +**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9 + + +Axiome + + une proposition qui est supposée vraie + +Un ensemble d’axiomes est consistant s’il n’existe pas de proposition +dont on peut démontrer qu’elle est à la fois vraie et fausse. + +Un ensemble d’axiomes est complet si, pour toute proposition, il est +possible de démontrer qu’elle est vraie ou fausse. + +Théorème d’incomplétude de Gödel (1931) : tout ensemble +consistant d’axiomes pour l’arithmétique sur les entiers est +nécessairement incomplet. + +**Les concepts de base en algorithmique sont les axiomes** + +inférence + + règles d’inférence, règles permettant de combiner des axiomes et des + propositions vraies pour établir de nouvelles propositions vraies. + +Démonstration + + vérification d’une proposition par une séquence de déductions logiques + à partir d’un ensemble d’axiomes. + +Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus, +on peut définir un choix de valeur des variables permettant de vérifier la +proposition obtenue par la *conjonction* de tous les axiomes du système proposé. +On dit alors que ce choix *réalise* un système d'axiomes. + + +Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de +chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance +à un champ d'individus qui soutiennent entre eux les relations définies pas les +axiomes. + +Concret et abstrait +-------------------- + +Il est possible qu'un même genre d'existant joue dans un schéma de genèse le +rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une +autre genèse le concret de base d'un nouvel abstrait. + +Une pareille présentation des choses implique un tel renversement par rapport +aux habitudes de pensée classiques, qu'il faut encore insister sur le sens +nouveau que reçoivent ici les expressions de "concret" et "d'abstrait". + +Les systèmes d'axiomes sont souvent conçus comme des structures purement +formelles, abstraites. Ces structures sont si profondément engagées dans la +genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les +structures de base. + +Un système d'axiome *peut* devenir le concret de base. + +Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de +l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la +structure de cet abstrait et celle du concret de base. + +Dans certains cas, la genèse de l'abstrait à partir d'un concret de base +s'affirme jusqu'à réaliser une imitation de structure entre ces genres +d'existants qui naissent l'un de l'autre. + +**C'est pourquoi on représente souvent un algorithme en pseudo-code**, +c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la +personne qui l'exprime) dominant chez la personne qui exprime un algorithme. + +Comment rendre un algorithme lisible +------------------------------------ + +- Le bon algorithme utilise des identifiants explicites. +- Le bon algorithme est structuré. +- Le bon algorithme est indenté. + +Complexité d'un algorithme +-------------------------- + +On peut approximer la complexité des algorithmes. +C'est utile pour pouvoir comparer des algorithmes. + +complexité + + estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise. + +Si f est la fonction caractérisant exactement le coût d’un algorithme et n +la taille des données, on s’intéresse à la façon dont augment f(n) lorsque n augmente +on va montrer que f(n) n'augmente pas plus vite qu’une autre fonction +g(n). Du point de vue mathématique, on dit que la fonction f est dominée +asymptotiquement par la fonction g ce qui se note f = O(g) + +- Complexité temporelle : c’est le nombre d’op«erations effectuées par + une machine qui exécute l’algorithme. + +- Complexité spatiale : c’est le nombre de positions mémoire utilisées par + une machine qui exécute l’algorithme. diff --git a/AlgoApprofondie/cours/annexes/agile.txt b/AlgoApprofondie/cours/annexes/agile.txt new file mode 100644 index 0000000..5884c11 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/agile.txt @@ -0,0 +1,83 @@ +La planification agile +======================== + +Le mode itératif +----------------- + +- livrer des versions successives et utilisables qui convergent vers + la version finale + +- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires + +- de nouvelles orientations fonctionnelles sont possibles, même tard + +- les specs détaillées sont écrites "juste à temps" + + +La planification agile +----------------------- + +- chaque livraison est un projet qui est planifié en tant que tel +- utiliser l'expérience acquise pour affiner les estimations +- préservation de l'écologie du projet au quotidien (code, tests...) + +La confiance, feedback +----------------------- + +- livraisons régulières +- progrès visibles par tous (pas d'effet tunnel) +- pilotage du projet par choix du contenu des livraisons +- investissement du Product Owner +- chercher la collaboration plutôt que la confrontation + +L'agilité +---------- + +- le projet n'est pas joué d'avance +- cultiver la souplesse +- révolution douce +- sortir de la confrontation, jouer le "nous collectif" + mettre tout le monde sur le mme pont et amener tout le monde à bon port + +Les outils agiles +------------------ + +- planification par itérations de 4 semaines +- entrepot de source partagé +- intégration continue +- tests automatisés +- pair programming sur points cruciaux +- sprints +- extranet : + + - hitoires utilisateurs + - test cases + - gestion du backolog et des tickets + - suivi de l'avancement + - documentation + +Le product owner +----------------- + +idéalement, + +- connaissance du métier à informatiser +- fibre projet +- dispo à 100% + +Les tests +--------- + +- automatiser +- viser l'exhaustivité +- tester une cible mouvante +- migrer les tests d'une release à l'autre + +Questions importantes en environnement agile +---------------------------------------------- + +- quelle durée d'itération ? +- comment découper en itérations ? +- que faire lorsque le product owner se retrouve sur le chemin critique ? +- la planification est faite en mode "juste à temps" et "juste assez" +- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble diff --git a/AlgoApprofondie/cours/annexes/exercices.txt b/AlgoApprofondie/cours/annexes/exercices.txt new file mode 100644 index 0000000..1597a02 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/exercices.txt @@ -0,0 +1,19 @@ +Exercices complémentaires +-------------------------- + ++ **Manipulation de chaînes de caractères**: + (création, accès à un caractère, concaténation), listes (création, ajout + d’un élément, suppression d’un élément, accès à un élément, extraction d’une partie de liste), tableaux à une ou plusieurs dimensions. + + + traitement des chaines de caractères + + s.replace() + + s1 + s2 + + un exemple de regexp simple + ++ **Fichiers** : + notion de chemin d’accès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier. + On encourage l’utilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques. + ++ **Piles** + Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes + (ou tableaux à 1 dimension) pour leur implantation. diff --git a/AlgoApprofondie/cours/annexes/index.txt b/AlgoApprofondie/cours/annexes/index.txt new file mode 100644 index 0000000..dc5acf1 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/index.txt @@ -0,0 +1,10 @@ +Annexes +========= + +.. toctree:: + :maxdepth: 2 + + exercices + surete + agile + scrum diff --git a/AlgoApprofondie/cours/annexes/scrum.txt b/AlgoApprofondie/cours/annexes/scrum.txt new file mode 100644 index 0000000..3777780 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/scrum.txt @@ -0,0 +1,176 @@ +scrum +===== + +.. glossary:: + + scrum + + Scrum est une méthode agile pour la gestion de projets + Le terme Scrum est emprunté au rugby et signifie mêlée. + Ce processus s'articule en effet autour d'une équipe soudée, + qui cherche à atteindre un but, comme c'est le cas en rugby + pour avancer avec le ballon pendant une mêlée. + + +Scrum définit trois rôles principaux : + +- le responsable de produit -- Product Manager, +- le faciliteur -- ScrumMaster +- le développeur + +et bien sûr, l'équipe (auto-gérée). + +Des intervenants peuvent s'intégrer également au projet +de façon plus ponctuelle. + +responsable de produit + + Le responsable de produit (Product Manager) est le représentant des + clients et utilisateurs. + C'est lui qui définit l'ordre dans lequel les fonctionnalités + seront développées et qui prend les décisions importantes + concernant l'orientation du projet. + +Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique +du terme, mais dans le sens de l'orientation. + +équipe, développement + + outes les décisions sont prises ensemble et personne ne donne d'ordre + à l'équipe sur sa façon de procéder + +facilitateur + + est chargé de protéger l'équipe de tous les éléments perturbateurs + +planification +-------------- + +Scrum utilise une planification à trois niveaux : + +- release/projet +- sprint +- quotidien -- ScrumMeeting + +quotidien + + Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min) + permet à l'équipe et au ScrumMaster de faire un point d'avancement sur + les tâches et sur les difficultés rencontrées. + répondre à trois questions : + * Qu'est-ce que j'ai fait hier ? + * Qu'est-ce que je compte faire aujourd'hui ? + * Quelles difficultés est-ce que je rencontre ? + +sprint + + Scrum est un processus itératif : les itérations sont appelées des sprints + et durent en théorie 30 jours calendaires. + En pratique, les itérations durent généralement entre 2 et 4 semaines. + Chaque sprint possède un but et on lui associe une liste d'items + de fonctionnalités à réaliser. + Ces items sont décomposés par l'équipe en tâches élémentaires + de quelques heures, les items de fonctionnalités de sprint. + + Pendant un sprint, les items de fonctionnalités de sprint à réaliser + ne peuvent pas être changés. + Les changements éventuels seront éventuellement réalisés + dans les sprints suivants. + +releases + + pour améliorer la lisibilité du projet, + on regroupe généralement des itérations en releases. + En effet, comme chaque sprint doit aboutir à la livraison + d'un produit partiel, une release permet de marquer la livraison + d'une version aboutie, susceptible d'être mise en exploitation + +gestion des besoins +------------------- + +tâches (backlog de sprint) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités +seront réalisés dans ce sprint. + +L'équipe décompose ensuite chaque item en liste de tâches élémentaires +(techniques ou non), chaque tâche étant estimée en heures +et ne devant pas durer plus de 2 jours. +On constitue ainsi le backlog de sprint. + +Les items de backlog de produit sont les fonctionnalités qui deviendront +les items du baclog d'un sprint. +Ces fonctionnalités sont estimées en points relatifs, sans unité. + +planning poker + + façon ludique et efficace de produire des estimations + sur la complexité des fonctionnalités à développer + + pour évaluer les scénarios utilisateurs (user stories) + du carnet de produit (product backlog). + +à la fin d'un sprint : + +- revue de sprint +- rétrospective de sprint + +comprendre ce qui n'a pas bien marché dans le sprint, +les erreurs commises et de prendre des décisions pour s'améliorer + +mise en oeuvre +-------------- + +Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent. +La liste des items du backlog de produit et la liste des items du backlog +de sprint. La saisie et la mise à jour des données est simplement +un peu moins agréable. + +glossaire +--------- + +Directeur de produit (Product Owner) (responsable produit) + + personne responsable de produire et maintenir à jour le backlog de produit. + C'est lui qui en détermine les priorités et qui prend les décisions + concernant l'orientation du projet. + +ScrumMaster (facilitateur) + + membre de l'équipe dont l'objectif principal est de la protéger + des perturbation extérieures. + Il est complètement transparent pour la communication entre l'équipe + et les clients et n'a aucun pouvoir hiérarchique sur l'équipe. + C'est en revanche un facilitateur pour les problèmes non techniques + de l'équipe. + +Backlog de produit (Product Backlog) (fonctionnalités) + + liste des fonctionnalités qui devront être réalisées par le logiciel. + +Backlog de sprint (Sprint Backlog) (tâches) + + liste des tâches à accomplir pendant un sprint. + Elles correspondent à la réalisation des items de backlog + du produit affectés au sprint. + +Mêlée quotidienne (Daily Scrum) (quotidien) + + réunion quotidienne de 15 minutes qui a pour but de faire le point + sur ce qui a été fait depuis la dernière mêlée, + ce qui est prévu de faire jusqu'à la prochaine + et quelles sont les embûches rencontrées durant le travail. + +Sprint (sprint) + + nom d'une itération dans Scrum. + Cette itération dure 30 jours calendaires en théorie, + mais en pratique on utilise plutôt entre 2 et 4 semaines. + Pendant une itération, l'équipe doit développer une liste d'items + du backlog de produit qui a été définie au début de ce sprint. + +Graphique d'avancement (Burndown Chart) (avancement) + + graphique qui montre la tendance du reste à faire total de jour en jour + (pour les sprints) ou de sprint en sprint (pour les releases). diff --git a/AlgoApprofondie/cours/annexes/surete.txt b/AlgoApprofondie/cours/annexes/surete.txt new file mode 100644 index 0000000..44da9b7 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/surete.txt @@ -0,0 +1,93 @@ +Outils de sureté d'un programme +-------------------------------------- + +La preuve de programme +~~~~~~~~~~~~~~~~~~~~~~ + +Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve +formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de +raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou +du matériel électroniques, afin de démontrer leur validité par rapport à une certaine +spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le +programme est valide et ne va pas planter. + +La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très +difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit +absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical +(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce +domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui +avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire +(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions +d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire +perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas +bugger). + +Le model checking +~~~~~~~~~~~~~~~~~~ + +Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie +moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du +système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte +donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont +utilisées que dans un contexte industriel de haute sécurité. + +Les tests d'acceptation +~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a plusieurs types de tests + +- unitaires +- fonctionnels +- acceptation + +Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines +parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près. +Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles. + +Les Outils de linting (validation) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- vérifications syntaxiques +- vérification sémantiques +- vérification sur les imports inutiles ou mal formés (imports croisés + +Exemple en python : pylint + + +La dette technique +~~~~~~~~~~~~~~~~~~ + +Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes. +Les tests permettent de solder la dette technique plus facilement. + +**avoir le courage de payer une dette technique, et affronter une dette technique +sinon il peut y avoir un coût à payer qui sera pohibitoire.** + +On solde la dette technique parce que à un moment ça va devenir beaucoup trop +cher à payer. + +Les méthodologies agiles +~~~~~~~~~~~~~~~~~~~~~~~~ + +La manière dont le code est produit importe énormément. Par exemple, une +méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé +a plus de chance de produire du code organisé. + +Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les +méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur : + +- Du logiciel fonctionnel plutôt que de la documentation exhaustive +- La réponse au changement plutôt que le suivi d'un plan +- Le logiciel fonctionnel est la principale mesure d'avancement +- Une attention continue à l'excellence technique et à une bonne + conception améliore l'agilité +- La simplicité est essentielle (il est facile de faire, il est + difficile de faire simple) + +Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon +itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une +à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le +responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce +sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce +temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de +résoudre les problèmes non techniques de l'équipe. diff --git a/AlgoApprofondie/cours/apercu.txt b/AlgoApprofondie/cours/apercu.txt new file mode 100644 index 0000000..ea09668 --- /dev/null +++ b/AlgoApprofondie/cours/apercu.txt @@ -0,0 +1,79 @@ +Aperçu des algorithmes fondamentaux +=================================== + +Les algorithmes sont partout. Absolument partout aujourd'hui. +Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme. + +En mathématiques +----------------- + +- l'algèbre (étude des structures de données) +- l'arithmétique modulaire (théorie des nombres) +- la géométrie (affine, algébrique, invariants topologiques...) +- les diagrammes (diagrammes de Venn...) +- les colorisation d'une carte +- comportements stochastiques + +En informatique +---------------- + +- les algorithmes sur la manipulation des structures de données + Exemple : les algorithmes de tri, de recherche dans un arbre... +- les parcours de graphes (chemins le plus court, voyageur de commerce...) +- la cryptologie (code gray) +- les stratégies de jeux + +Tirés du monde réel +-------------------- + +- les jeux (casse-tête, dominos, échiquiers...) +- énigmes, logique et paradoxes +- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes + ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement. +- La "marche de l'ivrogne" : processus de progression discrète (pas à pas) + dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche. + Il revêt seulement un caractère de type probabilité (stochastique) dit markovien. +- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture) + +Le voyageur de commerce +~~~~~~~~~~~~~~~~~~~~~~~~ + +Le problème du voyageur de commerce, consiste en la recherche d’un trajet minimal permettant à un +voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la +distance totale parcourue. + +Il suffit de construire tous les chemins possibles et de calculer leurs longueurs. +Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles. +Avec 36 villes on trouve : 5166573983193072464833325668761600000000, +si le nombre de villes augmente, ça devient vite rédibitoire. + +Résolution par + +- algorithme de parcours de graphes +- algorithme glouton +- algorithmes génétiques + +Les algorithmes génétiques s’appuient sur un principe de sélection des individus d’une population qui présen- +tent des caractéristiques se rapprochant au mieux de ce que l’on recherche; cette population évoluant par +ailleurs selon des critères d’évolution génétique à choisir. Dans le contexte du problème du voyageur de +commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il s’agit +maintenant de dé...nir un critère de sélection ainsi que des règles d’évolution de la population. + +- approches métaheuristiques (exemples: colonies de fourmis) + +Exemple de résolution + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme du voyageur de commerce}\label{commerce} + \begin{algorithmic}[1] + + \BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes} + \BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer} + \State \emph{début} + \BState ... + \State \emph{fin} + + \end{algorithmic} + \end{algorithm} diff --git a/AlgoApprofondie/cours/cesar.py b/AlgoApprofondie/cours/cesar.py new file mode 100644 index 0000000..c3d25ac --- /dev/null +++ b/AlgoApprofondie/cours/cesar.py @@ -0,0 +1,61 @@ +# coding: utf-8 +minuscules = 'abcdefghijklmnopqrstuvwxyz' +majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +def rotation(chaine, x): + """ + Effectue une rotation de x caractères vers la droite: + >>> rotation('abcde', 2) + 'cdeab' + """ + return chaine[x:] + chaine[:x] + +def index(c, chaine): + """ + Trouve l'index de c dans la chaine: + >>> index('n', 'bonjour') + 2 + """ + for i in range(len(chaine)): + if (c == chaine[i]): + return i + return -1 + +def chiffre_minuscules(chaine, x): + """ + Chiffre une chaîne composée de minuscules + >>> chiffre_minuscules('bonjour', 3) + 'erqmrxu' + """ + r = rotation(minuscules, x) + resultat = '' + for lettre in chaine: + resultat = resultat + r[index(lettre, minuscules)] + return resultat + +def chiffre(chaine, x): + """ + Chiffre une chaîne quelconque + >>> chiffre('Bonjour les amis!', 3) + 'Erqmrxu ohv dplv!' + """ + r_min = rotation(minuscules, x) + r_maj = rotation(majuscules, x) + resultat = '' + for lettre in chaine: + if lettre in minuscules: + resultat = resultat + r_min[index(lettre, minuscules)] + elif lettre in majuscules: + resultat = resultat + r_maj[index(lettre, majuscules)] + else: + resultat = resultat + lettre + return resultat + +############################################################################# +# Programme principal +############################################################################# +print(chiffre_minuscules('bonjour', 3)) +print(chiffre('Bonjour les amis!', 3)) +print(chiffre('Erqmrxu ohv dplv!', 23)) +print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23)) + diff --git a/AlgoApprofondie/cours/code/factorielle.ml b/AlgoApprofondie/cours/code/factorielle.ml new file mode 100644 index 0000000..5065a2c --- /dev/null +++ b/AlgoApprofondie/cours/code/factorielle.ml @@ -0,0 +1,17 @@ +let rec fact = function + |1 -> 1 + | n -> n * fact (n-1) ;; + +let print_fact n = + Printf.printf "factorielle %i = %i\n" n (fact n) + +let main () = + begin + print_fact 5 ; + print_newline () ; + exit 0 ; + end + +let _ = main () + + diff --git a/AlgoApprofondie/cours/code/factorielle.py b/AlgoApprofondie/cours/code/factorielle.py new file mode 100644 index 0000000..734719f --- /dev/null +++ b/AlgoApprofondie/cours/code/factorielle.py @@ -0,0 +1,12 @@ +def factorielle(n): + if (n > 1): + r = n*factorielle(n-1) + else: + r = 1 + return r + +def print_fact(n): + print "factorielle {} = {}\n".format(5, factorielle(5)) + +if __name__ == '__main__': + print_fact(5) diff --git a/AlgoApprofondie/cours/conf.py b/AlgoApprofondie/cours/conf.py new file mode 100644 index 0000000..3005e97 --- /dev/null +++ b/AlgoApprofondie/cours/conf.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +# +# Algorithmique documentation build configuration file, created by +# sphinx-quickstart on Thu Mar 16 16:07:00 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig', +] + +# ajout des cours avec solution des exercices ou non +def setup(app): + app.add_config_value('correction', False, 'env') + app.add_config_value('exercice', False, 'env') + +exercice = False +correction = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.txt' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Algorithmique Approfondie' +copyright = u'2017, Gwen' +author = u'Gwen' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1' +# The full version, including alpha/beta/rc tags. +release = u'1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'fr' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%d/%m/%Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +default_role = 'literal' + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +html_show_copyright = False + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Algorithmiquedoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +'papersize': 'a4paper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +'preamble': """\usepackage{amsmath} +\usepackage{algorithm} +\usepackage[noend]{algpseudocode} +\makeatletter +\def\BState{\State\hskip-\ALG@thistlm} +\makeatother + +""" + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'AlgorithmiqueApprofondie.tex', u'Cours d\'algorithmique approfondie', + u'INFAL24', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = '_static/cesi.jpg' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = False + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'algorithmique', u'Algorithmique Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Algorithmique', u'Algorithmique Documentation', + author, 'Algorithmique', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +#epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True diff --git a/AlgoApprofondie/cours/control.txt b/AlgoApprofondie/cours/control.txt new file mode 100644 index 0000000..7770490 --- /dev/null +++ b/AlgoApprofondie/cours/control.txt @@ -0,0 +1,294 @@ +Les structures de contrôle +========================== + +L'instruction de saut +---------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de saut conditionnel}\label{saut} + \begin{algorithmic}[1] + \Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide} + \State $\textit{stringlen} \gets \text{length of }\textit{string}$ + \State $i \gets \textit{patlen}$ + \BState \emph{top}: + \If {$i > \textit{stringlen}$} \Return false + \EndIf + \State $j \gets \textit{patlen}$ + \BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette} + \If {$\textit{string}(i) = \textit{path}(j)$} + \State $j \gets j-1$. + \State $i \gets i-1$. + \State \textbf{goto} \emph{loop}. \label{goto} + \State \textbf{close}; + \EndIf + \State $i \gets + i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$. + \State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut} + \EndProcedure + \end{algorithmic} + \end{algorithm} + + +.. raw:: latex + + Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette), + c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\ + +.. raw:: latex + + Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\ + +Description générique d'une instruction de saut:: + + Instruction 1 + Saut Label1 + Instruction 2 + ... + Label1: + Instruction n + +.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés + dans le langage cible, car c'est le meilleur moyen d'aboutir à + du **code spaghetti**. + +L'instruction de branchement conditionnel +------------------------------------------ + +On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'instruction de test} + \begin{algorithmic}[1] + \BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée} + \BState \emph{locale}: $a\gets ""$ + \BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$} + \BState \emph{corps}: + \If{$quality\ge 9$} + \State $a\gets perfect$ + \ElsIf{$quality\ge 7$} + \State $a\gets good$ + \ElsIf{$quality\ge 5$} + \State $a\gets medium$ + \ElsIf{$quality\ge 3$} + \State $a\gets bad$ + \Else + \State $a\gets unusable$ + \EndIf + \end{algorithmic} + \end{algorithm} + + + +.. ifconfig:: exercice + + **Exercice** : Compacter l'algorithme suivant en une seule condition de test:: + + Si il fait trop chaud Alors + Si il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + Sinon + Fermer la fenêtre + Finsi + +.. ifconfig:: correction + + **Correction** : + + :: + + Si il fait trop chaud ET il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + + +L'instruction switch +-------------------- + +L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable. +Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable. + +Les instructions d'itérations (boucles) +--------------------------------------- + +.. important:: Toutes les boucles concernent le paradigme de programmation impératif + et ne sont pas valides dans le paradigme de programmation fonctionnel + (puisque l'ordre d'évaluation importe) + +- arrêt conditionnel (break) +- passage d'un pas (continue) + +Répéter ... jusqu'à +~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de répéter ... jusqu'à} + \begin{algorithmic}[1] + \BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i} + \Repeat \Comment{c'est le label de début du répéter} + \State $i \gets \textit{i+1}$ + \Until{i == 100} \Comment{condition de fin de la boucle} + \end{algorithmic} + \end{algorithm} + +La boucle **pour** (for) +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle for} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \For{$i\gets 1, n$} + \State $sum\gets sum+i$ + \EndFor + \end{algorithmic} + \end{algorithm} + + + + + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, + et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres + +.. ifconfig:: correction + + **Correction** : + :: + + Variables N, i, PG en Entier + Debut + PG <- 0 + Pour i <- 1 à 20 + Ecrire "Entrez un nombre : " + Lire N + Si i = 1 ou N > PG Alors + PG <- N + FinSi + Ecrire "Le nombre le plus grand était : ", PG + Fin + + +.. attention:: ne jamais manipuler le compteur dans une boucle + +:: + + Variable Truc en Entier + Début + Pour Truc <- 1 à 15 + Truc <- Truc * 2 + Ecrire "Passage numéro : ", Truc + Truc Suivant + Fin + +La boucle tant que (while) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle while} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \State $i\gets 1$ + \While{$i\le n$} + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \EndWhile + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur + + :: + + "Voulez vous un café ? (O/N)" + +.. ifconfig:: correction + + **Correction** : deux solutions possibles, une + + :: + + Variable Rep en Caractère + Début + Rep <- "" + Ecrire "Voulez vous un café ? (O/N)" + TantQue Rep <> "O" et Rep <> "N" + Lire Rep + Si Rep <> "O" et Rep <> "N" Alors + Ecrire "Saisie Erronée, Recommencez" + FinSi + FinTantQue + Fin + + :: + + Variable Rep en Caractère + Début + Ecrire "Voulez vous un café ? (O/N)" + Lire Rep + TantQue Rep <> "O" et Rep <> "N" + Ecrire "Vous devez répondre par O ou N. Recommencez" + Lire Rep + FinTantQue + Ecrire "Saisie acceptée" + Fin + +.. ifconfig:: exercice + + **Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à l’utilisateur + un nombre compris entre a et b jusqu’à ce que la réponse convienne. + +.. ifconfig:: correction + + **Correction** : + + :: + + Variable N en Entier + Debut + N <- 0 + Ecrire "Entrez un nombre entre 10 et 20" + TantQue N < 10 ou N > 20 + Lire N + Si N < 10 Alors + Ecrire "Plus grand !" + SinonSi N > 20 Alors + Ecrire "Plus petit !" + FinSi + FinTantQue + Fin + +Et les autres boucles : répéter... jusqu'à, etc... + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle répéter} + + \begin{algorithmic}[1] + \State $sum\gets 0$ + \State $i\gets 1$ + \Repeat + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \Until{$i>n$} + \end{algorithmic} + \end{algorithm} diff --git a/AlgoApprofondie/cours/donnees.txt b/AlgoApprofondie/cours/donnees.txt new file mode 100644 index 0000000..990629e --- /dev/null +++ b/AlgoApprofondie/cours/donnees.txt @@ -0,0 +1,577 @@ +Les structures de données +=========================== + +.. glossary:: + + ATD + + Abstract Data Type, structure de données abstraites. + La représentation des données est forcément un choix. + Il est impossible de rendre compte globalement d'un élément du réel, + il faut en faire une interprétation abstraite. + +**Exemple**: + +- Un être humain peut être représenté par les données présentes dans sa + carte d'identité. Mais un être humain n'est pas sa carte d'identité. +- Un être humain peut être représenté par les données présentes dans ses préférences + de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net. + +Les séquences +------------- + +Les types séquences (listes) + +.. code-block:: ocaml + + # 4::1::5::8::1::[];; + - : int list = [4 ;1 ;5 ;8 ;1] + + +Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, s’appelle un tableau, ou encore une liste, ou une variable indicée. +Le nombre qui, au sein d’un tableau, sert à repérer chaque valeur s’appelle l’indice. +Chaque fois que l’on doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de l’indice de l’élément. + +**manipulation** : + +- `insert()` +- `append()` +- `remove()` +- `find()` +- `print()` +- ... + +.. code-block:: python + + zoo = ['bear', 'lion', 'panda', 'zebra'] + print(zoo) + + # But these list elements are not + biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']] + print(biggerZoo) + +- Lists Versus Tuples : types mutables, immutables +- Lists Versus Sets : non ordonné, collection simple + +- Recherche dans une liste, recherche du maximum dans une liste +- Recherche d’un mot dans une chaîne de caractères. + +Algorithme de la longueur d'une liste +-------------------------------------- + +.. code-block:: ocaml + + # let rec longueur l = + match l with + [] -> 0 + | ::s -> 1 + (longueur s);; + +Cette fonction est prédéfinie en Ocaml : `List.length` + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui déclare et + remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro. + +.. ifconfig:: correction + + **Correction** : + :: + + Tableau Truc(6) en Numérique + Variable i en Numérique + Debut + Pour i <- 0 à 6 + Truc(i) <- 0 + i Suivant + Fin + + exemple d'implémentation en python + + .. code-block: python + + >>> liste = [] + >>> for i in range(6): + ... liste.append(i) + ... + >>> liste + [0, 1, 2, 3, 4, 5] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Calcul du premier élément maximal dans une liste, + proposer une implémentation en python qui renvoie le maximum et + la position du max dans la liste. + +.. ifconfig:: correction + + **Correction** : + + .. code-block: python + + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + + Exemple de généricité : ce code fonctionne avec une chaîne de caractères. + + .. code-block: python + + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +.. glossary:: + + Matrice + + Tableaux de dimension multiple, c'est un tableau de tableau + +.. ifconfig:: exercice + + **Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros. + +.. ifconfig:: correction + + **Correction** : + + implémentation en python + + .. code-block:: python + + >>> matrice = [] + >>> for i in range(12): + ... matrice.append([0 for i in range(5)]) + ... + >>> from pprint import pprint + >>> pprint(matrice) + [[0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]] + >>> + +Algorithmes de tri +------------------ + +On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre. + +Les algorithmes de tri ont une grande importance pratique. +Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle). + +L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu. + +Tri par insertion +~~~~~~~~~~~~~~~~~~ + +Cet algorithme de tri suit de manière naturelle la structure récursive des +listes. Soit l une liste à trier : + +- si l est vide alors elle est déjà triée +- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s’ + on insert x au bon endroit dans s’ et on obtient une liste triée + +Description de l'algorithme + +- la fonction inserer permet d’insérer un élément x dans une liste l +- si la liste l est triée alors x est inséré au bon endroit + +.. code-block:: ocaml + + # let rec inserer x l = + match l with + [] -> [x] + | y::s -> if x<=y then x::l else y::(inserer x s);; + val inserer : ’a -> ’a list -> ’a list + # inserer 5 [3 ;7 ;10];; + - : int list = [3 ; 5 ; 7 ; 10] + +Tri rapide +~~~~~~~~~~~~ + +soit une liste l à trier : + +- si l est vide alors elle est triée +- sinon, choisir un élément p de la liste (le premier par exemple) + nommé le **pivot** +- partager l en deux listes g et d contenant les autres éléments de l + qui sont plus petits (resp. plus grands) que la valeur du pivot p +- trier récursivement g et d, on obtient deux listes g’ et d’ triées + +.. code-block:: ocaml + :caption: fonction de partage d'une liste + + #let rec partage p l = + match l with + [] -> ([] , []) + |x::s -> let g,d = partage p s in + if x<=p then (x::g , d) else (g , x::d) ;; + val partage : ’a -> ’a list -> ’a list * ’a list = + # partage 5 [1 ;9 ;7 ;3 ;2 ;4];; + - : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7]) + +.. code-block:: ocaml + :caption: algorithme de tri rapide + + # let rec tri rapide l = + match l with + [] -> [] + | p::s -> let g , d = partage p s in + (tri rapide g)@[p]@(tri rapide d) ;; + val tri rapide : ’a list -> ’a list = + # tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];; + - : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9] + + +Définition d'un itérateur +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + >>> l = range(10) + >>> for i in l: + ... print l[i] + ... + 0 + ... + 8 + 9 + >>> l.__iter__() + + + +Les listes chaînées +~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + typedef struct list{ + int elt ; + struct list* suivant ; + } ; + + +**Outils de manipulation** : + +- `next()` +- `pointer()` +- `insert(l, a)` +- `remove(a, n)` + + +Les piles +---------- + +**manipulation** + +- `insert()` : insérer un élément à la fin de la pile +- `dequeue()` : (remove and return) : retirer un élément du haut de la pile +- FIFO : "first in first out" + + +Traduction d'une structure de données dans une autre +----------------------------------------------------- + +.. code-block:: python + + >>> listOfStrings = ['One', 'Two', 'Three'] + >>> strOfStrings = ' '.join(listOfStrings) + >>> print(strOfStrings) + One Two Three + >>> + >>> # List Of Integers to a String + ... listOfNumbers = [1, 2, 3] + >>> strOfNumbers = ''.join(str(n) for n in listOfNumbers) + >>> print(strOfNumbers) + 123 + >>> + +.. code-block:: python + + >>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')] + >>> result = [] + >>> for hostname, ip, macaddress in l: + ... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress)) + ... + >>> result + [{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'}, + {'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme de traduction de cette structure de donnée + + .. code-block:: python + + [ + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True }, + { 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + + ] + + En cette structure de données : + + .. code-block:: python + + [ + { + address: '192.168.0.0', + mask: '255.255.255.0', + dynamicRanges: [ + { low: '192.168.0.5', high: '192.168.0.12', only_unknown: true }, + { low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j + ], [ + { low: '192.168.0.12', high: '192.168.0.45', only_unknown: true }, + { low: '192.168.0.8', high: '192.168.0.35', only_unknown: false }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + ] + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> from pprint import pprint + pprint(l) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> newdata = [] + >>> for i in l: + ... if i['address'] not in [j['address'] for j in newdata]: + ... newdata.append(i) + ... else: + ... for k in newdata: + ... if k['address'] == i['address']: + ... k['dynamicRanges'].extend(i['dynamicRanges']) + ... + >>> pprint(newdata) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}, + {'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.10.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme qui permette de récupérer la liste + des adresses IP disponibles + + .. code-block:: python + + { + "local": { + "leases": [ + { + "mac": "02:00:c0:a8:00:66", + "name": "pcxubuntu", + "address": "192.168.0.200" + }, + { + "mac": "02:00:c0:a8:00:67", + "name": "pcxubuntu", + "address": "192.168.0.201" + }, + { + "mac": "02:00:c0:a8:00:68", + "name": "pcxubuntu", + "address": "192.168.0.202" + } + ] + } + } + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> l = { + ... "local": { + ... "leases": [ + ... { + ... "mac": "02:00:c0:a8:00:66", + ... "name": "pcxubuntu", + ... "address": "192.168.0.200" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:67", + ... "name": "pcxubuntu", + ... "address": "192.168.0.201" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:68", + ... "name": "pcxubuntu", + ... "address": "192.168.0.202" + ... } + ... ] + ... } + ... } + >>> leases = l["local"]["leases"] + >>> from pprint import pprint + >>> pprint(leases) + [{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'}, + {'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'}, + {'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}] + >>> addresses = [lease['address'] for lease in leases] + >>> addresses + ['192.168.0.200', '192.168.0.201', '192.168.0.202'] + >>> + + + +Structures de données complexes +------------------------------- + +Les types produits nommés +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On les appelle enregistrements, dictionnaires ou tables de hachage. + +:: + + algorithme monAlgorithme + // déclaration d'un enregistrement + enregistrement Personne + chaine nom; + chaine prenom; + entier age; + réel taille; + finenregistrement + ... + Personne[50] t; + début + // Initialisation + t[0].nom <- "Duchmol"; + t[0].prenom <- "Robert"; + t[0].age <- 24; + t[0].taille <- 1.80; + ... + fin + +.. code-block:: ocaml + + # type adresse = { rue : string ; ville : string ; cp : int};; + # type fiche = { + nom : string ; + prenom : string ; + adresse : adresse ; + date naissance : int * int * int ; + tel fixe : string ; + portable : string + };; + # let v1 = { a = 1 ; b = false ; c = 'r'};; + + + + +- les sommes (constructeurs) + +.. code-block:: ocaml + + # type couleur = Pique | Coeur | Carreau | Trefle;; + # let v = (Pique , Coeur);; + val v : couleur * couleur = (Pique , Coeur) + +.. code-block:: ocaml + + type nombre = + Ent of int | Reel of float | Cplx of float × float + Ent, Reel, Cplx sont les constructeurs du type. + +Autres structures de données complexes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- arbres +- graphes +- dates + +- le parcours de graphes +- les calculs de dates diff --git a/AlgoApprofondie/cours/fonctions.txt b/AlgoApprofondie/cours/fonctions.txt new file mode 100644 index 0000000..330cbca --- /dev/null +++ b/AlgoApprofondie/cours/fonctions.txt @@ -0,0 +1,588 @@ +Les fonctions et les procédures +================================ + +Préliminaire : rappel de théorie de cybernétique +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication) + +Canal de transmission:: + + entrée -> récepteur -> émetteur -> sortie + +.. glossary:: + + cybernétique + + étude des fonctions de réflexes conditionnés du cerveau humain + utilisation au mieux en PNL ("programmation neuro-linguistique") + ou en analyse transactionnelle, ou au pire en ingérinerie sociale. + +La matérialité physique est considérée comme le hardware, le génétique (le +réseau neuronal) étant assimilé au network hardware. + +Les objets mentaux (fonctionnements psychologiques et épigénétiques du +cerveaux) est assimilé au logiciel, au software. + +IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de +comportement affecté à un assimilé-machine. + +L'humain est ramené à une machine. +C'est articulation entre "déclencheur contextuel" et "action en réponse de" +n'est pas une "black box" mais un "feedback" qui, pour l'humain, +loin d'être ramené à une entrée/sortie, constitue un **feedback** +utile pour la connaissance de soi. + +A la place, la communication est ramenée à une **boucle de rétroaction** +(comme dans un prompt) entre un système comportemental et son environnement. +La représentation sujet/objet (la perspective traditionnelle) est remplacée +par le clivage intérieur/extérieur. Behaviorisme, procédural. + +L'humain est donc ramené à + +- un ordonnanceur +- un comportement intrinsèque (boîte noire) + +- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre +d'entrée +- une instruction comportementale est considérée comme une action de + traitement +- le résultat est observé. + +Cette articulation entre "déclencheur contextuel" et "action en réponse" +est très exactement une forclusion de la profondeur monadique (Leibniz) de +l'humain à la black box informationnelle (et cybernétique). + +Pour quoi faire ? Pour pirater. Pour manipuler. +Le piratage consiste à + +- isoler les constantes (les procédures répétitives, les algorithmes) +- les observer (collecter les données) + +afin de + +- les réécrire (influence toxique, pishing - hammeçonnage) +- les détruire (attaque en règle) + + +Description d'une procédure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +En programmation impérative, un programme est une suite d’instructions qui font +évoluer l’état mémoire, le résultat est dans l’état final de la mémoire. + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la procédure + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{permutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire} + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{appel de la procédure} + \end{algorithmic} + \end{algorithm} + +effet de bord + + toute modification de la mémoire ou modification d'un support externe + +instruction + + commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte + (allocation mémoire, support externe, disque, écran...) + +Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.). + +Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur. +Cela permet de structurer le texte source du programme et améliorer sa +lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit +dans le code, cette primitive. + +Appel d'une procédure +~~~~~~~~~~~~~~~~~~~~~ + +(ex: pseudo-pascal) + +**déclaration de procédure** + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{appelpermutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ \Comment{paramètres formels de la procédure} + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{les variables locales de la procédure} + \BState \emph{corps}: + \State ... \Comment{Le corps de la procedure} + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{l'appel de la procédure} + \end{algorithmic} + \end{algorithm} + + +- les variables x1,...,xn sont appelées *paramètres formels* de p +- les variables v1,...,vm sont appelées *les variables locales* de p + +les valeurs effectivement passées en paramètres, ici `10, 12` +sont appelées **paramètres effectifs** de p + +signature + + C'est l'ensemble paramètre formel + resultat de l'appel + +fermeture + + L'ensemble procédure + variables locales + signature + parametres effectifs + est appelé une **fermeture**. C'est la procédure + son contexte qui permet + de l'instancier dans un programme. + +Environnement + + Contexte d’évaluation d'une expression ou d'une fonction + +Portée + + La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné + (utilisation locale uniquement, ou bien globale, ou bien locale et globale) + La portée d’une liaison est la portion du code dans laquelle cette + liaison est valide (i.e. où un identifiant est lié à une expression). + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + # let x = 42 in + let y = x - 1 in x - y ;; + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: ocaml + + - : int = 1 + + +.. code-block:: ocaml + + let a = 3 (* première liaison pour l'identifiant a *) + let b = 5 and c = 6 + let somme = a + b + c + val somme : int = 14 + let a = 45 (* deuxième liaison pour l'identifiant a *) + somme + val a : int = 45 + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + let somme = a + b + c ;; + val somme : int = ??? + let a = 44 + let b = 5 + let c = 1 + somme + - : int = ??? + +.. ifconfig:: correction + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + - : int = 15 + let somme = a + b + c ;; + val somme : int = 15 + let a = 44 + let b = 5 + let c = 1 + somme + - : int = 15 + + Même code en python + + .. code-block:: python + + >>> a = 1 + >>> b = 2 + >>> c = 3 + >>> somme = a + b + c + >>> somme + 6 + >>> a = 56 + >>> b = 5678 + >>> c = 56789 + >>> somme + 6 + >>> + +Portée locale dans une expression + +.. code-block:: ocaml + + # let a = 2 and b = 3 and c = 4 in + let somme = a+b+c in + somme + - : int = 9 + # somme ;; + Error: Unbound value somme + # a ;; + Error: Unbound value a + +.. important:: + + L’ordre d’évaluation dans un let ... in ... est bien déterminé, + sans grande importance dans un cadre purement fonctionnel, mais important + en cas d’effets de bord + + +Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) : + +.. code-block:: python + + >>> a = 5 + >>> def print_a(): + ... print("La variable a = {0}.".format(a)) + ... + >>> print_a() + La variable a = 5. + >>> a = 8 + >>> print_a() + La variable a = 8. + >>> + + + +niveau + + Le niveau d’une déclaration (de variable ou de procédure) est le nombre + de procédures sous lesquelles elle est déclarée. Le programme principal + a le niveau 0. + +.. code-block:: python + :linenos: + + def _get_config(name): + # return config value + if not isfile(CONFIG_FILE): + raise Exception("Fichier de configuration non existant") + from ConfigParser import ConfigParser + cfg = ConfigParser(allow_no_value=True) + cfg.read(CONFIG_FILE) + + if name == "SUBNETS": + return eval(cfg.get('eole', 'subnets')) + elif name == "LEASES_FILE": + DHCP_PATH = cfg.get('eole', 'container_path_dhcp') + return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases') + def get_routes(*args, **kwargs): + """ + Send list of reserved IP + return list of tuple (id, machine name, IP, MAC Adress) + """ + cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME, + mandatory_permissive=False) + return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname, + cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress) + +On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19. +C'est autorisé et les espaces de nommages sont différents. + + +Description d'une fonction +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Une fonction renvoie une valeur et ne modifie pas l'état courant du programme +en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie +**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien) + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la fonction + +En programmation fonctionnelle, programme est un ensemble de définitions de fonctions, +un résultat est l'application d’une fonction à une structure de données effective. + +- composant de base : la fonction +- opération de base : l’application + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de fonction}\label{fonction} + \begin{algorithmic}[1] + \Function{permuter}{$a,b$}{} \Comment{définition de la fonction} + \BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels} + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales} + \State $z: \textit{int}$ + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction} + \EndFunction + \State \Call{permuter}{10, 12} \Comment{appel de la fonction} + \BState \emph{result}: + \State (12, 10) \Comment{Le résultat effectif de la fonction après appel} + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : factoriser le code suivant + :: + + Ecrire "Etes-vous marié ?" + Rep1 <- "" + TantQue Rep1 <> "Oui" et Rep1 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep1 + FinTantQue + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- "" + TantQue Rep2 <> "Oui" et Rep2 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep2 + FinTantQue + +.. ifconfig:: correction + + **Correction** : + + :: + + Fonction RepOuiNon() en caractère + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin + + Ecrire "Etes-vous marié ?" + Rep1 <- RepOuiNon() + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- RepOuiNon() + + +Définition mathématique +~~~~~~~~~~~~~~~~~~~~~~~~~ + +fonction + + Une fonction f d’un ensemble E vers un ensemble F est une + correspondance qui associe à chaque élément de E au plus + un élément de F. + +- E est appelé le domaine de définition +- F est appelé codomaine +- la **signature** de la fonction : `E → F (int -> int = )` + + +Exemple de signature d'une fonction + +:: + + Fonction RepOuiNon(Msg en Caractère) en Caractère + Ecrire Msg + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin Fonction + + ... + Rep1 <- RepOuiNon("Etes-vous marié ?") + ... + Rep2 <- RepOuiNon("Avez-vous des enfants ?") + ... + + +curryfication + + évaluation de l'application d'une fonction + +- évaluter `(f x y)` +- peut donner une **valeur fonctionnelle** +- évaluation de la valeur fonctionnelle sur une valeur des types de base + +:: + + let g = function n -> (function p -> p + 1) n;; + +Typage d'une fonction +~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + # let f x y z = if x > 0 then y + x else z - x;; + val f : int -> int -> int -> int = + +c’est en fait une fonction à un argument qui retourne une fonction:: + +.. code-block:: ocaml + + val f : int -> (int -> (int -> int)) = + +application de f à trois valeurs + +.. code-block:: ocaml + + # f 1 2 3;; + - : int = 3 + +en programmation fonctionnelle, +les fonctions sont des valeurs comme les autres + + +.. code-block:: ocaml + + # fun x -> x * x;; + - : int -> int = + +Récursivité +~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + if n=0 then 1 else n * fact (n-1) + + +équivalent impératif utilisant une boucle + +.. code-block:: c + + int fact(int n){ + int f = 1 ; + int i = n ; + while (i>0){ + f = f * i; + i-- ; + } ; + return f ; + } + +Définitions par cas +~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + match n with + 0 -> 1 + | -> n * fact (n-1) + +**exemple** : la fonction puissance + +.. code-block:: ocaml + + let rec puissance x n = match n with + 0 -> 1 + | -> x * puissance x (n-1) + + + +.. ifconfig:: exercice + + **Portée locale dans une fonction** + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + + +.. ifconfig:: correction + + Correction: + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + >>> a + 4 + >>> + + +.. ifconfig:: exercice + + **Exercice** : Portée locale dans une fonction avec variable globale + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + 3 + >>> + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> myfunc() + 3 + >>> a + 2 + >>> a = myfunc() + 3 + >>> a + 6 + >>> diff --git a/AlgoApprofondie/cours/fondement.txt b/AlgoApprofondie/cours/fondement.txt new file mode 100644 index 0000000..874365c --- /dev/null +++ b/AlgoApprofondie/cours/fondement.txt @@ -0,0 +1,198 @@ +Présentation de l'art de programmer +==================================== + +Qu'est-ce que la programmation ? +-------------------------------- + +programmation + + Description d’un calcul (traitement) dans + un langage compréhensible par la machine + (langage de programmation) + +Le processus d'abstraction +-------------------------- + +Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au +"bas niveau". Souvent, on se jette dans le grand bain : + +- soit en s'approchant au maximum de la machine (admin système et réseau, noyau + linux, langage C) + +- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau + de bas niveau (microservices, monde nodeJS/javascript, etc...) + +Soit on suit un cursus scolaire traditionnel qui commence souvent par une +explication du fonctionnement d'une machine abstraite de bas niveau, puis en +allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au +bas niveau (comprendre comment ça se passe derrière la scène). + +Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant +les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit +rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies +sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue +(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage +collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire, +architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul. + +L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire) +est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du +côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une +pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix, +en connaissance de sa discipline. + +Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective +des langages à partir des paradigmes de rationalisation de la penseée (modules, +objects, généricité, polymorphisme paramétrique...) et d'un outil de communication +avec la machine qu'on appelle compilateur (dont la description est en dehors de +l'objectif de ce cours). + +La tendance générale de l'évolution des langages est de se libérer de ces +contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques +dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à +l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets +quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai +aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est +construite une trame IP, indépendances de chaque couche (transport, payload) entre +elles). Même la tendance système est à la virtualisation qui accentue encore la +tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du +haut niveau (le niveau applicatif). + +Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s) +langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la +conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la +volonté d'abstraire. + +- **s'abstraire de la machine** : un langage de programmation permet de + négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du + microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté + le programme. + +- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un + programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur. + Un des moyens pour y parvenir est le typage des programmes et la mise + en oeuvre d'un mécanisme d'exceptions. + +- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un + paradigme d'implémentation qui est indépendant du domaine considéré (paradigme + objet, modulaire, générique, composants...) + +- **abstraire les composants** : Les langages de programmation donnent la + possibilité de découper une application en différents composants logiciels, plus ou + moins indépendants et autonomes. La modularité permet une structuration de plus haut + niveau de l'ensemble d'une application complexe. Les langages à objets constituent + une autre approche de la réutilisabilité permettant la réalisation très rapide de + prototypes. + +Description des niveaux d'abstraction par rapport à la machine +--------------------------------------------------------------- + +Les langages de haut niveau simplifient le travail du +programmeur là où les langages de bas niveau permettent de produire un code +plus efficace. + +- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode. + impossible de coder dans ce langage. + +- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine + et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple, + la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après). + Il faut gérer les ressources,le langage est très optimisé mais presque impossible + à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur. + +- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++) + indépendance par rapport à la machine, grande structuration mais très verbeux + +- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces + langages ne dépent plus de la machine, et ils implémentent des paradigmes de + programmation indépendant de l'état de la mémoire de l'ordinateur, + ils sont indépendant même du système d'exploitation. + +Qu'est-ce qu'une machine ? +--------------------------- + +Une machine, ce truc apparemment si complexe, est en fait +un assemblage de bric et de brac. + +L'assemblage des connecteurs permet de simuler un additionneur, +en prenant en compte les propriétés de **reste euclidien** +de l'addition. + +La structure électronique est composée de : + +- un ordonnanceur. +- le stockage d'un **état**. +- une pile d'instruction + +.. glossary:: + + adressage + + Dès lors qu'on dispose de ces bases électronique au dessus du processeur, + un langage d'assemblage est possible, c'est le langage de calcul sur les registres. + + registre + + machines ont un espace mémoire et un espace de calcul (registres) + +Un ordinateur, c'est très très stupide, mais ça permet de disposer de : + +- une mémoire très grande et ordonnée, +- une capacité à effectuer inlassablement des tâches répétitives +- une grande rapidité de calcul + +Apprendre à programmer, c'est-à-dire être capable de +contrôler la machine. + +.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée, + pour pouvoir accessoirement ensuite communiquer avec une machine. + +Compilateur +----------- + +Schématiquement, un compilateur est un programme qui traduit un +programme d’un langage source vers un langage cible, en signalant +d’éventuelles erreurs. + +Quand on parle de compilation, on pense typiquement à la traduction d’un +langage de haut niveau (C, Java, Caml, ...) vers le langage machine d’un +processeur (Intel Pentium, PowerPC, ...) + +- xml (libre office, word) -> postscript (imprimante) +- postcript -> image +- syntaxe wiki -> html (Wikipédia...) + +compilation graphique + + passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt + passer par une api qui permet de causer avec une interface + +**transpiler** : transformation d'un langage de haut niveau vers un autre +langage de haut niveau. + +- cofee script, typescript -> javascript +- (babel) javascript -> javascript ES 6 +- python -> javascript + +Un compilateur traduit un programme P en un programme Q tel que +pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)` + +Un interprète est un programme qui, étant donné un programme `P` et une +entrée x , calcule la sortie s de `P(x)` + +Le compilateur fait un travail complexe une seule fois, pour produire un +code fonctionnant pour n’importe quelle entrée +L’interprète effectue un travail plus simple, mais le refait sur chaque entrée +Autre différence : le code compilé est généralement bien plus efficace que +le code interprété + +Typiquement, le travail d’un compilateur se compose d’une phase d’analyse + +- reconnaît le programme à traduire et sa signification +- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.) + +Puis d’une phase de synthèse + +- production du langage cible +- utilise de nombreux langages intermédiaires +- n’échoue pas diff --git a/AlgoApprofondie/cours/index.txt b/AlgoApprofondie/cours/index.txt new file mode 100644 index 0000000..aa2ef7d --- /dev/null +++ b/AlgoApprofondie/cours/index.txt @@ -0,0 +1,19 @@ +Introduction à l'algorithmique +================================ + +.. toctree:: + :maxdepth: 2 + + presentation + fondement + langage + algo + programme + fonctions + control + donnees + apercu + modularite + modules + tp + annexes/index diff --git a/AlgoApprofondie/cours/langage.txt b/AlgoApprofondie/cours/langage.txt new file mode 100644 index 0000000..67f858d --- /dev/null +++ b/AlgoApprofondie/cours/langage.txt @@ -0,0 +1,336 @@ +Les langages de programmation +============================= + +langage + + Un langage de + programmation + doit permettre d'écrire des + programmes de bonne qualité + +Un programme doit être : + +- correct +- robuste +- lisible, bien documenté +- facile à modifier, extensible + +Un langage de programmation doit permettre : + +- la programmation structurée +- la structuration avec les types +- proposer un mécanisme d’exceptions +- présenter des caractères de généricité, de polymorphisme et de surcharge + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Approche historique et chronologique +------------------------------------- + +- Lambda calcul (1930) +- machines de Turing (1936) +- début des langages vers les années 1950 (A0, Fortran(impératif), + Lisp(impératif et fonctionnel), Cobol) +- années 60 : Simula (classes), CPL (compilation séparée) +- années 70 : C (référence du langage impératif de bas niveau), Pascal + (procédures), Smalltalk (programmation orientée objects), Prolog + (programmation logique), Scheme (programmation fonctionnelle pure), Modula, + C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats) +- années 80 : ML, CAML (langages fonctionnels) +- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes) + Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine + virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+ + programmation concurrente), javascript (orienté web, objets par + prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité, + programmation générique, fonctionnelle et objets, modulaire et fonctorielle) +- 2009 : go (google, compilé, typage statique, objets par prototypage, + prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente) + +Les langages actuellement les plus utilisés dans le monde de l'entreprise sont : + +- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son + succès (chaos complet des librairies) +- le go est de plus en plus utilisé, c'est **le** langage qui monte + actuellement +- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés) +- PHP, Java (stagnants) +- C, C++ (de moins en moins utilisés) + +Approche par typologie des langages +----------------------------------- + +- **A0 (1954)** : possibilité de découpage de programmes en + sous-programmes ; + +- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication + de blocs de code ; + +- **C (1971)** : syntaxe claire et simple, programme fortement structuré ; + +- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner + un seul jeu d'instructions sur des machines différentes. Avant, le code + d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique + jeu d'instructions ; + +- **1980** : déploiement et succès des langages à objets ; + +- **1983** : turbo pascal (Borland) qui fut le tournant du C, + propose un IDE (Environnement de Développement Intégré). + aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement, + il est soutenu par une communauté open source autour de **Lazarus** ; + +- **depuis les années 90** : deux grands groupes de langages. Les langages à + objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les + avancées actuelles du web, les microservices (Erlang, Haskell), + viennent du monde fonctionnel, le NoSQL, etc). + Les grandes avancées architecturales (système d'exploitation, linux, etc...) + viennent du monde de l'impératif. + + +Approches par modèles de programmation +-------------------------------------- + +- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un + programme à un endroit et de la reprendre à un autre endroit du programme prévu à + cet effet. Ce mécanisme permet de gérer les situations exceptionnelles. + +- **le paradigme impératif** : les entrées-sorties, les modifications physiques de + valeurs et les structures de contrôle itératives sont possibles. + +- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du + langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions + ou être retournées comme résultat d'un appel de fonction. + +- **le paradigme objet** : La représentation du programme colle à la réalité en + reproduisant des entités relativement proches des objets réel. Attention, le piège + est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le + réel. **C'est en fait un processus d'abstraction comme un autre**. + +Sûreté du langage, typage +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tri par ordre de sûreté croissant : + +0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0... +1. typage dynamique faible : (javascript) (possibilité de changer le prototype + d'un objet pendant l'éxécution du programme, c'est la fête on peut faire + n'importe quoi) +2. typage dynamique fort inféré par le comportement (behavior, duck typing) + (python, ruby, PHP) Le contenu de la variable détermine le choix du typage + `var = 0 -> type int` +3. typage statique déclaré fort (Java) + `int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout) +4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml) + sûreté d'exécution, agilité, sécurité. + + +La syntaxe, la lisibilité +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Importance de la lisibilité (notamment par rapport aux méthodes agiles). + +- courte (python) +- verbeuse (C) +- l'importance des mots clef du langage +- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...) + +Langages compilés ou interprétés ? +----------------------------------- + +.. glossary:: + + langage compilé + + une première passe est faite, des validations son effectuées **avant** + la génération du code objet, cette phase est faite par le compilateur. + + compilateur + + programme qui transforme un langage de haut niveau en un langage de base + niveau + + - phase d’analyse syntaxique (source -> syntaxe abstraite) + - phase de synthèse (syntaxe abstraite -> code objet) + + + scripting (langage de scripting) + + langage interprèté + + générique (langage) + + Langage à usage générique, qui peut être utilisé dans n'importe quel + domaine (par opposition au DSL) + + domain specific + + Domain Specific Language, langage destiné à être utilisé dans un + domaine prédéfini. + + paradigmes + + représentation d'une vision particulière à partir d'un modèle théorique + + impératif + + l'algorithme ressemble à une recette de cuisine, + c'est-à-dire à une succession d'instructions à exécuter + les unes à la suite des autres + + fonctionnel + + l'algorithme ne dépend plus de l'ordre d'exécution d'instructions + pas de mélange entre les données et les traitements + + objets (programmation) + + le monde est découpé en catégories + qui permettent de créer des objets + + **développement par composants** + + les objets sont organisés entre eux par composants suivant des designs patterns, + (patrons de conception) + + garbage collector (ramasse miettes) + + la gestion automatique de la mémoire apparaît en 1989 + + machine virtuelle + + portabilité du code (mais diminution en optimisation et performances) + + JIT (just in time compiler) + + code objet, programmes fonctionnant autour de machines virtuelles + + +- **le typage statique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de la + compilation du programme. Dès lors, il n'est pas nécessaire de faire ces + vérifications durant l'exécution du programme ce qui accroît son efficacité. En + outre, la vérification de type permet d'éliminer la plupart des erreurs introduites + par maladresse ou étourderie et contribue à la sûreté de l'exécution. + +- **le typage dynamique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution + ou de l'appel à certaines parties de codes du programme. + +- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la + totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non + entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité + permet de développer un code générique utilisable pour des structures de données + différentes tant que la représentation exacte de cette structure n'a pas besoin + d'être connue par le code en question. L'algorithme de typage est à même de faire + cette distinction. + +- **l'inférence de types** : le programmeur n'a besoin de donner aucune information + de type à l'intérieur de son programme. Le langage se charge seul de déduire du code + le type le plus général des expressions et des déclarations qui y figurent. Cette + inférence est effectuée conjointement à la vérification, lors de la compilation du + programme. + +Les grands paradigmes de programmation +--------------------------------------- + +Le paradigme des objets +~~~~~~~~~~~~~~~~~~~~~~~ + +- 1962 (SIMULA) : premières notions de classes ; + +Pui, une dizaine d'années plus tard : + +- C++ : intégration des classes pour le C ; +- turbo pascal : intégration des classes pour le pascal ; + +Tous les langages actuels ont intégré des traits objets mais de manière très +différentes : + +- perl (1987) +- python (1991) +- Ruby (1993) + +- L'implémentation des objets en python est très proche des notions initiales de + classes issues du Smaltalk et présente une tentative très intéressante + d'unification des objets et des types depuis python 2.2 ; + +- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la + programmation objet, et des machines virtuelles, mais en fait et avec le recul, + doté d'un support objet lourd et alambiqué. + Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et + qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ; + + +Il n'y a pas **une** POO (Programmation Objet), il y a des POO. +Les implémentations objets dans les langages sont riches et variées : + +- objets obligatoirement construits pas des classes (Java, C++, ...) +- objets sans définition de classes (javascript, Ocaml, go, rust) +- langages à attributs (python) +- langages ou le type des objets est défini par leur classe (python, ruby) +- langages ou le type des objets est différent du type de leur classe (Ocaml) +- objets sans classes mais construits par des prototypes (javascript) +- construction d'objets possibles objets sans classe du tout (Ocaml) +- encapsulation des attributs des objets (Java, Ocaml, C++, PHP) +- pas d'encapsulation des attributs (python, ruby, javascript...) + +Le paradigme impératif +~~~~~~~~~~~~~~~~~~~~~~ + +Un programme est une suite d'états de la mémoire de l'ordinateur, +c'est la suite logique des machines de Turing. +La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme, +et ont une très faible visibilité par rapport aux autres paradigmes existants. +Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner +suivant différents paradigmes, ce sont des programmeurs chevronnés et +cultivés. + +Le paradigme fonctionnel +~~~~~~~~~~~~~~~~~~~~~~~~ + +La notion de fonction que possède sous une forme ou une autre la plupart des +langages est empruntée aux mathématiques et non à l'électronique. D'une manière +générale, les langages substituent des modèles formels aux conceptions purement +calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur +paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le +**mathème fonctionnel** et pas sur la boite noire électronique. La fonction +mathématique apporte un niveau opératoire dans le traitement de l'information. + + +Approche par fonctionnalités +---------------------------- + +Plusieurs domaines de l'informatique on proposé/imposé des méthodologies, +des manières de faire. Ces modèles de programmation on fortement influencé +en retour les langages. On reconnaît aujourd'hui : + +- Le modèle client-serveur +- Le modèle de programmation concurrente (exécution de processus légers, threads) : +- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface) +- Le modèle de développement web (communiquer sur le réseau Internet, API + REST, microservices...) +- Le modèle de programmation système et réseau +- le modèle **Dev Ops** et les méthodes de développement virtualisés +- les langages présentant des **fonctionnalités agiles** + +Conclusion +----------- + +Les langages de haut niveau sont caractérisés par +des concepts tels que : + +- déclaration de valeurs, types, expressions, portée +- expressions, variables, instructions, structures de contrôle +- fonctions, procédures, fermetures +- encapsulation, modules, objets + +=========== ============ +Paradigmes Concepts +=========== ============ +impératif variables, procédures, modules +objets classes, méthodes, héritage, surcharge +fonctionnel fonctions, fermetures, modules +logique prédicats, modules +concurrent tâche/processus, communication +=========== ============ diff --git a/AlgoApprofondie/cours/modularite.txt b/AlgoApprofondie/cours/modularite.txt new file mode 100644 index 0000000..276d12d --- /dev/null +++ b/AlgoApprofondie/cours/modularite.txt @@ -0,0 +1,200 @@ +La programmation structurée +============================= + +Un langage de programmation doit permettre la programmation structurée. + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Structuration d'un programme +----------------------------- + +La réalisation d'applications importantes oblige le programmeur ou l'équipe de +développement à se poser des questions d'organisation et de structuration. +Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les +particularités sont distincts. + +L'écriture des vrais programmes consiste à les structurer pour les présenter +comme un assemblage de briques qui s'emboîtent naturellement. +Ce problème se révèle fondamental dès que la taille des programmes devient conséquente. +Si on ne prend pas garde au bon découpage des programmes en modules indépendants, +on se retrouve rapidement débordé par un grand nombre de variables, +et il devient quasiment impossible de réaliser un programme correct. + +La programmation raisonnée +--------------------------- + +Un **programme** est le codage d'un algorithme dans un langage de programmation. +La programmation consiste à modéliser un problème du monde réel sous une forme +symbolique (pour faire résoudre ce problème par un ordinateur). + +Certains problèmes sont **indécidables** ou **ouverts**. +On utilise un langage de programmation pour décrire la **solution** du programme. +La sémantique du programme est le sens de chacune des constructions du langage. +**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?** + +spécifier + + décrire de manière complète et rigoureuse le problème à résoudre + +modéliser + + proposer une représentation du réel qui soit accessible au calcul + algorithmique + +transcrire + + La transcription du modèle algorithmique se fait dans un langage + de programmation cible adapté au problème + +valider + + La validation du programme est une étape qui permet de s'assurer plus ou + moins fortement que le programme produit les résultats attendus. + La validation va de la série de tests unitaires (validation faible) + à la preuve de programme (validation mathématique forte). + +Conception descendante +----------------------- + +Une vision **centripète** : du général au particulier. + +Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches +de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final. + +On met des *trous* dans les algorithmes de plus haut niveau, +c'est-à-dire des phrases en langage naturel. + +.. ifconfig: exercice + + **Exercice** : **Calculer la date du lendemain** + +.. ifconfig: correction + + - l'algorithme de plus bas niveau + + :: + + lendemain jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le 1er janvier de l'année suivante] + sinon + resultat = lendemain_dansl'année jour + + - les algorithmes de plus bas niveau + + :: + + lendemain_dans_l'année jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le premier jour du mois suivant] + sinon + resultat = jour suivant jour + + :: + + jour_suivant jour = + jour + 1 + + et ainsi de suite jusqu'à ce que toutes les phrases soient calculables. + +Algorithme vague +-------------------- + +L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de +l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est +difficile. + +Voici, tiré du monde réel, un exemple d'algorithme vague +("ce que doit faire une fonction"), placé dans un bout de code +(souvent la **docstring** d'une fonction). + +.. code-block:: python + + def upsert_route(*args, **kwargs): + """ + Create or modify an existant DHCP route + param tuple (id or null, machine name, IP, MAC Adress) + return True or False with error message + """ + # si id présent alors modification sinon ajout + # récupère la liste des réservations en cours + # y cherche la variable sur la base de l'ID + # modifie les valeurs + # applique la nouvelle conf DHCP + + return True + +Voici un autre bout de code avec l'algorithme en commentaire, +et l'implémentation effective de l'algorithme + +.. code-block:: python + + def del_route(*args, **kwargs): + """ + Delete an existant DHCP route + param tuple (id, machine name, IP, MAC Adress) + return True or False with error message + """ + # récupère la liste des réservations en cours + # y cherche la variable sur l'id donné en paramètre + # supprime l'entrée avec vérification que les données fournies + # sont bien dans l'enregistrement à supprimer + # applique la nouvelle conf DHCP + route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17") + routes = get_routes() + if route_to_del in routes: + c = creole_loader(load_extra=True, rw=True) + c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0]) + if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2] + and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]: + c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id) + config_save_values(c, MODNAME) + return True + return False + +Les deux grands paradigmes +--------------------------- + +La modularité +~~~~~~~~~~~~~~ + +Les données et les traitements sont regroupés au sein d'une même entité à deux +facettes : d'un côté le code proprement dit, de l'autre son interface. La +communication entre modules s'effectue via leur interface. La description d'un +type peut être masquée en n'apparaissant pas dans l'interface du module. Ces +types de données abstraits facilitent les modifications d'implantation à +l'intérieur d'un module sans affecter les autres modules qui s'en servent. De +plus, les modules peuvent être paramétrés par d'autres modules augmentant +ainsi leur réutilisabilité. + +Le paradigme objet +~~~~~~~~~~~~~~~~~~ + +Les descriptions des traitements et des données sont regroupées dans des +entités appelées **classes**; un objet est une instance (valeur) d'une classe. +La communication entre objets est réalisée par envoi de message, l'objet +receveur détermine à l'exécution (liaison retardée) le traitement +correspondant au message. En cela, la programmation objet est dirigée par +les données. La structuration d'un programme provient des relations entre +classes, en particulier l'héritage permet de définir une classe par extension +d'une autre. + +En programmation objet, un **programme** est une collection d’objets qui communiquent +entre eux par **message**, le **résultat** est un message envoyé à un objet particulier + +Comparaison entre les deux paradigmes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a dualité entre ces deux modèles. + +- On ne peut pas augmenter les composants d'un type dans un module (pas + d'extensibilité des données), mais on peut ajouter de nouveaux traitements + (extensibilité des traitements) sur ces données. + +- En objet, on peut ajouter des sous-classes à une classe (extensibilité des + données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux + traitements visibles de la classe ancêtre (pas d'extensibilité des traitements). + +**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les +traitements et les données.** diff --git a/AlgoApprofondie/cours/modules.txt b/AlgoApprofondie/cours/modules.txt new file mode 100644 index 0000000..5df4b5e --- /dev/null +++ b/AlgoApprofondie/cours/modules.txt @@ -0,0 +1,313 @@ +La programmation modulaire +=========================== + +Il s'agit de décomposer un grand programme en +morceaux (**modules**) connectés entre eux par des **interfaces** bien +définies. + +Ces modules doivent être aussi indépendants que possible. + +module + + ensemble de ressources liées sémantiquement + +interface + + mode d’emploi du module, avec en plus un principe de masquage + des informations (partie publique, partie secrète) + + +Signatures, type abstrait et langage de modules : la programmation modulaire +permet d'aller très loin dans la programmation structurée. + + +Définir des fonctions dans un fichier séparé +-------------------------------------------- + +Les fonctions peuvent être définies dans un fichier et le programme dans un +autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec +la commande python `nomfichierprogramme.py`, le fichier du programme doit +importer d’abord les fonctions du fichier dans lequel les fonctions sont +définies. + +1. Fichier de fonctions +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + # Fichier foncmaxliste.py + # Recherche le premier élément maximal dans une liste ou + #dans une chaine de caractères + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + +2. Fichier de programme +~~~~~~~~~~~~~~~~~~~~~~~~ + +Pour utilser les fonctions définies dans d’autres fichiers, le fichier de +programme doit commencer par les instructions qui importent ces fichiers de +fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe +ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`. + +.. code-block:: python + + # Fichier progmaxlist.py + from foncmaxliste import max_list + # ou plus simple: + # from foncmaxliste import * + print max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print max_list(’totovaaumarche’) + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +Au lieu d’importer les fonctions, on peut importer le fichier qui définit les +fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera +changé comme suit : + +.. code-block:: python + + # Fichier prog2maxlist + import foncmaxliste + print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + # la syntaxe indiquant le chemin d’acces a la fonction max_list utiliser ‘‘.’’ + couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print foncmaxliste.max_list(’totovaaumarche’) + couple = foncmaxliste.max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +L’exécution directe du premier fichier de programme:: + + python prog max list.py + +L’exécution directe du seconde fichier de programme:: + + python prog2 max list.py + +Définition de l'implémentation d'un module +------------------------------------------- + +Tout fichier qui contient au moins une définition d’une fonction ou d’une +variable est appelé un module (une bibliothèque). Le nom du module est le nom +du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient +au moins une définition d’une fonction ou un fichier qui ne contient que des +définition de fonctions sont des modules. On peut importer un module ou des +fonctions ou variables d’un module dans un programme, comme nous avons vu dans +les exemples ci-dessus. + +.. important:: on peut importer un module, ou bien lancer un module en tant que + programme executable + +.. code-block:: python + + if __name__ == '__main__': + main() + +Pour faciliter la programmation, Python définit un certain nombre de **modules internes**, +appelés les builtins (la librairie standard). + +Par exemple : + +– Lors de l’ouverture d’une session interactive, on est dans un module interne nommé + main . Toutes les variables définies par affectation au niveau de ce module sont valides + globalement dans la session. + +– D’autres modules internes sont string, math, random + +Dans une session de travail sous l’interpréteur Python, la première importation d’un mo- +dule qui, à part des fonctions qu’elle définit, contient des instruction de programme fait +exécuter ces instructions. Dans la même session, les importations suivantes ne font pas +exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule) +(sans sufffixe .py). + +Exemples d'interface +-------------------- + +:: + + type: son type + arguments + arg1 : description de l'argument 1 + arg2 : description de l'argument 2 + préconditions: + arg1 > 10 + postconditions: + result < 19 + raises: TypeError, AssertionError, SystemError... + test: tests nominaux pour chaque cas spécifié + +- L'interface racine carrée + +:: + + racine: + type: float -> float + arguments x: float, flottant dont on veut calculer la racine + pré: x >= 0 + test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError + +- L'interface `lendemain` + +Il faut définir auparavant un type spécifique appelé `date` + +:: + + lendemain: le lendemain est la date qui désigne + le jour suivant de la date passée en argument + type: date -> date + arguments : + d: date + description: la date dont on veut calculer le lendemain + +Le langages des modules +------------------------- + +.. code-block:: ocaml + + module type PILE = (* signature (interface) du module *) + sig + type ’a t + val create : unit -> ’a t + val push : ’a -> ’a t -> unit + val pop : ’a t -> ’a + end + + (* implémentation du module *) + module Pile : PILE = (* le module est restreint + par la signature PILE *) + struct + type ’a t = ’a list ref + let create () = ref [] + let push x p = p := x::!p + let pop p = match !p with [...] + let rec print p = match p with [...] + end + +- `struct .. end` introduit une collection de définitions, valeurs, types ou modules. + C'est une **structure**. + +- `module Nom = struct .. end` permet de donner un nom à cette structure et + c'est ça un module. C'est une structure nommée. + +- `sig ... end` introduit une signature de module : une interface pour un module. + +On restreint souvent une structure par une signature pour "cacher" certaines +définitions. Une signature de module fournit une **interface** entre l'extérieur +et l'intérieur d'un module. + +En dehors du module, on accède à ses composants grâce à la notation pointée + +.. code-block:: ocaml + + let p = Pile.create() + Pile.push 45 p + +Les foncteurs +-------------- + +Si un langage possède un langage de modules, on peut aller plus loin : on peut +considérer un module comme étant une expression de base du langage. + +- La signature d'un module peut être considérée comme le type du module +- La structure du module peut être considéré comme sa valeur + +Quel est l'intérêt ? On peut alors définir des **foncteurs**. + +foncteur + + "fonction" d'une structure vers une autre structure. + On peut ainsi paramétrer un module par un autre module. + +.. code-block:: ocaml + + module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... = + struct + ... + end + +On applique un foncteur à des paramètres modules, pour +obtenir un nouveau module : + +.. code-block:: ocaml + + module M = F (Titi) (Toto) + + +Contrainte de type par signature +------------------------------------ + +:: + + module M = + struct + type t = int * int * int ;; + let make d m y = d, m, y ;; + end ;; + + let d = M.make 8 5 8 ;; + + module type S = + sig + type t ;; + val make : int -> int -> int -> t ;; + end ;; + + module MS = (M:S) ;; + + MS.make 5 1 2 ;; + +Type et signature +------------------ + +:: + + # module type A = sig + val a: int -> int + end ;; + module type A = sig val a : int -> int end + # module B = struct + let a x = x + 1 ;; + end;; + module B : sig val a : int -> int end + # module C = (B:A) ;; + module C : A + + # C.a 2 ;; + - : int = 3 + # + +Module auquel on impose une signature +----------------------------------------- + + +:: + + module type DATE = sig + type t + val make: int -> t + val get_year: t -> int + val get_month: t -> int + end ;; + + module MR = struct + type t = int * int + let make x y = (x, y) + let get_month (x, y) = x + let get_year (x, y) = y + end ;; + + module date = (MR:DATE) ;; diff --git a/AlgoApprofondie/cours/presentation.txt b/AlgoApprofondie/cours/presentation.txt new file mode 100644 index 0000000..6263f9e --- /dev/null +++ b/AlgoApprofondie/cours/presentation.txt @@ -0,0 +1,72 @@ +Avant propos +============ + +Introduction +~~~~~~~~~~~~ + +| "**Que nul n'entre ici s'il n'est géomètre**" +| Maxime apposée au porche d'entrée de l'École de Platon + + +- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique + algébrique. L'algorithmique est un sous-domaine de l'algèbre et des + approches modulaires (arithmétique modulaire...) + +- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de + l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et + seulement du pseudo-code. + L'approche mathématique forte utilisant le formalisme mathématique de + l'algorithmique algébrique est en général enseignée en France uniquement aux cours + des grandes écoles. + +- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche + ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours + réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le + **style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation + existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire, + générique et objet**. Nous envisagerons les structures de données et les structures de contrôle + spécifiques à chacun des styles évoqués. + +- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**, + nous évoquerons un panorama des différents langages existants -- historiques et contemporains -- + en les comparants les uns aux autres. + +- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous + limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation + impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points + de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité. + +Intérêt +------- + + +| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**" +| Thalès de Milet ; Sentences - VIe s. av. J.-C. + +L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie, +en tant qu'art de découper un problème complexe en tâches élémentaires, +en tant qu'énoncés de compréhension et de sémantique, +est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1. +Cette notion d'algorithme est profondément enracinée dans le désir humain de +transmettre des méthodes pour comprendre des problématiques, +qu'il s'agisse de processus scientifiques ou mathématiques, de secrets, +de philosophie ou de divination au sens des anciens Grecs. +De règles linguistiques, aussi, chez les Romains. + +Objectifs de ce cours +~~~~~~~~~~~~~~~~~~~~~ + +Il s'agit de : + +- maîtriser et concevoir un algorithme de base, +- choisir une représentation appropriée des données, +- décomposer en sous-problèmes et affinements successifs, +- savoir organiser son code en fonctions et en modules. + +Le développement raisonné d’algorithmes et leur implantation +permet d'acquérir les qualités suivantes : + ++ Analyser et modéliser un problème, spécifier, ++ Exprimer une problématique, une solution ou un algorithme, ++ Traduire un algorithme dans un langage de programmation, ++ Concevoir une réponse à un problème précisément posé. diff --git a/AlgoApprofondie/cours/programme.txt b/AlgoApprofondie/cours/programme.txt new file mode 100644 index 0000000..6133cf1 --- /dev/null +++ b/AlgoApprofondie/cours/programme.txt @@ -0,0 +1,476 @@ +Définition d'un programme +========================== + +Qu'est-ce qu'un programme ? +---------------------------- + +- Un **programme** est une suite de **phrases** ; +- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ; + +Production d'un programme : + +1. on écrit le code source du programme ; +2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ; +3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme. + +.. important:: + + L'introduction à la compilation et les différentes phases de la compilation + d'un programme sont des sujets qui ne seront pas traités dans ce cours. + +Dans un programme de base, il y a deux fichiers : + +1. un fichier contenant le code : c'est le source du programme. +2. un fichier contenant le code machine : c'est l'exécutable. + +Que peut faire un programme lorsqu'il est exécuté ? +Le programme doit communiquer. S'il reste isolé, il ne pourra pas +produire quoi que ce soit. Voici les trois moyens de communication qu'a un +programme : + +1. communiquer avec l'utilisateur, +2. communiquer avec des fichiers, +3. communiquer avec d'autres programmes. + +Les expressions +---------------- + +expression + + Une expression est une valeur caculée du langage, une opération arithmétique + qui retourne une valeur (entier, texte, valeur logique...). + C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs** + +Par exemple, la ligne suivante est une expression effectuant une addition:: + + 5 + 6 + +Expressions à partir de types de base +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Autres exemples d'expressions : + +- 5 est une expression de type int +- 4.5 est une expression de type float +- 'c' est une expression de type char +- true est une expression de type bool +- print ('c') est une expression de type None +- raw_input est une expression de type string + +Les expressions se complexifient avec la complexification des données et des traitements, +mais le principe de l'expressivité d'un langage reste le même. + + +.. ifconfig:: exercice + + **Exercice** : + Le parenthésage et les opérateurs booléens:: + + Variables A, B, C, D, E en Booléen + Variable X en Entier + Début + Lire X + A <- X > 12 + B <- X > 2 + C <- X < 6 + D <- (A ET B) OU C + E <- A ET (B OU C) + Ecrire D, E + Fin + + **Que valent D et E si X = 3 ?** + + +.. ifconfig:: correction + + **Correction** : D sera VRAI alors que E sera FAUX + + + + +Les déclarations +----------------- + +Un autre exemple d'expression : + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'expression} + \begin{algorithmic}[1] + \BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \end{algorithmic} + \end{algorithm} + +Exemple de déclarations : + +- `a = 1` +- `b = 'c'` + +.. important:: Le signe égal est utilisé de deux manières + + - lors d'une déclaration d'une expression + - lorsque deux expressions sont équivalentes + + Suivant les langages, il y a deux symboles différents, ou alors + ils sont identiques. + +Il s'agit de **renseigner** une valeur dans une expression nommée + +- en javascript : + +.. code-block:: javascript + + var b = "blabla" ; + +- en python : + +.. code-block:: python + + b = "blabla" + +- en java : + +.. code-block:: java + + String b = "A"; + +- en OCaml : + +.. code-block:: ocaml + + let a = 1 + +Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let** +signifie ici véritablement l'instanciation d'une valeur au sens +mathématique du terme : soit `a` l'entier tel que a soit égal à 1... + +En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude +d'appeler des "variables" à propos des affectations, sont en fait des **constantes** +au sens du paradigme impératif de la programmation. + +.. important:: + + Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité. + Pour les autres langages, on utilise `==` ou bien `===` (javascript) car + le `=` est sémantiquement déjà utilisé... + +Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation + +Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit + +- le typage est faible +- le typage est dynamique (calcul du type en fonction du contenu de la + variable) +- le typage est statique et fort mais ça ne se voit pas + (var le système les calcule automatiquement par inférence de type) + +Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose. + +Exemples dans la langue française : + +- Le traitement que le budget **alloue** à ces fonctionnaires. +- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour. + +.. glossary:: + + affectation + + Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable. + + Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée, + comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`. + Dans certains langages, le symbole est considéré comme un opérateur d'affectation, + et la structure entière peut alors être utilisée comme une expression. + D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage. + +Voir aussi : + +- Les déclarations de types primitifs et conversions de type +- Les types de base:: + + Octets (8 bits) byte + Entiers courts (16 bits) short + Entiers (32 bits) int + Entiers longs (64 bits) long + Réels (32 bits) float + Réels longs (64 bits) double + Caractères (16 bits) char + Booléens boolean + +- Déclarations par lots:: + + x1 = e1, x2 = e2, ... xn = en; + +Exercices : algorithmes sur les affectations + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation:: + + Variables A, B, C en Entier + Début + A <- 3 + B <- 10 + C <- A + B + B <- A + B + A <- C + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation + Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ? + :: + + Variables A, B en Entier + Début + A <- 5 + B <- 2 + A <- B + B <- A + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme permettant d’échanger les valeurs + de deux variables A et B, et ce quel que soit leur contenu préalable. + +.. ifconfig:: correction + + **Correction**:: + + Début + A <- n + B <- p + C <- A + A <- B + B <- C + Fin + + Il faut passer par une variable dite temporaire (la variable C) + + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type entier + Début + A <- 423 + B <- 12 + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = 423 + >>> b = 12 + >>> c = a + b + >>> c + 435 + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type texte + Début + A <- "423" + B <- "12" + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = '423' + >>> b = '12' + >>> c = a + b + >>> c + '42312' + +Interaction avec l'utilisateur +------------------------------ + +Il est possible de communiquer de la manière suivante avec un programme : + +- lire et écrire sur l'entrée/sortie standard +- lire et écrire dans un fichier +- afficher (du texte, un nombre...) +- lire (du texte, un nombre...) +- interagir avec les prompts + + +.. code-block:: ocaml + + let x = read_int () in + let signe = + if x >= 0 + then " positif " + else " négatif " in + print_string signe + + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui demande le prénom d'une personne + et renvoie "bonjour, je m'appelle " + +.. ifconfig:: correction + + **Correction** : (implémentation en python) + + .. code-block:: python + + # coding: utf-8 + prenom = raw_input("quel est ton prénom ? \n") + print("bonjour, je m'appelle " + prenom.capitalize()) + + +La REPL (boucle d'interaction) +------------------------------- + +.. glossary:: + + REPL + + Read Eval Print Loop : outil principal de communication avec un programme + ou avec un système. Exemples : la console python, le prompt OCaml. + + interface + + outil de communication avec un programme. + + - interface texte + - interface graphique + +**Exemples de REPL** + +Le prompt python:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + [GCC 5.4.0 20160609] on linux2 + Type "help", "copyright", "credits" or "license" for more information. + >>> + >>> dir() + ['__builtins__', '__doc__', '__name__', readline', 'rlcompleter'] + >>> + +Le prompt ipython:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + Type "copyright", "credits" or "license" for more information. + + IPython 2.4.1 -- An enhanced Interactive Python. + ? -> Introduction and overview of IPython's features. + %quickref -> Quick reference. + help -> Python's own help system. + object? -> Details about 'object', use 'object??' for extra details. + + In [1]: + +Le prompt OCaml (utop):: + + Type #utop_help for help about using utop. + + ─( 09:21:24 )─< command 0 >── + utop # + # let x = 1 in x + 2;; + - : int = 3 + # let y = 1 + 2;; + val y : int = 3 + # y * y;; + - : int = 9 +Construire une boucle d'interaction avec l'utilisateur en python:: + + #!/usr/bin/env python3 + error = True + while error: + try: + entier = int(input('donnez un entier : ')) + error = False + except: + print('une valeur entiere est attendue') + print(entier) + +Lire et écrire dans un fichier +------------------------------ + +Les descripteurs de fichiers (file handle) + +Exemple en python + +.. code-block:: python + + >>> fh = file("test.txt", "w") + >>> fh.write("un contenu exemple") + >>> fh.close() + >>> + +.. code-block:: python + + >>> fh.read() + 'un contenu exemple' + >>> fh.close() + >>> + +Linéarisation (serialisation) de données par exemple en json + +.. code-block:: python + + import json + data = dict(a='essai', b='essai2', c=range(3)) + with open('data.txt', 'w') as outfile: + json.dump(data, outfile) diff --git a/AlgoApprofondie/cours/tp.txt b/AlgoApprofondie/cours/tp.txt new file mode 100644 index 0000000..3d3ebd5 --- /dev/null +++ b/AlgoApprofondie/cours/tp.txt @@ -0,0 +1,101 @@ +Travaux Pratiques +================= + +.. ifconfig:: exercice + + **travaux pratiques :** + + Ecrire un algorithme qui renvoie le résultat d’une mini-calculatrice. Cette + méthode aura + comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « - + », « * », + « / ». + +.. ifconfig:: exercice + + **travaux pratiques :** + + + Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en + paramètre + sont des anagrammes l’un de l’autre. (Lettres identiques mais dans un ordre + différent) + + +.. ifconfig:: exercice + + **travaux pratiques :** + + ascii art (ligne d'étoiles) + + Concevoir un algorithme qui, pour un caractère imprimable et un nombre n + donnés, imprime une barre + horizontale de n de ces caractères. + + ``****************`` + + 2. Modifier l’algorithme pour l’impression d’une barre double. + + :: + + **************** + **************** + + 3. Modifier l’algorithme pour l’impression d’une barre d’épaisseur quelconque + donnée. + 4. (optionnel) Transformer les algorithmes ci-dessus en fonctions. + 5. Écrire un programme Java implémentant la dernière version de l’algorithme + (épaisseur quelconque). + + 3.3 + Triangle de nombres + Concevoir un algorithme qui imprime pour n donné:: + + 1 + 1 2 + 1 2 3 + 1 2 3 4 + 1 2 3 4 5 + ........... + ............. + ............... + 1 2 3 4 5 6 ... n + +.. ifconfig:: exercice + + **travaux pratiques :** + + code de césar : faire un programme pour chiffrer et déchiffrer par décalage + + exemples : Effectue une rotation de x caractères vers la droite:: + + >>> print(chiffre('bonjour', 3)) + erqmrxu + >>> print(chiffre('Bonjour les amis!', 3)) + Erqmrxu ohv dplv! + >>> print(chiffre('Erqmrxu ohv dplv!', 23)) + Bonjour les amis! + +.. ifconfig:: exercice + + **travaux pratiques :** + + :: + + écrire “Entrer un numéro de mois” + mois <- lire + selon que mois est + cas 1 : écrire “janvier (31 jours)” + cas 2 : écrire “février (28 ou 29 jours)” + cas 3 : écrire “mars (31 jours)” + cas 4 : écrire “avril (30 jours)” + cas 5 : écrire “mai (31 jours)” + cas 6 : écrire “juin (30 jours)” + cas 7 : écrire “juillet (31 jours)” + cas 8 : écrire “août (31 jours)” + cas 9 : écrire “septembre (30 jours)” + cas 10 : écrire “octobre (31 jours)” + cas 11 : écrire “novembre (30 jours)” + cas 12 : écrire “décembre (31 jours)” + défaut : écrire “numéro invalide” + fselon diff --git a/AlgoApprofondie/diapos/Makefile b/AlgoApprofondie/diapos/Makefile new file mode 100644 index 0000000..fd60fc0 --- /dev/null +++ b/AlgoApprofondie/diapos/Makefile @@ -0,0 +1,47 @@ +RST = python tools/rst.py + +TEXDOCUMENTS = $(basename $(wildcard *.tex)) +RSTDOCUMENTS = $(basename $(wildcard *.txt)) + +SOURCES = $(addsuffix .tex,$(TEXDOCUMENTS)) +DVI = $(addsuffix .dvi,$(TEXDOCUMENTS)) +POSTSCRIPT = $(addsuffix .ps,$(TEXDOCUMENTS)) +POSTSCRIPT_GZ = $(addsuffix .ps.gz,$(TEXDOCUMENTS)) +PDF = $(addsuffix .pdf,$(TEXDOCUMENTS)) +RSTSOURCES = $(addsuffix .txt,$(RSTDOCUMENTS)) +HTML = $(TEXDOCUMENTS) $(addsuffix .html,$(RSTDOCUMENTS)) + +all: dvi ps ps.gz html +dvi: $(DVI) +ps: $(POSTSCRIPT) +ps.gz: $(POSTSCRIPT_GZ) +pdf: $(PDF) +html: $(HTML) + + +${DVI}: %.dvi: %.tex + latex $< + latex $< + +${POSTSCRIPT}: %.ps: %.dvi + dvips -o $@ $< + +${POSTSCRIPT_GZ}: %.ps.gz: %.ps + gzip -c $< > $@ + +${PDF}: %.pdf: %.tex + rm -f $*.out $*.log $*.aux + xelatex $< + rm -f $*.out $*.log $*.aux + +%: %.tex %.dvi + latex2html -local_icons $< + touch $@ + +%.html: %.txt + $(RST) $< > $@ + + +clean: + rm -f -- *~ *.log *.aux *.out *.nav *.snm *.toc ${DVI} ${POSTSCRIPT} ${POSTSCRIPT_GZ} ${PDF} + rm -fr ${HTML} diff --git a/AlgoApprofondie/diapos/beamer.tex b/AlgoApprofondie/diapos/beamer.tex new file mode 100644 index 0000000..62eb264 --- /dev/null +++ b/AlgoApprofondie/diapos/beamer.tex @@ -0,0 +1,268 @@ +\documentclass[ignorenonframetext]{beamer} +\usepackage{graphicx} +% Internal links only wors with second screen on the right +% \setbeameroption{show notes on second screen} +\usetheme{Madrid} +\usecolortheme{dolphin} + +% gets rid of bottom navigation bars +\setbeamertemplate{footline}[frame number]{} + +% gets rid of navigation symbols +\setbeamertemplate{navigation symbols}{} + +%\usetheme{Warsaw} +%\usepackage[french]{babel} +%\usepackage[utf8,utf8x]{inputenc} +%\usepackage[T1]{fontenc} + + +% Replace babel +\usepackage{polyglossia} +\setdefaultlanguage{french} + +%% Require XeTeX +\usepackage{xltxtra} +\usepackage{fontspec} +\usepackage{xunicode} + +\logo{ + \hspace{120pt} + \includegraphics[width=2cm]{img/cesi.jpg}~ + \hspace{113pt} + \includegraphics[width=1cm]{img/logo-cadoles.png}~ +} + + +%%\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}} + +\title[]{Algorithmique} + +\subtitle{CESI alternance} +\subtitle{promotion GMSI B3} + +\author[Gwenaël Rémond]{} + +%\institute[E.O.L.E]{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}} +\institute[Cadoles]{\includegraphics[width=2cm]{img/cesi.jpg}} + +%\date{{\small 8 avril 2013}} + +\subject{Talks} + +\AtBeginSection[] % Add a TOC with current section highlighted +{ + \begin{frame} + \frametitle{Plan} + \tableofcontents[currentsection] + \end{frame} +} + + +\usepackage{hyperref} +\usepackage{hyperxmp} +\hypersetup{% + colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone, + pdftitle={EAD3}, + pdfsubject={Présentation technique d'EWT}, + pdfauthor={EOLE}, + pdfkeywords={EOLE, J-EOLE, distribution, GNU, Linux, Éducation, + nationale, Ubuntu}, + pdflang={fr-FR}, + pdfcopyright={Copyright © 2017 Équipe EOLE }, % Require XeTeX + pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}, +} + +\parskip=0.8em + +\begin{document} + +\frame{\titlepage} + +\section{Introduction} +\begin{frame} +\frametitle{Objectifs} + +\texttt{ + "Il ne suffit pas d'avoir les mains propres, \\ + il faut aussi avoir l'esprit pur."\\ +} +\emph{Thalès ; VIe s. av. J.-C.} + +\begin{itemize} +\item<1-> maîtriser et concevoir un algorithme, +\item<2-> choisir une représentation appropriée des données, +\item<3-> décomposer en sous-problèmes et affinements successifs, +\item<4-> savoir organiser son code et faire des petits programmes en python. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'art de programmer} +\texttt{GEEK SUBLIME (Vikram CHANDRA) +Une vision esthétique, littéraire, mathématique du codage} + +\begin{itemize} +\item<1-> Programmer, c'est abstraire, prendre du recul. +\item<2-> Abstraire, par rapport à quoi ? Par rapport à la machine +\item<3-> Les niveaux d'abstraction par rapport à la machine +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les langages de programmation} +\begin{itemize} +\item Qu'est-ce qu'un langage de programmation ? +\item Les grands paradigmes de programmation (procédural, objet, fonctionnel, modulaire, générique \dots) +\item L'historique des langages. +\end{itemize} +\end{frame} + +\section{Algorithmique} +\begin{frame} +\frametitle{Les algorithmes} +\begin{itemize} +\item définition d'un algorithme +\item implémentation d'un algorithme +\item représentation d'un algorithme dans un langage cible +\end{itemize} +\end{frame} + +\section{Algorithmique pour la programmation} + +\begin{frame} +\frametitle{Qu'est-ce qu'un programme ?} +\begin{itemize} +\item <1-> Les expressions +\item <2-> Les déclarations +\item <3-> La REPL (Read Eval Print Loop) +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Approche générale des fonctions} +\begin{itemize} +\item Les procédures +\item La portée d'une variable +\item Les fonctions +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Les structures de contrôle} +\begin{itemize} +\item Le branchement conditionnel +\item L'itération +\item \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les structures de données} +\begin{itemize} +\item Les listes +\item Les dictionnaires +\item Les arbres, les graphes \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'état de l'art de l'agorithmique} +\begin{itemize} +\item en mathématiques + \begin{itemize} + \item algorithmique algébrique, + \item arithmétique modulaire, + \item \dots + \end{itemize} +\item en informatique + \begin{itemize} + \item en informatique fondamentale + \item en langages de programmation + \item dans touts les domaines où l'informatique intervient\dots + \end{itemize} +\item en sciences physique, en biologie +\item en sciences sociales (réseaux sociaux, auto-organisation\dots) +\end{itemize} +\end{frame} + +\section{Programmation modulaire} +\begin{frame} +\frametitle{La programmation modulaire} +\begin{itemize} +\item La programmation raisonnée +\item Le paradigme modulaire vs le paradigme objet +\item exemple de programmation modulaire en python +\end{itemize} +\end{frame} + + + + +% Not present in TOC +\appendix + +\begin{frame}[label=thanks]{Remerciements} + + Je remercie la communauté du logiciel libre pour tous ces + merveilleux logiciels sans lesquels si peu de choses existeraient. + + Cette présentation a été réalisée grâce aux logiciels libres + suivants~: + + \begin{itemize} + \item Le système de composition \LaTeX{} + \href{https://fr.wikipedia.org/wiki/TeX_Live}{TeX Live} + \item L'éditeur de texte + \href{http://www.vim.org/}{Vim} + \item L'environnement graphique + \href{http://gnome.org/}{Gnome} + \item Le système d'exploitation + \href{https://debian.org/}{Debian} + \end{itemize} + + \begin{center} + % Do not mess with graphics + \hypersetup{hidelinks} + \begin{tabular}{cccccc} + \href{http://www.gnu.org}{\includegraphics[height=1.3cm]{graphics/gnu-head.pdf}} & + \href{http://www.kernel.org}{\includegraphics[height=1.2cm]{graphics/tux.pdf}} & + \href{http://www.debian.org/}{\includegraphics[height=1cm]{graphics/debian.eps}} & + \href{https://fr.wikipedia.org/wiki/TeX_Live}{\includegraphics[height=1cm]{graphics/texlive.pdf}} + \end{tabular} + \end{center} + +\end{frame} + +\begin{frame}[label=license]{Licence} + Cette présentation est mise à disposition sous licence\\ + \href{http://creativecommons.org/licenses/by-sa/4.0}% + {Creative Commons \textsc{by-sa 4.0}} + \begin{columns}[t] + \begin{column}{5.5cm} + \begin{itemize} + \item Attribution + \end{itemize} + \end{column} + \begin{column}{6.5cm} + \begin{itemize} + \item Partage dans les mêmes conditions + \end{itemize} + \end{column} + \end{columns} + Vous pouvez obtenir une copie de la licence + \begin{block}{par Internet} + \href{http://creativecommons.org/licenses/by-nc-sa/4.0}% + {\url{http://creativecommons.org/licenses/by-nc-sa/4.0}} + \end{block} + \begin{block}{par courrier postal} + \begin{quote} + Creative Commons\\ + 444 Castro Street, Suite 900 Mountain View,\\ + California, 94041, USA. + \end{quote} + \end{block} +\end{frame} + +\end{document} diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLE.eps b/AlgoApprofondie/diapos/graphics/Logo-EOLE.eps new file mode 100644 index 0000000..13f4889 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLE.eps @@ -0,0 +1,133 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:20:58 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 232 85 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 232 85 +%%EndPageSetup +q 0 -1 232 86 rectclip q +0.290196 0.247059 0.454902 rg +133.668 16.757 m 133.668 16.757 133.25 1.257 148.941 1.257 c 176.328 1.257 + l 170.723 3.749 168.633 5.874 164.891 10.585 c 150.969 10.585 l 147.234 + 10.585 145.441 13.222 145.441 17.538 c 145.441 17.538 145.492 75.363 145.414 + 75.445 c 142.301 82.999 133.668 84.519 133.668 84.519 c 133.668 83.995 +133.676 39.347 133.668 16.757 c h +133.668 16.757 m f +41.039 38.73 m 41.207 38.808 41.25 38.921 41.457 39.109 c 41.5 40.347 41.375 + 41.511 41.164 42.823 c 40.625 46.238 40.664 49.726 41.207 53.07 c 41.125 + 53.214 l 41.043 53.366 40.914 53.405 40.914 53.405 c 40.664 53.48 40.414 + 53.554 40.121 53.515 c 35.613 53.366 31.141 52.577 26.758 51.265 c 24.457 + 50.702 22.16 50.14 19.863 49.577 c 17.984 49.015 16.688 48.152 15.812 46.913 + c 16.062 46.839 16.145 46.691 16.23 46.538 c 16.48 46.464 l 16.395 46.238 + l 15.98 45.863 15.812 45.409 15.895 44.886 c 15.977 44.738 16.105 44.698 + 16.188 44.55 c 16.523 44.327 16.859 44.101 17.062 43.909 c 17.234 43.988 + 17.234 43.988 17.355 43.952 c 17.523 44.027 17.816 44.062 18.023 44.249 + c 18.316 44.288 18.445 44.249 18.57 44.21 c 24.836 43.464 30.973 41.999 + 37.027 39.933 c 37.152 39.894 37.281 39.855 37.242 39.749 c 37.324 39.597 + 37.449 39.558 37.406 39.445 c 37.91 39.296 l 38.91 38.995 39.785 38.734 + 40.75 38.698 c 40.914 38.769 40.914 38.769 41.039 38.73 c 39.117 40.687 + m 38.117 40.988 l 39.078 40.948 l 39.16 40.796 39.117 40.687 39.117 40.687 + c f +49.855 72.859 m 49.855 72.859 54.316 79.749 63.262 84.269 c 13.684 84.269 + l 0.484 84.269 0.527 73.152 0.527 73.152 c 0.527 17.499 l 0.527 17.499 +0.117 1.984 15.809 1.984 c 64.07 1.984 l 58.465 4.472 54.559 8.597 50.816 + 13.308 c 50.816 13.308 15.844 13.296 15.891 13.308 c 11.449 13.308 12.086 + 17.542 12.086 17.542 c 12.156 69.034 l 12.156 73.109 15.902 72.859 15.902 + 72.859 c f +69.723 45.148 m 69.723 45.148 66.891 28.866 79.219 23.05 c 84.949 20.351 + 89.504 19.945 95.855 22.363 c 99.852 23.882 103.457 27.659 104.977 31.769 + c 106.496 35.878 105.191 40.874 101.199 44.757 c 99.793 38.538 98.297 33.53 + 92.91 30.741 c 89.711 29.116 86.457 29.386 83.211 30.995 c 79.961 32.605 + 77.473 36.48 76.484 40.363 c 76.484 40.363 74.473 47.585 82.195 59.417 +c 75.809 56.718 70.875 52.245 69.723 45.148 c h +69.723 45.148 m f +0.945098 0.792157 0.0745098 rg +110.621 8.773 m 117.836 13.503 123.312 20.792 125.211 30.261 c 125.238 +30.429 l 126.707 37.968 125.305 45.933 121.43 52.601 c 117.527 59.308 110.711 + 64.777 102.098 65.82 c 102.074 65.831 l 96.797 66.464 90.988 64.273 86.93 + 60.507 c 82.406 55.163 80.273 51.816 80.387 44.03 c 84.254 49.132 94.043 + 54.202 100.949 53.523 c 105.414 52.984 108.629 50.445 110.898 46.542 c +113.168 42.636 114.066 37.445 113.184 33.058 c 110.383 19.085 94.641 12.073 + 81.125 15.976 c 62.398 21.382 55.426 40.464 63.086 58.038 c 72.824 73.859 + 90.422 80.905 113.074 77.519 c 105.887 85.03 93.703 83.984 93.703 83.984 + c 82.363 84.874 61.398 78.519 53.613 63.808 c 42.234 42.316 52.059 11.566 + 78.055 4.062 c 89.188 0.847 101.344 2.695 110.621 8.777 c h +110.621 8.773 m f +0.290196 0.247059 0.454902 rg +194.387 67.495 m 185.594 67.495 178.215 64.179 172.285 57.597 c 166.355 + 51.011 164.41 42.503 164.41 32.046 c 164.41 20.98 166.184 15.999 171.609 + 9.894 c 180.992 -1.075 203.68 1.32 210.367 1.402 c 217.055 1.484 219.438 + 1.644 231.012 0.57 c 228.027 5.839 220.824 9.495 218.348 10.011 c 206.766 + 12.195 193.328 8.179 181.414 15.484 c 176.691 19.57 175.734 22.14 175.559 + 29.62 c 223.012 29.62 l 223.012 35.269 l 223.012 45.374 219.598 53.257 +214.785 58.945 c 208.164 64.816 201.25 67.409 194.387 67.495 c h +194.184 58.421 m 199.434 58.421 203.531 56.702 206.484 53.245 c 209.438 + 49.788 211.941 44.956 211.984 38.745 c 175.684 38.745 l 175.715 44.808 +177.715 49.339 181.262 52.972 c 184.805 56.601 189.109 58.421 194.184 58.421 + c h +194.184 58.421 m f +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLE.svg b/AlgoApprofondie/diapos/graphics/Logo-EOLE.svg new file mode 100644 index 0000000..f55c0d7 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLE.svg @@ -0,0 +1,1277 @@ + + + +image/svg+xml       \ No newline at end of file diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps new file mode 100644 index 0000000..72c3b78 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:15:46 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 1660 851 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font DejaVuSans-Bold +11 dict begin +/FontType 42 def +/FontName /DejaVuSans-Bold def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<000100000009008000030010637674203eb93108000000e8000002546670676d5b026bf00000 +033c000000ac676c7966e2f9cb840000009c0000004c686561640e24be09000003e800000036 +686865610eaf07730000042000000024686d74780796006600000444000000086c6f63610000 +00980000044c0000000c6d6178700647062d0000045800000020707265707c61a2e700000478 +000007a700020066fe96046605a400030007001fbc00040126000000060126b6010805890204 +002fc4d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206 +2900000001660133016600bc00e90000013d00a200fa031f00020002006601660002000200ac +015400ec00bc006201660181048501540166016d04a400020166007f04cd0000000201330062 +00710000002504a401bc00ba00e500660181018d0548055a0166016d000000000002000200f6 +05c301f0053902390058046d043d04b2048104b2016601750466048100b00466043902d1049c +047b04cf047b005801330166014c0166014c000200ac009a014a0123009a029a014401190144 +02cd00c100000166013f019a013b05cb05cb00d500d5015000ac00ac0077020a01c701f2012f +015801b2012300f600f6011f012f0135023501ee01e70133009800d10358050a009a008f0112 +009800bc00cd00e500e500f2007304000166008f05d5022b05d500c300e100d700e50000006a +01020000001d032d05d505d505f000a8006a00ec00e1010205d506140721046602f800ec0183 +02a602f80123010201020112011f031f005e03cd046004c7048900ec01bc00ba01020333031f +03420333035c0112011f05d5019a009a00e106660179046004600460047b000000ec02c302b8 +02cd00be00dd00d50000006a025c027b029a00dd01ae01ba01120000008501ae04600762041b +009a069a045800ee009a029a00d102cd019a015005cb05cb008b008b063100f6040600f0034c +016004a800c10000002505c101000121074a06120096014a078300a800000337007b00140000 +00c9010005c105c105c105c101000108061d00960427039e00ec0102027d0133009800d10358 +017900cd02390362009c009c009c009301b8009300b80073000014000326b707060504030201 +002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720 +b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ff +ff5058041b0559b0051cb0032508e12d2c4b505820b80128454459212d2cb002254560442d2c +4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b02063 +68208a108a233a8a10653a2d0001000000025eb8b54203fc5f0f3cf5001f080000000000d3d9 +0a2000000000d3d90a20f772fcae0fcd096500010008000000010000000000010000076dfe1d +00001021f772f9320fcd00010000000000000000000000000000000204cd006602c900000000 +00000000004c0000004c000100000002034e002b0078000c0002001000400008000005ed0221 +0008000441840280012600fe000301250011000301240121003a0005012400fa000301230016 +000301220121003a0005012200fe00030121003a0003012000fa0003011f00bb0003011e0064 +0003011d00fe0003011c00190003011b001e0003011a00fe0003011900fe0003011800fe0003 +011700fe0003011600fe000301150114000e0005011500fe00030114000e0003011300fe0003 +011200fe0003010f010e007d0005010f00fe0003010e007d0003010d010c008c0005010d00fe +0003010d00c00004010c010b00590005010c008c0003010c00800004010b010a00260005010b +00590003010b00400004010a00260003010900fe0003010800fe00030107000c000301070080 +00040106b2972e054113010600fa0003010500fa0003010400fe0003010300190003010200fa +0003010100fa0003010040ff7d03ff3e03fefe03fcfb2c05fcfe03fb2c03fafe03f9f84705f9 +7d03f84703f7fa03f6fe03f5fe03f4fe03f3bb03f2fe03f1fe03f0fe03ef1e03eefe03edec0a +05edfe03ec0a03ec4004ebea0a05eb3203ea0a03e9fa03e8911605e8fe03e7fa03e6fa03e591 +1605e5fe03e4fe03e3fe03e2fe03e1fe03e0fe03dffe03defa03dddc1805dd6403dc1803dba0 +1e05db6403dad92505dafa03d92503d8d12505d8fa03d7d61405d71603d6d51005d61403d510 +03d4d30b05d42003d30b03d2d12505d2fa03d1911605d12503d0940c05d02303cfce1405cf26 +03cecd1205ce1403cd1203cc911605cc1d03cb1403cac9bb05cafe03c9c85d05c9bb03c98004 +c840ffc72505c85d03c84004c72503c6fe03c56403c4901005c4fe03c31c03c2fe03c1fe03c0 +bf3a05c0fa03bfad1b05bf3a03bebd1a05be3203bdbc1105bd1a03bcbb0f05bc1103bbba0c05 +bb0f03ba0c03b9911605b9fe03b8fe03b71503b61203b5fe03b4fe03b3fe03b21703b11903b0 +1603afad1b05affa03aead1b05aefa03ad911605ad1b03ac911605ac7d03abfe03aa2603a9fe +03a8fe03a7fe03a6fe03a50a03a4fe03a3a20e05a3fe03a20e03a24004a1a01e05a1fa03a091 +1605a01e039f9116059ffa039e940c059e1c039dfe039c9bbb059cfe039b9a5d059bbb039b80 +049a8f25059a5d039a400499fe0398972e0598fe03972e0396911605961e40ff0395940c0595 +2003940c0393911605934b039291160592fe03919010059116039010038f25038efe038dfe03 +8cfe038bfe038afe0389fe038887250588fe0387250386fe0385fe0384320383960382fe0381 +fe038019037f0a037efe037dfe037cfe037bfa037afa0379fe037776a60577fe0376a6037574 +1b0575fa03741b0373fa03727d0371fe03706f2c056f2c036efa036dfa036cfa036bfe036afe +0369fe0368630c0568320367fe0366320365640a0565fe03640a0364400463620a05630c0362 +0a0361601505619603600111056015035f0a035efe035dfe035c0111055cfe035b5a1b055bfe +035a0111055a1b0359fe0358fa0357fe035601110540ff56fe0355fe03541e03531403525119 +0552fa0351011105511903504f190550fa034f4e11054f19034e11034d1e034c4b14054c1503 +4b4a11054b14034a490e054a1103490e0348fa034746140547150346140345fa0344430e0544 +0f03430e034241250542fa0341011105412503403f0f0540fe033f3e0e053f0f033e0e033d3c +0d053d16033c0d033b64033afe0339140338fe0337130336351a0536250335341405351a0335 +c004340a0d0534140334800433320c05331403334004320c033130a60531fe033001110530a6 +032f0c032e13032d2c3a052dfa032c1525052c3a032b64032a640329fe032815032717110527 +1e03262003251e0324231105402b241e0323110322000d0522fa03210f032140042014031f0a +031e1e031d1c19051d25031c0f13051c19031cb801004091041b0d031a194b051a7d03190111 +05194b0318fe031711031615250516fa031501110515250314640313110312fe031101110511 +fe031064030f0e10050f13030fc0040e10030e80040d0111050dfa030c32030b0a0d050b1603 +0b80040a0d030a400409fe0308fe0307fe0306050a0506fe03050a0305400404fa0303640302 +01110502fe0301000d05011103000d0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d0000> +] def +/f-0-0 currentdict end definefont pop +%%EndResource +%%BeginResource: font DejaVuSans +11 dict begin +/FontType 42 def +/FontName /DejaVuSans def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<0001000000090080000300106376742000691d39000000e0000001fe6670676d7134766a0000 +02e0000000ab676c7966f9f1ddd70000009c00000044686561640d13be360000038c00000036 +686865610d9f076f000003c400000024686d747807580066000003e8000000086c6f63610000 +0088000003f00000000c6d617870046f0671000003fc00000020707265703b07f1000000041c +0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec +310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629013500b8 +00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189 +022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4 +009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2 +055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd +03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a +009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083 +0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4 +009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3 +00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139 +0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460 +0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f +007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2 +002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029 +006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859 +212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559 +b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d +2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45 +442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000 +00025eb862af5a3e5f0f3cf5001f080000000000d3d90a2c00000000d3d90a2cf7d6fc4c0e59 +09dc00000008000000010000000000010000076dfe1d00000efef7d6fa510e59000100000000 +00000000000000000000000204cd0066028b0000000000000000004400000044000100000002 +0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9 +2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96 +03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453 +03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03 +d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe +03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe +03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb +05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03 +b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa +03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe +039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05 +97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590 +bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103 +89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382 +110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe +03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b +fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360 +fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505 +55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10 +034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344 +fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d +053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b +03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c +32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b +0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c +fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03 +13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c +16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503 +fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b1d00> +] def +/f-1-0 currentdict end definefont pop +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 1660 851 +%%EndPageSetup +q 0 -1 1660 852 rectclip q +0 g +BT +115.200005 0 0 115.200005 1659.494566 0.0000456218 Tm +/f-0-0 1 Tf +( )Tj +ET +0.945098 0.792157 0.0745098 rg +158.102 787.356 m 160.379 829.535 l 190.289 799.809 l h +158.102 787.356 m f +21.06434 w +0 J +0 j +[] 0.0 d +4 M q 0.380357 -1 -0.775998 -0.295156 0 1266.965088 cm +471.528 27.38 m 435.436 6.755 l 471.344 -14.188 l h +471.528 27.38 m S Q +58.695 757.856 m 80.516 721.688 l 39.07 729.465 l h +58.695 757.856 m f +18.464385 w +q -1 0.699805 0.543047 0.775998 0 1266.965088 cm +-278.556 -404.865 m -310.193 -422.942 l -278.719 -441.304 l h +-278.556 -404.865 m S Q +10.25 623.512 m 41.414 613.496 l 14.113 596.141 l h +10.25 623.512 m f +17.112694 w +q -1 -0.121862 -0.110002 0.811158 0 1266.965088 cm +75.757 -781.871 m 46.436 -798.623 l 75.608 -815.637 l h +75.757 -781.871 m S Q +101.438 509.071 m 70.375 498.742 l 82.148 528.875 l h +101.438 509.071 m f +12.576204 w +q 1 0.937579 0.772771 -0.802194 0 1266.965088 cm +-330.318 558.711 m -351.867 546.4 l -330.429 533.894 l h +-330.318 558.711 m S Q +0.290196 0.247059 0.454902 rg +161.094 604.578 m 161.094 604.578 152.773 561.961 192.316 543.309 c 210.699 + 534.641 225.316 533.344 245.688 541.098 c 258.508 545.977 270.074 558.094 + 274.949 571.278 c 279.824 584.461 275.645 600.489 262.836 612.942 c 258.316 + 592.989 253.516 576.926 236.242 567.981 c 225.973 562.762 215.535 563.629 + 205.117 568.793 c 194.703 573.957 186.715 586.391 183.539 598.844 c 183.539 + 598.844 177.09 622.012 201.859 659.969 c 182.059 644.739 164.789 627.348 + 161.094 604.578 c h +161.094 604.578 m f +0.945098 0.792157 0.0745098 rg +293.059 497.508 m 316.207 512.684 333.766 536.067 339.859 566.434 c 339.953 + 566.977 l 344.664 591.156 340.164 616.715 327.734 638.102 c 315.219 659.625 + 293.348 677.164 265.715 680.52 c 265.637 680.531 l 248.703 682.571 230.078 + 675.531 217.055 663.453 c 202.543 646.313 195.703 635.578 196.059 610.594 + c 208.465 626.961 239.875 643.227 262.027 641.047 c 276.348 639.321 286.664 + 631.18 293.949 618.653 c 301.23 606.125 304.105 589.465 301.281 575.391 + c 292.289 530.563 241.789 508.082 198.43 520.598 c 138.359 537.934 116.312 + 599.153 133.5 657.778 c 160.254 711.746 268.816 729.453 286.945 734.754 + c 280.277 744.656 213.539 742.957 213.539 742.957 c 180.559 734.364 130.008 + 728.141 104.754 682.086 c 53.828 589.199 105.188 506.442 188.582 482.371 + c 224.301 472.059 263.293 477.992 293.055 497.504 c h +293.059 497.508 m f +0 g +BT +32.000001 0 0 32.000001 1361.895445 368.012451 Tm +/f-1-0 1 Tf +( )Tj +ET +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg new file mode 100644 index 0000000..7a2c713 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg @@ -0,0 +1,779 @@ + + + +image/svg+xml    \ No newline at end of file diff --git a/AlgoApprofondie/diapos/graphics/Logo-MENESR.jpg b/AlgoApprofondie/diapos/graphics/Logo-MENESR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02d68704027f8a225c05e87cd8888e10b501976e GIT binary patch literal 9572 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 kPeX(!w4*50O%Ux2LJ#7 literal 0 HcmV?d00001 diff --git a/AlgoApprofondie/diapos/graphics/Logo-PCLL.eps b/AlgoApprofondie/diapos/graphics/Logo-PCLL.eps new file mode 100644 index 0000000..f151afd --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-PCLL.eps @@ -0,0 +1,927 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:27:36 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 -1 300 165 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 300 165 +%%EndPageSetup +q 0 -1 300 166 rectclip q +0.32549 0.286275 0.529412 rg +197.438 160.944 m 171.461 160.944 148.402 148.244 134.059 128.76 c 154.211 + 128.76 l 165.531 139.28 180.707 145.713 197.438 145.713 c 214.016 145.713 + 229.07 139.405 240.355 129.057 c 260.641 129.057 l 246.285 148.385 223.293 + 160.944 197.438 160.944 c h +132.855 37.463 m 147.086 17.01 170.703 3.549 197.438 3.549 c 223.234 3.549 + 246.145 16.073 260.508 35.323 c 240.219 35.323 l 228.949 25.041 213.953 + 18.772 197.438 18.772 c 179.809 18.772 163.918 25.92 152.438 37.463 c h +132.855 37.463 m f* +4.26191 w +2 J +0 j +[] 0.0 d +5 M q 1 0 0 -1 0 164.490509 cm +197.438 3.547 m 171.461 3.547 148.402 16.246 134.059 35.73 c 154.211 35.73 + l 165.531 25.211 180.707 18.777 197.438 18.777 c 214.016 18.777 229.07 +25.086 240.355 35.434 c 260.641 35.434 l 246.285 16.105 223.293 3.547 197.438 + 3.547 c h +132.855 127.027 m 147.086 147.48 170.703 160.941 197.438 160.941 c 223.234 + 160.941 246.145 148.418 260.508 129.168 c 240.219 129.168 l 228.949 139.449 + 213.953 145.719 197.438 145.719 c 179.809 145.719 163.918 138.57 152.438 + 127.027 c h +132.855 127.027 m S Q +q +0 164.491 300 -165 re W n +% Fallback Image: x=0 y=0 w=300 h=165 res=300ppi size=2580000 +[ 0.24 0 0 0.24 0 -0.629491 ] concat +/DeviceRGB setcolorspace +8 dict dup begin + /ImageType 1 def + /Width 1250 def + /Height 688 def + /Interpolate false def + /BitsPerComponent 8 def + /Decode [ 0 1 0 1 0 1 ] def + /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def + /ImageMatrix [ 1 0 0 -1 0 688 ] def +end +image +Gb"-V#C$t`_Z+TWTnl<<&Yt88b,Xs2W2ka,:g=(M65>*n8eDZ2(mhN?N"B_H["+5p+.A + <))6]`'+5R]f?:_V:#om[bNcc\tLR=!98HgXVBTBGt8j6i'dBCB!VHZ0u + LnW#DWd,0R#dci1=3U^ZdGoX-LFj.hBC\rto0E=uRLJqe*Nd:%%]!1bkYap\`u6@:BmK-Uc + 5g>UMEJ*k$.Wb'gn1*Bef>o]]:Gf<3sE'j1,Z"98E%!&0DO@_$gHB)L'Jd6!Aj>dd-Z_$Ql + d+#\((^Rd`c/[fRU`nI`_piL1([`;HJIf)B3o]8[)<\0UO[:\OWQsK50rk*LSHE-6H(]XO9 + !:U!!3I)DRYO1(c,'*K$Z_hXXmCRIJh`4t(:28U0V"0sgfaIn(XcMmBtP)dsQq(cBtn\H2 + -ejdIEsMkN,QH!<<*"5Y>p3hSflS@s5hHL[>Ke]mN)Ki3l?M/+8!@)GsdeGPc7$nF4f8>B` + KSSN1h\h?j5_!!(_jVI]&NHW"r`s,kM$opdIgQ1As^O41hr(fC25`[kI<^ACIfRIp,&e]/a + 3!!!!592!Ng4*5X76qkD[jh8;)k1N:RG:Uc1kEcj;q^`)F]/=2%HqJFjlE^Qm!!!#c/gi%@ + k`Kr0(@N15CNtoc;jI)4o!!?so'>tn[.0o?O'M\)ab5S"4;\%u!'n8<1F6O,FSrf0c%?8Fj + borfRLUph%NDc/FRI]^HVa4c?iU0,!&!GT;Y&uCZ%2qf'L1K:!!z$G*=?SD2;1:qmR5>? + \hkb/8-_Y@)?*Lf5KZ.nB9C#ljr*TE%PGHZe#)BHQ^=D85";1#r@Lhe^MUT1*Nrm_,-TXSQ + `:!!!"\5NV!0iXVLg$/3n@lZD57Lq$9qm6#N'i49#;:Zgg#WBQ4@!!!#/]GoJO2Qf2&k1B) + 4/]T=/42duEWO;d$OisIW*PRrY2cp(\!!$-aE`2IcLmUL,6Tc=`.;q-jT;?\jOi%AU=M&>* + NU,@D(]XO9J + ohRAcLRgDP:kZfrGDT8!!&\9okUP$(C]Lr3H^deULXE.,!3.KX1X&r@PAfc`s% + E.*j[@\0@-Bh4Tk`b!5KRecWln:gP13,3Dk(^+N3Dao:!="p6J>fY,d"9!<<*"YYf"Ep82s + ;#PAU)hCiD[R\;JBBQ:DLB.AT!&3^)l,t59S%`Vn??rFk`(ojnoFD@d + 4IL.[ot(Y5!!'f%V5It.MqmLOH^=4,6&^9n:J!!&s/Yup]fs#FoB6I/-dCB>[%e&oSSDs625qbC>)+#!Zp!8puDkuhe'mH + `SN](0/mL_HZ;5GtW>Lri36;Z0>o!!!#i^Vk1pB22aU1J\>)NL-RCXQ^ZV?+cm->mgW4!9? + qrNh#\[]%F?OTCTrc+YK#1NCWi+>]qm]U?ZqV!!!"\J&E?g45=J2o$ooI/tG<,6=P,Wo9E; + U!!'fH\N+r)2oP^B@tsR94X'VJ"*t,hgN"PmO0T)m!!$+E1F%6X6qm>M;j8s"$-AP0[e&"i + jaUfPjf!X3!rr<$c7V7CCJ!`MYM+q:^5OEbhrgV=:0\jSS$!(u!!#,X7XEY6d%0f-66)LJm + /rY-h49t%Xniq9!!!!YMp..H'bN00WN:KX:.Tq1kI)&@_fjI.!<<*r^sPpaEN4E:ApigtXm + 'PfWilj3!!%PEAS'sS>J."XgBl#hjb/_Bd\U6bb%5p?EcP/e-NF,H!(Y,RZYW`bTUXPDj\' + S[Ldl]4T"8LN+U\f_"TSNf^33oQahHZX<5/8WKG[DODSPRpMGnrbzb]bTjEQF44PV9QR+ZA + Cg5Kl<=n?hJ]#QOi)@#d%@0)H)`XF-F1#a('j,G.,I=nNL5!!!#'h2U`7;^XuAo'fSl\gE) + tP1GU_cBtmq,ro9(eHGpQ!3f49:>UkaR#[cuPV9$C+f<;\Q%+&2:2U+A!!!"#&[O"e].SZW + (XdsJ]B9!ne+^j-W4q*g!!!"&cCDI.CsYN1Me>A4_r)*YUl1,X1)Vcg_$D!!!"tOI;4oHcF(V:&'Mt+YJil%bt*S-DT],DpHSNd'2X86!'!!%QIn']/o_gN:L?N:a+>TtDA??A1V=nQnF!!!# + p;dQ&,q9n*dRuL:ZmNmOr:cbs#]6_G&m]$Bi!!%)24`f^lIHN"cmLhik1d_Jk4eHsnop#pc + !!)g\DJid*fZpp"7k7s.&jfhai\D--GAD(kT'E?p!!!"(f]eSkhS!PN?ec8\nkJuRS='q<6 + 1qVp!!!#%-RU9#FRE0N1d_O'4lX>a0I07qA5lq!!!!#W1/@amnV8/APV6SS+o++rH3Tp(Q) + +7k#64`(B4nLI[3?flm2)O^Y@%Y[q**e9'-=S<09?#1!WW5Y_3-G,)"Q]LjU5-V8:eq!^2k + oGqd0='!8M3W<1K;Q^[h%I+f#+86d'Ib=7&q7'a+L:J?qe\OZ)Kk--DRRKTH6VE?Ps],Loj + `!!!!I[O:pt0'rb*Y>,BI7&3JfJA$:B<*pFB!!&Z]G'<;t^ic6.e?;M:Ia7,V-U:ogihA8B + k/Q2H4Or%S!!!!Ye:khV"*t,$?]Gaca91JYB@b$0f2Z0,!<<,X+PSdrl-OI@nl7(]eu"/d# + nTV(UZ]/S;/rV>QN.!cYck.0S>d/GPqP<-+iId,,thLQ<*q]f!!$CCB2;n6U&,8[CJI2%Yp + t15s*!PSA^sjY!!!"dCua4Om@0)4^=ji#8bf6gX%-F/2Qr0AI2rIk!.[)8ZZE%'?_r.48I- + K&R6G>-:/7tWCFT;a!2Nl1SFTUNfuhp4KFhTb#4r8:FRb+N.k:T"!,QarhoX/\-R`>%&jhD + 2&XTnXqbO3*^&e97^cE7S?f?od[drod^7HU'&CVjVDW,"c`J"d%!!"Vp,<]hdn8RL484!Te + CI\67-oEkLobA8C!!#(*S[n<>fBLFZO+\)(J;DD)q8@'KYIac7!-kI@J"6$!oN/bE,_Q_a` + N,:(J\_XbG4>Q1]RM@J[9gurmm'!.UNXJr0.[C`dZMcd(@W*@07=))'1ta6KIJ + N)]-cV^+pmEmAbS3Rh"nCMA(pJ"+*fj`*^$AJeRj3DShl0!/..ma))cEf`jH%?KbS\#b2nlSX;nVqG%O5;V$kn9`?jr/NaKD=hn + kJR8`NkJ%M%mTrAQnr5\u?C#*=\pKa\T2EEX5h27#UQsK + 5p:0l/hbZ9/kg+G6?j2@Q+GATFQD"4[mP?*V8g>f4_SrM77eATHR/stGh(B=HNIaZ\#LCIL + ]I+:`W/a]$ena82Kd^U%N@6:6.*(rD<2)i!0/B]itZf7%:hmiBqlkpa2DscCqMXk7CS1m;8 + /kAX[<.21V!!)(I=0JFllT%o>HB1$Q\p7!knaiLNZa]:WMA)Q1_M9'0^\"nWj$sd7YMMKZq + M&F2(4OeG]^g\DS0:,hQuV5.MX&Y(!!"-K3HOJk-mm).Tp[1UD:ZH54G'EmglE9NpI[e!If/M0C++<.9Zu8-?h]T11PodL(F!8o + Wp"`IGUKHk**Q&"7Y!HV=1`*?&0Ye:H>/]\o^=48He_)Bb2>oo@qPhQ(OA\L5[&`OdhiU.uR(]CH[TYps(Ordb*4EJM + i>5(2@2//F.'0uW>(TuC-q-RuAN@tod%k"o"X!'igt<^^D&UjR#K%&S1-Oi)UaG!s;\BBQ9 + YGMqgC1U8sCO8\l]$ToAJT-]iG.,Uj8<<*"qOGUBlB]#Z/=(T<@\p'SU*k(\:[8b[h%:%5U + M`3t7DYgBXGibhX0bV6pMfWq6CFB/_:_8J@3c`jcjm+Xq)^"PE]=&gAc74p?Q'J[ac%5lO" + Xu[4M/Gf]Z@q\F!W[b&7T>t!IM'_(@RMGXRuRsq^&6B:9<(c'j>RD8(BO[_`,UXKJo4 + pd/S2_&0 + YOaH*@aD]ji#X7#OKb!N4q=@DRQ+n-VrL#NkKBfcF!!'fp_WG]6^>^>\Vfe2c'?@7H4F:*$ + W<)q;Z+.^a5;2SDV#IJ^m`ta`>?%45!!!"BZ#!"=o!K7DPI=hWRPo0YV$kmTT,5;V:7\mOc + 7boW#>\KFU+BWT?1iID!!$E4[4D"Aq[k2Iqds>iVld^[,t7Ju!GFKcG\sbdau2s`.=]O&gK + Ck'YNh;Q!!'ek4/1^s)t@\Up$'hDgt^g^2m0'X4sL'&/ghskS@Z/r(N`[MC$"<_F5'RBB*8 + 27J-fZqS772O4RJSt%LLjRH8@q]klB?[l-bQA1!BC90'*Z]o0WaXX$.O(!!&gb5+1Knl*#J + GIs5JN_eHqdV&1YaAEoVj+d + -N[\Q_m*kReT[&E2ci:?QhCFrcLViZ!!'h-,i;/iY"PGYePq*ZGFr#n&+[P!jBL"nNqMg$? + 25GA^o$;H;m0P(`m*!!!!9P+.[0bM\)s=&9&SS_Hnq>lKM'rDfHkJE(0OjXck8X^0E'b27 + ^Q0]H!&S'(s?!!'NZ^kn2rf1lK$SrNXL7P@P/:02l5!B%#b:(_CFjmU+hQmq&sWBU(W!!#' + GK^M[NC+`_c(]Oh=IFnQ#!<*M6-LB/E5l"$OJ7LpKi+$bS`#$d?@.25+H!63&d\U6bV2I93+* + .D^JH&5;bP\'S%-;9#Je0S2s2a;On.B$CTU_P-Y^,!W1`<.fc!(b-]A%8'W>V^s3<0&pIi_ + bV4![f$lDPh9\51c-.k.J/38f*XT1g0M.p2UO\0,>7TS<;$)?9b6DJ%ffjm/Xg+"pFiNGB' + )51G)jbK\:9'"Xk*(]71]m[5q\KBf3@!!!A5bo:,WYDDatHj>F5:.eQ8W.Fm)6K5Br"6M(_ + ;s4$o=E?b#T`tJs"]Rhd"`EU@f6$X)[s$:c$_O!mb[[n[`7q;?o.eDFi;#?L\`GIE!)VYN[ + FD?"-RiC1jl?+G$,(AIDkR5UOa-Nc)GkOa"cZ + +>=%^7mM`NhURG?[6B@^cd44"!*O=7pP;!!!2A[#(hX=MoNhIM([pnaW3sY>>7T3LOic2pY + I2>Gd?dV>:H"!.Y,Z?0"32/"_3WL[^?PC!J&(O/e!!))$7us0 + Ue"jcDb/"S&"n()adZN0iRju$<;ROA,H + `6X?>P1*DQ?D*t'S%Y"ZTNWEl2 + qCo!:lCbEJ^feN)[O4a\VFK\L]lq;tY\Fn6d]el+[X5W;JuETCSU-W#k%.WW3%7*2tkQ\p' + U;I"dc&,*ltZ=7&q7;uu4(bHlj)D=VM=rh>Nndc7AWia4+6%kI\\E-W5B?R(=X;80K\2sJa + S+R\`%eOL@);*1N3g,C+Kr6g^G,6!;5(K:D8J>AGB1!3QTq'Ot3B3i'lH2*)Km8SKr!D'ItrXs-[^8>X;\p7$4+jg8i^]n;(LFZ`RjF_Phm=/O48_ + "%ZJ2qd@`I6EKXRZ`l5)A+C`I'rd!!$,4c-!`Bf.d"C5BNN;iV[iK#8;WU:7k5Fd@%2;RZQ + W(q1:'r!&3\K_PO\87k7r^\9^US>EY,?V>=R$0]2P=W<7GM/&008HJ11nFo5pIl@TBC!*m< + h^5i%!?UpC+oZ:n>o(Y$\ODftKV=3>=jd-le:\RUH5nsA"kR/6@>kttMV;p6B7-NF.WXgE+T"V0#(]mOucf5hQZjT + ]Z3HEpapBfjfWW3%WNi7qmPcmkf2uS%,?+YD]oe?TBhM(RQ^ZuN2r1`8`q0ctal=1)"!1^o + [`+pAsN`3YOERFQ+cVI3Y<.,/U3/a7T)2%d@.).ULB_[0/!!!S9ZZ>p8$rXepERB^a&WrWT + X83Y7E%[QHfo,!2$OPNTCrklVHW;.Q!!&[Z=:Yi('hiF7aNR?o^-`&(zzzzzzzzzzzzzzzz + zzzzz!",`i-SDNWL`s2Qma,+e#7q'dPq+:f2]X6R-13I*>6"X'Vm^Ni$3-.2Li(hVl%nU,L + k=j:itmrPr2uMhbP%kuJ,fQLcpCBj#qZlacr+FA9*G:qE,r*V#Zr@#*!%190Pm + K#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5 + (P!!)H.cH]HR"oJT1iZ>I+RF"j*">*V#Zr@$UEr5Rtqr!);cC[>ii9b,fAK(*[MsAin(G8t&d/PDLWa.!&gGX!,4DNBEc + CI&3rV#!,5Q5o$qp8705tdIL/JUn);Ir0f"TTqb'bs`K<2ht8Uft0@#mgq3gYBf.)t,FJZr + G(mrUndM%g4KW*jen7cr-P?/QF.);uhFuU,,",fOO[*PH%W`*^>,/ITrVE3WiQc[:lNpTqt + '^>,k80W;loE181O2$!O?&BW1t3`sW=c/R#N + [7S,%5[VU&-[-?>AV)eodWjQN>181O2$!O?&BW1uncX^X"?G#=IV+ZZ%M7h+=t5c0V94IW$32\(0/)ehn`(2n&X+S/!TW_@**:kFu_'3Zjc\:fD8#JU01gS/C#lurZE]=X!X.L+e9AP6 + oYY.aR=il$[kDJiM";!dc)S[r'3ZlMTV]eaQ3mUE_#Z.\[_d_+[r1"_ + 2E'.Aq0RI8CM`Y-Vk5"cA4Z7M`?4dYMA@eT@)2p?C!]bK">//-ZrEI?;P=4F<@5(P!,r5SC + T4eR]=[h%djHFf7=OA7Ma\&NZ)u`fCS*_7;Z+WW4*FT%:uPi4X@SHt1M>!tS.%""8^LA;78 + &mP/JUn);Ir0f"TXnIi0J[nN>a\Jn)#cYo<)B2C2BV5M\`:kWH\@2fs>>We>`&D5O@Op2LY + FDRE-q7scr-P?/QF.);ugkD8m5u'>;n3=\T4Ojbbn1)p:ueZjn/9?cHFDCkKdd + OA9`BF4n(s6PUNeZlW0Fqcr-D;/_+%3<12*2T`crI-F?_PE!`OJC8"kfE6Xh/16_J&n[X.n + OH:$5*uR:lr&kRl&c["$U.$idpktI'1h`l>U8?"cQ3npOWA:0D!ek/^Y?nm\*?@:]hRjq[r:.JphU?`9bJOGd"j-* + t7Ri-9YHR^sX+!Z7gX"3l@^4!jq@6]/PG"aUMj>h+=t5c0V94IW$32\E\#"QQq<(cf.,*[^ + =gQt0isk$#[;tBO3B9*Cg-NcPV)eodWjQN>181O2$!O?&BW2!i&km5CG:Zn&Ug1HN#)d4a7 + "i,Jj^>Gp-UCD5(+iN5ZrAG>99ff8'`_KjrE?5jkF[6)WD^]+95W7]R>F#eGdLEt5teU$/Q + F.)<%(%*PmK#W!*k+]>H4oWs*c3M<%V+MPW_5&S"6*umFjE&I%8ig>3beHf@/0r*4@l*iX@ + F3k09C;aiX85MHOVl181O2$!O?&BW2!i'("FPKn''e?b.ghLlRL]gsD<:9'03Y_r[;+511hb7JGOP%jE)Bme[ri48/bSc#dm68c?[_Ut>Aq2tcWum0GiB%W + g01n!20S?=?+Y:%ge1e,KS5#H1M?FKgUC%T7Wn"GH1AiiT7?k9>.&+Ys8MmiRPYm=B[H>3b + :d5:I.r[]^86^.l1S9S_$;'H044_HD3ZYT;B5GNN>qcipoIW)`nDAZ3hq,G^'oO;FG^Z[u'p.n\l<=Y3+m/9((MPNc1n2Bkc + %n9mc?BpY=QZ%.89"b*Dkumk7kH\MGtr\T?q_q;mq]2/3u].<3^!rqPLk1M5GAoqfQ0Wi5h + -&J="R.TWX<_:QGDl-`mE?:H"#lU\B^RF"j*">*V#Zr@$E#nCXJ_FG\rUq;BUp@bqnD3m[Yn'\%*;GrZ\o.cA@d,06BN + KM!)\=_u8!sT/F#?:S]agY6-`A2f6lk`uQ_5Puh:s\LH<.N3d*=(7?1b=A)r-C/qZVe`:rMM'nl#%1P1+8u< + 0MDq_R4O$33(r2satCoKpb*3!/OY5C+E'E@gAs)$>jnn$0GAO9%D'!tW+cr'n[,rhcu:7aR + NGMV,gH#nV5M+6Ogk?#04@JR3JLRXd&\$rikXhb#i2('bAP^VSamkphhs8M#sPan,RPa%D% + N>e4p?Q*HYlKm31++bBr%[qe)OLAn7k4o + Q1TS&!L26]p^cl@bWJPm+kPq1G`7DCh\r9ma@qig:Jh?^3mJ7mFq9d[0O"JV>C#`fjd3glI + <@jor>PUWE!W2181O2$!O?&BW2!i&ff@uVb`qf]3H-];0SP[e5RZ"EL$(YVk8hjD!__d[A@ + JHAVjRCDjPtMkpMt`-7L5ejioaA[,8%BcaK-Sn35C2q=s!2*Up;/LS:QeKU)rkBW3b\V#l0 + ?E(inF5('m.>.n4RG1qRN/=+kh>FX+N[!6nC>5L<^qmFqd]Y([igY-e"h;$d$04&JLoONao + \ODDlG29S'g!EVE9UK5V=nV1:f,h-"&[YN*cr-P?/QF.);ugkDNbPJ`3d&kVW;#N'6[K@d+ + !6\-J\KO,7pEBRp1pWP7Z;<%r]^/=PP71ae,^Q9rpFE999"gd1B)qORh[P\Gh]ZDG']^ed8 + FOB98+"c<12*2!Pg!@VPP3A/a_2q@l6`3M2?4rG;m8&J)Z;4hLGS([VacVo%U$9RsObmM>t + QiNu'HUr5]I#et7,#WFE%?5*eXeS52BJ<0Z^qd*Sn![r0j&@EtB'rVH2f<2l%s?1-:GRgh0 + \g"E]EXh>C1fU"XAl?IPu1i:sRDV_nM5QAA*pQDh^V-^cWX\+j.#"O.0[F]eRHpU.d`5s.5 + mD=PbI=6NZeZ*3Ma(s;0XlKl,ZrEI?;P=4F<@5(P!,r5SBW9apD)8Ii?bUp`_a__lbr'`u* + Dp$E[VWK``JXO7JLUj9h5t\W`^[r[hL"]Sj83MNQ7=r=)fNAtA?)Ar*^4uH@=sBm<1uV^h* + FFL5(3:7[?It#]6LplG^]4;F_0r[\9:[eIL@,I=[@B6uVX@8^Y?j(aGl.-tA*kOY + ',MHtj?Z-#md@g'^A%Y]_u7NqoBWTpQ75a%G>.$K2)[ADaKP&Zp$.g-Q)-WCDJlV>&&#aNe + lr@AAg1EY9PCD%JsIl"=t0N^"FIW-8WtLc0$Xj\H61,E7M$m-fk6r-*MGfR$@i'NVnlO'fs + Bl3`uinR;`$Rg".J(EF)l;CpKDYej#pQ[eX'Tg8UJ6njiSI?K^ukVqJ4n'?PN#!n8PF_]mT + X]mYb\iV7(-h8p?GN#7i^PROG1*DADiKhhg(u/QF.)<%(%*PmK#W!*k+]>O(:kP7?Ao`n/i + :@=s5fL?eb_WD]Q&*&q?Vgt&T3BB2!_#4H89H:senJ%k@+rr);8>;^#7FL:HgY?\WdW\J@0 + oB&alhamG7pU=T#f3a#5HWYnPou)\#\u0Fu"q@ZF(\G+Nf6"bS4D<(a)tmG>/QF.)<%(%*P + mK#W!*k,H>,iupiWlk]^8"f8@M^Y%Gh>j]^]2%9#iisd[pbGJqtAP\\RW[?7YW\3V:M\K:O + BmD?@'_Jhg9P2dRAN8n%\nZg+f]E&e^r9ZJ0aW+gY@P\$rj?39$_sFm>4!dgHKidN2HL6Nq + X"99ff8'hZhNAO9#n!1.)&9?kT#M2mT;3HF12YIpSmjukbLmej:D',)%%n)Gl)TP^<"9h@q + (rS?%7O$/f#Sut/>\Lgg'G29?=cBp?(L0`ZJGH^_E[;+6t@9BQIq'<'O:Goi1XHm&'H?JUp + ^AdtE)l>".-1-%R(F`8Cg9k]SN,1:RW_@**:kFu_'3Zjc\-1WRqX1uam^^Z@9q0_9>8J%j( + ).JDj5\Uf;lBKbl\e*-4k'RjT+Y/r@FL]$AW#m]F6:]OH1sgi*j%N_6id[C:u+-Yc=NpP(Jb55OKfRl>3@rr"eE+V*0Wk/ToaPAO^$!qe + 4ZgV;t:L621!$X]r9#).1+S?Fb*q][tRI'e31EGm19<99ff8'hZhNAO9#n!12X%QMT!!+!! + =[^u4"fNutPg>-VPUjBmK)ltkKllTY$]`0NH$g,(@u]d>*&<`>>qkro9&(b)A"2;KqTdD;K&BM\7=.aLhT*U + 8?"cQ3npOWA:0D!ec8MdGE6+&L4YQ0X + 7J>G&r"Ws8D\g?dXY/O%M+>>0AmD,R0#&Xc_9>-q7scr-P?/QF.);ug + kDVRP&QV+T:==0H8_T(D-k^Nf:CbhR;EC5j,h9R.4"O'S/6`k^Sc1^t + rT1cqn%ooGu(%&.'r:A5ij3+p]p$:5!pKH;1n])`,k80WDJ24.MGu8!4 + W0fQ>5%/XD-/^L8HEWi60BieU9Vq?soZ$+==Nrh0VWES!TJ.oS`QB[;+7?hKnA1SRog-DlG + HG1$608[P7#glitj8AO9%D'!tW+cr'n[,rfs=SMtJYmZLoNTrYbfP*0pr&fr*s4c"qH2'aG + 8H`4f8$ig"^O5>&dAB>J+QW1kX++C0%GER.eQ>``M:7TZP60Qt+U]"O!ET>'\]E6ZYV94IW + $70Ab181NGJ4jkDQ>5KeQdO4.P$9[34iG$\pM(4J@S>5l8iV>"]]H1N6I!P,DFm[m_EYGQZ\(9D([;+66#;NK[k2k^hhT\VKCUp!:-8[PYHe3q]F6D7>^*tZ + ,dn`3Y*i+)Qju1Q4g!EW.6;*"FZrEI?;?=QZ3-e/6e>SN'oZEFLQ]mVCoD#;aWOeA!uiI!+[LJ,KE_l(fK?ks/TnjZ!SW0j-rD0K3SEOd3Ybhu9PCD%J + sIl"=t0N^"=J,eUIL6k/N'S1YI8`Sfs>>WN^%7+,i*H^>H1\aG1CG$DJj@^naSO+[6bXe7J + HD\@df=!5Ao6NVR4j/L^/mWSnm]3P*Z>FPZ>&$Z%9$sA%[E!R + lq<'Oi1MrVW;k^&1KU)rkBW3b\V#l0?E:T;E]_q?D\ts#`RPd!^4CcA>h2t.l0f%8PmG#%h + .8ls4<`YO&M.L4.PV-6FHU'MK[k1gmfW`uMrVl]_\hC\J4553QDG!P:55F7Qh+c,UIVH?CM/`mP>e;M(#?R(>.*Xl9:)_#goQf&B?hLQ)&=Z!AEhO=f"V41KpF + 2%=t5c0V94IW$32]pq-0ktT=Vd>'L)Nkj,Ap*K4A6&I_Bplg:CdOm2@OjVb`r9*UW0r^G`g + XHhQgR*Di\@]mpBF]*BM^.$r^)'h;$em7 + k7iSn:hAkN:41BrJb`BjH2sPN#?-sNK,Z!^-$Q'%qXs0d]=WtCT/1,?nNAbKjN3Spm[C)*c'gLo^OCTSG..+3\[f8^ + ^EPVn;FQl%I9c4]O$32=f99ff8'`_Kj9=.YA4?VD,?RU$^F-s(6\+]Fb'BO#kb*B;GcQ58tGe8.db*FVpI$"0qk? + Bg]k09A7**IBU[VacV]"2Lu)H!"^`pD6VQgkC>);N-IUOW=C@eTs,!uELj0Q#ONZ"(fa*BL + QOn(nKm2QTr]gASe[rR\g`-$Oa<-5tu-n%st,L(.jH6 + ocP>jb4LW0R`EXf;r+2M'HN*A&jTmqWO[afXnauePZQj-9,C6jiWjpdu1;cQ7&&A0qHImOjabKMZXuoN^1MWTe>XW\MHI9[8sLmj%N?3#BB82PP$WJ!-(BpOXDXDOq'6:/PqcTZ.5 + M+'j%g#M2E78&mP/JUn);Ir0f"TXnI=tTEN>JIIkrqYaEe.eo^W?QDmg[jUS)gQhQ*W>j-1 + H=r[%3'3BB#f@0@q0B4ECmKKc+7XO*jHEA5Y6f@;ekJh3Pan3k6,j:6:f*8DOcLMEB&ji52@Bm#PMC@")`MZ9>e. + 0=p?iFF>,m[SSF#M)BtoMtl-m].Qdd-]W_@**:kFu_'3Zjc\-,lLWBs?TcJZNkc2%U6)!@f + hI`fgU11b>R=0=CT:"&7hBWFTt92"mMp+BCIQmmB1&*"1U[?E+BY&rsYakiZh[CN+@(5q:` + hgRBV,U7(Br:mbcBW3b\V*YJlW_@**!8nJp[&)Up)]LIJ).G\T>/#Rql*4 + <12*2T`crI-F?_PE!aY.ak&B&pA7%o'2o>M%dquSUIK5:^#8_LT,51KcC?mQ4DVqpU&aW=^ + HXD+Y\2:R*ZcBk^AG(s-DJ(0D;*L(nc/CENsQIHZu=k$Dh%YRp8rk;HKqI?5Q"?b^WDZe7n + #kCV59S8!W1!`bn]jBp%<1W\8dc`I%d2=BO5(V+\cl+$+Kl,9oSKeElV_`JXs2*8%T1O4`Reldq&ELl[Tm8kN"STG\DS + AS!/5,`"SreQ(t,peUG+7un]+s5UM&f::pR_)H8e&8.H!fVVB4`$D+QUZ:@ncC[=nR[U7&C + (Ed,PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P + =4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G + :qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff + 8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.) + ;ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc< + 12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);I + r0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%1 + 90PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4 + F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:q + E,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8' + hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);u + cmu-V$gp#qZlacr+FA9*G;3Fm7>NjQ'k%ZN/nhZrEI?;P=4F<@5(P!,t@E)&_nWqsGDA]TJ + GCUj=Wnm#IA]'3ZlMTV]eaQ3mUEa'u;qkg6$M/N%=p4EKYDl59W,03YALBW4g[Q7*V#Zr@$E/W1Du/mPo*U&V0@q==FVm8H/*!;8`P + PmK#W9$gII6;%I^(\5TgIm!SkUP0bb9URZj[V\r+5lc'o99ff8'hZhNAO9#n!*=1>r;"L#. + mL84hH$pmaiMOoe^FY/5$Fs[BW4g[Q7GV8cTeJ%.0/te;Ir0fKb + CalRF"h4_"h+aQ8WU6:f2cFMj>h+=t5c0V94IWMYo%h4oNa$6[SOn=gr9SA7VM2cY_FFM>q + nmjN6cTCt5ioN#FZpTPd3kp%;6If9,h4S+N + OP2>$N]mBA:%3%4lhnT2C"Ug>45H]>#^k7>qL:Xq+Bq3E,ruF=Q]]s24YTm>O9PCD%JsIl" + =t9)uoB4FqQnY4?]mBE;Tu4AI'e4=hcsb4i3B(j2:q]63Ir4)W]m0),g(ebYUe.Sa$,F8gW + A:0D64$hq9PCDEFaNiKC#?XQd@s'H/uSFo;5-J%Q7\l+U/^S$$G'06:6dJ>?K59B;PZj&E3 + KGAZ$Q*.0k84Fl-^k=3niG[")pJ.W_@**:kFu_'3Zkj='T"ckF[6A@QD-ZHgeYg""9j88kM + _Cg9n==C.LmOl.\p+9O,&Eh>$O#]6h+=t5c0V94IW$(P"\rB1hA9OHTlF6O.opK.OsQuD[r1$5g2@4".\Hnr<@5(P-p^Lk + #qZlE-S@#Hq\Mr'gV%sClCCCqo>;)'BUk:*M\hG1Lp4pChgG#imC*0L'i9LJ.MGu8Pb=kqK + U)ts&f)6`Z=HO*4/e1+?@#39:8>U]N/Z7G-cK:tmFnskg,(ArE)*c>RF"j*">*V#ZrFPs=g + M_N]=XQd61k[+2GEdmUVP!rc0aB$qZBX87j!/$_hJWogGCJsE)*c>RF"j*">*V#ZrFOBIt) + t87n23bfO@06K'HW3!TiM-GL$Ru\od0W4*K8!UU4"93RL`96;*"FZrEI?;W/6T6:0``Wk5l + iM%V,9qN8@3l`/fa'PP>!_08(-:o6pS?+Y:5H],71^cBe?AO9%D'!tW+cr/j#eui:o_sMh? + +nb?o(ccWtqXs/MT0Ag8RsSe`o^qdN7urQ-IDUXD?[r#sN>aYq2@+O$KlYA&/UQQ@8'7)I[ + t"F,#AfEd$90D:W_@**:kFu_'3ZlUgk?+PSppNMX8;)\r6PDeS2p2\N>omHEoP#oET>(;rU + 56Nq_tsX)IL4+fm^O;(pnGOf#*7R4(_^(<5:NA;Ir0fKbCalRF"jjbUaN&_hJV[pXAEXX8i + 1rmkS)]Fk,*qpNA3-d\M_&3s)o!=t8I#BW3b\V*YJlW_@**E+Un))FFW35TfX#5:OX!BEdaDY1ccO:cO,k)EX^Ah,.On'g_p + P5L1G^i3R_0*tm&ZSuY$JZXc>MCF:&M>bVqR!`,;1_=jN3U$euY8sCY"_!;Z["%VG3Nq()F + >ga,UND/ss@5-Z>te=]pLj+'uBlfl+Y(2IXIUWDf^PGEDU'qtBDM:/4hIX5!*6ZY.UAdn.3 + g`EBQ^djB'(mG>N\r:@I?kJTYc27IpCA7WWu`emi6p?^Jl6lJ:=r9_sIq=.H[C8@p"(d"[f#3M:[6H/oBE0F[Vjp4H + hZr\"q;4.f]LGJ*C$faTr#nbQ3npOWA:0D_Dto8HM,ZU+#VJE7u\F`HEoTM$"q155aoflIDpO.oo@@V(Q,h]SD + 8tGeqAacH'%(gpeNYT3]'PIH?_q*dF#`2`J4gPq+e1g2tQ+0uo=s\)71V3,p-)4T*fdW+rHhWt/Y#A4rk005@?Ua/mIq`qc:mHW,r9=]*)Zk(jG*e4+XO$EVgi4smo=0?X1Oae3OW_@ + **:kFu_'3ZlUP?OD0\`]P?^)X^Y<"H5<^3&V&=YgYjbl\1\L_[3 + t-]=8TSO[YQ7P&+>KA3nUirccUQ'Jb%nRAcWe6TZC1M4=HogG,\V-\V#04):>k0U#%+44lH + PURi`Z\%Ct?[_UtmbPM:-YA%a:trEqXa9XCn`Rk:j_k=(gJVlBGOA_j-Bjpg]4fTdpYL8Cg + +A2r1N_j-.p&lE^)DLWHLL4X^OO+R$16HS'.m>W]i4.GWW(1)mfWk#Mg('VoX(/PHa[kM^/ + d+s]2bk1WF*DhU9<34J_8W-YJ:(JABC!8D-+BkU=/J_A*3VU>Zepi=K>ISgKob!8sLn!jd0 + =lgU>AF\J[e.PmK#W9$gII6;*"Gb08'dnr6VRnhKo44ibaea:O8?Z(@(\%R'C(,JAHu[d&u + 9%ho]l<46UGR@-02e##hQ',0hN-oj;5q!d7n4uqgJFm@HgL"b[[4am2!M_DeXedgQ3If9+? + ;,NL36UQ6K]SD8tbRBCD.FPP8:RU+@3_rCS]mB?E0>/X;h(iQa9URY)jqiWuVb`ZZ>E4IN* + AA`a`9+UE]6a.M3"rCl]8d+GcC\LFQ9%Y[kigRJH + XQpmn1]7uDiWU;\DO`/ + H6E"(qC.q<[D)60dQC8:O]e=-^16-=Ka)HYB>b#s + Hsl=EJqJ[tHgEIc[U-+A\VGTL_]WrM1B"Bpeui:/1F:f&;Ir0fKbCalRF"jjKY4t1F;G609 + 9usNGF*,(HLtnHcNN)l1o%d5qrZu#fJY%f[a[XQ9''8q]k-W!@[BN!ZXIM6h,8/)'u7b!C0 + FeEZY%J+SRI?f-,RR;D4$:QQ?qoM1"1Uk?EID=KS0II?4@.H<2!pKRV(BM7pI@Q]tM[]hQU + G+N)(QX41fRscK7ke>Z$-*Jo#d"Q7lVE^b<[M&6C7.s'ieM>,k80WDJ24.MGu8S5!$bQBAr + VmaS5"lC$MP@^5Rie&U8*d+t-IBk#i1BC4MQmA+^[_D^1EehJbad&kXFcC-W6L;S"l)`MZI + s8MohQsm7/`Ki)[B'juq[a]a&p6k\K^q3UK>4pCE;qAZ$NbPIZX]i-nMpKY;2a@)q"4QGAI + J\2?'1bnpDqqk-kn>IelY6tN*,P!M,#5%+*dP]rajdCpe(U4WJsIl"=t5c0V94IW$>6\^gG + U;BK[#uFX.JRhHM6]>qJtd@/R,ZjiCe>Hg/MBV&$YMEh5:4VR;3>DIQUaVi# + ei=JGic`ue>V8RY8OO,oY*;R8 + 'q?647>-t5.Qi4"eXI!:CfcDs>o('*Z-qU,/b(Q&f-"s85Tr#WZN#=E@GEG_)>WLtmrnqYR + a,d^MEp.rS#7e+aDQ__lL$md/>ICetCoN,+rC1qod\YM9OkW8MC!iZ/]k@,W$SR;gCj]9`> + 3_qWQ`=&dB)8Cnnb(L@>BPlEfi!MA1M0`H]fX0Ce>cM!HVCD1P9pLsd&gM2HVE@8'e31mHM + +;Sq#gg'fP)7f-;Cf50M/"8b(Q&f-"s85Tr#WZ(g1XRqQ&t@4U_++ghn^C8u)5!1WQ7>Lm[5U$ + njH2rIe>Q6PC/s*Qr8(/\IB:!pO+U[%dn`3!P*0:%H?U3RFI*HT=__IK$Pk:tC05JlXB;a% + 316n^&\>fnB?89>1]E^^cTLem_hJW>aBcE$mG,7YVl+0["q=mep!niR@DM#0P=_LFb(Q&f- + "s85Tr#WZ<3KV6G>Vf?%:JQH,9rsqc'ej'6\PmaY#hg`kg?.A/R#MugU8+aFt?q1<3-1+Zt + N=26j\Ku<3BKZWlNTP[T"t3Z.f6AUQ<.bk*mM]LA:ZCc^H`WpYUI-Z=M(Q8X'#Ckp,dmY$/ + 5Jp$:3_+"]Y2"tT$E]X,:kB^c'gM + !R6>idA2-"r0eSV:ph`Dp/pn?n2iX^sV[^\ATG + PA+;X$T->`!P"o;^\V0`]R\H"G:d-j1p3J7RMiE_HSNpXnU;<>_55F9'ic6<)fA.O'\T[A/\1AKp\?_TngV/+5FJgDX89Z + KP#5n2LD`(!W:J]l]HabsYT7?k9SaX%FT5q`"DBF\#.MGu8Pb=kqKU)tCP+.qVA@Z:==7,@ + sf@SWqi_$:a]63F_k006KN?]4qU(81/DPHkCT:p-qmEq\amN<)R&QV&.7MJ!M5JOO;cTZ/1 + nUDGSp"@MA^MJ:1F^(kJ-Q=$q*"M")dh)2jp`tQJ%3+Sm.GbH,9&I:,o3m9-V>g,OdiX);E + S[>&qsHOu'@Uft2Vc_QgXW?+`Bho-L%=?Kc^m:(UL5Dr-hloV96VB7pYUHZ3&fZZqYg0GlO + G*Ke%0\f%,M6DWjDZ->JGplqqqEkAE6(d*cSc5k>'hf;c6N3qn6:IG0`>GS<69ZjK@k/![t + 3-g7Qu&Y[Bc-EohCuC>HJ/mZ_f(>`BXZNZL?`43el+D)d"Bph-4Ip76Ea1&b,6U8?"cQ3np + OWA:0D_Ps%hIG2bW-R0j'oh>DOb*=KR9:+5#F30Rk=05Y;AAF0D2]DJtg`qkBP*hVME0@** + <8k]J$^E2Ad[cjUZh*>(1\g:9T76W.GLORK_WOI^6rJuI+_oN7YGiFQqf<,u2EbFa*?@#1J*/oh7HLtn,d2FiT?uU"\[+*iNEcO3am& + 3!)_5\$-04)Ya;/8q@s*]EOWm4Nrqbq=h-1 + =-C$YL,#P$076T4k8.;5\9Tqt'^>,k80WGj=k[VX>sDE[U81TIAK^BP2iX?0jq68M_&DVMC + (6h00TFbfAA^V@Scc"a5-h)[g4/(3$UHd2?2k2k\Bq&NC9=I?o*c#'GhBDC;,hs&FjO>W)a + XC&`Vp/$GN(LFRgSaf9@6q$66cerkc*8FGq>e-U+2;=!'.pfl5dJ0*dIf$88bA6V94\T[kJ + ).^%ll0lUTfo(,n*b165`\gU:tRVYcL=;56Tp&# + 0$.L_iHsVq%H:b(Q&f-"s85Tr#W*)#:jq-oJ$&q-RUUC#ms-e##jGG3#%Ghf?gm7f'Z0t>oD;3Y"BH&mJe/cfih*!e[ + g8[^_Q]R<%gF0i7nk3bRmGG[np6ahjeK3]&B:m`LnJ>P[dFLH]M3]V)=t5c0V94IW$E#Xlc + 5bY/=2Tb%e-R`K(]Z#%)*OJ%4tR,ZrAG>99ff8'i&>oZt[+0Y%GqIWLi7%[;4AhGIG,-n$[*&f[s<^ + cdoOg>WYM*Kt]= + V]fB'PD?QBnD]O+hKMda5-UV#?qcq&eu1FRIr;[ZP\?G^+JC`fJ`P=&8_6D19^66F9^[cr- + P?/QF.)<&bU;:QRF4EB(SQcHb"SDj'X.ofsUJpn@EV@Z?hJSut/8\Lgg+qsCl##OKm8McBl + Uqtk.>=K5=LK1"=qV2?M#H^Eb?Sp3U!6bb?11"miX2W(*;`/##Z,>Xab8Tt_9[T)(stR9#_t!j/0-B*=6Fj + $(&]&T17;S.,>W]ab=VG402E;fY+\pKm9S8;^aqmBD>gY5qVSpU5"eJKGP+@,hEX&lKBoCR + .>o@Ua'GMPP)fi":rBqi9mCX:5:%3.?(HZ14E9s[>_c-4B_>e%$3YhHi?]WGDIDVB`--rE> + .aY/fD6US7/:pt1C,N%""+Peu^p:gllgt/]DeZ*E9XKcVg9$gII6;*"FZrEI?;W1TP:S4f% + [.sFVO&]!I5E'tLq8A+'17Pdnj+cu:G3$`,]&T17;K_GQo>rAP=>f%,j2Z:Lbk(#D)]?f$/ + bS&aks/$k1W,I)LgQ\q + AY1V$^5&<7)b1p?^JDK=q3[le6tJDVWm!\Ja#&?U*oaI/`s)2@lCJR]8N\p4HqcD;1rdj*, + `mGhDKQ;Wa^Mb(Q&f-"s85Tr#W*(qG!VjMtrY@cSRinlsMT[u?Hq5F^M-FUusUDng/>J/K4 + B\mN=6O,l4TP[.L.?='5kP=`Objr99l?@2&sm2n:d'U&>>-RW[??F+6q+mf,eJds'tL\^oBHhp2(OkXKa([B^@=U\&>5%` + $:-SHP^JIJA&s/5XhrN?j#b)n%JII_2_e5"@T9^ZMEY(qsij"XI7W4m'V*+labm<]]ZM3rF + RqMhKuAm\T9(H`_P9sD1r@Zr.]>$_@n=(hd?lt6`jP"KZd!r3UL*W>U7NsAkZU3EWSl;>_& + Zn#qQgY'J(c^<2icLGFAKM_SSXL:.9X'mFehDn5bu9D+\Y5ED&HDr4$]u2/:VPgJdB"0J%/ + --*(j]"R=dcJ,]8A^rORD>57-X;PZhqC'T`1W@TRjW(N*l4fCfLA?"(f-5S48+Pai_Vba94 + 'YAsX=K5H+/n0%*JFHHA-Vp_&Zn#qQgY'ULI[V@Fl/( + GF(Gbl8m"C4%qJG6"U="nT@p^6@H1=A->HiIZ$$A]pASgJdAu03>;]@;/5K9-$*;XDn'eW` + @7/ZOmc]_Oi[e8P)Lj*Aj4]Z@!sp.d#mUe07nue,]XU#WFhjnmp\pLk/GcW9W_7#(qL'c'$ + fUqtga;aYF>&=)$6efo@(7<1P(5!jGWaJY`E#^f'7sQ3p:mlAKd60M\F=.b+,ZVG3O,Ik0# + ?O)sF*7;YG49;PB]._u82PURj4k/E5p=kZa-;Q1$l$@IauX?lWf7R6b3Vdq#U.a+=;Wm[V1 + $YkeR=mF(j,DDVX0O]QP$S:TfWHt1qNfFm[YLS3(i?9?fe@0W*q!Pc_aN]q=NHcZJ99g/m. + c:@Zj(7Imq)1)?]=:Tq:)H?jcB2^lKF.oiSpgnop1.W + s./I/3>Ep0!]Z1t&ilfOrUn + e:n)(1T=+u4%apBU6Dul7S-a6QXC.t6`SN9^u;l0tG&fA$M0(h2>eh$W$Tg%'UnB5)eYZ.$ + uV1nc9l8RUJPM'TZ5Ok4%DdI/`Zd'6!*BSG?(2:(?\o-=bC'Rb0r5TMCp_E\cD.mVHUe-b\ + :AXV=GMbQ5r`l;5.L[k.:11&O$aHJ# + V8tfD/#CsDk:qFV+R#qm'H0;]bCCHg6=!_K%`Mc=mGkVl]'BZbimfj0==?7[FD<_[o,:)'G + Mgd2F_.b@RTQu(!)t0HX^HYKZ].PY#qr\\eMOP'e32Pp%;=4QVrC2apBU6Dul7S-a6QXC64 + RCR@+q8S1o?cE5$J'C=Pqd67XQ:q-3[\YJ5b"_QkpG/6-;!Bc0'[ZuGp8lIF)EZRh;mX]r: + &Q"gk)VKU="Q?r>q@GqY-*^4tMhVS&&nKYG4PI8n]kKZs!SsPe1K\G'-;P]+f!V>L#=7>Xl + If3GFnHOX)baC7m\oc&^1FI<@B&o:cISk6.WilIsPnR7LhuYH0:11':"DQGg)0M%&042FhT + 0@6GP.KX]Pq#epDhYbQg9tikD$6.SZaR6JB[K/VI7m4+JWE_O'OS.VM4F.te#6+giX82[m8Y`'5p@Ks*$$%M.o$jX;e-_6Y5;$R^2fIQKDSk5cS_=Q)D_3gT,5%g6'DR54"&p$7bkPRhnJalU^4/%)Ksh7Mm=LN#`Y9KGoD(8dpJH?!!,9s$B*Z#V_?/;\NKaKA*_,=jqQ@cq\T[ + !pKW`1G+Y>&?9GTkiD@IW3kdOJ3!Wr%_l0g_jV;&X]Y_?tfs7G/97j"_#qQg1!L>2_YZ,#!&4[rP7NI+mqssUHSiqG1'M2R + WL+mi>>\T2PgY5XGB3ad-Q7B5L'Sn@J\"&FpEK_Jor)'s9E_:\)H:f\c5*I?i(+ue9oB&Y^ + MoFA!pu."lk\-g$-l,ai<.BCIlC/B2o&T?7p6JMu,LgYsZ5NVG=9Vj5A;P9WW`QBAb^*ZrE + WSl;>_&Zn#qQgY/=SP7U5j_$0JbM+EH*^^L%!m3U]-L>042H&Dr6Fh3?TGpA^8C:2f>k,#" + t4a>On,a9e'/C,ht.`hnFNgVP[%T6>`W?j2Sa]N-at[7_sY(E,b<@7>pTjV-G./QBp%S>.8B$C'kOs7-UFjSJQ8eCms*>,Ba285n$_AQ/54=AbHqV/G/&R + :Yh=?+O!%OXpV>#3O'nMcrBpVG3h[U/\-YK36g'[jC;(%[H\od2R\7S$);Guu?]ij'"?ORO4R[/ + ?snm/hK8Q9PeNfG[R+oB+uD;2Lq[RU&n + ]1P$mtI5<#RG,$^-,,)`5gP\BS3-nUg(n?-'/\od0lET0BkT4M._Z:U6,TqS10VT;ndk007bkKaP6c.ojN)>?Vfg9hG33[A + -rb1Eh(4$#D\CY%jnOX$SaB]>>Hbk;*b$E[OA^3B%;W&d:468i]7FR@d>J\QL(ll#K8LD7J + ujr5Mf&fqjMLkn$0i'?bf]a"ub`;Z`QgU?qRq2*p.>0+a<]2ke&)*.)B"dUVcYZ/CA=K7n, + ;LsZ<*ZeX_7Ld@G=B`"CcX*YQXeA+;g=b0HhS#BeQ-!.ombPKVY$<.MR>c8IDVVa0_#eCfl + fQH](G&ZBZZ`;9IQi#GJE<1X6N6oY7un]c$HQnphVR,_,E + hIb3b!eUc^l.5AdnPK))uT.W;]t'=g?RMLA+*%af(]!-^fC"6EZR-[r8mh\_5]jeu`.8Fd] + $irqJi[@>&(,L9X]XZ=HO9cl'TF+Vd1jrd;bH*W>m0s7Y2cZ[MXE5[\Z/o!2iMZL86s##hE + p4ad%/^V>81D3FpUW:ATLCBk7bOEUFmicLoBEX@6gCTaJ/ + ,\$DdNusuSF(U=G/Q1HJS2G)JE"+@6Au1Y<:EJMbY-+pg*^.[4$O>*/:J]=(gUBtK33dJ`` + i4m5e?3)HEOWm)`/ru8A"&mV]=YZgcXm#^.WKHJSN:m+m`Y(6s":`_3P\PS"I9D)!)&Rj== + Q"QaJas,-B!2SbhU)7@o*N.48%pkn'Iaqa,V/Z2/;d>GMe8R3"[--3tR_#6D6`".TNKJZ!t + \"q=9C@Ck2Wk`;XNCiPUGF7>jd:1OoE%5Q:Ff]mB?T[r+p!K:GKns".*B6tUrKrV,3-4Vh\ + US.Sb!\T6fQC##R[Rt_@k8\c^m9N:T?oT7sfK*r;?04eG@;O_/t>E!g + Y;`YZ/CA=K7n,;Lp/SHhONDG>JDt^nsQ`t + Dc5#JLh98;QUgpA=Q,uG2.=K#$RPEShr/Uiu)N>mf0'q2@+K!i"oE]Y^5eZ)WE(-jKJ`^`X + 3o'G$cQ6"uKkkN\hP:M[7G_ZbLL(>@iCXt$u4$*ZP#P,pr5EKA<@).hr(DDWU!*[5>3+g"j]9MA-4"q?gO:]H'8R2O3/eSEa;;5 + o)Q*&qnfAV]pBdmrdtIer:V;9)3kYZ*W6V#i9b;WS%I$8f]ggUBVb^SV^(o?TOKr`n"Eo&n + >KqXeJ.q[Jjk*fV'qqY^/qfZp?\N/;,*)k!p+#G"Ir@Udf`9bja\S:oCOP!.L0F__.>qGjJ + XR&*5%QC@__VB^+>.^u&LLO]@&Q_fE_99uMU5Uq[-/Rk\InV7-#Eqo-4Z,]B^YZ*W6V#i9b + ;WS%I$FE5u:f+cImF32+Un^81$B2a7]Qis5V-d2[(+jjk_?FX8%@4",N>jgB0O\Zb(+rk53 + (p8.,Y[f&Gl%%]qrCURg:)"HZ;DgG*BSFDC85-)e5ndOZIIqg'0E7jq-1=GAZW`$ffX\o^MO-6cH@&ZDd":#0m))EUXhRokK7e5`g5A\uVf<8P>Wf7Fnh;-mcf&2W]Y$ANYR + $6X.0EGR\b!M+>qbKlOKS>*lj[ia"6U?2!nOL]$H$OZaAK:&Dod#$4IU;P_HVt\@E[5uLR^ + :KX4?YimIJVRDdSa$FdF$A&[\Lk@\Nk]Ie0eJ_baG7$G#N,*Wg26$aHQal.OVH"^]di?SA8 + $RV?mY>,\*NGV+N0u%O#`B[VacY)`P&R>EBa%rr0@7[`!55f.^aV&32tKV?0Cb$ZXAm#7`S + +ekGkb^'Y`$:S0gVc<3Hp`JYPML(.XbAQ5%]KiTMDSs5P^aN-r:-HVZd]6sGFe##k:o]_Rl + 9qORqp5_H;:h3W=b*FXVcThGcP%BVVC@[]MMmmW^?F+66-kH?(O":kOgiO,],.3=4g!O + R<'TB_C/kF&YeLhnHcJ>>,:4-dS;CPAr#k21VOG#qQg1!L>2_YZ.7taEWXP?2j]d0554qV* + [B&X]r8/Rl1ET#:idnnRr.4#F;4\;Q3^!g4BJ97*Y6GN4Z]K)aRN->Uc\h=0Gp:2b74^0d? + c)$kR&-o1@]fPhBOPt3FeudQ-?QTjl+gtb+q"XBSMi5cNJ,Un5%>u# + UDIHs.J,]B;kKagX<2uaEJ:KY$k1$A/LTq7D1UHrNl]Y3Ec'pYUP*4mBRN0e%oB+T(=&818 + X=;>Qo]ah;p$1*%mbK*H$F-)W]QpjQBt7j#)@8Q1[r.aUZd-kA&t7&Ng%1O_>oGkP["O:l. + TWWAY"Dbsfc&V5:#AVoO]0.:R145(!"iP:'.\LPI['OkdaoD>ZWuq2\F3j, + aqXHhZsh4I!/oj9&&?'3HaB!\@>H@&ZD(q"jjTfs>>6PUSbAoOu[Ka`lWjQZ8Of2fE"HUs5 + Af-SdQ.r-0u+4EKYD^V@P;Kl,YWp$]ZqDV)$30dBRuTgFG?(+`RnABCiOWtHKtQ;*+P@\57 + Wl!V!M<'Ga,FQ15q"Uc*uf[u9oH,kpc]63Gj^OL`;>?`I&VfV%H.JWnA=Q8B$n(bI[G4!ui + './f\Empm[M6-[NKpjl7P5gl=3TRps1M.'C,uQ48=]5(jq=u$nG`ZV!Y[PG*%MP[RfW\eB( + +hRhkWjN7e>Q6)NfI2D>Z"=Z;^%`Qp?^HY99t\=P0K-Veui:?AT.MEo?X4ep?gW/mbN6GUubKF]"qXp%":[Zc6(V'Y"Y?sNUn<$p!\Qojl,q!cV.p?fJ:n`%HA&,Z1unLj`hJ>LBp//<+)Q7=8d; + uhH?J>E;IF9sKu:11&O$aq;?6 + d/"I:MbYZ/CA=K7n,;?6cD!gX/ncm>nq3J"".0#1BH"I9ApckEW_!.Z\QV90)q'lX2>.OVH + "!.^YkV#gX=#qT(O@&\YaYZ*W6V#gYh"=t8fTM&[lEWSl;>_&Zn#qQekTI4-H!!$:+99g/m + .c:@ZWgpk&!<@G_f@RLD+@CkliE[Z.!/LiF.OVH"^]di?SA8#'z9H707SA8#'( + LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!!Z;Q7=8d<5 + 8Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.=c-#qQg1!L + >2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/D#WH&&5"^H + SSapBU6z^r1f#apBU6Dul7S-a6PMz'*jgQ-a6Rc"^%dp^et15!!!!m**B52^et1L@&\/J9* + G:q!!"]m@&\/J9*JRNV90)q'`\46!5QO(V90)q'lX2>.OVH"z!##U'.OVH"^]di?SA8#'z9 + H707SA8#'(LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!! + !Z;Q7=8d<58Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`. + =c-#qQg1!L>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/ + D#WH&&5"^HSSapBU6!!$!8f@Tchl-kZQNl-S\Z`p[l>n0\nW2M+?:X?.I[n`JT[:@7;#7hm + :>nPF&YZ*W6V#i9b;WS%I$31'`&/#UrjiS;S(RMo:rjtmo2C2"^ba+!%^\sIBJNtsLio2"B + HK=&D0miW\mbPM,XBF#rbUi/?hR$u1mi$c6J>LBp//<+)Q7=8d;ufUXf\"h4B?o/agJ=4mA + a.X>QS2]@8kS)KP]Zj$r*3N5kKK>MCY#Qr)`G?UpPsGd9(M&bPAGid;G@:7&RE"lD:u4+;l + + @oU'V8<*B\RccC?oDp*E4h*.@_XrUf=fn*6,L9\om*) + am9#\g=ihk"\T$=#F6heYZ/CA=K7n,;?8I/gt^\<#Jaq`B%O4nk?TDJ#(rUPZY%)1C!`N(V + OqBo!L@K[>e>/2h5d:gEHcV>C^l[;N"7I>:11&O$aE_(F\dqWcV3]SiW8\8c#E^=9,\LNfS8JYf6]Ub + )2]Pq,NE/s]8EG3rE.o)%mjo<) + %FYgdc^PbgQlqNU6=b*MG9OWuCd_GYsTJYaQ:%4i5[1`'8/(*kRf:ggPe[XPq0I]Xh9M@!dEp8\oOJP6F.PO&j<(*p@V':`X!_^e,=B\m+O6NH3 + PB`G9`9Z$YF6Ch#gm=NkF*`1[o<)%FYgdc^Pbf!>:7OkWVdmc-N30ooJan;f,'j\L'gXYm= + DHFJq=EdfBESfYeZ)V:6UQ-cai_JS$\cpQ=gM`1Y#,4-WTc)o9-oouPq#de&($4N0,RoGV# + oZZ91AIk==So90!NhVbO+&nbEXUPeYDs3cTf0io7hI?iZK<=e]4&`B?rbenmo`T.SUmbC-# + &5;NnlnZ;3*FY?"Q0CtW%%DQu,(9*N[XO6RF'=-H1U1KW)4f$+;1BK=0LK + 'Pq-?R@X+4dKfaMHo^(8;8"^#M#@& + ^eS"F:09MWcq%"^#M#@&^eS"F:09MWcq%"^#M#@&^eS"F:09MWc + q%"^#M#@&^eS"F:09MWcq%4*N;>4 + IgW#'OkN\/mc1]cE8c?+\1?Ct:_M + +1$:F>8#Xf^u\3HJ6(>e+Fh(=IVOF&7%U/;t3dg_l_hSbf?2Z6*/rn_ + "aM1>7LCPVSr^MkcV-KVQg?d:d&%Tr&gU>?@meeC;//?QJ@&XF+\`hI>,9e>QpoS,NQ8s$K + UfL6h:n[q.4$A&jfU,)s7n<%(]=3"QhIXlrALTC"6A5csX]p"bJ-!i[00ascHq6eaKWQUK- + ?c:Q7[OO+G/oU`mFntkT0GPM2pKRjaJb8H3pC-P;Nc"r`:8QY68W&K^5rBbSiqE]GOCt[Dd + J`i<39>hN5f5;GThRc`j+%Gf[u`VGENH%/mXpBKB.\27uF7c`f1poOr+T3q)'j8JsK$i9DD + J6rqncd;iI"\+!4;(s+(7WQ7>m,q!W:baAK^$rE6I=&XcXuq[!Q8[r:/IE,b$oZY,OQj7(aM#/[SN>i?k3VI4o]]:g>:6m;ik/gNN;"27h"f&%nac8)[r:0dc'ug\B[3,.$Pk:4 + EcN@jfZB=)("[O&^etcX#*t,hRZ#HB2)$_'p?^I$MA0J=)PuJ\?[a/N*4:RTY@#$c4*GFk! + X5A7R1\FE6\Z"hF`i-(jpbf0A7S>M$!h2m-8f@M1_haq$`75RnQ,'fhO5@Y0n<`(. + >/Rl>7@2FY#QH[C*[EKr(XP5XU?5]jDDa,YB4hGpT-`3tJLR@BZrEa'c+9CZ.Q7Og7>$:7TtLH#ou=P@Hm2R5Sp99U[ePn(tb#5(+RT==U&s^etb4F4#uD + '($m<'Lg#4^]!l\UIUBp-o*2!B[itX6s/Ldq,MnBoiLkC7;YbrV%Tb4]6:=;D[b&kUIG]DD + &L/faT/VO\T0HPOXEqrfs><=,U>p]5s7ju(^qoqXAJDUP<]*F;d(KAaPrL8'4PU&qXfpA(i + XS=oTUe'W`5slCgg>EkDI(c^m;sl)107$k1RH.p&n8bEjaVU[%:']4Lu;8B#[%e]5^c'Vf' + f`f(c[YW5]82(C(jnDM+ip8)otefR,*PYd3/Q5U>Id@io4"Zo8B3HM'N9#Ld(Pu"AWV(Q)e + .'9ft5($2%Uji:=0bt<:(M@5f_ueu`/!lI8\2P.Gf%8h37UYZ+#oJYaQHk + +VrN4`]USTgFHt)B5K+W(h)EXS`E^&e5j=9T9D.@3V"0]V%ZL'$>BWpkZ^$e[*c@^qfg>lR + U_VCgVW0Q8%ch)O=!UEkQel'^su=_hZ33+otfG,37%?Hi*O(&j!(VV39#iAa%S&+MWcq%: + S(PS*R@]rG3pdTd9g>`D;2L!]>@OW>O&1dVfLtGXa%UL1he/H>r=/j/1aKJa2g'bWDb0AVj + ?>.3dpjH2>T`Gq'($k6suu$OuI=9J,fIK<+jace=8O?;SO%oJ"Y6!/#eX(a\@q0-]iiTe0s + 86_hXtHKi5]a&\SC7MBJ@GFtM8!gUhF`_J0Ji1,ZB\I + /,mMnqd.8R@+rifJ40P%hGo[Q75b0=gM]\4*DT!A4ZI_h7Igq7`;WB`JTU=)00>)GH/Tpm[jm69O=gR7@!<]2mR:9fA2f[iqhS"9B^Qr + *2B[M?\!62%'[FC<`8$_lOe60P8rDp%(2/_3:\4jGRjmqNVQe^nWq>W/DpkFQjP$+dGr#3AhgbYh + j(HJO'OKqS?naEOdY,:NG0#BWIMA"MQAXl`YZ(bQ>Vp2pAB;U^cTN-[=^,+&3HHN"/hUuKD + r/-0]65e'P`3"beREn+/;9ai+SHlm.p&mdGk#6oj_m][NupT`5+fsE;AUrjaOjVsnJqi>#; + 7a6F9dL2*Ze(2nP2hS`6_G[6maf[>ol=897?Ku(#u@&mFnu>o^pA[!nk8B%NQbeb0gP->K4 + Mo[+*a\=I(tf.TNLU@`=4k0>I(=HW!bie#-!NDr5GBA!='n7MA-kC'rjGo*m^taUO6b-.;c + 0qXNUdgUD)S>-s+aokJO0^O?!FYsK4!D;;Y+Xf^u^4aT_:kq;&8`'g>NLCYIRG7P&hMj.ja + KV'k&$k-ZoKVi>(QIi9FbLcmLkc%LY)Dl-Cd`?q>!sFK)s/`F]Oohn/nrH>jVG/!fCe,%+l + -cC3Q;T"qc$0L.#F:8226^$_d9O%lWFVZ"Y[Bb_JO/2-I>+$c+=$7_)`Ed4*_U:ocHbcFNZ + C3IV+i]l,eh:.JEFRoqh/26AZ&)Zl?)\hf6fn:DpJ^ + CM0OY$j.<71"mV2nWp&+XW_G0.5O^lLr-1$[5^3fTl`f(d(MA.3UN/39tr00l_WB^=MK9MK + 4FW)lQUYEG,1S`k+p"*Q0's^pkfed2SjCIlQnfkPeJ\N'dHoQ8,`;[2]fcp@62qcd[q=CR[ + jiWi]^tJVWksK<=>`r$`:;(`3:<&bcWUT#mQc.e'+4RK$5OEbX&n\FI$(8r7!$bMV + :sSS;!T:KSNE1C_7Op[ZM^k)[VT*dKk\WDL?3D:@WnYFT4[Q%a]^1SZ_RKrpS\!?.LcP5p" + $6Le;fbC?8Ne@mQ6[Q"s8G1 + AV\BB%MWcq%#_h=.*M1CkI,6^=BZpoHtlSJA(c?39YiP;Pmjft + -K,h)Gd-8.P,TjCWE*&#_G0.5Ob9Spkf/RC&JIH^//30N>,U;7N0e3HO&jH + WP#r7A5sB;Q'65Pq/3.L[kBAo2">24Zkj*N>U,BT07NJTpnLUQ7ATFkih5NjiRn=S0LN6QD + pdABrPufDSd>:GCF6:!;,R,9=X)+ldfYFeGfFDKg0_<^]E,Zjo?qId;*-h#bnkCb>Nb9I"[ + !5,'<(t7<89)%:n_&XfX1_&U/GC29I_hV;Ah.O4oW%[C(\5MF&ab,s+r5SUUP68ZQgb[V`l + 5Nu^T\$r:k9jQM^==POVR> + 6A7WMC+3]B!LAW,26^$_d9O%iWT;rbC*hAtIG5`Ug_/q_CZHN;C(XE& + aYmXV9YJbLYC%U>IPl"dS(A6\Z!]/u*+-U5[RjAd3A]RJcmP$S7f?4?'Usl;NiCgS,!XlL2Lf0&4ND5Q)k0Z_C: + 7;Qj?9,2.AR< + /(\I#qWQ5;IQJHmFoGE;jSA%cr + *)Wr(-cD/_cV9rVH9WDmDU-_GV]33G[1siPos$bXqcQcY/V:I4;RGl-aV+DqVFmE;LMS9dM + lV3h$f9LZI$^i%2o2c@D>I2,>IB!]*BW9)^0D_M3I'uCt%YkQ::/">l + Dr1i9;C0r*B?qXaY4MA\(2h'(Q:c;bC=T?+\Mes:q.J[[^O"D.;kg,8TL"2T7ujOW%[XK:; + A$SHQAQfRMhWc?0JJSl`nnCUj_osd# + Mu-.T`cX&["r59D.rLUqVVRNj<6>&mp_YbHVu$;C0pd%$\?hcCI$Egka?/Fl:&de.&D"TgO + Sjb&`f8J;"Q&*;&4J.XDV_nRm\n9b'.8G`<7XqR'.-D7:a^8;DV_lAg&A\m/6-_] + iSibF?+4tB/JE#q5_0!"4"CY,/=$'"Y1 + aHM'!>&N99"mhCso,9jFV1!Y.\`/3mrh_N@G2b(8r7!$b;V4K_jMHYbHV3kab?.OV9YPh:Ul*6A]dR3X=+dfe?WZ/;YQ$Jm,#E[\3e.dPn4iP>-D6q3Fs!Z + >^4u0Be2&,.h4+1:8uaBc^$4k0&2'+/=$(gW7n=W[k>#@W6`cq5cu+H)]P!0SICgAkV]SD" + OUI2A?!V0*M\o4'GMgB6cZl)[7A5O6(+WFE\k + c;EpqNZ&5RoXDRi*\EM\`_0[nfOcOALI<@&\0=V4R1"G':_S(sPsZA=Mp0.2 + IqOX!Ao:7WZVWi%DP<(*p@V':`XU*3/mGO?HYN&P\3aPTh+G3ssld]H`_bW`XbokNcB7.RS + ,e1?kG2Che-PdI$>71i0-?I.+,S3;4"\3cH32>PDug>pa8=KnIB0!o<>6BUFK(kJMUY*0iF + lD(B?Z4_&nBU27r`CXo/4?S9IFE_p^:nW?/9p!7IB[EDJT0CBS?#kIl,'j\L'gXYm%9_uhl + dr+IgqS>Gre?k#D_A\frr)_,p=W``G#=1qq!k,d_G&3Pa[$_\+`H5MdX!AY74bioq=<$`U+ + /*>g^pVb4\JKm+&g\S]T\i``!L>4G:6sRs2Jh"ggka?/[:-t-e.&D"Z"( + hQ7='<-P<6"m%?\76q3OkU*g7!`("$f)Wq="\NoQbV"F!D>lR)H\J@B + J(4/e>T;oC)PMSs/?QXbF:Gon5^MK*&@E$YHKUeaMj&R9<6=e/G8)GPLN(7]Y(%_p@u'.&L8n=Y:0LJoR*:)W9!7d4TgR=87o_@o=YEc_XoRKL\pW + MU#tmoaC"*(po&Rn[?*%'Q@&\rg"%u&obsb!c8gn#Y\8W=\7urtHM>R&9;`cN-NY8b@2Jq/ + =X3K-Fp$q(_e4*tDnA9u*Q9&j70]>Ki1hgEP^'J+?921+F&VCM[bu1H8T.[dA8sLmJhhpF7Gq>Y.iPL.sJ]=l2QAXl`YZ(bQ>dS(A^]4;FE#HFgn + r(^d\@T7L48\Bt1P$=cc-:r,SiqGoQS52j/PXJf8L%2[))Z/nKV"&i&PI7gF;/Vg:n^3FT# + 3H,>V%`9EYFg#F!gQ!R'[PZ>#anNBjdp'l_NC7^An1ZC*Q3Se8u + -$oB+!`J,hU!kgZSqn0SJY/o33Y"Bnp + ?GVO>b$,"q@J>l[$J\'?CR5/=d',)[68s<&/>pKG'/WS-)`mT + Ksb^JW`foadS(ALCYK(iJ"U4#5SQiW&G4!ui2r`r\74g8bNZ8ig?5 + -V8$!QVm;5:)WS2bLTCer$ELo!R/6r8[,K*Mof].X4^/[\EK6:N@J4?VE=`eL#$e3d"o9@Z + XBWR?Z/Y[@KS^F`ToK\DI6/2\RoTlAu-_AhdmZ(q4+)$0:="SEN)<2NE]C?4qnWJFj_919E + :79c&r'buue?U!F@lIDp_r*-'!e>6.NCY#S\[_oD^?c@m;hn=@aW]Us%eG]:=;qj%DkYVpb + -+%@56F`RKH1JUmnNuX2A-UR^F6:\\Zsle%4@rg$Z=qX[Wn%/CPu&X7Mj>kpNk4,\]tLC>) + 9l%cSND$2hN4.nR;qA(;hUo9O-VA%QFchUeu``K_I0@!?3?P + +.g(sdG+B-J\o]_RelIin"41--h7-YKe99i>IXfX0tVq%_CK;C#,>,mL=$[#\7%]ROXN5N\ + s+7%O^0AIeHhFMrW5=1`Q#n=3,kO3kKZ)/k+oFtHqPc-ldh'L<9;8f.8Ai',/:?m"uN.W,31"(L)*,G%P + GBQ'sRGNZC44_80R'Q7]8BY2hf@S2dcBM\[iGZW+G:lB*;]=DI0KT`[#e`q%'BPbf#H[V\\ + )$Sg=?]6:1'(BIX($m%ELUbPLd4'&j4lC+2_J>J.'mJd(]`JPD*mP/b.#n@GWC!`659'G*C + 2g'2pZY(Z[?DY)D"M/^>,2=D`e;RN@//?QJ@&XF+\S08d$1$3HVq.(!bNk7K^Y`n`\<5nI" + X9,re('Vd)0&-33Yd=+V37G$W`=tR]O--`jis8RN"q4:5tbdWkr7@`_=36m,NLD)6(InnN> + l=k7=Dm2=0>fJ*7bT:0L3.>HhZs-[rke&HXR-h*2$%lPesqMiu$N-ZDIQtn%XepjS%ieLJb + Fn$Fr<+]66oJZA"u)>\iC6(m^'C26^$_d9MpAe2ha;FAmb:T0Hti-QsY,>.&)r@hn!gkK]V + 3kZU5:^qbL'=dgQ$h7Hb3Y0m9I:l-aY8b^'6f4aZ5XhS!uSGOO.e+&N6.,q7=5o?TX"X"%,LeG8_!W + D,O(qGbu9#1Dd^rVEqG9aJODWPAE*S)X1=0k846q.7>e=ag2(:m-* + VTh7#;OTVbRu71:S'?Tr$Oc\uSeV?qH7_KT.'J>FH9%4i5[1`)u><@' + C>0:b7QQ@7;olIDpKQ+1el!Z@;ZKn]@!qN?CR)3+:Vh4+79:b(Vijq=O$5(ITc$FR.L0173I^lBS9FkG:hqMD^;UqF\jiX!VA5 + #WBgEJR24$1&!7ujC8G`Nn/+t"GBd9XJ6H2$a_j2[4a;Pf8LY,tp;Nd^pHhbr@EGse-*3\< + @4jJZ:lmdT2Qf<8OWG1#^3\">m7:3I5[`ejYVs+Xdb;l37Qe>ZBC8sRhQQMd.i1#rE1nF2P + 8<=ebb)cEo1p;I)+7J%L#.Y;=d)RWNGOTM;C;5d;7acjNM]=YCCI&%%\/1hbjc]F6?:h82K%:uW\>M:+-q,LdmF$tisXQO*^'5_+-RAggt\D:l\ZE-[VacBq!d5u?Tt[;UIPhlS#B5]9#a>V*NR\b<6 + WS1aD!<9GG9Va.RhIB,mDl;ap]ng8r/FbCtc7qgA>FMi5*9AUjXO4/`b-ZZkY))=Us4r4AR<=utFrqhH]+%k2c]IYr9Ml?XSqsUQQ(?+H,hnFN>l + IN:i=V<,2-qK?2-NG\4d;*-h#bnkCh,4RJhnO*^YbC'GcCI&+PEV1CpQ,?*GhgE)-ic>OccZhk`n)FhFj1fak>X3^f + '8ZcCaXea2c0<8`'Jp/N&6!gU<@q;*q*bjQl-$fle`;R\\A$;]u)[8@p\!"I=r/26^$_d9Q + `3If1+Q;VP(UZ*CS*k05DUW0#4JP"MWISMJr + cg6S3*ASGFcC[569E[fP0'T*\[/p[;,@Y--=#A8E^RX@rb?DOD_JH@2pSs6dp):>piG3RFD + ]e96^qsX:Jhj:nR9u0_k^H@qapYUHN50%p,_M&0M12,@HV6ZR`9A-U^7BQ3^+L"g5YCWMoL + utEZ925C@2=$8C4+@%j-OJNO5%SMFlf[FYoff'1F6Cg`mK38iZpq:L'M'Hik0/rJaV?fm`" + 3*,pI;C:']-NM7ns]m^YKSU>-pYP%Qen&'UTMjKnP*^GB\7^R:M+SBDf#Nl-cC`ld(OD[;/ + !QoLM`<7%nNl2&H`4+$Lt5G3@/A1Rk=5/4ATGo]X+tK.nW]W@.SfiRCe:1D;)F + 8lfR=Vn6KV:Kq+C(7ZA>!'K$boMWd"'#cTo_/&]B + E:i@S9TBa:T3ub_?OBW1)g_`JC>VG/)*\h,WZa97U#7jq&%"@a+"lo4JU*0J>OYT+MrbR6. + Po6f*7'D0<,)GBu@]>eC,UDI!V+X2ck0BMZA]b]B"rK::gl*+,*$$&\*'*TVfeXi`U*N+k/ + 68j>n0$oL\T>F,Um$n%5a7.jlK[Y,Ne3gmh9;9Cao>YQAe"QS%N[`'#)^n6#>GH_AM7E),g + tu?k-f$TWmpIf_al1j7073TNC9kM!\#^SduB=BHF/9)1`TJi@W + )>eG=/h;*MPlIBF;baLD)n`%M_:/5$&DEW+*&G_q^I/"hdnUQ,idLL8*7(8r7!!pUC' + '%(5[D@CHM-R9b67Yb3&m;(X1,S4h(Lm?rqsZh&)lL+]^#X77#?n_]mBA:qXs/%:7TtKGOI + crr3J\A#'K4\q=+j#C=R(S\8durD7XoXC27Us@Ddhh2fG/C"U.OfoGUg]JnQd@<)#&rrd=" + _o&IcOk?TD7!!!H191AIk==So90!J=JLlRMPZ=Sslkt7J9S>^Ko&WF%_,ldoF]`LhqoGUg] + JnQd@<;!bIodZ*Er;#sYmbN6ep?`LL4F6MT60HOa=l+(s=gOu+VL\dK!+;82;A$SHQAQfR$ + S5:@*#osH\Ra6j<ch=kV]SD"OUI^WTqm;B29;Zbagh>d@s'&Pq)IO2rCiTBj,9&XI503^q72Y!!'A8//? + QJ@&XF+\\M+nUI'YAd]?@]AnGWk04*_qlR)H\J@BJ-Mg2 + )#jU`JYO6_bY@:c>@E8*>fX7]8HXh!;$IH("$f)W + FrRs4Pj7'D0<,)G@_9*G:q!'i:j("$r-Wq//8-b!!!/j-be?k/nV5q?J + Omp#17i?5Bt6GnktB)Y6*99*]KWL0&^_-Lctl5"TSN&zTIR3$na)*n:Z,M3zzzzzzzzzzzz + zzzz!!'gALl.-Si,Ji2Q(X2s]T4!3z!!)5KFXp70CUY-hccCZQ"8tT4+#a0"z!73*u1%Ab/ + \o:_8D.UWcVZ;N&z!!!"t_lFUQ4Y6!2X.Qge7+M;>6ko\%z!*$dEqc3(@Vn(_%<<*"!z:^M + cjnB[nIgq?L)qT,,nVj-!WuTCG*q!!#sVr94Ggk=]jX9\Yu"AD + hkE!<<*"?n,u95/VerU=&V?>]TMs'A`s*!5KJ)+aM\jbM;PWgEG_'@*];=LCjLd!!"@gTtNCqO&\$-V$m";a!L4=MuWk< + &JG"edTBT=2]kb,i@GLe`mG!!"]eJj2[4m'20>\4+lO*P!=I+H6&W"9>CD_u"?W=Q+-H.m5HNT0C9\Vu + Qet!2+DnW]0[GMq0\_V^%L*"[L+5^[ea5Vkr0e2-S=grKqd=zXK5TOK_st%lQIM*X-^%W%0 + /HMJB&,#0eGW`oCh-c;ucmu!3d+O)*;T[>4,l;XbVjFp[#DE@2K!U+X&#VH.<5hpD+c[eDP + J3TCFrlz`:;o^:\XR+gda+\Lr5qhYqbd]O!aom/g8''ViT`PrKa11o]isI`Np)fO!ao-!!" + jtG1VZ-#;c4tpqJ]jqM4W*ScAcTGX(^=g35FKRu'=Lr:""K`tJFQ!!$1K0d19%hcL+[R1/B + Fq!e8ehM2dF+GEb7me*ql_YlBeO"=L[JG8R:!!!"L[L)R:*RGg"/LZf(*UJh.]YjW.!WYV" + +.p'onMp9TLMem$g,UVq.nTmD!!#8:[r4CLCmGE?\_Y)hkW%Eh'`^M^;c(D3>BfKo%Gdg]V + kpS(#4OgVzcjfkVl>J + pEJTX3R!;ucmu!3"&3*S7e3Gk@=d?'_$GI@p8="X$I%R#n[to*$WPHkE9(cCX[fI:9es%IM:(><\6JOqsXXe!!#:a6q51T*U:LijJ0o + r20ds+a7"9q@0!SKQd.bZf@>HLjfcjd)mqCY-D'rD"onW'5aK4SI;j\:jkRm@\r;o.h'V;@ + #mlI$%l+.]-TX;+e^>\tYBmlo@#l'%+$t5pA,lT0!+[8@gjFYh\CA]tZ**QQ"n=dt!9fgu% + t-nX=i^JMf5#\SY^bU(QM3ZL!!!!aQ=KAYbbV%DH?WP=o\^aB_8,q-"/%S^A)]GL4,r^^<6 + _[8GBk9CzA4;;=/RNmeqcHDHR5TMPYKnTQLDg0knDp:h(i*dPQaXW7g>OIKisYnf!._.D>[ + 5.AZ*)kP7/BZ^:.l+Bgdk&SO/`3$,!%2sPOf[iKW93mNSb?jO#QA*!!!#7PbFB\pcL!7SpE04`IH&+3M7f#b`k + 2gHKdzJFjZeaXc]gE??W@SIFqoo%^5A=K2RUFMu2;Dg/hGX!:q<0OC8NTAY.M!<<*"!5;2p + 6K7>\41L?RXoCUmf>=XjekmS6GLidKkgz1*n,,HL+HEm\?X1 + 'e>3]X-Oe5$]X.on,_I(T5QF2-19Ap*);&HH%.qdl/F19BB%:I,T*O$43Zg3bnn$R56+0i?nbhFo + 3c6=bi6ehIChPQIMoru'EA+5!!!SHod`hM\$tB]NlmfY1Nga->I460d)U+^B)r"Tj8Ho?k+lkLYHf\uEdP?EiA' + f-z!'ha?[p@rVTZYFABt;0-eVVZ"8DY]q!6X6co4cmP"'-380m3;"?!<<*"!'i.@K>D!D!U_0_A8n` + ;L\BP]NK*+L7K=QkM"#*P%Hi%[>0?df6In1=2]-e3&-)\1!!#WQOH;GGqG-J=.thG(n!/\% + hMdGFWr`_A()jU:ojY[RbILt>#`8MmI7["L;ucmu!9f4%kd\`a]5f!)+XquC!YZsFA,)pDV + u(RB`r0@4;Y&/pmI>0&][$rczKaA9JZ5KouqcF4tc/;nYp[#C*q)O3(W<'g7_s`$CRcVS9= + P@i25`jJhrnB:[17%[6!<<*"!2'ZB_4SbM4*)K`+_fE/X+U;(F2=ImGb6!!X7Q1!^mFkD0g + Ch8A]!Y*T-Ni2('"=7!;&t3a7)rYf5VmV+mIG(ElhM*j1[^LGb6*$/+W>[qh;@=YeH&&`b* + /DYg=fT-O9\P!!%Q7"T!n6(uW>\oS$fad=_]'m.S$b#1Ieu,ES"KGicg&C#c[A5P(#@ArO- + =8FU9KV[3>'!!%P3nFm;.eo*G?0c6'V`X[,OHLME1XT9m`)A7>2j2UTfCUg#%87i_o^aUr[ + N;&_Az?rZ!t$Q@f9-23N=,*5)R*OiRc#kSYhIBikOnDp:(_kI7#*6H,T]`/mTp](9o!6CVA + GniBauJl@8S9/=OcOrbM!R.KBGK!'gm0?O%)*NH\>ZQ9dYS2` + [LUrA&otklXV8KS7:u2kD[j^TXQs'(2YG+t=fA3;J'>];P]0!!!$!%ptr)R.XOUYo19)pU2 + Ror'GY#7"?XKDhGK9^4]W!fIj!rr<$!"]@/Wgiof=!qlKEo8j)VU5VQK>IGAYPZ?2 + UPIb7eOaRHC^:K,jF(V@zBE056Ih,o4IJegJQjKNHmr6&6gtRmW%e&usLa+&dn_^s^SQDGf + m^%fJM1d:E.5l&UiR,\Tm)E&oaN,4TB,M7)cp.0h8 + M>if#PqXVkC2,-MJ(5AS^Gi)][&>5zNBp$1A/rR:/;L0gmd9D=NSh$WlfG%*h^9`tnNPdEI + u+Gl^4,mWoBI!6VH;YXZ=#oJ3sGZb!!&)b)+Q8_G_#[I%T,=d\h1C\]D'BtgTOrg,UME3@& + ">NQf*#Tc.:,U-B3/UZEWA<1*C=EXlFD+AH2]1!!%$^UFGA+-b,6'&>Q):eac/8pDht0o=; + >;@KM!g4<4NZG^CEp;O;f$<'3/7SNZ=Y)b@k6CB2&HDe2!'jU*3H,of + 1THWTTA'C>b3f-+Xt2ko\Q-??_$a*S.lRVY^WY1]F*SFc2mtG!!)4&^\>Qo%E:.@#ZH%l>[fK + uKAG=rS"7kFhLFkFjepFrp]c6EX9j65NfN^V)g(i*b7dB.[r/pa_Z%o@$!W2X>D&>g&]TbK + \M<;X3:@Luz+A37])DuB%480=0U>>IGZl_$e0A!rk17o?MODI + #`T+N`bk[be + GmX)`Na!4%bT+^7m9I-:)^AT^4&WAPs%1\F71$An#T]9,U"=npO*q[!!!!Ab@*(AL_4SJ%3 + c(0Qqj_6(@Tt'=UU:t!rr<$!9f^^7m-=bPk!4fG6%u$A5)Ge9Ddkz!%;*coV>:GA_ + ]e:889j/&q['EIbg=I^%IQ_*>\\U!!!!Qn`ki.L]L9+a,gRY+=^sXaGkY__7]6Ez!'g\G@8 + ZWnn)QZq6kBJu4HB,j@UnDChdlfg!!!"LBTeMe41AJ'ZEW@QUdPas;'\:Um>i:!bPUE/z!+ + ^*!G"#U2:8VJHbPNT>LH"TS + N&!!%lg+.p("knNl3-6b[A0c8#IZ*IKEA^gIn`$F46;#gRr!!&ZSQS1JhgXUlPQkMasKJA+ + *3b#W;z!.Enno4c)*c.kg\#_F2Kbau*bpsWm4G>/&;!!!"l3q;`sS"7l-=n!Mb+p^&N_DuD + /7gJoS40BG0#2])Iz!+7oODnd:?HR8Ek."WR4\r7Kao^pOXhY0P@z^k'joaEc6YEZ^Df#_J + klIbqfb&M^reNW9%Z!!%Ng#".st4Z@^k0&\uN71^`&VbcJe-]WHB^*s*`zPMkPDs"W*MgrH + ?!Jn3P.Z$#Yb+3aUg#QXZ"g:R*W.-j$Hj8WGuR + J;+a,*2&-Or2FGEgK^qGR/hH@0cCT$Q1T+qB%Jdm3HHl=G7hL0@msI=*m'?[GK(Sa0D^mg/ + O\1dk\]KopmAN#,j%oaVpg)-=m;oUlJkrM3`^o]n.?8i<5tM%Vr/pcF^63/(nC^f>Af&QmO + ZmOVHM^(%GlRi'%]<+2k"Lg?T490YA94>Is(,,Uk]746J5N2AVq6j,P(pD9er"-,[Ek9B!8 + rEVh@Q/6D-cYQ<`0./?rlgnk0'Go2#mVG]t5qtHMjtB#;21)Rm';fj,).G)#sZ)j4r>]"ga + )=cao9oWenXdKbi"hde_5=ct=0q!#[2I(t_]*Cs)PNi7#*0;:4IpH0(lFrVajbV\]=5RB4* + (F32;)i7"m*&`+I"._`ZF/bFl'!5Ot`8e(4ErPeELP*NXnrP>)[5%k-#J7-Y]?[d"Ok2ghH6,AV%o)cJ1MisPk&#]esOpR8api7#!-i@L.W]4()XY-+AC-P-7Xr4 + \KZmhX7(&q"_c1^q(.FPEXMSY8h"!!'NaA27/3i,$^2B^cU;dR.beG#A49kpoLGPG-;>!!%6Tf<9=`6u+-/b7-X=9DXQ8Z>u]DeQk,I"Vh# + f;6R+0j3=FT6B0P06dPI(#.3CW?/Jre3V6GU!!#CNe;8)[cJBCcfTpVd^%QJlm&MY1cOU!U + GUS`seDWd>o:FYII.3GDcPFj]Er'<^k[O\p!$8_&JRhJtj0LNKK+Hq(I^aSuD5d?mgu.*uk + gKS5!/=9V?[pVH-_I!92Y]Nil.9sQ8#n.9H%[gN!+T%lT%LILZg>c%i5<)^`d;ku@oFsL9T)s>4CL + GX!.[;\fA"&apD:/KHFB"/&=].p<)_W:rMKVqn0b&fkC`Z#SpT1(ejr0`id"bn4unrL8;4e + $!kIPA!!)L)%1Wl>q4dQLIr#WZj@c8Q860X-ZJ?=+ + 5DHn;!<=7k[($!5\8'pN$2MEXIVDcG^0-?Febo3[NR7DP!!$Q8?b5[lW&XMCPdS>/!,9B;1 + HeoJ>'K"QGNeo=!!(#r6t2h_^tD05Z7>g&Y:lk7h@N=,4WFb.!5`Dbm>)NW:EH,EHomDk2K + _@cb2noFHjTiR,K.hG[s)]hCi4Dnn7CQBH6i,i5T.sj:N*2eH(t1:4S2nb!!)rJi8A!a;u= + `!Q'95L#2^GsLYA!_q9.[LFhAl`9)3-%cVdZCqWp;X+n:]Adb-hMf + k!!(fH<9h4OX[W\uV`e&lI'\q6@X$^TR_GR&]lj__!2EfnXn[I\B3okW/GPs5i@)%hn/KJQ + n`iahe5SC#o^mmPP5kT5+nklrCEI@Uo'D=Pi2_WTcPFg_\81tSSK2"0mi)6,i8I;)#+JAs7 + 9<#f[hmI3uN!!'eGqPj(QrDdKr]tS"Qhu#U@ma4ssfNapl&rBnSjg#VhqM14+)AFHB6jRYJ0;FA` + K)sr8tn1aZ\sER8IEoDB8Y.S5l*7Gh;'%HH3=3Jpn'(o>s#:bbj#pi4EDt3S"!]jIeCFMLK + eZQ\/kFW!rr>2[uRLp7r$AP?bQL8S + kPK%nCdKjU1q#"3"-n?aJq5!.hHX!Bq+9;HB@ngF1H7`uLm77__6=1<)!!"67It.%;`Qn=tkKC?c/ULu_k6;H6Of[=A3@26)I(ZS_^ + >VUUHX!DU'EA-k^@_'i``fMbg>B8K6g_LhJ$`TaZ.E4[A4Cp;#APd^k^e/!heK/H[YR`&*?!b5%@oG9lK#!Aei(pUge1Iebbg + Hn(VnE]oAo(jfY(9U&Xoh!!)f#;Q7JOf=P6?>\uOXmZ_OS'[3O7CjibY:`uAJXC7B"=)_6-(fN)$[?e.O + hIpos] + +Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/AlgoApprofondie/diapos/graphics/Logo-PCLL.svg b/AlgoApprofondie/diapos/graphics/Logo-PCLL.svg new file mode 100644 index 0000000..d42bd44 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-PCLL.svg @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + +   + +       + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AlgoApprofondie/diapos/graphics/debian.eps b/AlgoApprofondie/diapos/graphics/debian.eps new file mode 100644 index 0000000..ff431ef --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/debian.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 262 316 372 461 +%................................ +%%Creator: GNU Ghostscript 510 (epswrite) +%%CreationDate: 1999/12/10 21:20:34 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. +%%BeginResource: procset GS_pswrite_ProcSet +/GS_pswrite_ProcSet 40 dict dup begin +/!{bind def}bind def/X{load def}! +/rg/setrgbcolor X/g/setgray X/w/setlinewidth X/J/setlinecap X +/j/setlinejoin X/M/setmiterlimit X/d/setdash X/i/setflat X +/m/moveto X/l/lineto X/c/curveto X/h/closepath X +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{currentpoint 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/q/gsave X/Q/grestore X/f/fill X/f*/eofill X/S/stroke X/rf{re f}! +/Y{initclip clip newpath}!/Y*{initclip eoclip newpath}!/rY{re Y}! +/@/currentfile X/|{string readstring pop}! +/Ix{[1 0 0 1 9 -1 roll neg 9 -1 roll neg]exch}! +/It{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{Ix false 1 colorimage}! +/@85{@/ASCII85Decode filter}! +end def +%%EndResource +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +save GS_pswrite_ProcSet begin 0.1 0.1 scale +%%EndPageSetup +0.843137 0.027451 0.317647 rg +0 0 m +6120 0 l +6120 7920 l +0 7920 l +Y +3233.33 4125.86 m +3218.39 4125.66 3236.15 4118.18 3255.66 4115.17 c +3261.06 4119.39 3265.94 4123.63 3270.29 4127.77 c +3258.15 4124.8 3245.79 4124.73 3233.33 4125.86 c +f +3313.52 4145.85 m +3322.43 4158.14 3328.92 4171.58 3331.2 4185.48 c +3329.19 4175.58 3323.84 4167.03 3318.76 4157.99 c +3290.83 4140.4 3316.12 4168.43 3318.74 4179.1 c +3288.72 4141.27 3314.61 4156.42 3313.52 4145.85 c +f +3343.14 4222.89 m +3344.95 4249.8 3337.84 4241.28 3335.46 4231.03 c +3338.23 4229.57 3340.44 4212.05 3343.14 4222.89 c +f +3176.66 4590.68 m +3184.64 4589.26 3193.91 4588.16 3192.58 4586.25 c +3201.32 4588.18 3203.3 4589.92 3176.66 4590.68 c +f +3192.58 4586.25 m +3186.96 4585.08 l +3192.21 4585.56 l +3192.58 4586.25 l +f +3441.26 4212.69 m +3442.16 4188.53 3434.21 4176.79 3427.02 4156.03 c +3414.1 4149.6 l +3403.54 4129.06 3415.15 4136.56 3407.57 4120.23 c +3391.05 4105.56 3357.51 4074.34 3346.77 4071.48 c +3338.92 4071.65 3352.08 4080.74 3353.8 4084.29 c +3331.71 4069.13 3336.06 4061.53 3302.29 4052.3 c +3301.3 4054.51 l +3218 4015.31 3102.28 4092.98 3103.8 4198.94 c +3102.92 4192.22 3101.27 4193.9 3099.43 4191.2 c +3095.13 4245.71 3124.61 4300.46 3174.33 4322.85 c +3222.96 4346.91 3279.97 4337.05 3314.79 4304.56 c +3295.66 4329.62 3257.58 4356.19 3212.45 4353.73 c +3168.24 4353.01 3126.88 4324.92 3113.07 4294.41 c +3090.43 4280.16 3087.79 4239.45 3077.93 4231.99 c +3064.64 4134.39 3102.9 4092.24 3167.63 4042.63 c +3177.79 4035.77 3170.49 4034.72 3171.85 4029.5 c +3150.35 4039.56 3130.67 4054.76 3114.47 4073.37 c +3123.07 4060.8 3132.34 4048.58 3144.33 4038.98 c +3124.04 4045.83 3096.95 4088.11 3089.06 4089.83 c +3124.01 4027.25 3230.84 3980.08 3286.81 4003.49 c +3260.92 4002.53 3228.03 4002.96 3198.94 4013.71 c +3186.7 4020 3170.1 4033.01 3173.07 4035.44 c +3249.42 4006.93 3328.29 4013.86 3394.36 4066.81 c +3411.16 4079.91 3429.52 4102.18 3434.83 4102.48 c +3426.85 4090.46 3436.2 4096.7 3430.07 4086.09 c +3446.8 4113.1 3422.78 4097.09 3447.37 4132.73 c +3456.46 4120.23 l +3453.07 4142.67 3484.31 4169.89 3481.12 4205.35 c +3488.29 4216.19 3489.11 4193.67 3481.51 4168.73 c +3492.06 4196.4 3484.31 4200.85 3487 4223.69 c +3489.92 4216.01 3493.78 4207.86 3495.75 4199.75 c +3488.88 4226.5 3502.78 4244.78 3506.24 4260.33 c +3502.82 4261.83 3495.64 4248.51 3493.98 4280.09 c +3494.23 4293.81 3497.8 4287.28 3499.17 4290.66 c +3496.49 4292.21 3489.42 4302.73 3485.13 4322.9 c +3488.22 4327.65 3493.45 4310.61 3497.69 4309.92 c +3494.96 4325.95 3490.26 4338.18 3490.07 4350.49 c +3477.67 4376.39 3485.67 4347.03 3475.64 4361.61 c +3462.44 4402.75 3486.57 4371.16 3488.21 4389.84 c +3508.19 4360.89 3519.59 4315.99 3524.83 4297.4 c +3520.83 4320.07 3514.39 4342.04 3506.49 4363.29 c +3512.59 4360.72 3496.72 4409.92 3514.4 4377.34 c +3495.52 4446.79 3433.62 4511.69 3376.67 4542.13 c +3383.62 4535.76 3392.42 4527.76 3389.27 4526.5 c +3360.94 4543.35 3365.92 4544.68 3361.85 4551.8 c +3338.8 4561.19 3337.27 4551.03 3322 4551.78 c +3278.52 4574.86 3270.13 4572.4 3230.1 4586.85 c +3231.91 4578.33 l +3203.1 4587.93 3198.34 4574.71 3167.21 4578.31 c +3165.32 4579.78 3177.19 4583.67 3186.96 4585.08 c +3159.11 4581.4 3160.41 4590.58 3133.15 4584.07 c +3139.86 4588.78 3146.98 4591.91 3154.14 4595.91 c +3131.43 4594.53 3099.9 4582.69 3109.63 4593.47 c +3072.58 4576.93 3006.77 4553.72 2969.84 4519.09 c +2968.68 4526.85 l +2951.76 4506.54 2894.89 4466.19 2890.36 4439.86 c +2885.83 4438.81 l +2877.04 4423.9 2871.33 4407.01 2864.35 4391.68 c +2852.84 4372.05 2847.47 4384.12 2849.11 4381.04 c +2826.46 4335.12 2815.19 4296.54 2805.48 4264.88 c +2812.4 4254.53 2805.65 4202.56 2808.26 4160.97 c +2796.9 3955.53 2952.44 3756.07 3122.46 3710.04 c +3147.38 3701.11 3184.43 3701.44 3215.96 3700.55 c +3178.77 3711.19 3173.97 3706.17 3137.73 3718.81 c +3111.6 3731.13 3105.88 3745.18 3087.36 3761.25 c +3094.69 3748.3 l +3058.39 3761.15 3073.58 3764.2 3044.04 3773.55 c +3051.87 3783.77 l +3040.1 3784.67 3020.7 3803.59 3015.4 3814.1 c +3002.52 3813.59 l +2987.06 3832.66 2978.81 3846.43 2979.42 3857.09 c +2975.26 3849.67 l +2970.55 3857.75 2918.35 3921.25 2945.43 3906.47 c +2940.4 3911.05 2933.71 3913.94 2926.46 3927.13 c +2931.97 3933.42 l +2918.96 3950.19 2907.99 3971.68 2908.83 3978.84 c +2915.78 3969.46 2920.6 3967.7 2925.38 3966.09 c +2892.47 4047.73 2890.62 3970.58 2865.71 4049.19 c +2870.97 4049.61 l +2866.94 4055.72 2864.47 4062.31 2861.23 4068.8 c +2863.53 4091.65 l +2839.85 4119.01 2856.91 4208.1 2860.34 4256.95 c +2862.69 4276.81 2880.11 4297.96 2893.34 4331.13 c +2885.28 4332.51 l +2900.7 4359.39 2973.3 4440.5 3006.94 4436.34 c +3023.23 4456.8 3003.7 4436.42 3000.51 4441.56 c +3036.3 4478.59 3047.55 4467.72 3071.7 4474.39 c +3097.73 4489.84 3049.35 4468.35 3061.69 4480.28 c +3106.72 4491.77 3093.59 4506.42 3152.32 4512.25 c +3158.52 4508.73 3137.95 4506.81 3132.79 4502.24 c +3170.29 4520.6 3251.48 4516.41 3304.23 4492.06 c +3365.41 4463.45 3434.17 4378.92 3436.89 4299.39 c +3439.97 4298.56 l +3438.41 4266.94 3444.81 4230.37 3433.71 4196.79 c +3441.26 4212.69 l +f +3070.23 4105.36 m +3068.12 4094.89 l +3077.95 4081.54 3085.75 4067.08 3098.28 4056.68 c +3089.26 4074.27 3082.57 4081.54 3070.23 4105.36 c +f +3093.44 4106.26 m +3088.24 4112.02 3085.18 4118.94 3081.72 4125.82 c +3085.02 4113.71 3091.78 4103.3 3098.05 4092.7 c +3093.44 4106.26 l +f +3504.27 4195.56 m +3502.08 4190.04 l +3498.06 4161.46 3489.36 4133.18 3476.03 4106.95 c +3490.75 4134.62 3500.25 4164.89 3504.27 4195.56 c +f +3179.63 4597.85 m +3189.73 4601.54 3204.45 4599.88 3215.19 4602.31 c +3201.21 4601.14 3187.3 4600.44 3173.57 4598.69 c +3179.63 4597.85 l +f +2824.92 4409.23 m +2827.25 4387.69 2808.72 4379.32 2829.02 4393.54 c +2839.92 4418.08 2824.78 4400.31 2824.92 4409.23 c +f +2801.04 4309.49 m +2805.73 4323.86 2806.57 4332.48 2808.36 4340.81 c +2795.43 4324.27 2802.4 4320.74 2801.04 4309.49 c +f +0 g +2758.02 3347.25 m +2757.57 3346.78 2757.57 3272.19 2756.64 3252.72 c +2755.72 3236.97 2754.32 3203.15 2720.96 3203.15 c +2686.67 3203.15 2678.33 3242.54 2675.55 3259.67 c +2672.31 3278.67 2672.31 3294.43 2672.31 3301.37 c +2672.31 3323.61 2673.7 3385.72 2726.06 3385.72 c +2741.82 3385.72 2750.62 3381.07 2757.57 3377.38 c +2758.02 3347.25 l +h +2623.65 3292.56 m +2623.65 3161.9 2693.16 3161.9 2703.35 3161.9 c +2732.08 3161.9 2750.62 3177.66 2758.49 3204.98 c +2759.42 3163.75 l +2768.23 3164.22 2777.03 3165.14 2791.39 3165.14 c +2796.49 3165.14 2800.65 3165.14 2804.37 3164.67 c +2808.08 3164.67 2811.78 3164.22 2815.95 3163.75 c +2808.54 3178.57 2802.98 3211.93 2802.98 3284.24 c +2802.98 3354.67 2802.98 3473.75 2809 3509.9 c +2792.33 3502.01 2777.95 3496.91 2746.44 3494.14 c +2758.95 3480.7 2758.95 3473.75 2758.95 3412.6 c +2750.16 3415.37 2739.03 3418.61 2720.03 3418.61 c +2637.09 3418.61 2623.65 3346.33 2623.65 3292.56 c +f +2874.95 3316.21 m +2875.42 3354.67 2883.3 3388.97 2916.19 3388.97 c +2952.34 3388.97 2955.1 3349.12 2954.18 3316.21 c +2874.95 3316.21 l +h +3000.05 3311.56 m +3000.05 3365.78 2989.4 3419.08 2920.82 3419.08 c +2826.3 3419.08 2826.3 3314.35 2826.3 3292.11 c +2826.3 3198.05 2868.46 3160.98 2939.36 3160.98 c +2970.85 3160.98 2986.16 3165.6 2994.5 3167.93 c +2994.04 3184.61 2996.35 3195.27 2999.15 3209.63 c +2989.4 3203.59 2976.89 3195.72 2949.09 3195.72 c +2876.8 3195.72 2875.87 3261.54 2875.87 3284.24 c +2999.15 3284.24 l +3000.05 3311.56 l +f +3150.8 3291.64 m +3150.8 3248.55 3142.93 3190.62 3089.18 3190.62 c +3081.76 3190.62 3072.5 3192.03 3066.48 3193.42 c +3065.55 3210.1 3065.55 3238.83 3065.55 3272.19 c +3065.55 3312.05 3069.71 3332.87 3072.97 3343.09 c +3082.69 3375.98 3104.47 3376.44 3108.63 3376.44 c +3143.85 3376.44 3150.8 3327.77 3150.8 3291.64 c +h +3017.82 3241.13 m +3017.82 3206.84 3017.82 3187.38 3012.26 3172.56 c +3031.26 3165.14 3054.88 3160.98 3083.16 3160.98 c +3101.23 3160.98 3153.59 3160.98 3181.85 3218.89 c +3195.29 3245.76 3199.92 3281.91 3199.92 3309.26 c +3199.92 3325.94 3198.07 3362.54 3184.63 3385.72 c +3171.66 3407.48 3150.8 3418.61 3128.57 3418.61 c +3084.08 3418.61 3071.11 3381.54 3064.17 3362.54 c +3064.17 3386.17 3064.62 3468.65 3068.32 3510.82 c +3038.21 3496.91 3019.66 3494.61 2999.75 3492.75 c +3017.82 3485.35 3017.82 3454.75 3017.82 3355.12 c +3017.82 3241.13 l +f +3288.99 3163.75 m +3279.73 3165.14 3273.22 3166.07 3259.78 3166.07 c +3244.98 3166.07 3234.77 3165.14 3224.12 3163.75 c +3228.75 3172.56 3230.6 3176.74 3231.99 3206.84 c +3233.85 3248.09 3234.32 3358.38 3231.07 3381.54 c +3228.75 3399.16 3224.59 3401.93 3218.1 3406.56 c +3256.09 3410.27 3266.76 3413.05 3284.35 3421.39 c +3280.65 3401.02 3280.18 3390.8 3280.18 3359.77 c +3279.26 3199.88 3278.79 3182.75 3288.99 3163.75 c +f +3437.37 3294.9 m +3436.46 3265.7 3435.99 3245.31 3428.1 3229.1 c +3418.37 3208.24 3402.16 3202.23 3390.11 3202.23 c +3362.29 3202.23 3356.28 3225.39 3356.28 3248.09 c +3356.28 3291.64 3395.21 3294.9 3412.8 3294.9 c +3437.37 3294.9 l +h +3309.93 3237.89 m +3309.93 3208.69 3318.74 3179.51 3344.7 3166.99 c +3356.28 3161.9 3367.86 3161.9 3371.57 3161.9 c +3414.21 3161.9 3428.56 3193.42 3437.37 3212.87 c +3436.9 3192.48 3437.37 3179.98 3438.76 3163.75 c +3447.1 3164.22 3455.44 3165.14 3469.35 3165.14 c +3477.22 3165.14 3484.64 3164.22 3492.51 3163.75 c +3487.41 3171.62 3484.64 3176.27 3483.23 3194.34 c +3482.31 3211.93 3482.31 3229.55 3482.31 3254.1 c +3482.78 3348.63 l +3482.78 3383.87 3473.51 3418.61 3403.99 3418.61 c +3358.14 3418.61 3331.26 3404.71 3317.82 3397.75 c +3323.39 3387.56 3328.02 3378.77 3332.18 3358.83 c +3350.26 3374.59 3373.9 3382.93 3397.98 3382.93 c +3436.46 3382.93 3436.46 3357.44 3436.46 3321.31 c +3427.65 3321.76 3420.22 3322.68 3407.71 3322.68 c +3348.86 3322.68 3309.93 3300 3309.93 3237.89 c +f +3704.27 3209.63 m +3704.74 3193.87 3704.74 3177.19 3711.22 3163.75 c +3701.02 3164.67 3694.99 3166.07 3676.01 3166.07 c +3664.87 3166.07 3658.86 3165.14 3650.05 3163.75 c +3651.89 3169.77 3652.84 3172.09 3653.76 3179.98 c +3655.15 3190.62 3656.08 3226.31 3656.08 3238.83 c +3656.08 3288.87 l +3656.08 3310.65 3656.08 3342.17 3654.68 3353.28 c +3653.76 3361.15 3651.46 3382.46 3624.56 3382.46 c +3598.15 3382.46 3589.36 3363.01 3586.1 3347.25 c +3582.41 3331.03 3582.41 3313.42 3582.41 3244.84 c +3582.86 3185.53 3582.86 3179.98 3587.49 3163.75 c +3579.62 3164.67 3569.89 3165.6 3555.99 3165.6 c +3544.85 3165.6 3537.45 3165.14 3528.19 3163.75 c +3531.44 3171.17 3533.29 3174.88 3534.21 3200.82 c +3535.15 3226.31 3537 3351.43 3532.8 3381.07 c +3530.5 3399.16 3525.85 3403.32 3520.77 3407.95 c +3558.31 3409.8 3570.34 3415.84 3581.94 3421.85 c +3581.94 3372.73 l +3587.49 3387.11 3599.07 3419.08 3645.42 3419.08 c +3703.35 3419.08 3703.8 3376.91 3704.27 3349.12 c +3704.27 3209.63 l +f +0.843137 0.027451 0.317647 rg +3292.9 3486.97 m +3254.53 3448.61 l +3216.17 3486.97 l +3254.53 3525.33 l +3292.9 3486.97 l +f +end showpage restore +%%PageTrailer +%%Trailer +%%Pages: 1 diff --git a/AlgoApprofondie/diapos/img/cesi.jpg b/AlgoApprofondie/diapos/img/cesi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dafbe55de24691c42c68b12402a75d4f863000ee GIT binary patch literal 60367 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 literal 0 HcmV?d00001 diff --git a/AlgoApprofondie/diapos/img/logo-cadoles.png b/AlgoApprofondie/diapos/img/logo-cadoles.png new file mode 100644 index 0000000000000000000000000000000000000000..de8ddc0506f341a1bb5d22eb69e46950fdfedb10 GIT binary patch literal 17924 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 R0H6Q>002ovPDHLkV1n_Dg{c4l literal 0 HcmV?d00001 diff --git a/poo/INFAL26-ConceptsDemarcheObjet.pdf b/poo/INFAL26-ConceptsDemarcheObjet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..17f55bcd4faf692fba3eed44f8e39f5490c26fa2 GIT binary patch literal 39272 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%0Dh9V#it-TT-Vw4Ja2zg40+MiDjr^rybM5n~b z0T9*Tzy?UYgh5*{WvF(>Vn9l%N9y-u;2Ap+$LY#wd2 zSPDp^k1cmNM`$51(mj#!akAso684x7zlBXVR&#^PAB z0NOmf5cP06_g(g&sw~<2-nnlVCVukzvIlSz4}i6_Nf6 D0@ZKn literal 0 HcmV?d00001 diff --git a/poo/cours/Makefile b/poo/cours/Makefile new file mode 100644 index 0000000..8b94f17 --- /dev/null +++ b/poo/cours/Makefile @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/poo/cours/_static/cesi.jpg b/poo/cours/_static/cesi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dafbe55de24691c42c68b12402a75d4f863000ee GIT binary patch literal 60367 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 literal 0 HcmV?d00001 diff --git a/poo/cours/algo.txt b/poo/cours/algo.txt new file mode 100644 index 0000000..c2f8ed7 --- /dev/null +++ b/poo/cours/algo.txt @@ -0,0 +1,291 @@ +Algorithmique +============= + +Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur +des manipulations algébriques (algèbre = **al jabr**). +C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre +mathématicien arabe du 9ème siècle, mais l'algèbre existe +depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne). + +.. glossary:: + + + algorithme + + terme désignant une suite d'opérations constituant un schéma de calcul + ou de résolution d'un problème. C'est un processus systématique de + résolution d'un problème permettant de décrire précisément des étapes. + C'est une suite finie d'instructions permettant de donner la réponse à un + problème. + +L'algorithmique est l'étude et la production de règles et de techniques +qui sont impliquées dans la définition d'algorithmes. + +Implémentation d'un algorithme +------------------------------ + +.. glossary:: + + implémentation + + Adaptation de la méthodologie de calculabilité au calcul effectif + sur une machine abstraite ou via un langage formel. + +Il n’y a pas de parcours à sens unique de l’algorithme vers l’implantation. +La quête d’une implantation efficace nous amène souvent à effectuer +un retour vers les algorithmes eux-mêmes, et à en modifier des points +essentiels. L’aspect théorique de réflexion sur les algorithmes, +et l’aspect pratique de l'implémentation sont donc en symbiose. + +Un existant émerge de la décomposition structurale d'un +domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les +uns à partir des autres. + +L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée +(un langage). L'origine d'une matière fait naître les formes (concepts) +que sa structure dessine. + +- Notion structurale de non-contradiction +- Notion extensive de "réalisation dans un champ donné" + +Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une +matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa +structure dessine. + +Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites +qui posséderaient en eux-mêmes comme une nature de matière et une nature de +forme ; cette conception tendrait, en effet, à stabiliser les existants +mathématiques dans certains rôles immuables et ignorerait le fait que les +existants abstraits qui naissent de la structure d'un domaine plus concret +peuvent à leur tour servir de domaine de base pour la genèse d'autres existants. + +L'algorithme comme généralisation de la calculabilité +------------------------------------------------------ + +L'importance croissante de l'informatique comme outil scientifique +impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes) +susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité +d'implémenter les calculs sur un ordinateur. + +Exemple d'algorithme +--------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{L'alorithme de Bellman-Kalaba} + \begin{algorithmic}[1] + \Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \EndProcedure + \Statex + \Procedure {FindPathBK}{$v$, $u$, $p$} + \If {$v = u$} + \State \textbf{Write} $v$ + \Else + \State $w \leftarrow v$ + \While {$w \not= u$} + \State \textbf{Write} $w$ + \State $w \leftarrow p(w)$ + \EndWhile + \EndIf + \EndProcedure + \end{algorithmic} + \end{algorithm} + +Exemple d'algorithme avec son implémentation +--------------------------------------------- + +Soit l'algorithme de factorielle suivant, + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme de la factorielle d'un nombre}\label{factorielle} + \begin{algorithmic}[1] + \Function{factorielle}{$n$}\Comment{La fonction récursive factorielle} + \BState \emph{parametre} : $n$ entier + \If{$n = 1$} + \BState \emph{Sortie} : 1 + \Else + \BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même} + \EndIf + \EndFunction + \end{algorithmic} + \end{algorithm} + +et son implémentation en python : + +.. literalinclude:: code/factorielle.py + :language: python + +En voici une autre implémentation (en OCaml) : + +.. literalinclude:: code/factorielle.ml + :language: ocaml + +On remarque que le **pseudocode** est très proche de +la syntaxe du python : + +.. function:: factorielle(n:int) + +:: + + if n=1 + return 1 + else + return n * factorielle(n-1) + end if + +Qualité d'un algorithme +----------------------- + +- correction d'un algorithme +- complétude d'un algorithme + +Sémantique + + Étude du sens, de la signification d'un langage + Définir la sémantique d’un langage formel consiste à lui donner une + signification mathématique. + +Sémantique opérationnelle + + on définit la sémantique par sa mise en œuvre sur + une machine abstraite. + +Sémantique dénotationnelle + + on associe à chaque construction syntaxique un + objet mathématique + +Sémantique axiomatique + + chaque construction est décrite par la manière dont + elle transforme des propriétés ou des prédicats. + +Proposition + + une proposition est un énoncé qui est soit vrai, soit faux + +**exemple** : ``2 + 3 = 5``. Proposition vraie. + +Prédicats + + Une proposition dont la valeur de vérité dépend de la valeur d’une ou plusieurs variables + +**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9 + + +Axiome + + une proposition qui est supposée vraie + +Un ensemble d’axiomes est consistant s’il n’existe pas de proposition +dont on peut démontrer qu’elle est à la fois vraie et fausse. + +Un ensemble d’axiomes est complet si, pour toute proposition, il est +possible de démontrer qu’elle est vraie ou fausse. + +Théorème d’incomplétude de Gödel (1931) : tout ensemble +consistant d’axiomes pour l’arithmétique sur les entiers est +nécessairement incomplet. + +**Les concepts de base en algorithmique sont les axiomes** + +inférence + + règles d’inférence, règles permettant de combiner des axiomes et des + propositions vraies pour établir de nouvelles propositions vraies. + +Démonstration + + vérification d’une proposition par une séquence de déductions logiques + à partir d’un ensemble d’axiomes. + +Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus, +on peut définir un choix de valeur des variables permettant de vérifier la +proposition obtenue par la *conjonction* de tous les axiomes du système proposé. +On dit alors que ce choix *réalise* un système d'axiomes. + + +Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de +chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance +à un champ d'individus qui soutiennent entre eux les relations définies pas les +axiomes. + +Concret et abstrait +-------------------- + +Il est possible qu'un même genre d'existant joue dans un schéma de genèse le +rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une +autre genèse le concret de base d'un nouvel abstrait. + +Une pareille présentation des choses implique un tel renversement par rapport +aux habitudes de pensée classiques, qu'il faut encore insister sur le sens +nouveau que reçoivent ici les expressions de "concret" et "d'abstrait". + +Les systèmes d'axiomes sont souvent conçus comme des structures purement +formelles, abstraites. Ces structures sont si profondément engagées dans la +genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les +structures de base. + +Un système d'axiome *peut* devenir le concret de base. + +Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de +l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la +structure de cet abstrait et celle du concret de base. + +Dans certains cas, la genèse de l'abstrait à partir d'un concret de base +s'affirme jusqu'à réaliser une imitation de structure entre ces genres +d'existants qui naissent l'un de l'autre. + +**C'est pourquoi on représente souvent un algorithme en pseudo-code**, +c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la +personne qui l'exprime) dominant chez la personne qui exprime un algorithme. + +Comment rendre un algorithme lisible +------------------------------------ + +- Le bon algorithme utilise des identifiants explicites. +- Le bon algorithme est structuré. +- Le bon algorithme est indenté. + +Complexité d'un algorithme +-------------------------- + +On peut approximer la complexité des algorithmes. +C'est utile pour pouvoir comparer des algorithmes. + +complexité + + estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise. + +Si f est la fonction caractérisant exactement le coût d’un algorithme et n +la taille des données, on s’intéresse à la façon dont augment f(n) lorsque n augmente +on va montrer que f(n) n'augmente pas plus vite qu’une autre fonction +g(n). Du point de vue mathématique, on dit que la fonction f est dominée +asymptotiquement par la fonction g ce qui se note f = O(g) + +- Complexité temporelle : c’est le nombre d’op«erations effectuées par + une machine qui exécute l’algorithme. + +- Complexité spatiale : c’est le nombre de positions mémoire utilisées par + une machine qui exécute l’algorithme. diff --git a/poo/cours/annexes/agile.txt b/poo/cours/annexes/agile.txt new file mode 100644 index 0000000..5884c11 --- /dev/null +++ b/poo/cours/annexes/agile.txt @@ -0,0 +1,83 @@ +La planification agile +======================== + +Le mode itératif +----------------- + +- livrer des versions successives et utilisables qui convergent vers + la version finale + +- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires + +- de nouvelles orientations fonctionnelles sont possibles, même tard + +- les specs détaillées sont écrites "juste à temps" + + +La planification agile +----------------------- + +- chaque livraison est un projet qui est planifié en tant que tel +- utiliser l'expérience acquise pour affiner les estimations +- préservation de l'écologie du projet au quotidien (code, tests...) + +La confiance, feedback +----------------------- + +- livraisons régulières +- progrès visibles par tous (pas d'effet tunnel) +- pilotage du projet par choix du contenu des livraisons +- investissement du Product Owner +- chercher la collaboration plutôt que la confrontation + +L'agilité +---------- + +- le projet n'est pas joué d'avance +- cultiver la souplesse +- révolution douce +- sortir de la confrontation, jouer le "nous collectif" + mettre tout le monde sur le mme pont et amener tout le monde à bon port + +Les outils agiles +------------------ + +- planification par itérations de 4 semaines +- entrepot de source partagé +- intégration continue +- tests automatisés +- pair programming sur points cruciaux +- sprints +- extranet : + + - hitoires utilisateurs + - test cases + - gestion du backolog et des tickets + - suivi de l'avancement + - documentation + +Le product owner +----------------- + +idéalement, + +- connaissance du métier à informatiser +- fibre projet +- dispo à 100% + +Les tests +--------- + +- automatiser +- viser l'exhaustivité +- tester une cible mouvante +- migrer les tests d'une release à l'autre + +Questions importantes en environnement agile +---------------------------------------------- + +- quelle durée d'itération ? +- comment découper en itérations ? +- que faire lorsque le product owner se retrouve sur le chemin critique ? +- la planification est faite en mode "juste à temps" et "juste assez" +- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble diff --git a/poo/cours/annexes/exercices.txt b/poo/cours/annexes/exercices.txt new file mode 100644 index 0000000..1597a02 --- /dev/null +++ b/poo/cours/annexes/exercices.txt @@ -0,0 +1,19 @@ +Exercices complémentaires +-------------------------- + ++ **Manipulation de chaînes de caractères**: + (création, accès à un caractère, concaténation), listes (création, ajout + d’un élément, suppression d’un élément, accès à un élément, extraction d’une partie de liste), tableaux à une ou plusieurs dimensions. + + + traitement des chaines de caractères + + s.replace() + + s1 + s2 + + un exemple de regexp simple + ++ **Fichiers** : + notion de chemin d’accès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier. + On encourage l’utilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques. + ++ **Piles** + Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes + (ou tableaux à 1 dimension) pour leur implantation. diff --git a/poo/cours/annexes/index.txt b/poo/cours/annexes/index.txt new file mode 100644 index 0000000..dc5acf1 --- /dev/null +++ b/poo/cours/annexes/index.txt @@ -0,0 +1,10 @@ +Annexes +========= + +.. toctree:: + :maxdepth: 2 + + exercices + surete + agile + scrum diff --git a/poo/cours/annexes/scrum.txt b/poo/cours/annexes/scrum.txt new file mode 100644 index 0000000..3777780 --- /dev/null +++ b/poo/cours/annexes/scrum.txt @@ -0,0 +1,176 @@ +scrum +===== + +.. glossary:: + + scrum + + Scrum est une méthode agile pour la gestion de projets + Le terme Scrum est emprunté au rugby et signifie mêlée. + Ce processus s'articule en effet autour d'une équipe soudée, + qui cherche à atteindre un but, comme c'est le cas en rugby + pour avancer avec le ballon pendant une mêlée. + + +Scrum définit trois rôles principaux : + +- le responsable de produit -- Product Manager, +- le faciliteur -- ScrumMaster +- le développeur + +et bien sûr, l'équipe (auto-gérée). + +Des intervenants peuvent s'intégrer également au projet +de façon plus ponctuelle. + +responsable de produit + + Le responsable de produit (Product Manager) est le représentant des + clients et utilisateurs. + C'est lui qui définit l'ordre dans lequel les fonctionnalités + seront développées et qui prend les décisions importantes + concernant l'orientation du projet. + +Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique +du terme, mais dans le sens de l'orientation. + +équipe, développement + + outes les décisions sont prises ensemble et personne ne donne d'ordre + à l'équipe sur sa façon de procéder + +facilitateur + + est chargé de protéger l'équipe de tous les éléments perturbateurs + +planification +-------------- + +Scrum utilise une planification à trois niveaux : + +- release/projet +- sprint +- quotidien -- ScrumMeeting + +quotidien + + Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min) + permet à l'équipe et au ScrumMaster de faire un point d'avancement sur + les tâches et sur les difficultés rencontrées. + répondre à trois questions : + * Qu'est-ce que j'ai fait hier ? + * Qu'est-ce que je compte faire aujourd'hui ? + * Quelles difficultés est-ce que je rencontre ? + +sprint + + Scrum est un processus itératif : les itérations sont appelées des sprints + et durent en théorie 30 jours calendaires. + En pratique, les itérations durent généralement entre 2 et 4 semaines. + Chaque sprint possède un but et on lui associe une liste d'items + de fonctionnalités à réaliser. + Ces items sont décomposés par l'équipe en tâches élémentaires + de quelques heures, les items de fonctionnalités de sprint. + + Pendant un sprint, les items de fonctionnalités de sprint à réaliser + ne peuvent pas être changés. + Les changements éventuels seront éventuellement réalisés + dans les sprints suivants. + +releases + + pour améliorer la lisibilité du projet, + on regroupe généralement des itérations en releases. + En effet, comme chaque sprint doit aboutir à la livraison + d'un produit partiel, une release permet de marquer la livraison + d'une version aboutie, susceptible d'être mise en exploitation + +gestion des besoins +------------------- + +tâches (backlog de sprint) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités +seront réalisés dans ce sprint. + +L'équipe décompose ensuite chaque item en liste de tâches élémentaires +(techniques ou non), chaque tâche étant estimée en heures +et ne devant pas durer plus de 2 jours. +On constitue ainsi le backlog de sprint. + +Les items de backlog de produit sont les fonctionnalités qui deviendront +les items du baclog d'un sprint. +Ces fonctionnalités sont estimées en points relatifs, sans unité. + +planning poker + + façon ludique et efficace de produire des estimations + sur la complexité des fonctionnalités à développer + + pour évaluer les scénarios utilisateurs (user stories) + du carnet de produit (product backlog). + +à la fin d'un sprint : + +- revue de sprint +- rétrospective de sprint + +comprendre ce qui n'a pas bien marché dans le sprint, +les erreurs commises et de prendre des décisions pour s'améliorer + +mise en oeuvre +-------------- + +Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent. +La liste des items du backlog de produit et la liste des items du backlog +de sprint. La saisie et la mise à jour des données est simplement +un peu moins agréable. + +glossaire +--------- + +Directeur de produit (Product Owner) (responsable produit) + + personne responsable de produire et maintenir à jour le backlog de produit. + C'est lui qui en détermine les priorités et qui prend les décisions + concernant l'orientation du projet. + +ScrumMaster (facilitateur) + + membre de l'équipe dont l'objectif principal est de la protéger + des perturbation extérieures. + Il est complètement transparent pour la communication entre l'équipe + et les clients et n'a aucun pouvoir hiérarchique sur l'équipe. + C'est en revanche un facilitateur pour les problèmes non techniques + de l'équipe. + +Backlog de produit (Product Backlog) (fonctionnalités) + + liste des fonctionnalités qui devront être réalisées par le logiciel. + +Backlog de sprint (Sprint Backlog) (tâches) + + liste des tâches à accomplir pendant un sprint. + Elles correspondent à la réalisation des items de backlog + du produit affectés au sprint. + +Mêlée quotidienne (Daily Scrum) (quotidien) + + réunion quotidienne de 15 minutes qui a pour but de faire le point + sur ce qui a été fait depuis la dernière mêlée, + ce qui est prévu de faire jusqu'à la prochaine + et quelles sont les embûches rencontrées durant le travail. + +Sprint (sprint) + + nom d'une itération dans Scrum. + Cette itération dure 30 jours calendaires en théorie, + mais en pratique on utilise plutôt entre 2 et 4 semaines. + Pendant une itération, l'équipe doit développer une liste d'items + du backlog de produit qui a été définie au début de ce sprint. + +Graphique d'avancement (Burndown Chart) (avancement) + + graphique qui montre la tendance du reste à faire total de jour en jour + (pour les sprints) ou de sprint en sprint (pour les releases). diff --git a/poo/cours/annexes/surete.txt b/poo/cours/annexes/surete.txt new file mode 100644 index 0000000..44da9b7 --- /dev/null +++ b/poo/cours/annexes/surete.txt @@ -0,0 +1,93 @@ +Outils de sureté d'un programme +-------------------------------------- + +La preuve de programme +~~~~~~~~~~~~~~~~~~~~~~ + +Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve +formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de +raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou +du matériel électroniques, afin de démontrer leur validité par rapport à une certaine +spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le +programme est valide et ne va pas planter. + +La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très +difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit +absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical +(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce +domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui +avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire +(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions +d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire +perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas +bugger). + +Le model checking +~~~~~~~~~~~~~~~~~~ + +Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie +moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du +système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte +donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont +utilisées que dans un contexte industriel de haute sécurité. + +Les tests d'acceptation +~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a plusieurs types de tests + +- unitaires +- fonctionnels +- acceptation + +Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines +parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près. +Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles. + +Les Outils de linting (validation) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- vérifications syntaxiques +- vérification sémantiques +- vérification sur les imports inutiles ou mal formés (imports croisés + +Exemple en python : pylint + + +La dette technique +~~~~~~~~~~~~~~~~~~ + +Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes. +Les tests permettent de solder la dette technique plus facilement. + +**avoir le courage de payer une dette technique, et affronter une dette technique +sinon il peut y avoir un coût à payer qui sera pohibitoire.** + +On solde la dette technique parce que à un moment ça va devenir beaucoup trop +cher à payer. + +Les méthodologies agiles +~~~~~~~~~~~~~~~~~~~~~~~~ + +La manière dont le code est produit importe énormément. Par exemple, une +méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé +a plus de chance de produire du code organisé. + +Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les +méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur : + +- Du logiciel fonctionnel plutôt que de la documentation exhaustive +- La réponse au changement plutôt que le suivi d'un plan +- Le logiciel fonctionnel est la principale mesure d'avancement +- Une attention continue à l'excellence technique et à une bonne + conception améliore l'agilité +- La simplicité est essentielle (il est facile de faire, il est + difficile de faire simple) + +Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon +itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une +à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le +responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce +sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce +temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de +résoudre les problèmes non techniques de l'équipe. diff --git a/poo/cours/apercu.txt b/poo/cours/apercu.txt new file mode 100644 index 0000000..ea09668 --- /dev/null +++ b/poo/cours/apercu.txt @@ -0,0 +1,79 @@ +Aperçu des algorithmes fondamentaux +=================================== + +Les algorithmes sont partout. Absolument partout aujourd'hui. +Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme. + +En mathématiques +----------------- + +- l'algèbre (étude des structures de données) +- l'arithmétique modulaire (théorie des nombres) +- la géométrie (affine, algébrique, invariants topologiques...) +- les diagrammes (diagrammes de Venn...) +- les colorisation d'une carte +- comportements stochastiques + +En informatique +---------------- + +- les algorithmes sur la manipulation des structures de données + Exemple : les algorithmes de tri, de recherche dans un arbre... +- les parcours de graphes (chemins le plus court, voyageur de commerce...) +- la cryptologie (code gray) +- les stratégies de jeux + +Tirés du monde réel +-------------------- + +- les jeux (casse-tête, dominos, échiquiers...) +- énigmes, logique et paradoxes +- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes + ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement. +- La "marche de l'ivrogne" : processus de progression discrète (pas à pas) + dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche. + Il revêt seulement un caractère de type probabilité (stochastique) dit markovien. +- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture) + +Le voyageur de commerce +~~~~~~~~~~~~~~~~~~~~~~~~ + +Le problème du voyageur de commerce, consiste en la recherche d’un trajet minimal permettant à un +voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la +distance totale parcourue. + +Il suffit de construire tous les chemins possibles et de calculer leurs longueurs. +Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles. +Avec 36 villes on trouve : 5166573983193072464833325668761600000000, +si le nombre de villes augmente, ça devient vite rédibitoire. + +Résolution par + +- algorithme de parcours de graphes +- algorithme glouton +- algorithmes génétiques + +Les algorithmes génétiques s’appuient sur un principe de sélection des individus d’une population qui présen- +tent des caractéristiques se rapprochant au mieux de ce que l’on recherche; cette population évoluant par +ailleurs selon des critères d’évolution génétique à choisir. Dans le contexte du problème du voyageur de +commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il s’agit +maintenant de dé...nir un critère de sélection ainsi que des règles d’évolution de la population. + +- approches métaheuristiques (exemples: colonies de fourmis) + +Exemple de résolution + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme du voyageur de commerce}\label{commerce} + \begin{algorithmic}[1] + + \BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes} + \BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer} + \State \emph{début} + \BState ... + \State \emph{fin} + + \end{algorithmic} + \end{algorithm} diff --git a/poo/cours/cesar.py b/poo/cours/cesar.py new file mode 100644 index 0000000..c3d25ac --- /dev/null +++ b/poo/cours/cesar.py @@ -0,0 +1,61 @@ +# coding: utf-8 +minuscules = 'abcdefghijklmnopqrstuvwxyz' +majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +def rotation(chaine, x): + """ + Effectue une rotation de x caractères vers la droite: + >>> rotation('abcde', 2) + 'cdeab' + """ + return chaine[x:] + chaine[:x] + +def index(c, chaine): + """ + Trouve l'index de c dans la chaine: + >>> index('n', 'bonjour') + 2 + """ + for i in range(len(chaine)): + if (c == chaine[i]): + return i + return -1 + +def chiffre_minuscules(chaine, x): + """ + Chiffre une chaîne composée de minuscules + >>> chiffre_minuscules('bonjour', 3) + 'erqmrxu' + """ + r = rotation(minuscules, x) + resultat = '' + for lettre in chaine: + resultat = resultat + r[index(lettre, minuscules)] + return resultat + +def chiffre(chaine, x): + """ + Chiffre une chaîne quelconque + >>> chiffre('Bonjour les amis!', 3) + 'Erqmrxu ohv dplv!' + """ + r_min = rotation(minuscules, x) + r_maj = rotation(majuscules, x) + resultat = '' + for lettre in chaine: + if lettre in minuscules: + resultat = resultat + r_min[index(lettre, minuscules)] + elif lettre in majuscules: + resultat = resultat + r_maj[index(lettre, majuscules)] + else: + resultat = resultat + lettre + return resultat + +############################################################################# +# Programme principal +############################################################################# +print(chiffre_minuscules('bonjour', 3)) +print(chiffre('Bonjour les amis!', 3)) +print(chiffre('Erqmrxu ohv dplv!', 23)) +print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23)) + diff --git a/poo/cours/code/factorielle.ml b/poo/cours/code/factorielle.ml new file mode 100644 index 0000000..5065a2c --- /dev/null +++ b/poo/cours/code/factorielle.ml @@ -0,0 +1,17 @@ +let rec fact = function + |1 -> 1 + | n -> n * fact (n-1) ;; + +let print_fact n = + Printf.printf "factorielle %i = %i\n" n (fact n) + +let main () = + begin + print_fact 5 ; + print_newline () ; + exit 0 ; + end + +let _ = main () + + diff --git a/poo/cours/code/factorielle.py b/poo/cours/code/factorielle.py new file mode 100644 index 0000000..734719f --- /dev/null +++ b/poo/cours/code/factorielle.py @@ -0,0 +1,12 @@ +def factorielle(n): + if (n > 1): + r = n*factorielle(n-1) + else: + r = 1 + return r + +def print_fact(n): + print "factorielle {} = {}\n".format(5, factorielle(5)) + +if __name__ == '__main__': + print_fact(5) diff --git a/poo/cours/conf.py b/poo/cours/conf.py new file mode 100644 index 0000000..3005e97 --- /dev/null +++ b/poo/cours/conf.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +# +# Algorithmique documentation build configuration file, created by +# sphinx-quickstart on Thu Mar 16 16:07:00 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig', +] + +# ajout des cours avec solution des exercices ou non +def setup(app): + app.add_config_value('correction', False, 'env') + app.add_config_value('exercice', False, 'env') + +exercice = False +correction = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.txt' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Algorithmique Approfondie' +copyright = u'2017, Gwen' +author = u'Gwen' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1' +# The full version, including alpha/beta/rc tags. +release = u'1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'fr' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%d/%m/%Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +default_role = 'literal' + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +html_show_copyright = False + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Algorithmiquedoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +'papersize': 'a4paper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +'preamble': """\usepackage{amsmath} +\usepackage{algorithm} +\usepackage[noend]{algpseudocode} +\makeatletter +\def\BState{\State\hskip-\ALG@thistlm} +\makeatother + +""" + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'AlgorithmiqueApprofondie.tex', u'Cours d\'algorithmique approfondie', + u'INFAL24', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = '_static/cesi.jpg' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = False + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'algorithmique', u'Algorithmique Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Algorithmique', u'Algorithmique Documentation', + author, 'Algorithmique', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +#epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True diff --git a/poo/cours/control.txt b/poo/cours/control.txt new file mode 100644 index 0000000..7770490 --- /dev/null +++ b/poo/cours/control.txt @@ -0,0 +1,294 @@ +Les structures de contrôle +========================== + +L'instruction de saut +---------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de saut conditionnel}\label{saut} + \begin{algorithmic}[1] + \Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide} + \State $\textit{stringlen} \gets \text{length of }\textit{string}$ + \State $i \gets \textit{patlen}$ + \BState \emph{top}: + \If {$i > \textit{stringlen}$} \Return false + \EndIf + \State $j \gets \textit{patlen}$ + \BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette} + \If {$\textit{string}(i) = \textit{path}(j)$} + \State $j \gets j-1$. + \State $i \gets i-1$. + \State \textbf{goto} \emph{loop}. \label{goto} + \State \textbf{close}; + \EndIf + \State $i \gets + i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$. + \State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut} + \EndProcedure + \end{algorithmic} + \end{algorithm} + + +.. raw:: latex + + Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette), + c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\ + +.. raw:: latex + + Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\ + +Description générique d'une instruction de saut:: + + Instruction 1 + Saut Label1 + Instruction 2 + ... + Label1: + Instruction n + +.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés + dans le langage cible, car c'est le meilleur moyen d'aboutir à + du **code spaghetti**. + +L'instruction de branchement conditionnel +------------------------------------------ + +On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'instruction de test} + \begin{algorithmic}[1] + \BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée} + \BState \emph{locale}: $a\gets ""$ + \BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$} + \BState \emph{corps}: + \If{$quality\ge 9$} + \State $a\gets perfect$ + \ElsIf{$quality\ge 7$} + \State $a\gets good$ + \ElsIf{$quality\ge 5$} + \State $a\gets medium$ + \ElsIf{$quality\ge 3$} + \State $a\gets bad$ + \Else + \State $a\gets unusable$ + \EndIf + \end{algorithmic} + \end{algorithm} + + + +.. ifconfig:: exercice + + **Exercice** : Compacter l'algorithme suivant en une seule condition de test:: + + Si il fait trop chaud Alors + Si il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + Sinon + Fermer la fenêtre + Finsi + +.. ifconfig:: correction + + **Correction** : + + :: + + Si il fait trop chaud ET il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + + +L'instruction switch +-------------------- + +L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable. +Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable. + +Les instructions d'itérations (boucles) +--------------------------------------- + +.. important:: Toutes les boucles concernent le paradigme de programmation impératif + et ne sont pas valides dans le paradigme de programmation fonctionnel + (puisque l'ordre d'évaluation importe) + +- arrêt conditionnel (break) +- passage d'un pas (continue) + +Répéter ... jusqu'à +~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de répéter ... jusqu'à} + \begin{algorithmic}[1] + \BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i} + \Repeat \Comment{c'est le label de début du répéter} + \State $i \gets \textit{i+1}$ + \Until{i == 100} \Comment{condition de fin de la boucle} + \end{algorithmic} + \end{algorithm} + +La boucle **pour** (for) +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle for} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \For{$i\gets 1, n$} + \State $sum\gets sum+i$ + \EndFor + \end{algorithmic} + \end{algorithm} + + + + + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, + et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres + +.. ifconfig:: correction + + **Correction** : + :: + + Variables N, i, PG en Entier + Debut + PG <- 0 + Pour i <- 1 à 20 + Ecrire "Entrez un nombre : " + Lire N + Si i = 1 ou N > PG Alors + PG <- N + FinSi + Ecrire "Le nombre le plus grand était : ", PG + Fin + + +.. attention:: ne jamais manipuler le compteur dans une boucle + +:: + + Variable Truc en Entier + Début + Pour Truc <- 1 à 15 + Truc <- Truc * 2 + Ecrire "Passage numéro : ", Truc + Truc Suivant + Fin + +La boucle tant que (while) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle while} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \State $i\gets 1$ + \While{$i\le n$} + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \EndWhile + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur + + :: + + "Voulez vous un café ? (O/N)" + +.. ifconfig:: correction + + **Correction** : deux solutions possibles, une + + :: + + Variable Rep en Caractère + Début + Rep <- "" + Ecrire "Voulez vous un café ? (O/N)" + TantQue Rep <> "O" et Rep <> "N" + Lire Rep + Si Rep <> "O" et Rep <> "N" Alors + Ecrire "Saisie Erronée, Recommencez" + FinSi + FinTantQue + Fin + + :: + + Variable Rep en Caractère + Début + Ecrire "Voulez vous un café ? (O/N)" + Lire Rep + TantQue Rep <> "O" et Rep <> "N" + Ecrire "Vous devez répondre par O ou N. Recommencez" + Lire Rep + FinTantQue + Ecrire "Saisie acceptée" + Fin + +.. ifconfig:: exercice + + **Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à l’utilisateur + un nombre compris entre a et b jusqu’à ce que la réponse convienne. + +.. ifconfig:: correction + + **Correction** : + + :: + + Variable N en Entier + Debut + N <- 0 + Ecrire "Entrez un nombre entre 10 et 20" + TantQue N < 10 ou N > 20 + Lire N + Si N < 10 Alors + Ecrire "Plus grand !" + SinonSi N > 20 Alors + Ecrire "Plus petit !" + FinSi + FinTantQue + Fin + +Et les autres boucles : répéter... jusqu'à, etc... + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle répéter} + + \begin{algorithmic}[1] + \State $sum\gets 0$ + \State $i\gets 1$ + \Repeat + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \Until{$i>n$} + \end{algorithmic} + \end{algorithm} diff --git a/poo/cours/donnees.txt b/poo/cours/donnees.txt new file mode 100644 index 0000000..990629e --- /dev/null +++ b/poo/cours/donnees.txt @@ -0,0 +1,577 @@ +Les structures de données +=========================== + +.. glossary:: + + ATD + + Abstract Data Type, structure de données abstraites. + La représentation des données est forcément un choix. + Il est impossible de rendre compte globalement d'un élément du réel, + il faut en faire une interprétation abstraite. + +**Exemple**: + +- Un être humain peut être représenté par les données présentes dans sa + carte d'identité. Mais un être humain n'est pas sa carte d'identité. +- Un être humain peut être représenté par les données présentes dans ses préférences + de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net. + +Les séquences +------------- + +Les types séquences (listes) + +.. code-block:: ocaml + + # 4::1::5::8::1::[];; + - : int list = [4 ;1 ;5 ;8 ;1] + + +Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, s’appelle un tableau, ou encore une liste, ou une variable indicée. +Le nombre qui, au sein d’un tableau, sert à repérer chaque valeur s’appelle l’indice. +Chaque fois que l’on doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de l’indice de l’élément. + +**manipulation** : + +- `insert()` +- `append()` +- `remove()` +- `find()` +- `print()` +- ... + +.. code-block:: python + + zoo = ['bear', 'lion', 'panda', 'zebra'] + print(zoo) + + # But these list elements are not + biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']] + print(biggerZoo) + +- Lists Versus Tuples : types mutables, immutables +- Lists Versus Sets : non ordonné, collection simple + +- Recherche dans une liste, recherche du maximum dans une liste +- Recherche d’un mot dans une chaîne de caractères. + +Algorithme de la longueur d'une liste +-------------------------------------- + +.. code-block:: ocaml + + # let rec longueur l = + match l with + [] -> 0 + | ::s -> 1 + (longueur s);; + +Cette fonction est prédéfinie en Ocaml : `List.length` + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui déclare et + remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro. + +.. ifconfig:: correction + + **Correction** : + :: + + Tableau Truc(6) en Numérique + Variable i en Numérique + Debut + Pour i <- 0 à 6 + Truc(i) <- 0 + i Suivant + Fin + + exemple d'implémentation en python + + .. code-block: python + + >>> liste = [] + >>> for i in range(6): + ... liste.append(i) + ... + >>> liste + [0, 1, 2, 3, 4, 5] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Calcul du premier élément maximal dans une liste, + proposer une implémentation en python qui renvoie le maximum et + la position du max dans la liste. + +.. ifconfig:: correction + + **Correction** : + + .. code-block: python + + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + + Exemple de généricité : ce code fonctionne avec une chaîne de caractères. + + .. code-block: python + + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +.. glossary:: + + Matrice + + Tableaux de dimension multiple, c'est un tableau de tableau + +.. ifconfig:: exercice + + **Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros. + +.. ifconfig:: correction + + **Correction** : + + implémentation en python + + .. code-block:: python + + >>> matrice = [] + >>> for i in range(12): + ... matrice.append([0 for i in range(5)]) + ... + >>> from pprint import pprint + >>> pprint(matrice) + [[0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]] + >>> + +Algorithmes de tri +------------------ + +On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre. + +Les algorithmes de tri ont une grande importance pratique. +Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle). + +L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu. + +Tri par insertion +~~~~~~~~~~~~~~~~~~ + +Cet algorithme de tri suit de manière naturelle la structure récursive des +listes. Soit l une liste à trier : + +- si l est vide alors elle est déjà triée +- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s’ + on insert x au bon endroit dans s’ et on obtient une liste triée + +Description de l'algorithme + +- la fonction inserer permet d’insérer un élément x dans une liste l +- si la liste l est triée alors x est inséré au bon endroit + +.. code-block:: ocaml + + # let rec inserer x l = + match l with + [] -> [x] + | y::s -> if x<=y then x::l else y::(inserer x s);; + val inserer : ’a -> ’a list -> ’a list + # inserer 5 [3 ;7 ;10];; + - : int list = [3 ; 5 ; 7 ; 10] + +Tri rapide +~~~~~~~~~~~~ + +soit une liste l à trier : + +- si l est vide alors elle est triée +- sinon, choisir un élément p de la liste (le premier par exemple) + nommé le **pivot** +- partager l en deux listes g et d contenant les autres éléments de l + qui sont plus petits (resp. plus grands) que la valeur du pivot p +- trier récursivement g et d, on obtient deux listes g’ et d’ triées + +.. code-block:: ocaml + :caption: fonction de partage d'une liste + + #let rec partage p l = + match l with + [] -> ([] , []) + |x::s -> let g,d = partage p s in + if x<=p then (x::g , d) else (g , x::d) ;; + val partage : ’a -> ’a list -> ’a list * ’a list = + # partage 5 [1 ;9 ;7 ;3 ;2 ;4];; + - : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7]) + +.. code-block:: ocaml + :caption: algorithme de tri rapide + + # let rec tri rapide l = + match l with + [] -> [] + | p::s -> let g , d = partage p s in + (tri rapide g)@[p]@(tri rapide d) ;; + val tri rapide : ’a list -> ’a list = + # tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];; + - : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9] + + +Définition d'un itérateur +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + >>> l = range(10) + >>> for i in l: + ... print l[i] + ... + 0 + ... + 8 + 9 + >>> l.__iter__() + + + +Les listes chaînées +~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + typedef struct list{ + int elt ; + struct list* suivant ; + } ; + + +**Outils de manipulation** : + +- `next()` +- `pointer()` +- `insert(l, a)` +- `remove(a, n)` + + +Les piles +---------- + +**manipulation** + +- `insert()` : insérer un élément à la fin de la pile +- `dequeue()` : (remove and return) : retirer un élément du haut de la pile +- FIFO : "first in first out" + + +Traduction d'une structure de données dans une autre +----------------------------------------------------- + +.. code-block:: python + + >>> listOfStrings = ['One', 'Two', 'Three'] + >>> strOfStrings = ' '.join(listOfStrings) + >>> print(strOfStrings) + One Two Three + >>> + >>> # List Of Integers to a String + ... listOfNumbers = [1, 2, 3] + >>> strOfNumbers = ''.join(str(n) for n in listOfNumbers) + >>> print(strOfNumbers) + 123 + >>> + +.. code-block:: python + + >>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')] + >>> result = [] + >>> for hostname, ip, macaddress in l: + ... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress)) + ... + >>> result + [{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'}, + {'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme de traduction de cette structure de donnée + + .. code-block:: python + + [ + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True }, + { 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + + ] + + En cette structure de données : + + .. code-block:: python + + [ + { + address: '192.168.0.0', + mask: '255.255.255.0', + dynamicRanges: [ + { low: '192.168.0.5', high: '192.168.0.12', only_unknown: true }, + { low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j + ], [ + { low: '192.168.0.12', high: '192.168.0.45', only_unknown: true }, + { low: '192.168.0.8', high: '192.168.0.35', only_unknown: false }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + ] + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> from pprint import pprint + pprint(l) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> newdata = [] + >>> for i in l: + ... if i['address'] not in [j['address'] for j in newdata]: + ... newdata.append(i) + ... else: + ... for k in newdata: + ... if k['address'] == i['address']: + ... k['dynamicRanges'].extend(i['dynamicRanges']) + ... + >>> pprint(newdata) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}, + {'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.10.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme qui permette de récupérer la liste + des adresses IP disponibles + + .. code-block:: python + + { + "local": { + "leases": [ + { + "mac": "02:00:c0:a8:00:66", + "name": "pcxubuntu", + "address": "192.168.0.200" + }, + { + "mac": "02:00:c0:a8:00:67", + "name": "pcxubuntu", + "address": "192.168.0.201" + }, + { + "mac": "02:00:c0:a8:00:68", + "name": "pcxubuntu", + "address": "192.168.0.202" + } + ] + } + } + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> l = { + ... "local": { + ... "leases": [ + ... { + ... "mac": "02:00:c0:a8:00:66", + ... "name": "pcxubuntu", + ... "address": "192.168.0.200" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:67", + ... "name": "pcxubuntu", + ... "address": "192.168.0.201" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:68", + ... "name": "pcxubuntu", + ... "address": "192.168.0.202" + ... } + ... ] + ... } + ... } + >>> leases = l["local"]["leases"] + >>> from pprint import pprint + >>> pprint(leases) + [{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'}, + {'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'}, + {'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}] + >>> addresses = [lease['address'] for lease in leases] + >>> addresses + ['192.168.0.200', '192.168.0.201', '192.168.0.202'] + >>> + + + +Structures de données complexes +------------------------------- + +Les types produits nommés +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On les appelle enregistrements, dictionnaires ou tables de hachage. + +:: + + algorithme monAlgorithme + // déclaration d'un enregistrement + enregistrement Personne + chaine nom; + chaine prenom; + entier age; + réel taille; + finenregistrement + ... + Personne[50] t; + début + // Initialisation + t[0].nom <- "Duchmol"; + t[0].prenom <- "Robert"; + t[0].age <- 24; + t[0].taille <- 1.80; + ... + fin + +.. code-block:: ocaml + + # type adresse = { rue : string ; ville : string ; cp : int};; + # type fiche = { + nom : string ; + prenom : string ; + adresse : adresse ; + date naissance : int * int * int ; + tel fixe : string ; + portable : string + };; + # let v1 = { a = 1 ; b = false ; c = 'r'};; + + + + +- les sommes (constructeurs) + +.. code-block:: ocaml + + # type couleur = Pique | Coeur | Carreau | Trefle;; + # let v = (Pique , Coeur);; + val v : couleur * couleur = (Pique , Coeur) + +.. code-block:: ocaml + + type nombre = + Ent of int | Reel of float | Cplx of float × float + Ent, Reel, Cplx sont les constructeurs du type. + +Autres structures de données complexes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- arbres +- graphes +- dates + +- le parcours de graphes +- les calculs de dates diff --git a/poo/cours/fonctions.txt b/poo/cours/fonctions.txt new file mode 100644 index 0000000..330cbca --- /dev/null +++ b/poo/cours/fonctions.txt @@ -0,0 +1,588 @@ +Les fonctions et les procédures +================================ + +Préliminaire : rappel de théorie de cybernétique +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication) + +Canal de transmission:: + + entrée -> récepteur -> émetteur -> sortie + +.. glossary:: + + cybernétique + + étude des fonctions de réflexes conditionnés du cerveau humain + utilisation au mieux en PNL ("programmation neuro-linguistique") + ou en analyse transactionnelle, ou au pire en ingérinerie sociale. + +La matérialité physique est considérée comme le hardware, le génétique (le +réseau neuronal) étant assimilé au network hardware. + +Les objets mentaux (fonctionnements psychologiques et épigénétiques du +cerveaux) est assimilé au logiciel, au software. + +IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de +comportement affecté à un assimilé-machine. + +L'humain est ramené à une machine. +C'est articulation entre "déclencheur contextuel" et "action en réponse de" +n'est pas une "black box" mais un "feedback" qui, pour l'humain, +loin d'être ramené à une entrée/sortie, constitue un **feedback** +utile pour la connaissance de soi. + +A la place, la communication est ramenée à une **boucle de rétroaction** +(comme dans un prompt) entre un système comportemental et son environnement. +La représentation sujet/objet (la perspective traditionnelle) est remplacée +par le clivage intérieur/extérieur. Behaviorisme, procédural. + +L'humain est donc ramené à + +- un ordonnanceur +- un comportement intrinsèque (boîte noire) + +- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre +d'entrée +- une instruction comportementale est considérée comme une action de + traitement +- le résultat est observé. + +Cette articulation entre "déclencheur contextuel" et "action en réponse" +est très exactement une forclusion de la profondeur monadique (Leibniz) de +l'humain à la black box informationnelle (et cybernétique). + +Pour quoi faire ? Pour pirater. Pour manipuler. +Le piratage consiste à + +- isoler les constantes (les procédures répétitives, les algorithmes) +- les observer (collecter les données) + +afin de + +- les réécrire (influence toxique, pishing - hammeçonnage) +- les détruire (attaque en règle) + + +Description d'une procédure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +En programmation impérative, un programme est une suite d’instructions qui font +évoluer l’état mémoire, le résultat est dans l’état final de la mémoire. + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la procédure + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{permutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire} + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{appel de la procédure} + \end{algorithmic} + \end{algorithm} + +effet de bord + + toute modification de la mémoire ou modification d'un support externe + +instruction + + commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte + (allocation mémoire, support externe, disque, écran...) + +Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.). + +Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur. +Cela permet de structurer le texte source du programme et améliorer sa +lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit +dans le code, cette primitive. + +Appel d'une procédure +~~~~~~~~~~~~~~~~~~~~~ + +(ex: pseudo-pascal) + +**déclaration de procédure** + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{appelpermutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ \Comment{paramètres formels de la procédure} + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{les variables locales de la procédure} + \BState \emph{corps}: + \State ... \Comment{Le corps de la procedure} + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{l'appel de la procédure} + \end{algorithmic} + \end{algorithm} + + +- les variables x1,...,xn sont appelées *paramètres formels* de p +- les variables v1,...,vm sont appelées *les variables locales* de p + +les valeurs effectivement passées en paramètres, ici `10, 12` +sont appelées **paramètres effectifs** de p + +signature + + C'est l'ensemble paramètre formel + resultat de l'appel + +fermeture + + L'ensemble procédure + variables locales + signature + parametres effectifs + est appelé une **fermeture**. C'est la procédure + son contexte qui permet + de l'instancier dans un programme. + +Environnement + + Contexte d’évaluation d'une expression ou d'une fonction + +Portée + + La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné + (utilisation locale uniquement, ou bien globale, ou bien locale et globale) + La portée d’une liaison est la portion du code dans laquelle cette + liaison est valide (i.e. où un identifiant est lié à une expression). + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + # let x = 42 in + let y = x - 1 in x - y ;; + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: ocaml + + - : int = 1 + + +.. code-block:: ocaml + + let a = 3 (* première liaison pour l'identifiant a *) + let b = 5 and c = 6 + let somme = a + b + c + val somme : int = 14 + let a = 45 (* deuxième liaison pour l'identifiant a *) + somme + val a : int = 45 + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + let somme = a + b + c ;; + val somme : int = ??? + let a = 44 + let b = 5 + let c = 1 + somme + - : int = ??? + +.. ifconfig:: correction + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + - : int = 15 + let somme = a + b + c ;; + val somme : int = 15 + let a = 44 + let b = 5 + let c = 1 + somme + - : int = 15 + + Même code en python + + .. code-block:: python + + >>> a = 1 + >>> b = 2 + >>> c = 3 + >>> somme = a + b + c + >>> somme + 6 + >>> a = 56 + >>> b = 5678 + >>> c = 56789 + >>> somme + 6 + >>> + +Portée locale dans une expression + +.. code-block:: ocaml + + # let a = 2 and b = 3 and c = 4 in + let somme = a+b+c in + somme + - : int = 9 + # somme ;; + Error: Unbound value somme + # a ;; + Error: Unbound value a + +.. important:: + + L’ordre d’évaluation dans un let ... in ... est bien déterminé, + sans grande importance dans un cadre purement fonctionnel, mais important + en cas d’effets de bord + + +Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) : + +.. code-block:: python + + >>> a = 5 + >>> def print_a(): + ... print("La variable a = {0}.".format(a)) + ... + >>> print_a() + La variable a = 5. + >>> a = 8 + >>> print_a() + La variable a = 8. + >>> + + + +niveau + + Le niveau d’une déclaration (de variable ou de procédure) est le nombre + de procédures sous lesquelles elle est déclarée. Le programme principal + a le niveau 0. + +.. code-block:: python + :linenos: + + def _get_config(name): + # return config value + if not isfile(CONFIG_FILE): + raise Exception("Fichier de configuration non existant") + from ConfigParser import ConfigParser + cfg = ConfigParser(allow_no_value=True) + cfg.read(CONFIG_FILE) + + if name == "SUBNETS": + return eval(cfg.get('eole', 'subnets')) + elif name == "LEASES_FILE": + DHCP_PATH = cfg.get('eole', 'container_path_dhcp') + return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases') + def get_routes(*args, **kwargs): + """ + Send list of reserved IP + return list of tuple (id, machine name, IP, MAC Adress) + """ + cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME, + mandatory_permissive=False) + return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname, + cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress) + +On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19. +C'est autorisé et les espaces de nommages sont différents. + + +Description d'une fonction +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Une fonction renvoie une valeur et ne modifie pas l'état courant du programme +en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie +**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien) + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la fonction + +En programmation fonctionnelle, programme est un ensemble de définitions de fonctions, +un résultat est l'application d’une fonction à une structure de données effective. + +- composant de base : la fonction +- opération de base : l’application + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de fonction}\label{fonction} + \begin{algorithmic}[1] + \Function{permuter}{$a,b$}{} \Comment{définition de la fonction} + \BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels} + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales} + \State $z: \textit{int}$ + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction} + \EndFunction + \State \Call{permuter}{10, 12} \Comment{appel de la fonction} + \BState \emph{result}: + \State (12, 10) \Comment{Le résultat effectif de la fonction après appel} + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : factoriser le code suivant + :: + + Ecrire "Etes-vous marié ?" + Rep1 <- "" + TantQue Rep1 <> "Oui" et Rep1 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep1 + FinTantQue + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- "" + TantQue Rep2 <> "Oui" et Rep2 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep2 + FinTantQue + +.. ifconfig:: correction + + **Correction** : + + :: + + Fonction RepOuiNon() en caractère + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin + + Ecrire "Etes-vous marié ?" + Rep1 <- RepOuiNon() + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- RepOuiNon() + + +Définition mathématique +~~~~~~~~~~~~~~~~~~~~~~~~~ + +fonction + + Une fonction f d’un ensemble E vers un ensemble F est une + correspondance qui associe à chaque élément de E au plus + un élément de F. + +- E est appelé le domaine de définition +- F est appelé codomaine +- la **signature** de la fonction : `E → F (int -> int = )` + + +Exemple de signature d'une fonction + +:: + + Fonction RepOuiNon(Msg en Caractère) en Caractère + Ecrire Msg + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin Fonction + + ... + Rep1 <- RepOuiNon("Etes-vous marié ?") + ... + Rep2 <- RepOuiNon("Avez-vous des enfants ?") + ... + + +curryfication + + évaluation de l'application d'une fonction + +- évaluter `(f x y)` +- peut donner une **valeur fonctionnelle** +- évaluation de la valeur fonctionnelle sur une valeur des types de base + +:: + + let g = function n -> (function p -> p + 1) n;; + +Typage d'une fonction +~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + # let f x y z = if x > 0 then y + x else z - x;; + val f : int -> int -> int -> int = + +c’est en fait une fonction à un argument qui retourne une fonction:: + +.. code-block:: ocaml + + val f : int -> (int -> (int -> int)) = + +application de f à trois valeurs + +.. code-block:: ocaml + + # f 1 2 3;; + - : int = 3 + +en programmation fonctionnelle, +les fonctions sont des valeurs comme les autres + + +.. code-block:: ocaml + + # fun x -> x * x;; + - : int -> int = + +Récursivité +~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + if n=0 then 1 else n * fact (n-1) + + +équivalent impératif utilisant une boucle + +.. code-block:: c + + int fact(int n){ + int f = 1 ; + int i = n ; + while (i>0){ + f = f * i; + i-- ; + } ; + return f ; + } + +Définitions par cas +~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + match n with + 0 -> 1 + | -> n * fact (n-1) + +**exemple** : la fonction puissance + +.. code-block:: ocaml + + let rec puissance x n = match n with + 0 -> 1 + | -> x * puissance x (n-1) + + + +.. ifconfig:: exercice + + **Portée locale dans une fonction** + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + + +.. ifconfig:: correction + + Correction: + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + >>> a + 4 + >>> + + +.. ifconfig:: exercice + + **Exercice** : Portée locale dans une fonction avec variable globale + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + 3 + >>> + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> myfunc() + 3 + >>> a + 2 + >>> a = myfunc() + 3 + >>> a + 6 + >>> diff --git a/poo/cours/fondement.txt b/poo/cours/fondement.txt new file mode 100644 index 0000000..874365c --- /dev/null +++ b/poo/cours/fondement.txt @@ -0,0 +1,198 @@ +Présentation de l'art de programmer +==================================== + +Qu'est-ce que la programmation ? +-------------------------------- + +programmation + + Description d’un calcul (traitement) dans + un langage compréhensible par la machine + (langage de programmation) + +Le processus d'abstraction +-------------------------- + +Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au +"bas niveau". Souvent, on se jette dans le grand bain : + +- soit en s'approchant au maximum de la machine (admin système et réseau, noyau + linux, langage C) + +- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau + de bas niveau (microservices, monde nodeJS/javascript, etc...) + +Soit on suit un cursus scolaire traditionnel qui commence souvent par une +explication du fonctionnement d'une machine abstraite de bas niveau, puis en +allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au +bas niveau (comprendre comment ça se passe derrière la scène). + +Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant +les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit +rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies +sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue +(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage +collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire, +architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul. + +L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire) +est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du +côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une +pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix, +en connaissance de sa discipline. + +Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective +des langages à partir des paradigmes de rationalisation de la penseée (modules, +objects, généricité, polymorphisme paramétrique...) et d'un outil de communication +avec la machine qu'on appelle compilateur (dont la description est en dehors de +l'objectif de ce cours). + +La tendance générale de l'évolution des langages est de se libérer de ces +contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques +dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à +l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets +quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai +aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est +construite une trame IP, indépendances de chaque couche (transport, payload) entre +elles). Même la tendance système est à la virtualisation qui accentue encore la +tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du +haut niveau (le niveau applicatif). + +Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s) +langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la +conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la +volonté d'abstraire. + +- **s'abstraire de la machine** : un langage de programmation permet de + négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du + microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté + le programme. + +- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un + programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur. + Un des moyens pour y parvenir est le typage des programmes et la mise + en oeuvre d'un mécanisme d'exceptions. + +- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un + paradigme d'implémentation qui est indépendant du domaine considéré (paradigme + objet, modulaire, générique, composants...) + +- **abstraire les composants** : Les langages de programmation donnent la + possibilité de découper une application en différents composants logiciels, plus ou + moins indépendants et autonomes. La modularité permet une structuration de plus haut + niveau de l'ensemble d'une application complexe. Les langages à objets constituent + une autre approche de la réutilisabilité permettant la réalisation très rapide de + prototypes. + +Description des niveaux d'abstraction par rapport à la machine +--------------------------------------------------------------- + +Les langages de haut niveau simplifient le travail du +programmeur là où les langages de bas niveau permettent de produire un code +plus efficace. + +- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode. + impossible de coder dans ce langage. + +- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine + et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple, + la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après). + Il faut gérer les ressources,le langage est très optimisé mais presque impossible + à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur. + +- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++) + indépendance par rapport à la machine, grande structuration mais très verbeux + +- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces + langages ne dépent plus de la machine, et ils implémentent des paradigmes de + programmation indépendant de l'état de la mémoire de l'ordinateur, + ils sont indépendant même du système d'exploitation. + +Qu'est-ce qu'une machine ? +--------------------------- + +Une machine, ce truc apparemment si complexe, est en fait +un assemblage de bric et de brac. + +L'assemblage des connecteurs permet de simuler un additionneur, +en prenant en compte les propriétés de **reste euclidien** +de l'addition. + +La structure électronique est composée de : + +- un ordonnanceur. +- le stockage d'un **état**. +- une pile d'instruction + +.. glossary:: + + adressage + + Dès lors qu'on dispose de ces bases électronique au dessus du processeur, + un langage d'assemblage est possible, c'est le langage de calcul sur les registres. + + registre + + machines ont un espace mémoire et un espace de calcul (registres) + +Un ordinateur, c'est très très stupide, mais ça permet de disposer de : + +- une mémoire très grande et ordonnée, +- une capacité à effectuer inlassablement des tâches répétitives +- une grande rapidité de calcul + +Apprendre à programmer, c'est-à-dire être capable de +contrôler la machine. + +.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée, + pour pouvoir accessoirement ensuite communiquer avec une machine. + +Compilateur +----------- + +Schématiquement, un compilateur est un programme qui traduit un +programme d’un langage source vers un langage cible, en signalant +d’éventuelles erreurs. + +Quand on parle de compilation, on pense typiquement à la traduction d’un +langage de haut niveau (C, Java, Caml, ...) vers le langage machine d’un +processeur (Intel Pentium, PowerPC, ...) + +- xml (libre office, word) -> postscript (imprimante) +- postcript -> image +- syntaxe wiki -> html (Wikipédia...) + +compilation graphique + + passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt + passer par une api qui permet de causer avec une interface + +**transpiler** : transformation d'un langage de haut niveau vers un autre +langage de haut niveau. + +- cofee script, typescript -> javascript +- (babel) javascript -> javascript ES 6 +- python -> javascript + +Un compilateur traduit un programme P en un programme Q tel que +pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)` + +Un interprète est un programme qui, étant donné un programme `P` et une +entrée x , calcule la sortie s de `P(x)` + +Le compilateur fait un travail complexe une seule fois, pour produire un +code fonctionnant pour n’importe quelle entrée +L’interprète effectue un travail plus simple, mais le refait sur chaque entrée +Autre différence : le code compilé est généralement bien plus efficace que +le code interprété + +Typiquement, le travail d’un compilateur se compose d’une phase d’analyse + +- reconnaît le programme à traduire et sa signification +- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.) + +Puis d’une phase de synthèse + +- production du langage cible +- utilise de nombreux langages intermédiaires +- n’échoue pas diff --git a/poo/cours/index.txt b/poo/cours/index.txt new file mode 100644 index 0000000..aa2ef7d --- /dev/null +++ b/poo/cours/index.txt @@ -0,0 +1,19 @@ +Introduction à l'algorithmique +================================ + +.. toctree:: + :maxdepth: 2 + + presentation + fondement + langage + algo + programme + fonctions + control + donnees + apercu + modularite + modules + tp + annexes/index diff --git a/poo/cours/langage.txt b/poo/cours/langage.txt new file mode 100644 index 0000000..67f858d --- /dev/null +++ b/poo/cours/langage.txt @@ -0,0 +1,336 @@ +Les langages de programmation +============================= + +langage + + Un langage de + programmation + doit permettre d'écrire des + programmes de bonne qualité + +Un programme doit être : + +- correct +- robuste +- lisible, bien documenté +- facile à modifier, extensible + +Un langage de programmation doit permettre : + +- la programmation structurée +- la structuration avec les types +- proposer un mécanisme d’exceptions +- présenter des caractères de généricité, de polymorphisme et de surcharge + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Approche historique et chronologique +------------------------------------- + +- Lambda calcul (1930) +- machines de Turing (1936) +- début des langages vers les années 1950 (A0, Fortran(impératif), + Lisp(impératif et fonctionnel), Cobol) +- années 60 : Simula (classes), CPL (compilation séparée) +- années 70 : C (référence du langage impératif de bas niveau), Pascal + (procédures), Smalltalk (programmation orientée objects), Prolog + (programmation logique), Scheme (programmation fonctionnelle pure), Modula, + C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats) +- années 80 : ML, CAML (langages fonctionnels) +- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes) + Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine + virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+ + programmation concurrente), javascript (orienté web, objets par + prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité, + programmation générique, fonctionnelle et objets, modulaire et fonctorielle) +- 2009 : go (google, compilé, typage statique, objets par prototypage, + prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente) + +Les langages actuellement les plus utilisés dans le monde de l'entreprise sont : + +- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son + succès (chaos complet des librairies) +- le go est de plus en plus utilisé, c'est **le** langage qui monte + actuellement +- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés) +- PHP, Java (stagnants) +- C, C++ (de moins en moins utilisés) + +Approche par typologie des langages +----------------------------------- + +- **A0 (1954)** : possibilité de découpage de programmes en + sous-programmes ; + +- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication + de blocs de code ; + +- **C (1971)** : syntaxe claire et simple, programme fortement structuré ; + +- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner + un seul jeu d'instructions sur des machines différentes. Avant, le code + d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique + jeu d'instructions ; + +- **1980** : déploiement et succès des langages à objets ; + +- **1983** : turbo pascal (Borland) qui fut le tournant du C, + propose un IDE (Environnement de Développement Intégré). + aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement, + il est soutenu par une communauté open source autour de **Lazarus** ; + +- **depuis les années 90** : deux grands groupes de langages. Les langages à + objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les + avancées actuelles du web, les microservices (Erlang, Haskell), + viennent du monde fonctionnel, le NoSQL, etc). + Les grandes avancées architecturales (système d'exploitation, linux, etc...) + viennent du monde de l'impératif. + + +Approches par modèles de programmation +-------------------------------------- + +- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un + programme à un endroit et de la reprendre à un autre endroit du programme prévu à + cet effet. Ce mécanisme permet de gérer les situations exceptionnelles. + +- **le paradigme impératif** : les entrées-sorties, les modifications physiques de + valeurs et les structures de contrôle itératives sont possibles. + +- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du + langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions + ou être retournées comme résultat d'un appel de fonction. + +- **le paradigme objet** : La représentation du programme colle à la réalité en + reproduisant des entités relativement proches des objets réel. Attention, le piège + est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le + réel. **C'est en fait un processus d'abstraction comme un autre**. + +Sûreté du langage, typage +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tri par ordre de sûreté croissant : + +0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0... +1. typage dynamique faible : (javascript) (possibilité de changer le prototype + d'un objet pendant l'éxécution du programme, c'est la fête on peut faire + n'importe quoi) +2. typage dynamique fort inféré par le comportement (behavior, duck typing) + (python, ruby, PHP) Le contenu de la variable détermine le choix du typage + `var = 0 -> type int` +3. typage statique déclaré fort (Java) + `int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout) +4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml) + sûreté d'exécution, agilité, sécurité. + + +La syntaxe, la lisibilité +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Importance de la lisibilité (notamment par rapport aux méthodes agiles). + +- courte (python) +- verbeuse (C) +- l'importance des mots clef du langage +- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...) + +Langages compilés ou interprétés ? +----------------------------------- + +.. glossary:: + + langage compilé + + une première passe est faite, des validations son effectuées **avant** + la génération du code objet, cette phase est faite par le compilateur. + + compilateur + + programme qui transforme un langage de haut niveau en un langage de base + niveau + + - phase d’analyse syntaxique (source -> syntaxe abstraite) + - phase de synthèse (syntaxe abstraite -> code objet) + + + scripting (langage de scripting) + + langage interprèté + + générique (langage) + + Langage à usage générique, qui peut être utilisé dans n'importe quel + domaine (par opposition au DSL) + + domain specific + + Domain Specific Language, langage destiné à être utilisé dans un + domaine prédéfini. + + paradigmes + + représentation d'une vision particulière à partir d'un modèle théorique + + impératif + + l'algorithme ressemble à une recette de cuisine, + c'est-à-dire à une succession d'instructions à exécuter + les unes à la suite des autres + + fonctionnel + + l'algorithme ne dépend plus de l'ordre d'exécution d'instructions + pas de mélange entre les données et les traitements + + objets (programmation) + + le monde est découpé en catégories + qui permettent de créer des objets + + **développement par composants** + + les objets sont organisés entre eux par composants suivant des designs patterns, + (patrons de conception) + + garbage collector (ramasse miettes) + + la gestion automatique de la mémoire apparaît en 1989 + + machine virtuelle + + portabilité du code (mais diminution en optimisation et performances) + + JIT (just in time compiler) + + code objet, programmes fonctionnant autour de machines virtuelles + + +- **le typage statique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de la + compilation du programme. Dès lors, il n'est pas nécessaire de faire ces + vérifications durant l'exécution du programme ce qui accroît son efficacité. En + outre, la vérification de type permet d'éliminer la plupart des erreurs introduites + par maladresse ou étourderie et contribue à la sûreté de l'exécution. + +- **le typage dynamique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution + ou de l'appel à certaines parties de codes du programme. + +- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la + totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non + entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité + permet de développer un code générique utilisable pour des structures de données + différentes tant que la représentation exacte de cette structure n'a pas besoin + d'être connue par le code en question. L'algorithme de typage est à même de faire + cette distinction. + +- **l'inférence de types** : le programmeur n'a besoin de donner aucune information + de type à l'intérieur de son programme. Le langage se charge seul de déduire du code + le type le plus général des expressions et des déclarations qui y figurent. Cette + inférence est effectuée conjointement à la vérification, lors de la compilation du + programme. + +Les grands paradigmes de programmation +--------------------------------------- + +Le paradigme des objets +~~~~~~~~~~~~~~~~~~~~~~~ + +- 1962 (SIMULA) : premières notions de classes ; + +Pui, une dizaine d'années plus tard : + +- C++ : intégration des classes pour le C ; +- turbo pascal : intégration des classes pour le pascal ; + +Tous les langages actuels ont intégré des traits objets mais de manière très +différentes : + +- perl (1987) +- python (1991) +- Ruby (1993) + +- L'implémentation des objets en python est très proche des notions initiales de + classes issues du Smaltalk et présente une tentative très intéressante + d'unification des objets et des types depuis python 2.2 ; + +- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la + programmation objet, et des machines virtuelles, mais en fait et avec le recul, + doté d'un support objet lourd et alambiqué. + Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et + qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ; + + +Il n'y a pas **une** POO (Programmation Objet), il y a des POO. +Les implémentations objets dans les langages sont riches et variées : + +- objets obligatoirement construits pas des classes (Java, C++, ...) +- objets sans définition de classes (javascript, Ocaml, go, rust) +- langages à attributs (python) +- langages ou le type des objets est défini par leur classe (python, ruby) +- langages ou le type des objets est différent du type de leur classe (Ocaml) +- objets sans classes mais construits par des prototypes (javascript) +- construction d'objets possibles objets sans classe du tout (Ocaml) +- encapsulation des attributs des objets (Java, Ocaml, C++, PHP) +- pas d'encapsulation des attributs (python, ruby, javascript...) + +Le paradigme impératif +~~~~~~~~~~~~~~~~~~~~~~ + +Un programme est une suite d'états de la mémoire de l'ordinateur, +c'est la suite logique des machines de Turing. +La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme, +et ont une très faible visibilité par rapport aux autres paradigmes existants. +Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner +suivant différents paradigmes, ce sont des programmeurs chevronnés et +cultivés. + +Le paradigme fonctionnel +~~~~~~~~~~~~~~~~~~~~~~~~ + +La notion de fonction que possède sous une forme ou une autre la plupart des +langages est empruntée aux mathématiques et non à l'électronique. D'une manière +générale, les langages substituent des modèles formels aux conceptions purement +calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur +paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le +**mathème fonctionnel** et pas sur la boite noire électronique. La fonction +mathématique apporte un niveau opératoire dans le traitement de l'information. + + +Approche par fonctionnalités +---------------------------- + +Plusieurs domaines de l'informatique on proposé/imposé des méthodologies, +des manières de faire. Ces modèles de programmation on fortement influencé +en retour les langages. On reconnaît aujourd'hui : + +- Le modèle client-serveur +- Le modèle de programmation concurrente (exécution de processus légers, threads) : +- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface) +- Le modèle de développement web (communiquer sur le réseau Internet, API + REST, microservices...) +- Le modèle de programmation système et réseau +- le modèle **Dev Ops** et les méthodes de développement virtualisés +- les langages présentant des **fonctionnalités agiles** + +Conclusion +----------- + +Les langages de haut niveau sont caractérisés par +des concepts tels que : + +- déclaration de valeurs, types, expressions, portée +- expressions, variables, instructions, structures de contrôle +- fonctions, procédures, fermetures +- encapsulation, modules, objets + +=========== ============ +Paradigmes Concepts +=========== ============ +impératif variables, procédures, modules +objets classes, méthodes, héritage, surcharge +fonctionnel fonctions, fermetures, modules +logique prédicats, modules +concurrent tâche/processus, communication +=========== ============ diff --git a/poo/cours/modularite.txt b/poo/cours/modularite.txt new file mode 100644 index 0000000..276d12d --- /dev/null +++ b/poo/cours/modularite.txt @@ -0,0 +1,200 @@ +La programmation structurée +============================= + +Un langage de programmation doit permettre la programmation structurée. + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Structuration d'un programme +----------------------------- + +La réalisation d'applications importantes oblige le programmeur ou l'équipe de +développement à se poser des questions d'organisation et de structuration. +Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les +particularités sont distincts. + +L'écriture des vrais programmes consiste à les structurer pour les présenter +comme un assemblage de briques qui s'emboîtent naturellement. +Ce problème se révèle fondamental dès que la taille des programmes devient conséquente. +Si on ne prend pas garde au bon découpage des programmes en modules indépendants, +on se retrouve rapidement débordé par un grand nombre de variables, +et il devient quasiment impossible de réaliser un programme correct. + +La programmation raisonnée +--------------------------- + +Un **programme** est le codage d'un algorithme dans un langage de programmation. +La programmation consiste à modéliser un problème du monde réel sous une forme +symbolique (pour faire résoudre ce problème par un ordinateur). + +Certains problèmes sont **indécidables** ou **ouverts**. +On utilise un langage de programmation pour décrire la **solution** du programme. +La sémantique du programme est le sens de chacune des constructions du langage. +**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?** + +spécifier + + décrire de manière complète et rigoureuse le problème à résoudre + +modéliser + + proposer une représentation du réel qui soit accessible au calcul + algorithmique + +transcrire + + La transcription du modèle algorithmique se fait dans un langage + de programmation cible adapté au problème + +valider + + La validation du programme est une étape qui permet de s'assurer plus ou + moins fortement que le programme produit les résultats attendus. + La validation va de la série de tests unitaires (validation faible) + à la preuve de programme (validation mathématique forte). + +Conception descendante +----------------------- + +Une vision **centripète** : du général au particulier. + +Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches +de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final. + +On met des *trous* dans les algorithmes de plus haut niveau, +c'est-à-dire des phrases en langage naturel. + +.. ifconfig: exercice + + **Exercice** : **Calculer la date du lendemain** + +.. ifconfig: correction + + - l'algorithme de plus bas niveau + + :: + + lendemain jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le 1er janvier de l'année suivante] + sinon + resultat = lendemain_dansl'année jour + + - les algorithmes de plus bas niveau + + :: + + lendemain_dans_l'année jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le premier jour du mois suivant] + sinon + resultat = jour suivant jour + + :: + + jour_suivant jour = + jour + 1 + + et ainsi de suite jusqu'à ce que toutes les phrases soient calculables. + +Algorithme vague +-------------------- + +L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de +l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est +difficile. + +Voici, tiré du monde réel, un exemple d'algorithme vague +("ce que doit faire une fonction"), placé dans un bout de code +(souvent la **docstring** d'une fonction). + +.. code-block:: python + + def upsert_route(*args, **kwargs): + """ + Create or modify an existant DHCP route + param tuple (id or null, machine name, IP, MAC Adress) + return True or False with error message + """ + # si id présent alors modification sinon ajout + # récupère la liste des réservations en cours + # y cherche la variable sur la base de l'ID + # modifie les valeurs + # applique la nouvelle conf DHCP + + return True + +Voici un autre bout de code avec l'algorithme en commentaire, +et l'implémentation effective de l'algorithme + +.. code-block:: python + + def del_route(*args, **kwargs): + """ + Delete an existant DHCP route + param tuple (id, machine name, IP, MAC Adress) + return True or False with error message + """ + # récupère la liste des réservations en cours + # y cherche la variable sur l'id donné en paramètre + # supprime l'entrée avec vérification que les données fournies + # sont bien dans l'enregistrement à supprimer + # applique la nouvelle conf DHCP + route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17") + routes = get_routes() + if route_to_del in routes: + c = creole_loader(load_extra=True, rw=True) + c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0]) + if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2] + and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]: + c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id) + config_save_values(c, MODNAME) + return True + return False + +Les deux grands paradigmes +--------------------------- + +La modularité +~~~~~~~~~~~~~~ + +Les données et les traitements sont regroupés au sein d'une même entité à deux +facettes : d'un côté le code proprement dit, de l'autre son interface. La +communication entre modules s'effectue via leur interface. La description d'un +type peut être masquée en n'apparaissant pas dans l'interface du module. Ces +types de données abstraits facilitent les modifications d'implantation à +l'intérieur d'un module sans affecter les autres modules qui s'en servent. De +plus, les modules peuvent être paramétrés par d'autres modules augmentant +ainsi leur réutilisabilité. + +Le paradigme objet +~~~~~~~~~~~~~~~~~~ + +Les descriptions des traitements et des données sont regroupées dans des +entités appelées **classes**; un objet est une instance (valeur) d'une classe. +La communication entre objets est réalisée par envoi de message, l'objet +receveur détermine à l'exécution (liaison retardée) le traitement +correspondant au message. En cela, la programmation objet est dirigée par +les données. La structuration d'un programme provient des relations entre +classes, en particulier l'héritage permet de définir une classe par extension +d'une autre. + +En programmation objet, un **programme** est une collection d’objets qui communiquent +entre eux par **message**, le **résultat** est un message envoyé à un objet particulier + +Comparaison entre les deux paradigmes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a dualité entre ces deux modèles. + +- On ne peut pas augmenter les composants d'un type dans un module (pas + d'extensibilité des données), mais on peut ajouter de nouveaux traitements + (extensibilité des traitements) sur ces données. + +- En objet, on peut ajouter des sous-classes à une classe (extensibilité des + données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux + traitements visibles de la classe ancêtre (pas d'extensibilité des traitements). + +**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les +traitements et les données.** diff --git a/poo/cours/modules.txt b/poo/cours/modules.txt new file mode 100644 index 0000000..5df4b5e --- /dev/null +++ b/poo/cours/modules.txt @@ -0,0 +1,313 @@ +La programmation modulaire +=========================== + +Il s'agit de décomposer un grand programme en +morceaux (**modules**) connectés entre eux par des **interfaces** bien +définies. + +Ces modules doivent être aussi indépendants que possible. + +module + + ensemble de ressources liées sémantiquement + +interface + + mode d’emploi du module, avec en plus un principe de masquage + des informations (partie publique, partie secrète) + + +Signatures, type abstrait et langage de modules : la programmation modulaire +permet d'aller très loin dans la programmation structurée. + + +Définir des fonctions dans un fichier séparé +-------------------------------------------- + +Les fonctions peuvent être définies dans un fichier et le programme dans un +autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec +la commande python `nomfichierprogramme.py`, le fichier du programme doit +importer d’abord les fonctions du fichier dans lequel les fonctions sont +définies. + +1. Fichier de fonctions +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + # Fichier foncmaxliste.py + # Recherche le premier élément maximal dans une liste ou + #dans une chaine de caractères + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + +2. Fichier de programme +~~~~~~~~~~~~~~~~~~~~~~~~ + +Pour utilser les fonctions définies dans d’autres fichiers, le fichier de +programme doit commencer par les instructions qui importent ces fichiers de +fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe +ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`. + +.. code-block:: python + + # Fichier progmaxlist.py + from foncmaxliste import max_list + # ou plus simple: + # from foncmaxliste import * + print max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print max_list(’totovaaumarche’) + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +Au lieu d’importer les fonctions, on peut importer le fichier qui définit les +fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera +changé comme suit : + +.. code-block:: python + + # Fichier prog2maxlist + import foncmaxliste + print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + # la syntaxe indiquant le chemin d’acces a la fonction max_list utiliser ‘‘.’’ + couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print foncmaxliste.max_list(’totovaaumarche’) + couple = foncmaxliste.max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +L’exécution directe du premier fichier de programme:: + + python prog max list.py + +L’exécution directe du seconde fichier de programme:: + + python prog2 max list.py + +Définition de l'implémentation d'un module +------------------------------------------- + +Tout fichier qui contient au moins une définition d’une fonction ou d’une +variable est appelé un module (une bibliothèque). Le nom du module est le nom +du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient +au moins une définition d’une fonction ou un fichier qui ne contient que des +définition de fonctions sont des modules. On peut importer un module ou des +fonctions ou variables d’un module dans un programme, comme nous avons vu dans +les exemples ci-dessus. + +.. important:: on peut importer un module, ou bien lancer un module en tant que + programme executable + +.. code-block:: python + + if __name__ == '__main__': + main() + +Pour faciliter la programmation, Python définit un certain nombre de **modules internes**, +appelés les builtins (la librairie standard). + +Par exemple : + +– Lors de l’ouverture d’une session interactive, on est dans un module interne nommé + main . Toutes les variables définies par affectation au niveau de ce module sont valides + globalement dans la session. + +– D’autres modules internes sont string, math, random + +Dans une session de travail sous l’interpréteur Python, la première importation d’un mo- +dule qui, à part des fonctions qu’elle définit, contient des instruction de programme fait +exécuter ces instructions. Dans la même session, les importations suivantes ne font pas +exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule) +(sans sufffixe .py). + +Exemples d'interface +-------------------- + +:: + + type: son type + arguments + arg1 : description de l'argument 1 + arg2 : description de l'argument 2 + préconditions: + arg1 > 10 + postconditions: + result < 19 + raises: TypeError, AssertionError, SystemError... + test: tests nominaux pour chaque cas spécifié + +- L'interface racine carrée + +:: + + racine: + type: float -> float + arguments x: float, flottant dont on veut calculer la racine + pré: x >= 0 + test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError + +- L'interface `lendemain` + +Il faut définir auparavant un type spécifique appelé `date` + +:: + + lendemain: le lendemain est la date qui désigne + le jour suivant de la date passée en argument + type: date -> date + arguments : + d: date + description: la date dont on veut calculer le lendemain + +Le langages des modules +------------------------- + +.. code-block:: ocaml + + module type PILE = (* signature (interface) du module *) + sig + type ’a t + val create : unit -> ’a t + val push : ’a -> ’a t -> unit + val pop : ’a t -> ’a + end + + (* implémentation du module *) + module Pile : PILE = (* le module est restreint + par la signature PILE *) + struct + type ’a t = ’a list ref + let create () = ref [] + let push x p = p := x::!p + let pop p = match !p with [...] + let rec print p = match p with [...] + end + +- `struct .. end` introduit une collection de définitions, valeurs, types ou modules. + C'est une **structure**. + +- `module Nom = struct .. end` permet de donner un nom à cette structure et + c'est ça un module. C'est une structure nommée. + +- `sig ... end` introduit une signature de module : une interface pour un module. + +On restreint souvent une structure par une signature pour "cacher" certaines +définitions. Une signature de module fournit une **interface** entre l'extérieur +et l'intérieur d'un module. + +En dehors du module, on accède à ses composants grâce à la notation pointée + +.. code-block:: ocaml + + let p = Pile.create() + Pile.push 45 p + +Les foncteurs +-------------- + +Si un langage possède un langage de modules, on peut aller plus loin : on peut +considérer un module comme étant une expression de base du langage. + +- La signature d'un module peut être considérée comme le type du module +- La structure du module peut être considéré comme sa valeur + +Quel est l'intérêt ? On peut alors définir des **foncteurs**. + +foncteur + + "fonction" d'une structure vers une autre structure. + On peut ainsi paramétrer un module par un autre module. + +.. code-block:: ocaml + + module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... = + struct + ... + end + +On applique un foncteur à des paramètres modules, pour +obtenir un nouveau module : + +.. code-block:: ocaml + + module M = F (Titi) (Toto) + + +Contrainte de type par signature +------------------------------------ + +:: + + module M = + struct + type t = int * int * int ;; + let make d m y = d, m, y ;; + end ;; + + let d = M.make 8 5 8 ;; + + module type S = + sig + type t ;; + val make : int -> int -> int -> t ;; + end ;; + + module MS = (M:S) ;; + + MS.make 5 1 2 ;; + +Type et signature +------------------ + +:: + + # module type A = sig + val a: int -> int + end ;; + module type A = sig val a : int -> int end + # module B = struct + let a x = x + 1 ;; + end;; + module B : sig val a : int -> int end + # module C = (B:A) ;; + module C : A + + # C.a 2 ;; + - : int = 3 + # + +Module auquel on impose une signature +----------------------------------------- + + +:: + + module type DATE = sig + type t + val make: int -> t + val get_year: t -> int + val get_month: t -> int + end ;; + + module MR = struct + type t = int * int + let make x y = (x, y) + let get_month (x, y) = x + let get_year (x, y) = y + end ;; + + module date = (MR:DATE) ;; diff --git a/poo/cours/presentation.txt b/poo/cours/presentation.txt new file mode 100644 index 0000000..6263f9e --- /dev/null +++ b/poo/cours/presentation.txt @@ -0,0 +1,72 @@ +Avant propos +============ + +Introduction +~~~~~~~~~~~~ + +| "**Que nul n'entre ici s'il n'est géomètre**" +| Maxime apposée au porche d'entrée de l'École de Platon + + +- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique + algébrique. L'algorithmique est un sous-domaine de l'algèbre et des + approches modulaires (arithmétique modulaire...) + +- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de + l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et + seulement du pseudo-code. + L'approche mathématique forte utilisant le formalisme mathématique de + l'algorithmique algébrique est en général enseignée en France uniquement aux cours + des grandes écoles. + +- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche + ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours + réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le + **style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation + existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire, + générique et objet**. Nous envisagerons les structures de données et les structures de contrôle + spécifiques à chacun des styles évoqués. + +- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**, + nous évoquerons un panorama des différents langages existants -- historiques et contemporains -- + en les comparants les uns aux autres. + +- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous + limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation + impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points + de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité. + +Intérêt +------- + + +| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**" +| Thalès de Milet ; Sentences - VIe s. av. J.-C. + +L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie, +en tant qu'art de découper un problème complexe en tâches élémentaires, +en tant qu'énoncés de compréhension et de sémantique, +est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1. +Cette notion d'algorithme est profondément enracinée dans le désir humain de +transmettre des méthodes pour comprendre des problématiques, +qu'il s'agisse de processus scientifiques ou mathématiques, de secrets, +de philosophie ou de divination au sens des anciens Grecs. +De règles linguistiques, aussi, chez les Romains. + +Objectifs de ce cours +~~~~~~~~~~~~~~~~~~~~~ + +Il s'agit de : + +- maîtriser et concevoir un algorithme de base, +- choisir une représentation appropriée des données, +- décomposer en sous-problèmes et affinements successifs, +- savoir organiser son code en fonctions et en modules. + +Le développement raisonné d’algorithmes et leur implantation +permet d'acquérir les qualités suivantes : + ++ Analyser et modéliser un problème, spécifier, ++ Exprimer une problématique, une solution ou un algorithme, ++ Traduire un algorithme dans un langage de programmation, ++ Concevoir une réponse à un problème précisément posé. diff --git a/poo/cours/programme.txt b/poo/cours/programme.txt new file mode 100644 index 0000000..6133cf1 --- /dev/null +++ b/poo/cours/programme.txt @@ -0,0 +1,476 @@ +Définition d'un programme +========================== + +Qu'est-ce qu'un programme ? +---------------------------- + +- Un **programme** est une suite de **phrases** ; +- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ; + +Production d'un programme : + +1. on écrit le code source du programme ; +2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ; +3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme. + +.. important:: + + L'introduction à la compilation et les différentes phases de la compilation + d'un programme sont des sujets qui ne seront pas traités dans ce cours. + +Dans un programme de base, il y a deux fichiers : + +1. un fichier contenant le code : c'est le source du programme. +2. un fichier contenant le code machine : c'est l'exécutable. + +Que peut faire un programme lorsqu'il est exécuté ? +Le programme doit communiquer. S'il reste isolé, il ne pourra pas +produire quoi que ce soit. Voici les trois moyens de communication qu'a un +programme : + +1. communiquer avec l'utilisateur, +2. communiquer avec des fichiers, +3. communiquer avec d'autres programmes. + +Les expressions +---------------- + +expression + + Une expression est une valeur caculée du langage, une opération arithmétique + qui retourne une valeur (entier, texte, valeur logique...). + C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs** + +Par exemple, la ligne suivante est une expression effectuant une addition:: + + 5 + 6 + +Expressions à partir de types de base +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Autres exemples d'expressions : + +- 5 est une expression de type int +- 4.5 est une expression de type float +- 'c' est une expression de type char +- true est une expression de type bool +- print ('c') est une expression de type None +- raw_input est une expression de type string + +Les expressions se complexifient avec la complexification des données et des traitements, +mais le principe de l'expressivité d'un langage reste le même. + + +.. ifconfig:: exercice + + **Exercice** : + Le parenthésage et les opérateurs booléens:: + + Variables A, B, C, D, E en Booléen + Variable X en Entier + Début + Lire X + A <- X > 12 + B <- X > 2 + C <- X < 6 + D <- (A ET B) OU C + E <- A ET (B OU C) + Ecrire D, E + Fin + + **Que valent D et E si X = 3 ?** + + +.. ifconfig:: correction + + **Correction** : D sera VRAI alors que E sera FAUX + + + + +Les déclarations +----------------- + +Un autre exemple d'expression : + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'expression} + \begin{algorithmic}[1] + \BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \end{algorithmic} + \end{algorithm} + +Exemple de déclarations : + +- `a = 1` +- `b = 'c'` + +.. important:: Le signe égal est utilisé de deux manières + + - lors d'une déclaration d'une expression + - lorsque deux expressions sont équivalentes + + Suivant les langages, il y a deux symboles différents, ou alors + ils sont identiques. + +Il s'agit de **renseigner** une valeur dans une expression nommée + +- en javascript : + +.. code-block:: javascript + + var b = "blabla" ; + +- en python : + +.. code-block:: python + + b = "blabla" + +- en java : + +.. code-block:: java + + String b = "A"; + +- en OCaml : + +.. code-block:: ocaml + + let a = 1 + +Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let** +signifie ici véritablement l'instanciation d'une valeur au sens +mathématique du terme : soit `a` l'entier tel que a soit égal à 1... + +En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude +d'appeler des "variables" à propos des affectations, sont en fait des **constantes** +au sens du paradigme impératif de la programmation. + +.. important:: + + Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité. + Pour les autres langages, on utilise `==` ou bien `===` (javascript) car + le `=` est sémantiquement déjà utilisé... + +Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation + +Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit + +- le typage est faible +- le typage est dynamique (calcul du type en fonction du contenu de la + variable) +- le typage est statique et fort mais ça ne se voit pas + (var le système les calcule automatiquement par inférence de type) + +Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose. + +Exemples dans la langue française : + +- Le traitement que le budget **alloue** à ces fonctionnaires. +- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour. + +.. glossary:: + + affectation + + Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable. + + Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée, + comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`. + Dans certains langages, le symbole est considéré comme un opérateur d'affectation, + et la structure entière peut alors être utilisée comme une expression. + D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage. + +Voir aussi : + +- Les déclarations de types primitifs et conversions de type +- Les types de base:: + + Octets (8 bits) byte + Entiers courts (16 bits) short + Entiers (32 bits) int + Entiers longs (64 bits) long + Réels (32 bits) float + Réels longs (64 bits) double + Caractères (16 bits) char + Booléens boolean + +- Déclarations par lots:: + + x1 = e1, x2 = e2, ... xn = en; + +Exercices : algorithmes sur les affectations + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation:: + + Variables A, B, C en Entier + Début + A <- 3 + B <- 10 + C <- A + B + B <- A + B + A <- C + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation + Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ? + :: + + Variables A, B en Entier + Début + A <- 5 + B <- 2 + A <- B + B <- A + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme permettant d’échanger les valeurs + de deux variables A et B, et ce quel que soit leur contenu préalable. + +.. ifconfig:: correction + + **Correction**:: + + Début + A <- n + B <- p + C <- A + A <- B + B <- C + Fin + + Il faut passer par une variable dite temporaire (la variable C) + + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type entier + Début + A <- 423 + B <- 12 + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = 423 + >>> b = 12 + >>> c = a + b + >>> c + 435 + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type texte + Début + A <- "423" + B <- "12" + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = '423' + >>> b = '12' + >>> c = a + b + >>> c + '42312' + +Interaction avec l'utilisateur +------------------------------ + +Il est possible de communiquer de la manière suivante avec un programme : + +- lire et écrire sur l'entrée/sortie standard +- lire et écrire dans un fichier +- afficher (du texte, un nombre...) +- lire (du texte, un nombre...) +- interagir avec les prompts + + +.. code-block:: ocaml + + let x = read_int () in + let signe = + if x >= 0 + then " positif " + else " négatif " in + print_string signe + + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui demande le prénom d'une personne + et renvoie "bonjour, je m'appelle " + +.. ifconfig:: correction + + **Correction** : (implémentation en python) + + .. code-block:: python + + # coding: utf-8 + prenom = raw_input("quel est ton prénom ? \n") + print("bonjour, je m'appelle " + prenom.capitalize()) + + +La REPL (boucle d'interaction) +------------------------------- + +.. glossary:: + + REPL + + Read Eval Print Loop : outil principal de communication avec un programme + ou avec un système. Exemples : la console python, le prompt OCaml. + + interface + + outil de communication avec un programme. + + - interface texte + - interface graphique + +**Exemples de REPL** + +Le prompt python:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + [GCC 5.4.0 20160609] on linux2 + Type "help", "copyright", "credits" or "license" for more information. + >>> + >>> dir() + ['__builtins__', '__doc__', '__name__', readline', 'rlcompleter'] + >>> + +Le prompt ipython:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + Type "copyright", "credits" or "license" for more information. + + IPython 2.4.1 -- An enhanced Interactive Python. + ? -> Introduction and overview of IPython's features. + %quickref -> Quick reference. + help -> Python's own help system. + object? -> Details about 'object', use 'object??' for extra details. + + In [1]: + +Le prompt OCaml (utop):: + + Type #utop_help for help about using utop. + + ─( 09:21:24 )─< command 0 >── + utop # + # let x = 1 in x + 2;; + - : int = 3 + # let y = 1 + 2;; + val y : int = 3 + # y * y;; + - : int = 9 +Construire une boucle d'interaction avec l'utilisateur en python:: + + #!/usr/bin/env python3 + error = True + while error: + try: + entier = int(input('donnez un entier : ')) + error = False + except: + print('une valeur entiere est attendue') + print(entier) + +Lire et écrire dans un fichier +------------------------------ + +Les descripteurs de fichiers (file handle) + +Exemple en python + +.. code-block:: python + + >>> fh = file("test.txt", "w") + >>> fh.write("un contenu exemple") + >>> fh.close() + >>> + +.. code-block:: python + + >>> fh.read() + 'un contenu exemple' + >>> fh.close() + >>> + +Linéarisation (serialisation) de données par exemple en json + +.. code-block:: python + + import json + data = dict(a='essai', b='essai2', c=range(3)) + with open('data.txt', 'w') as outfile: + json.dump(data, outfile) diff --git a/poo/cours/tp.txt b/poo/cours/tp.txt new file mode 100644 index 0000000..3d3ebd5 --- /dev/null +++ b/poo/cours/tp.txt @@ -0,0 +1,101 @@ +Travaux Pratiques +================= + +.. ifconfig:: exercice + + **travaux pratiques :** + + Ecrire un algorithme qui renvoie le résultat d’une mini-calculatrice. Cette + méthode aura + comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « - + », « * », + « / ». + +.. ifconfig:: exercice + + **travaux pratiques :** + + + Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en + paramètre + sont des anagrammes l’un de l’autre. (Lettres identiques mais dans un ordre + différent) + + +.. ifconfig:: exercice + + **travaux pratiques :** + + ascii art (ligne d'étoiles) + + Concevoir un algorithme qui, pour un caractère imprimable et un nombre n + donnés, imprime une barre + horizontale de n de ces caractères. + + ``****************`` + + 2. Modifier l’algorithme pour l’impression d’une barre double. + + :: + + **************** + **************** + + 3. Modifier l’algorithme pour l’impression d’une barre d’épaisseur quelconque + donnée. + 4. (optionnel) Transformer les algorithmes ci-dessus en fonctions. + 5. Écrire un programme Java implémentant la dernière version de l’algorithme + (épaisseur quelconque). + + 3.3 + Triangle de nombres + Concevoir un algorithme qui imprime pour n donné:: + + 1 + 1 2 + 1 2 3 + 1 2 3 4 + 1 2 3 4 5 + ........... + ............. + ............... + 1 2 3 4 5 6 ... n + +.. ifconfig:: exercice + + **travaux pratiques :** + + code de césar : faire un programme pour chiffrer et déchiffrer par décalage + + exemples : Effectue une rotation de x caractères vers la droite:: + + >>> print(chiffre('bonjour', 3)) + erqmrxu + >>> print(chiffre('Bonjour les amis!', 3)) + Erqmrxu ohv dplv! + >>> print(chiffre('Erqmrxu ohv dplv!', 23)) + Bonjour les amis! + +.. ifconfig:: exercice + + **travaux pratiques :** + + :: + + écrire “Entrer un numéro de mois” + mois <- lire + selon que mois est + cas 1 : écrire “janvier (31 jours)” + cas 2 : écrire “février (28 ou 29 jours)” + cas 3 : écrire “mars (31 jours)” + cas 4 : écrire “avril (30 jours)” + cas 5 : écrire “mai (31 jours)” + cas 6 : écrire “juin (30 jours)” + cas 7 : écrire “juillet (31 jours)” + cas 8 : écrire “août (31 jours)” + cas 9 : écrire “septembre (30 jours)” + cas 10 : écrire “octobre (31 jours)” + cas 11 : écrire “novembre (30 jours)” + cas 12 : écrire “décembre (31 jours)” + défaut : écrire “numéro invalide” + fselon diff --git a/poo/diapos/Makefile b/poo/diapos/Makefile new file mode 100644 index 0000000..fd60fc0 --- /dev/null +++ b/poo/diapos/Makefile @@ -0,0 +1,47 @@ +RST = python tools/rst.py + +TEXDOCUMENTS = $(basename $(wildcard *.tex)) +RSTDOCUMENTS = $(basename $(wildcard *.txt)) + +SOURCES = $(addsuffix .tex,$(TEXDOCUMENTS)) +DVI = $(addsuffix .dvi,$(TEXDOCUMENTS)) +POSTSCRIPT = $(addsuffix .ps,$(TEXDOCUMENTS)) +POSTSCRIPT_GZ = $(addsuffix .ps.gz,$(TEXDOCUMENTS)) +PDF = $(addsuffix .pdf,$(TEXDOCUMENTS)) +RSTSOURCES = $(addsuffix .txt,$(RSTDOCUMENTS)) +HTML = $(TEXDOCUMENTS) $(addsuffix .html,$(RSTDOCUMENTS)) + +all: dvi ps ps.gz html +dvi: $(DVI) +ps: $(POSTSCRIPT) +ps.gz: $(POSTSCRIPT_GZ) +pdf: $(PDF) +html: $(HTML) + + +${DVI}: %.dvi: %.tex + latex $< + latex $< + +${POSTSCRIPT}: %.ps: %.dvi + dvips -o $@ $< + +${POSTSCRIPT_GZ}: %.ps.gz: %.ps + gzip -c $< > $@ + +${PDF}: %.pdf: %.tex + rm -f $*.out $*.log $*.aux + xelatex $< + rm -f $*.out $*.log $*.aux + +%: %.tex %.dvi + latex2html -local_icons $< + touch $@ + +%.html: %.txt + $(RST) $< > $@ + + +clean: + rm -f -- *~ *.log *.aux *.out *.nav *.snm *.toc ${DVI} ${POSTSCRIPT} ${POSTSCRIPT_GZ} ${PDF} + rm -fr ${HTML} diff --git a/poo/diapos/beamer.tex b/poo/diapos/beamer.tex new file mode 100644 index 0000000..62eb264 --- /dev/null +++ b/poo/diapos/beamer.tex @@ -0,0 +1,268 @@ +\documentclass[ignorenonframetext]{beamer} +\usepackage{graphicx} +% Internal links only wors with second screen on the right +% \setbeameroption{show notes on second screen} +\usetheme{Madrid} +\usecolortheme{dolphin} + +% gets rid of bottom navigation bars +\setbeamertemplate{footline}[frame number]{} + +% gets rid of navigation symbols +\setbeamertemplate{navigation symbols}{} + +%\usetheme{Warsaw} +%\usepackage[french]{babel} +%\usepackage[utf8,utf8x]{inputenc} +%\usepackage[T1]{fontenc} + + +% Replace babel +\usepackage{polyglossia} +\setdefaultlanguage{french} + +%% Require XeTeX +\usepackage{xltxtra} +\usepackage{fontspec} +\usepackage{xunicode} + +\logo{ + \hspace{120pt} + \includegraphics[width=2cm]{img/cesi.jpg}~ + \hspace{113pt} + \includegraphics[width=1cm]{img/logo-cadoles.png}~ +} + + +%%\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}} + +\title[]{Algorithmique} + +\subtitle{CESI alternance} +\subtitle{promotion GMSI B3} + +\author[Gwenaël Rémond]{} + +%\institute[E.O.L.E]{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}} +\institute[Cadoles]{\includegraphics[width=2cm]{img/cesi.jpg}} + +%\date{{\small 8 avril 2013}} + +\subject{Talks} + +\AtBeginSection[] % Add a TOC with current section highlighted +{ + \begin{frame} + \frametitle{Plan} + \tableofcontents[currentsection] + \end{frame} +} + + +\usepackage{hyperref} +\usepackage{hyperxmp} +\hypersetup{% + colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone, + pdftitle={EAD3}, + pdfsubject={Présentation technique d'EWT}, + pdfauthor={EOLE}, + pdfkeywords={EOLE, J-EOLE, distribution, GNU, Linux, Éducation, + nationale, Ubuntu}, + pdflang={fr-FR}, + pdfcopyright={Copyright © 2017 Équipe EOLE }, % Require XeTeX + pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}, +} + +\parskip=0.8em + +\begin{document} + +\frame{\titlepage} + +\section{Introduction} +\begin{frame} +\frametitle{Objectifs} + +\texttt{ + "Il ne suffit pas d'avoir les mains propres, \\ + il faut aussi avoir l'esprit pur."\\ +} +\emph{Thalès ; VIe s. av. J.-C.} + +\begin{itemize} +\item<1-> maîtriser et concevoir un algorithme, +\item<2-> choisir une représentation appropriée des données, +\item<3-> décomposer en sous-problèmes et affinements successifs, +\item<4-> savoir organiser son code et faire des petits programmes en python. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'art de programmer} +\texttt{GEEK SUBLIME (Vikram CHANDRA) +Une vision esthétique, littéraire, mathématique du codage} + +\begin{itemize} +\item<1-> Programmer, c'est abstraire, prendre du recul. +\item<2-> Abstraire, par rapport à quoi ? Par rapport à la machine +\item<3-> Les niveaux d'abstraction par rapport à la machine +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les langages de programmation} +\begin{itemize} +\item Qu'est-ce qu'un langage de programmation ? +\item Les grands paradigmes de programmation (procédural, objet, fonctionnel, modulaire, générique \dots) +\item L'historique des langages. +\end{itemize} +\end{frame} + +\section{Algorithmique} +\begin{frame} +\frametitle{Les algorithmes} +\begin{itemize} +\item définition d'un algorithme +\item implémentation d'un algorithme +\item représentation d'un algorithme dans un langage cible +\end{itemize} +\end{frame} + +\section{Algorithmique pour la programmation} + +\begin{frame} +\frametitle{Qu'est-ce qu'un programme ?} +\begin{itemize} +\item <1-> Les expressions +\item <2-> Les déclarations +\item <3-> La REPL (Read Eval Print Loop) +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Approche générale des fonctions} +\begin{itemize} +\item Les procédures +\item La portée d'une variable +\item Les fonctions +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Les structures de contrôle} +\begin{itemize} +\item Le branchement conditionnel +\item L'itération +\item \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les structures de données} +\begin{itemize} +\item Les listes +\item Les dictionnaires +\item Les arbres, les graphes \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'état de l'art de l'agorithmique} +\begin{itemize} +\item en mathématiques + \begin{itemize} + \item algorithmique algébrique, + \item arithmétique modulaire, + \item \dots + \end{itemize} +\item en informatique + \begin{itemize} + \item en informatique fondamentale + \item en langages de programmation + \item dans touts les domaines où l'informatique intervient\dots + \end{itemize} +\item en sciences physique, en biologie +\item en sciences sociales (réseaux sociaux, auto-organisation\dots) +\end{itemize} +\end{frame} + +\section{Programmation modulaire} +\begin{frame} +\frametitle{La programmation modulaire} +\begin{itemize} +\item La programmation raisonnée +\item Le paradigme modulaire vs le paradigme objet +\item exemple de programmation modulaire en python +\end{itemize} +\end{frame} + + + + +% Not present in TOC +\appendix + +\begin{frame}[label=thanks]{Remerciements} + + Je remercie la communauté du logiciel libre pour tous ces + merveilleux logiciels sans lesquels si peu de choses existeraient. + + Cette présentation a été réalisée grâce aux logiciels libres + suivants~: + + \begin{itemize} + \item Le système de composition \LaTeX{} + \href{https://fr.wikipedia.org/wiki/TeX_Live}{TeX Live} + \item L'éditeur de texte + \href{http://www.vim.org/}{Vim} + \item L'environnement graphique + \href{http://gnome.org/}{Gnome} + \item Le système d'exploitation + \href{https://debian.org/}{Debian} + \end{itemize} + + \begin{center} + % Do not mess with graphics + \hypersetup{hidelinks} + \begin{tabular}{cccccc} + \href{http://www.gnu.org}{\includegraphics[height=1.3cm]{graphics/gnu-head.pdf}} & + \href{http://www.kernel.org}{\includegraphics[height=1.2cm]{graphics/tux.pdf}} & + \href{http://www.debian.org/}{\includegraphics[height=1cm]{graphics/debian.eps}} & + \href{https://fr.wikipedia.org/wiki/TeX_Live}{\includegraphics[height=1cm]{graphics/texlive.pdf}} + \end{tabular} + \end{center} + +\end{frame} + +\begin{frame}[label=license]{Licence} + Cette présentation est mise à disposition sous licence\\ + \href{http://creativecommons.org/licenses/by-sa/4.0}% + {Creative Commons \textsc{by-sa 4.0}} + \begin{columns}[t] + \begin{column}{5.5cm} + \begin{itemize} + \item Attribution + \end{itemize} + \end{column} + \begin{column}{6.5cm} + \begin{itemize} + \item Partage dans les mêmes conditions + \end{itemize} + \end{column} + \end{columns} + Vous pouvez obtenir une copie de la licence + \begin{block}{par Internet} + \href{http://creativecommons.org/licenses/by-nc-sa/4.0}% + {\url{http://creativecommons.org/licenses/by-nc-sa/4.0}} + \end{block} + \begin{block}{par courrier postal} + \begin{quote} + Creative Commons\\ + 444 Castro Street, Suite 900 Mountain View,\\ + California, 94041, USA. + \end{quote} + \end{block} +\end{frame} + +\end{document} diff --git a/poo/diapos/graphics/Logo-EOLE.eps b/poo/diapos/graphics/Logo-EOLE.eps new file mode 100644 index 0000000..13f4889 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLE.eps @@ -0,0 +1,133 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:20:58 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 232 85 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 232 85 +%%EndPageSetup +q 0 -1 232 86 rectclip q +0.290196 0.247059 0.454902 rg +133.668 16.757 m 133.668 16.757 133.25 1.257 148.941 1.257 c 176.328 1.257 + l 170.723 3.749 168.633 5.874 164.891 10.585 c 150.969 10.585 l 147.234 + 10.585 145.441 13.222 145.441 17.538 c 145.441 17.538 145.492 75.363 145.414 + 75.445 c 142.301 82.999 133.668 84.519 133.668 84.519 c 133.668 83.995 +133.676 39.347 133.668 16.757 c h +133.668 16.757 m f +41.039 38.73 m 41.207 38.808 41.25 38.921 41.457 39.109 c 41.5 40.347 41.375 + 41.511 41.164 42.823 c 40.625 46.238 40.664 49.726 41.207 53.07 c 41.125 + 53.214 l 41.043 53.366 40.914 53.405 40.914 53.405 c 40.664 53.48 40.414 + 53.554 40.121 53.515 c 35.613 53.366 31.141 52.577 26.758 51.265 c 24.457 + 50.702 22.16 50.14 19.863 49.577 c 17.984 49.015 16.688 48.152 15.812 46.913 + c 16.062 46.839 16.145 46.691 16.23 46.538 c 16.48 46.464 l 16.395 46.238 + l 15.98 45.863 15.812 45.409 15.895 44.886 c 15.977 44.738 16.105 44.698 + 16.188 44.55 c 16.523 44.327 16.859 44.101 17.062 43.909 c 17.234 43.988 + 17.234 43.988 17.355 43.952 c 17.523 44.027 17.816 44.062 18.023 44.249 + c 18.316 44.288 18.445 44.249 18.57 44.21 c 24.836 43.464 30.973 41.999 + 37.027 39.933 c 37.152 39.894 37.281 39.855 37.242 39.749 c 37.324 39.597 + 37.449 39.558 37.406 39.445 c 37.91 39.296 l 38.91 38.995 39.785 38.734 + 40.75 38.698 c 40.914 38.769 40.914 38.769 41.039 38.73 c 39.117 40.687 + m 38.117 40.988 l 39.078 40.948 l 39.16 40.796 39.117 40.687 39.117 40.687 + c f +49.855 72.859 m 49.855 72.859 54.316 79.749 63.262 84.269 c 13.684 84.269 + l 0.484 84.269 0.527 73.152 0.527 73.152 c 0.527 17.499 l 0.527 17.499 +0.117 1.984 15.809 1.984 c 64.07 1.984 l 58.465 4.472 54.559 8.597 50.816 + 13.308 c 50.816 13.308 15.844 13.296 15.891 13.308 c 11.449 13.308 12.086 + 17.542 12.086 17.542 c 12.156 69.034 l 12.156 73.109 15.902 72.859 15.902 + 72.859 c f +69.723 45.148 m 69.723 45.148 66.891 28.866 79.219 23.05 c 84.949 20.351 + 89.504 19.945 95.855 22.363 c 99.852 23.882 103.457 27.659 104.977 31.769 + c 106.496 35.878 105.191 40.874 101.199 44.757 c 99.793 38.538 98.297 33.53 + 92.91 30.741 c 89.711 29.116 86.457 29.386 83.211 30.995 c 79.961 32.605 + 77.473 36.48 76.484 40.363 c 76.484 40.363 74.473 47.585 82.195 59.417 +c 75.809 56.718 70.875 52.245 69.723 45.148 c h +69.723 45.148 m f +0.945098 0.792157 0.0745098 rg +110.621 8.773 m 117.836 13.503 123.312 20.792 125.211 30.261 c 125.238 +30.429 l 126.707 37.968 125.305 45.933 121.43 52.601 c 117.527 59.308 110.711 + 64.777 102.098 65.82 c 102.074 65.831 l 96.797 66.464 90.988 64.273 86.93 + 60.507 c 82.406 55.163 80.273 51.816 80.387 44.03 c 84.254 49.132 94.043 + 54.202 100.949 53.523 c 105.414 52.984 108.629 50.445 110.898 46.542 c +113.168 42.636 114.066 37.445 113.184 33.058 c 110.383 19.085 94.641 12.073 + 81.125 15.976 c 62.398 21.382 55.426 40.464 63.086 58.038 c 72.824 73.859 + 90.422 80.905 113.074 77.519 c 105.887 85.03 93.703 83.984 93.703 83.984 + c 82.363 84.874 61.398 78.519 53.613 63.808 c 42.234 42.316 52.059 11.566 + 78.055 4.062 c 89.188 0.847 101.344 2.695 110.621 8.777 c h +110.621 8.773 m f +0.290196 0.247059 0.454902 rg +194.387 67.495 m 185.594 67.495 178.215 64.179 172.285 57.597 c 166.355 + 51.011 164.41 42.503 164.41 32.046 c 164.41 20.98 166.184 15.999 171.609 + 9.894 c 180.992 -1.075 203.68 1.32 210.367 1.402 c 217.055 1.484 219.438 + 1.644 231.012 0.57 c 228.027 5.839 220.824 9.495 218.348 10.011 c 206.766 + 12.195 193.328 8.179 181.414 15.484 c 176.691 19.57 175.734 22.14 175.559 + 29.62 c 223.012 29.62 l 223.012 35.269 l 223.012 45.374 219.598 53.257 +214.785 58.945 c 208.164 64.816 201.25 67.409 194.387 67.495 c h +194.184 58.421 m 199.434 58.421 203.531 56.702 206.484 53.245 c 209.438 + 49.788 211.941 44.956 211.984 38.745 c 175.684 38.745 l 175.715 44.808 +177.715 49.339 181.262 52.972 c 184.805 56.601 189.109 58.421 194.184 58.421 + c h +194.184 58.421 m f +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/poo/diapos/graphics/Logo-EOLE.svg b/poo/diapos/graphics/Logo-EOLE.svg new file mode 100644 index 0000000..f55c0d7 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLE.svg @@ -0,0 +1,1277 @@ + + + +image/svg+xml       \ No newline at end of file diff --git a/poo/diapos/graphics/Logo-EOLEienne.eps b/poo/diapos/graphics/Logo-EOLEienne.eps new file mode 100644 index 0000000..72c3b78 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLEienne.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:15:46 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 1660 851 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font DejaVuSans-Bold +11 dict begin +/FontType 42 def +/FontName /DejaVuSans-Bold def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<000100000009008000030010637674203eb93108000000e8000002546670676d5b026bf00000 +033c000000ac676c7966e2f9cb840000009c0000004c686561640e24be09000003e800000036 +686865610eaf07730000042000000024686d74780796006600000444000000086c6f63610000 +00980000044c0000000c6d6178700647062d0000045800000020707265707c61a2e700000478 +000007a700020066fe96046605a400030007001fbc00040126000000060126b6010805890204 +002fc4d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206 +2900000001660133016600bc00e90000013d00a200fa031f00020002006601660002000200ac +015400ec00bc006201660181048501540166016d04a400020166007f04cd0000000201330062 +00710000002504a401bc00ba00e500660181018d0548055a0166016d000000000002000200f6 +05c301f0053902390058046d043d04b2048104b2016601750466048100b00466043902d1049c +047b04cf047b005801330166014c0166014c000200ac009a014a0123009a029a014401190144 +02cd00c100000166013f019a013b05cb05cb00d500d5015000ac00ac0077020a01c701f2012f +015801b2012300f600f6011f012f0135023501ee01e70133009800d10358050a009a008f0112 +009800bc00cd00e500e500f2007304000166008f05d5022b05d500c300e100d700e50000006a +01020000001d032d05d505d505f000a8006a00ec00e1010205d506140721046602f800ec0183 +02a602f80123010201020112011f031f005e03cd046004c7048900ec01bc00ba01020333031f +03420333035c0112011f05d5019a009a00e106660179046004600460047b000000ec02c302b8 +02cd00be00dd00d50000006a025c027b029a00dd01ae01ba01120000008501ae04600762041b +009a069a045800ee009a029a00d102cd019a015005cb05cb008b008b063100f6040600f0034c +016004a800c10000002505c101000121074a06120096014a078300a800000337007b00140000 +00c9010005c105c105c105c101000108061d00960427039e00ec0102027d0133009800d10358 +017900cd02390362009c009c009c009301b8009300b80073000014000326b707060504030201 +002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720 +b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ff +ff5058041b0559b0051cb0032508e12d2c4b505820b80128454459212d2cb002254560442d2c +4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b02063 +68208a108a233a8a10653a2d0001000000025eb8b54203fc5f0f3cf5001f080000000000d3d9 +0a2000000000d3d90a20f772fcae0fcd096500010008000000010000000000010000076dfe1d +00001021f772f9320fcd00010000000000000000000000000000000204cd006602c900000000 +00000000004c0000004c000100000002034e002b0078000c0002001000400008000005ed0221 +0008000441840280012600fe000301250011000301240121003a0005012400fa000301230016 +000301220121003a0005012200fe00030121003a0003012000fa0003011f00bb0003011e0064 +0003011d00fe0003011c00190003011b001e0003011a00fe0003011900fe0003011800fe0003 +011700fe0003011600fe000301150114000e0005011500fe00030114000e0003011300fe0003 +011200fe0003010f010e007d0005010f00fe0003010e007d0003010d010c008c0005010d00fe +0003010d00c00004010c010b00590005010c008c0003010c00800004010b010a00260005010b +00590003010b00400004010a00260003010900fe0003010800fe00030107000c000301070080 +00040106b2972e054113010600fa0003010500fa0003010400fe0003010300190003010200fa +0003010100fa0003010040ff7d03ff3e03fefe03fcfb2c05fcfe03fb2c03fafe03f9f84705f9 +7d03f84703f7fa03f6fe03f5fe03f4fe03f3bb03f2fe03f1fe03f0fe03ef1e03eefe03edec0a +05edfe03ec0a03ec4004ebea0a05eb3203ea0a03e9fa03e8911605e8fe03e7fa03e6fa03e591 +1605e5fe03e4fe03e3fe03e2fe03e1fe03e0fe03dffe03defa03dddc1805dd6403dc1803dba0 +1e05db6403dad92505dafa03d92503d8d12505d8fa03d7d61405d71603d6d51005d61403d510 +03d4d30b05d42003d30b03d2d12505d2fa03d1911605d12503d0940c05d02303cfce1405cf26 +03cecd1205ce1403cd1203cc911605cc1d03cb1403cac9bb05cafe03c9c85d05c9bb03c98004 +c840ffc72505c85d03c84004c72503c6fe03c56403c4901005c4fe03c31c03c2fe03c1fe03c0 +bf3a05c0fa03bfad1b05bf3a03bebd1a05be3203bdbc1105bd1a03bcbb0f05bc1103bbba0c05 +bb0f03ba0c03b9911605b9fe03b8fe03b71503b61203b5fe03b4fe03b3fe03b21703b11903b0 +1603afad1b05affa03aead1b05aefa03ad911605ad1b03ac911605ac7d03abfe03aa2603a9fe +03a8fe03a7fe03a6fe03a50a03a4fe03a3a20e05a3fe03a20e03a24004a1a01e05a1fa03a091 +1605a01e039f9116059ffa039e940c059e1c039dfe039c9bbb059cfe039b9a5d059bbb039b80 +049a8f25059a5d039a400499fe0398972e0598fe03972e0396911605961e40ff0395940c0595 +2003940c0393911605934b039291160592fe03919010059116039010038f25038efe038dfe03 +8cfe038bfe038afe0389fe038887250588fe0387250386fe0385fe0384320383960382fe0381 +fe038019037f0a037efe037dfe037cfe037bfa037afa0379fe037776a60577fe0376a6037574 +1b0575fa03741b0373fa03727d0371fe03706f2c056f2c036efa036dfa036cfa036bfe036afe +0369fe0368630c0568320367fe0366320365640a0565fe03640a0364400463620a05630c0362 +0a0361601505619603600111056015035f0a035efe035dfe035c0111055cfe035b5a1b055bfe +035a0111055a1b0359fe0358fa0357fe035601110540ff56fe0355fe03541e03531403525119 +0552fa0351011105511903504f190550fa034f4e11054f19034e11034d1e034c4b14054c1503 +4b4a11054b14034a490e054a1103490e0348fa034746140547150346140345fa0344430e0544 +0f03430e034241250542fa0341011105412503403f0f0540fe033f3e0e053f0f033e0e033d3c +0d053d16033c0d033b64033afe0339140338fe0337130336351a0536250335341405351a0335 +c004340a0d0534140334800433320c05331403334004320c033130a60531fe033001110530a6 +032f0c032e13032d2c3a052dfa032c1525052c3a032b64032a640329fe032815032717110527 +1e03262003251e0324231105402b241e0323110322000d0522fa03210f032140042014031f0a +031e1e031d1c19051d25031c0f13051c19031cb801004091041b0d031a194b051a7d03190111 +05194b0318fe031711031615250516fa031501110515250314640313110312fe031101110511 +fe031064030f0e10050f13030fc0040e10030e80040d0111050dfa030c32030b0a0d050b1603 +0b80040a0d030a400409fe0308fe0307fe0306050a0506fe03050a0305400404fa0303640302 +01110502fe0301000d05011103000d0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d0000> +] def +/f-0-0 currentdict end definefont pop +%%EndResource +%%BeginResource: font DejaVuSans +11 dict begin +/FontType 42 def +/FontName /DejaVuSans def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<0001000000090080000300106376742000691d39000000e0000001fe6670676d7134766a0000 +02e0000000ab676c7966f9f1ddd70000009c00000044686561640d13be360000038c00000036 +686865610d9f076f000003c400000024686d747807580066000003e8000000086c6f63610000 +0088000003f00000000c6d617870046f0671000003fc00000020707265703b07f1000000041c +0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec +310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629013500b8 +00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189 +022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4 +009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2 +055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd +03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a +009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083 +0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4 +009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3 +00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139 +0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460 +0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f +007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2 +002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029 +006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859 +212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559 +b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d +2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45 +442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000 +00025eb862af5a3e5f0f3cf5001f080000000000d3d90a2c00000000d3d90a2cf7d6fc4c0e59 +09dc00000008000000010000000000010000076dfe1d00000efef7d6fa510e59000100000000 +00000000000000000000000204cd0066028b0000000000000000004400000044000100000002 +0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9 +2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96 +03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453 +03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03 +d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe +03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe +03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb +05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03 +b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa +03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe +039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05 +97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590 +bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103 +89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382 +110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe +03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b +fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360 +fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505 +55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10 +034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344 +fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d +053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b +03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c +32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b +0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c +fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03 +13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c +16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503 +fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b1d00> +] def +/f-1-0 currentdict end definefont pop +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 1660 851 +%%EndPageSetup +q 0 -1 1660 852 rectclip q +0 g +BT +115.200005 0 0 115.200005 1659.494566 0.0000456218 Tm +/f-0-0 1 Tf +( )Tj +ET +0.945098 0.792157 0.0745098 rg +158.102 787.356 m 160.379 829.535 l 190.289 799.809 l h +158.102 787.356 m f +21.06434 w +0 J +0 j +[] 0.0 d +4 M q 0.380357 -1 -0.775998 -0.295156 0 1266.965088 cm +471.528 27.38 m 435.436 6.755 l 471.344 -14.188 l h +471.528 27.38 m S Q +58.695 757.856 m 80.516 721.688 l 39.07 729.465 l h +58.695 757.856 m f +18.464385 w +q -1 0.699805 0.543047 0.775998 0 1266.965088 cm +-278.556 -404.865 m -310.193 -422.942 l -278.719 -441.304 l h +-278.556 -404.865 m S Q +10.25 623.512 m 41.414 613.496 l 14.113 596.141 l h +10.25 623.512 m f +17.112694 w +q -1 -0.121862 -0.110002 0.811158 0 1266.965088 cm +75.757 -781.871 m 46.436 -798.623 l 75.608 -815.637 l h +75.757 -781.871 m S Q +101.438 509.071 m 70.375 498.742 l 82.148 528.875 l h +101.438 509.071 m f +12.576204 w +q 1 0.937579 0.772771 -0.802194 0 1266.965088 cm +-330.318 558.711 m -351.867 546.4 l -330.429 533.894 l h +-330.318 558.711 m S Q +0.290196 0.247059 0.454902 rg +161.094 604.578 m 161.094 604.578 152.773 561.961 192.316 543.309 c 210.699 + 534.641 225.316 533.344 245.688 541.098 c 258.508 545.977 270.074 558.094 + 274.949 571.278 c 279.824 584.461 275.645 600.489 262.836 612.942 c 258.316 + 592.989 253.516 576.926 236.242 567.981 c 225.973 562.762 215.535 563.629 + 205.117 568.793 c 194.703 573.957 186.715 586.391 183.539 598.844 c 183.539 + 598.844 177.09 622.012 201.859 659.969 c 182.059 644.739 164.789 627.348 + 161.094 604.578 c h +161.094 604.578 m f +0.945098 0.792157 0.0745098 rg +293.059 497.508 m 316.207 512.684 333.766 536.067 339.859 566.434 c 339.953 + 566.977 l 344.664 591.156 340.164 616.715 327.734 638.102 c 315.219 659.625 + 293.348 677.164 265.715 680.52 c 265.637 680.531 l 248.703 682.571 230.078 + 675.531 217.055 663.453 c 202.543 646.313 195.703 635.578 196.059 610.594 + c 208.465 626.961 239.875 643.227 262.027 641.047 c 276.348 639.321 286.664 + 631.18 293.949 618.653 c 301.23 606.125 304.105 589.465 301.281 575.391 + c 292.289 530.563 241.789 508.082 198.43 520.598 c 138.359 537.934 116.312 + 599.153 133.5 657.778 c 160.254 711.746 268.816 729.453 286.945 734.754 + c 280.277 744.656 213.539 742.957 213.539 742.957 c 180.559 734.364 130.008 + 728.141 104.754 682.086 c 53.828 589.199 105.188 506.442 188.582 482.371 + c 224.301 472.059 263.293 477.992 293.055 497.504 c h +293.059 497.508 m f +0 g +BT +32.000001 0 0 32.000001 1361.895445 368.012451 Tm +/f-1-0 1 Tf +( )Tj +ET +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/poo/diapos/graphics/Logo-EOLEienne.svg b/poo/diapos/graphics/Logo-EOLEienne.svg new file mode 100644 index 0000000..7a2c713 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLEienne.svg @@ -0,0 +1,779 @@ + + + +image/svg+xml    \ No newline at end of file diff --git a/poo/diapos/graphics/Logo-MENESR.jpg b/poo/diapos/graphics/Logo-MENESR.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02d68704027f8a225c05e87cd8888e10b501976e GIT binary patch literal 9572 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 kPeX(!w4*50O%Ux2LJ#7 literal 0 HcmV?d00001 diff --git a/poo/diapos/graphics/Logo-PCLL.eps b/poo/diapos/graphics/Logo-PCLL.eps new file mode 100644 index 0000000..f151afd --- /dev/null +++ b/poo/diapos/graphics/Logo-PCLL.eps @@ -0,0 +1,927 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:27:36 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 -1 300 165 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 300 165 +%%EndPageSetup +q 0 -1 300 166 rectclip q +0.32549 0.286275 0.529412 rg +197.438 160.944 m 171.461 160.944 148.402 148.244 134.059 128.76 c 154.211 + 128.76 l 165.531 139.28 180.707 145.713 197.438 145.713 c 214.016 145.713 + 229.07 139.405 240.355 129.057 c 260.641 129.057 l 246.285 148.385 223.293 + 160.944 197.438 160.944 c h +132.855 37.463 m 147.086 17.01 170.703 3.549 197.438 3.549 c 223.234 3.549 + 246.145 16.073 260.508 35.323 c 240.219 35.323 l 228.949 25.041 213.953 + 18.772 197.438 18.772 c 179.809 18.772 163.918 25.92 152.438 37.463 c h +132.855 37.463 m f* +4.26191 w +2 J +0 j +[] 0.0 d +5 M q 1 0 0 -1 0 164.490509 cm +197.438 3.547 m 171.461 3.547 148.402 16.246 134.059 35.73 c 154.211 35.73 + l 165.531 25.211 180.707 18.777 197.438 18.777 c 214.016 18.777 229.07 +25.086 240.355 35.434 c 260.641 35.434 l 246.285 16.105 223.293 3.547 197.438 + 3.547 c h +132.855 127.027 m 147.086 147.48 170.703 160.941 197.438 160.941 c 223.234 + 160.941 246.145 148.418 260.508 129.168 c 240.219 129.168 l 228.949 139.449 + 213.953 145.719 197.438 145.719 c 179.809 145.719 163.918 138.57 152.438 + 127.027 c h +132.855 127.027 m S Q +q +0 164.491 300 -165 re W n +% Fallback Image: x=0 y=0 w=300 h=165 res=300ppi size=2580000 +[ 0.24 0 0 0.24 0 -0.629491 ] concat +/DeviceRGB setcolorspace +8 dict dup begin + /ImageType 1 def + /Width 1250 def + /Height 688 def + /Interpolate false def + /BitsPerComponent 8 def + /Decode [ 0 1 0 1 0 1 ] def + /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def + /ImageMatrix [ 1 0 0 -1 0 688 ] def +end +image +Gb"-V#C$t`_Z+TWTnl<<&Yt88b,Xs2W2ka,:g=(M65>*n8eDZ2(mhN?N"B_H["+5p+.A + <))6]`'+5R]f?:_V:#om[bNcc\tLR=!98HgXVBTBGt8j6i'dBCB!VHZ0u + LnW#DWd,0R#dci1=3U^ZdGoX-LFj.hBC\rto0E=uRLJqe*Nd:%%]!1bkYap\`u6@:BmK-Uc + 5g>UMEJ*k$.Wb'gn1*Bef>o]]:Gf<3sE'j1,Z"98E%!&0DO@_$gHB)L'Jd6!Aj>dd-Z_$Ql + d+#\((^Rd`c/[fRU`nI`_piL1([`;HJIf)B3o]8[)<\0UO[:\OWQsK50rk*LSHE-6H(]XO9 + !:U!!3I)DRYO1(c,'*K$Z_hXXmCRIJh`4t(:28U0V"0sgfaIn(XcMmBtP)dsQq(cBtn\H2 + -ejdIEsMkN,QH!<<*"5Y>p3hSflS@s5hHL[>Ke]mN)Ki3l?M/+8!@)GsdeGPc7$nF4f8>B` + KSSN1h\h?j5_!!(_jVI]&NHW"r`s,kM$opdIgQ1As^O41hr(fC25`[kI<^ACIfRIp,&e]/a + 3!!!!592!Ng4*5X76qkD[jh8;)k1N:RG:Uc1kEcj;q^`)F]/=2%HqJFjlE^Qm!!!#c/gi%@ + k`Kr0(@N15CNtoc;jI)4o!!?so'>tn[.0o?O'M\)ab5S"4;\%u!'n8<1F6O,FSrf0c%?8Fj + borfRLUph%NDc/FRI]^HVa4c?iU0,!&!GT;Y&uCZ%2qf'L1K:!!z$G*=?SD2;1:qmR5>? + \hkb/8-_Y@)?*Lf5KZ.nB9C#ljr*TE%PGHZe#)BHQ^=D85";1#r@Lhe^MUT1*Nrm_,-TXSQ + `:!!!"\5NV!0iXVLg$/3n@lZD57Lq$9qm6#N'i49#;:Zgg#WBQ4@!!!#/]GoJO2Qf2&k1B) + 4/]T=/42duEWO;d$OisIW*PRrY2cp(\!!$-aE`2IcLmUL,6Tc=`.;q-jT;?\jOi%AU=M&>* + NU,@D(]XO9J + ohRAcLRgDP:kZfrGDT8!!&\9okUP$(C]Lr3H^deULXE.,!3.KX1X&r@PAfc`s% + E.*j[@\0@-Bh4Tk`b!5KRecWln:gP13,3Dk(^+N3Dao:!="p6J>fY,d"9!<<*"YYf"Ep82s + ;#PAU)hCiD[R\;JBBQ:DLB.AT!&3^)l,t59S%`Vn??rFk`(ojnoFD@d + 4IL.[ot(Y5!!'f%V5It.MqmLOH^=4,6&^9n:J!!&s/Yup]fs#FoB6I/-dCB>[%e&oSSDs625qbC>)+#!Zp!8puDkuhe'mH + `SN](0/mL_HZ;5GtW>Lri36;Z0>o!!!#i^Vk1pB22aU1J\>)NL-RCXQ^ZV?+cm->mgW4!9? + qrNh#\[]%F?OTCTrc+YK#1NCWi+>]qm]U?ZqV!!!"\J&E?g45=J2o$ooI/tG<,6=P,Wo9E; + U!!'fH\N+r)2oP^B@tsR94X'VJ"*t,hgN"PmO0T)m!!$+E1F%6X6qm>M;j8s"$-AP0[e&"i + jaUfPjf!X3!rr<$c7V7CCJ!`MYM+q:^5OEbhrgV=:0\jSS$!(u!!#,X7XEY6d%0f-66)LJm + /rY-h49t%Xniq9!!!!YMp..H'bN00WN:KX:.Tq1kI)&@_fjI.!<<*r^sPpaEN4E:ApigtXm + 'PfWilj3!!%PEAS'sS>J."XgBl#hjb/_Bd\U6bb%5p?EcP/e-NF,H!(Y,RZYW`bTUXPDj\' + S[Ldl]4T"8LN+U\f_"TSNf^33oQahHZX<5/8WKG[DODSPRpMGnrbzb]bTjEQF44PV9QR+ZA + Cg5Kl<=n?hJ]#QOi)@#d%@0)H)`XF-F1#a('j,G.,I=nNL5!!!#'h2U`7;^XuAo'fSl\gE) + tP1GU_cBtmq,ro9(eHGpQ!3f49:>UkaR#[cuPV9$C+f<;\Q%+&2:2U+A!!!"#&[O"e].SZW + (XdsJ]B9!ne+^j-W4q*g!!!"&cCDI.CsYN1Me>A4_r)*YUl1,X1)Vcg_$D!!!"tOI;4oHcF(V:&'Mt+YJil%bt*S-DT],DpHSNd'2X86!'!!%QIn']/o_gN:L?N:a+>TtDA??A1V=nQnF!!!# + p;dQ&,q9n*dRuL:ZmNmOr:cbs#]6_G&m]$Bi!!%)24`f^lIHN"cmLhik1d_Jk4eHsnop#pc + !!)g\DJid*fZpp"7k7s.&jfhai\D--GAD(kT'E?p!!!"(f]eSkhS!PN?ec8\nkJuRS='q<6 + 1qVp!!!#%-RU9#FRE0N1d_O'4lX>a0I07qA5lq!!!!#W1/@amnV8/APV6SS+o++rH3Tp(Q) + +7k#64`(B4nLI[3?flm2)O^Y@%Y[q**e9'-=S<09?#1!WW5Y_3-G,)"Q]LjU5-V8:eq!^2k + oGqd0='!8M3W<1K;Q^[h%I+f#+86d'Ib=7&q7'a+L:J?qe\OZ)Kk--DRRKTH6VE?Ps],Loj + `!!!!I[O:pt0'rb*Y>,BI7&3JfJA$:B<*pFB!!&Z]G'<;t^ic6.e?;M:Ia7,V-U:ogihA8B + k/Q2H4Or%S!!!!Ye:khV"*t,$?]Gaca91JYB@b$0f2Z0,!<<,X+PSdrl-OI@nl7(]eu"/d# + nTV(UZ]/S;/rV>QN.!cYck.0S>d/GPqP<-+iId,,thLQ<*q]f!!$CCB2;n6U&,8[CJI2%Yp + t15s*!PSA^sjY!!!"dCua4Om@0)4^=ji#8bf6gX%-F/2Qr0AI2rIk!.[)8ZZE%'?_r.48I- + K&R6G>-:/7tWCFT;a!2Nl1SFTUNfuhp4KFhTb#4r8:FRb+N.k:T"!,QarhoX/\-R`>%&jhD + 2&XTnXqbO3*^&e97^cE7S?f?od[drod^7HU'&CVjVDW,"c`J"d%!!"Vp,<]hdn8RL484!Te + CI\67-oEkLobA8C!!#(*S[n<>fBLFZO+\)(J;DD)q8@'KYIac7!-kI@J"6$!oN/bE,_Q_a` + N,:(J\_XbG4>Q1]RM@J[9gurmm'!.UNXJr0.[C`dZMcd(@W*@07=))'1ta6KIJ + N)]-cV^+pmEmAbS3Rh"nCMA(pJ"+*fj`*^$AJeRj3DShl0!/..ma))cEf`jH%?KbS\#b2nlSX;nVqG%O5;V$kn9`?jr/NaKD=hn + kJR8`NkJ%M%mTrAQnr5\u?C#*=\pKa\T2EEX5h27#UQsK + 5p:0l/hbZ9/kg+G6?j2@Q+GATFQD"4[mP?*V8g>f4_SrM77eATHR/stGh(B=HNIaZ\#LCIL + ]I+:`W/a]$ena82Kd^U%N@6:6.*(rD<2)i!0/B]itZf7%:hmiBqlkpa2DscCqMXk7CS1m;8 + /kAX[<.21V!!)(I=0JFllT%o>HB1$Q\p7!knaiLNZa]:WMA)Q1_M9'0^\"nWj$sd7YMMKZq + M&F2(4OeG]^g\DS0:,hQuV5.MX&Y(!!"-K3HOJk-mm).Tp[1UD:ZH54G'EmglE9NpI[e!If/M0C++<.9Zu8-?h]T11PodL(F!8o + Wp"`IGUKHk**Q&"7Y!HV=1`*?&0Ye:H>/]\o^=48He_)Bb2>oo@qPhQ(OA\L5[&`OdhiU.uR(]CH[TYps(Ordb*4EJM + i>5(2@2//F.'0uW>(TuC-q-RuAN@tod%k"o"X!'igt<^^D&UjR#K%&S1-Oi)UaG!s;\BBQ9 + YGMqgC1U8sCO8\l]$ToAJT-]iG.,Uj8<<*"qOGUBlB]#Z/=(T<@\p'SU*k(\:[8b[h%:%5U + M`3t7DYgBXGibhX0bV6pMfWq6CFB/_:_8J@3c`jcjm+Xq)^"PE]=&gAc74p?Q'J[ac%5lO" + Xu[4M/Gf]Z@q\F!W[b&7T>t!IM'_(@RMGXRuRsq^&6B:9<(c'j>RD8(BO[_`,UXKJo4 + pd/S2_&0 + YOaH*@aD]ji#X7#OKb!N4q=@DRQ+n-VrL#NkKBfcF!!'fp_WG]6^>^>\Vfe2c'?@7H4F:*$ + W<)q;Z+.^a5;2SDV#IJ^m`ta`>?%45!!!"BZ#!"=o!K7DPI=hWRPo0YV$kmTT,5;V:7\mOc + 7boW#>\KFU+BWT?1iID!!$E4[4D"Aq[k2Iqds>iVld^[,t7Ju!GFKcG\sbdau2s`.=]O&gK + Ck'YNh;Q!!'ek4/1^s)t@\Up$'hDgt^g^2m0'X4sL'&/ghskS@Z/r(N`[MC$"<_F5'RBB*8 + 27J-fZqS772O4RJSt%LLjRH8@q]klB?[l-bQA1!BC90'*Z]o0WaXX$.O(!!&gb5+1Knl*#J + GIs5JN_eHqdV&1YaAEoVj+d + -N[\Q_m*kReT[&E2ci:?QhCFrcLViZ!!'h-,i;/iY"PGYePq*ZGFr#n&+[P!jBL"nNqMg$? + 25GA^o$;H;m0P(`m*!!!!9P+.[0bM\)s=&9&SS_Hnq>lKM'rDfHkJE(0OjXck8X^0E'b27 + ^Q0]H!&S'(s?!!'NZ^kn2rf1lK$SrNXL7P@P/:02l5!B%#b:(_CFjmU+hQmq&sWBU(W!!#' + GK^M[NC+`_c(]Oh=IFnQ#!<*M6-LB/E5l"$OJ7LpKi+$bS`#$d?@.25+H!63&d\U6bV2I93+* + .D^JH&5;bP\'S%-;9#Je0S2s2a;On.B$CTU_P-Y^,!W1`<.fc!(b-]A%8'W>V^s3<0&pIi_ + bV4![f$lDPh9\51c-.k.J/38f*XT1g0M.p2UO\0,>7TS<;$)?9b6DJ%ffjm/Xg+"pFiNGB' + )51G)jbK\:9'"Xk*(]71]m[5q\KBf3@!!!A5bo:,WYDDatHj>F5:.eQ8W.Fm)6K5Br"6M(_ + ;s4$o=E?b#T`tJs"]Rhd"`EU@f6$X)[s$:c$_O!mb[[n[`7q;?o.eDFi;#?L\`GIE!)VYN[ + FD?"-RiC1jl?+G$,(AIDkR5UOa-Nc)GkOa"cZ + +>=%^7mM`NhURG?[6B@^cd44"!*O=7pP;!!!2A[#(hX=MoNhIM([pnaW3sY>>7T3LOic2pY + I2>Gd?dV>:H"!.Y,Z?0"32/"_3WL[^?PC!J&(O/e!!))$7us0 + Ue"jcDb/"S&"n()adZN0iRju$<;ROA,H + `6X?>P1*DQ?D*t'S%Y"ZTNWEl2 + qCo!:lCbEJ^feN)[O4a\VFK\L]lq;tY\Fn6d]el+[X5W;JuETCSU-W#k%.WW3%7*2tkQ\p' + U;I"dc&,*ltZ=7&q7;uu4(bHlj)D=VM=rh>Nndc7AWia4+6%kI\\E-W5B?R(=X;80K\2sJa + S+R\`%eOL@);*1N3g,C+Kr6g^G,6!;5(K:D8J>AGB1!3QTq'Ot3B3i'lH2*)Km8SKr!D'ItrXs-[^8>X;\p7$4+jg8i^]n;(LFZ`RjF_Phm=/O48_ + "%ZJ2qd@`I6EKXRZ`l5)A+C`I'rd!!$,4c-!`Bf.d"C5BNN;iV[iK#8;WU:7k5Fd@%2;RZQ + W(q1:'r!&3\K_PO\87k7r^\9^US>EY,?V>=R$0]2P=W<7GM/&008HJ11nFo5pIl@TBC!*m< + h^5i%!?UpC+oZ:n>o(Y$\ODftKV=3>=jd-le:\RUH5nsA"kR/6@>kttMV;p6B7-NF.WXgE+T"V0#(]mOucf5hQZjT + ]Z3HEpapBfjfWW3%WNi7qmPcmkf2uS%,?+YD]oe?TBhM(RQ^ZuN2r1`8`q0ctal=1)"!1^o + [`+pAsN`3YOERFQ+cVI3Y<.,/U3/a7T)2%d@.).ULB_[0/!!!S9ZZ>p8$rXepERB^a&WrWT + X83Y7E%[QHfo,!2$OPNTCrklVHW;.Q!!&[Z=:Yi('hiF7aNR?o^-`&(zzzzzzzzzzzzzzzz + zzzzz!",`i-SDNWL`s2Qma,+e#7q'dPq+:f2]X6R-13I*>6"X'Vm^Ni$3-.2Li(hVl%nU,L + k=j:itmrPr2uMhbP%kuJ,fQLcpCBj#qZlacr+FA9*G:qE,r*V#Zr@#*!%190Pm + K#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5 + (P!!)H.cH]HR"oJT1iZ>I+RF"j*">*V#Zr@$UEr5Rtqr!);cC[>ii9b,fAK(*[MsAin(G8t&d/PDLWa.!&gGX!,4DNBEc + CI&3rV#!,5Q5o$qp8705tdIL/JUn);Ir0f"TTqb'bs`K<2ht8Uft0@#mgq3gYBf.)t,FJZr + G(mrUndM%g4KW*jen7cr-P?/QF.);uhFuU,,",fOO[*PH%W`*^>,/ITrVE3WiQc[:lNpTqt + '^>,k80W;loE181O2$!O?&BW1t3`sW=c/R#N + [7S,%5[VU&-[-?>AV)eodWjQN>181O2$!O?&BW1uncX^X"?G#=IV+ZZ%M7h+=t5c0V94IW$32\(0/)ehn`(2n&X+S/!TW_@**:kFu_'3Zjc\:fD8#JU01gS/C#lurZE]=X!X.L+e9AP6 + oYY.aR=il$[kDJiM";!dc)S[r'3ZlMTV]eaQ3mUE_#Z.\[_d_+[r1"_ + 2E'.Aq0RI8CM`Y-Vk5"cA4Z7M`?4dYMA@eT@)2p?C!]bK">//-ZrEI?;P=4F<@5(P!,r5SC + T4eR]=[h%djHFf7=OA7Ma\&NZ)u`fCS*_7;Z+WW4*FT%:uPi4X@SHt1M>!tS.%""8^LA;78 + &mP/JUn);Ir0f"TXnIi0J[nN>a\Jn)#cYo<)B2C2BV5M\`:kWH\@2fs>>We>`&D5O@Op2LY + FDRE-q7scr-P?/QF.);ugkD8m5u'>;n3=\T4Ojbbn1)p:ueZjn/9?cHFDCkKdd + OA9`BF4n(s6PUNeZlW0Fqcr-D;/_+%3<12*2T`crI-F?_PE!`OJC8"kfE6Xh/16_J&n[X.n + OH:$5*uR:lr&kRl&c["$U.$idpktI'1h`l>U8?"cQ3npOWA:0D!ek/^Y?nm\*?@:]hRjq[r:.JphU?`9bJOGd"j-* + t7Ri-9YHR^sX+!Z7gX"3l@^4!jq@6]/PG"aUMj>h+=t5c0V94IW$32\E\#"QQq<(cf.,*[^ + =gQt0isk$#[;tBO3B9*Cg-NcPV)eodWjQN>181O2$!O?&BW2!i&km5CG:Zn&Ug1HN#)d4a7 + "i,Jj^>Gp-UCD5(+iN5ZrAG>99ff8'`_KjrE?5jkF[6)WD^]+95W7]R>F#eGdLEt5teU$/Q + F.)<%(%*PmK#W!*k+]>H4oWs*c3M<%V+MPW_5&S"6*umFjE&I%8ig>3beHf@/0r*4@l*iX@ + F3k09C;aiX85MHOVl181O2$!O?&BW2!i'("FPKn''e?b.ghLlRL]gsD<:9'03Y_r[;+511hb7JGOP%jE)Bme[ri48/bSc#dm68c?[_Ut>Aq2tcWum0GiB%W + g01n!20S?=?+Y:%ge1e,KS5#H1M?FKgUC%T7Wn"GH1AiiT7?k9>.&+Ys8MmiRPYm=B[H>3b + :d5:I.r[]^86^.l1S9S_$;'H044_HD3ZYT;B5GNN>qcipoIW)`nDAZ3hq,G^'oO;FG^Z[u'p.n\l<=Y3+m/9((MPNc1n2Bkc + %n9mc?BpY=QZ%.89"b*Dkumk7kH\MGtr\T?q_q;mq]2/3u].<3^!rqPLk1M5GAoqfQ0Wi5h + -&J="R.TWX<_:QGDl-`mE?:H"#lU\B^RF"j*">*V#Zr@$E#nCXJ_FG\rUq;BUp@bqnD3m[Yn'\%*;GrZ\o.cA@d,06BN + KM!)\=_u8!sT/F#?:S]agY6-`A2f6lk`uQ_5Puh:s\LH<.N3d*=(7?1b=A)r-C/qZVe`:rMM'nl#%1P1+8u< + 0MDq_R4O$33(r2satCoKpb*3!/OY5C+E'E@gAs)$>jnn$0GAO9%D'!tW+cr'n[,rhcu:7aR + NGMV,gH#nV5M+6Ogk?#04@JR3JLRXd&\$rikXhb#i2('bAP^VSamkphhs8M#sPan,RPa%D% + N>e4p?Q*HYlKm31++bBr%[qe)OLAn7k4o + Q1TS&!L26]p^cl@bWJPm+kPq1G`7DCh\r9ma@qig:Jh?^3mJ7mFq9d[0O"JV>C#`fjd3glI + <@jor>PUWE!W2181O2$!O?&BW2!i&ff@uVb`qf]3H-];0SP[e5RZ"EL$(YVk8hjD!__d[A@ + JHAVjRCDjPtMkpMt`-7L5ejioaA[,8%BcaK-Sn35C2q=s!2*Up;/LS:QeKU)rkBW3b\V#l0 + ?E(inF5('m.>.n4RG1qRN/=+kh>FX+N[!6nC>5L<^qmFqd]Y([igY-e"h;$d$04&JLoONao + \ODDlG29S'g!EVE9UK5V=nV1:f,h-"&[YN*cr-P?/QF.);ugkDNbPJ`3d&kVW;#N'6[K@d+ + !6\-J\KO,7pEBRp1pWP7Z;<%r]^/=PP71ae,^Q9rpFE999"gd1B)qORh[P\Gh]ZDG']^ed8 + FOB98+"c<12*2!Pg!@VPP3A/a_2q@l6`3M2?4rG;m8&J)Z;4hLGS([VacVo%U$9RsObmM>t + QiNu'HUr5]I#et7,#WFE%?5*eXeS52BJ<0Z^qd*Sn![r0j&@EtB'rVH2f<2l%s?1-:GRgh0 + \g"E]EXh>C1fU"XAl?IPu1i:sRDV_nM5QAA*pQDh^V-^cWX\+j.#"O.0[F]eRHpU.d`5s.5 + mD=PbI=6NZeZ*3Ma(s;0XlKl,ZrEI?;P=4F<@5(P!,r5SBW9apD)8Ii?bUp`_a__lbr'`u* + Dp$E[VWK``JXO7JLUj9h5t\W`^[r[hL"]Sj83MNQ7=r=)fNAtA?)Ar*^4uH@=sBm<1uV^h* + FFL5(3:7[?It#]6LplG^]4;F_0r[\9:[eIL@,I=[@B6uVX@8^Y?j(aGl.-tA*kOY + ',MHtj?Z-#md@g'^A%Y]_u7NqoBWTpQ75a%G>.$K2)[ADaKP&Zp$.g-Q)-WCDJlV>&&#aNe + lr@AAg1EY9PCD%JsIl"=t0N^"FIW-8WtLc0$Xj\H61,E7M$m-fk6r-*MGfR$@i'NVnlO'fs + Bl3`uinR;`$Rg".J(EF)l;CpKDYej#pQ[eX'Tg8UJ6njiSI?K^ukVqJ4n'?PN#!n8PF_]mT + X]mYb\iV7(-h8p?GN#7i^PROG1*DADiKhhg(u/QF.)<%(%*PmK#W!*k+]>O(:kP7?Ao`n/i + :@=s5fL?eb_WD]Q&*&q?Vgt&T3BB2!_#4H89H:senJ%k@+rr);8>;^#7FL:HgY?\WdW\J@0 + oB&alhamG7pU=T#f3a#5HWYnPou)\#\u0Fu"q@ZF(\G+Nf6"bS4D<(a)tmG>/QF.)<%(%*P + mK#W!*k,H>,iupiWlk]^8"f8@M^Y%Gh>j]^]2%9#iisd[pbGJqtAP\\RW[?7YW\3V:M\K:O + BmD?@'_Jhg9P2dRAN8n%\nZg+f]E&e^r9ZJ0aW+gY@P\$rj?39$_sFm>4!dgHKidN2HL6Nq + X"99ff8'hZhNAO9#n!1.)&9?kT#M2mT;3HF12YIpSmjukbLmej:D',)%%n)Gl)TP^<"9h@q + (rS?%7O$/f#Sut/>\Lgg'G29?=cBp?(L0`ZJGH^_E[;+6t@9BQIq'<'O:Goi1XHm&'H?JUp + ^AdtE)l>".-1-%R(F`8Cg9k]SN,1:RW_@**:kFu_'3Zjc\-1WRqX1uam^^Z@9q0_9>8J%j( + ).JDj5\Uf;lBKbl\e*-4k'RjT+Y/r@FL]$AW#m]F6:]OH1sgi*j%N_6id[C:u+-Yc=NpP(Jb55OKfRl>3@rr"eE+V*0Wk/ToaPAO^$!qe + 4ZgV;t:L621!$X]r9#).1+S?Fb*q][tRI'e31EGm19<99ff8'hZhNAO9#n!12X%QMT!!+!! + =[^u4"fNutPg>-VPUjBmK)ltkKllTY$]`0NH$g,(@u]d>*&<`>>qkro9&(b)A"2;KqTdD;K&BM\7=.aLhT*U + 8?"cQ3npOWA:0D!ec8MdGE6+&L4YQ0X + 7J>G&r"Ws8D\g?dXY/O%M+>>0AmD,R0#&Xc_9>-q7scr-P?/QF.);ug + kDVRP&QV+T:==0H8_T(D-k^Nf:CbhR;EC5j,h9R.4"O'S/6`k^Sc1^t + rT1cqn%ooGu(%&.'r:A5ij3+p]p$:5!pKH;1n])`,k80WDJ24.MGu8!4 + W0fQ>5%/XD-/^L8HEWi60BieU9Vq?soZ$+==Nrh0VWES!TJ.oS`QB[;+7?hKnA1SRog-DlG + HG1$608[P7#glitj8AO9%D'!tW+cr'n[,rfs=SMtJYmZLoNTrYbfP*0pr&fr*s4c"qH2'aG + 8H`4f8$ig"^O5>&dAB>J+QW1kX++C0%GER.eQ>``M:7TZP60Qt+U]"O!ET>'\]E6ZYV94IW + $70Ab181NGJ4jkDQ>5KeQdO4.P$9[34iG$\pM(4J@S>5l8iV>"]]H1N6I!P,DFm[m_EYGQZ\(9D([;+66#;NK[k2k^hhT\VKCUp!:-8[PYHe3q]F6D7>^*tZ + ,dn`3Y*i+)Qju1Q4g!EW.6;*"FZrEI?;?=QZ3-e/6e>SN'oZEFLQ]mVCoD#;aWOeA!uiI!+[LJ,KE_l(fK?ks/TnjZ!SW0j-rD0K3SEOd3Ybhu9PCD%J + sIl"=t0N^"=J,eUIL6k/N'S1YI8`Sfs>>WN^%7+,i*H^>H1\aG1CG$DJj@^naSO+[6bXe7J + HD\@df=!5Ao6NVR4j/L^/mWSnm]3P*Z>FPZ>&$Z%9$sA%[E!R + lq<'Oi1MrVW;k^&1KU)rkBW3b\V#l0?E:T;E]_q?D\ts#`RPd!^4CcA>h2t.l0f%8PmG#%h + .8ls4<`YO&M.L4.PV-6FHU'MK[k1gmfW`uMrVl]_\hC\J4553QDG!P:55F7Qh+c,UIVH?CM/`mP>e;M(#?R(>.*Xl9:)_#goQf&B?hLQ)&=Z!AEhO=f"V41KpF + 2%=t5c0V94IW$32]pq-0ktT=Vd>'L)Nkj,Ap*K4A6&I_Bplg:CdOm2@OjVb`r9*UW0r^G`g + XHhQgR*Di\@]mpBF]*BM^.$r^)'h;$em7 + k7iSn:hAkN:41BrJb`BjH2sPN#?-sNK,Z!^-$Q'%qXs0d]=WtCT/1,?nNAbKjN3Spm[C)*c'gLo^OCTSG..+3\[f8^ + ^EPVn;FQl%I9c4]O$32=f99ff8'`_Kj9=.YA4?VD,?RU$^F-s(6\+]Fb'BO#kb*B;GcQ58tGe8.db*FVpI$"0qk? + Bg]k09A7**IBU[VacV]"2Lu)H!"^`pD6VQgkC>);N-IUOW=C@eTs,!uELj0Q#ONZ"(fa*BL + QOn(nKm2QTr]gASe[rR\g`-$Oa<-5tu-n%st,L(.jH6 + ocP>jb4LW0R`EXf;r+2M'HN*A&jTmqWO[afXnauePZQj-9,C6jiWjpdu1;cQ7&&A0qHImOjabKMZXuoN^1MWTe>XW\MHI9[8sLmj%N?3#BB82PP$WJ!-(BpOXDXDOq'6:/PqcTZ.5 + M+'j%g#M2E78&mP/JUn);Ir0f"TXnI=tTEN>JIIkrqYaEe.eo^W?QDmg[jUS)gQhQ*W>j-1 + H=r[%3'3BB#f@0@q0B4ECmKKc+7XO*jHEA5Y6f@;ekJh3Pan3k6,j:6:f*8DOcLMEB&ji52@Bm#PMC@")`MZ9>e. + 0=p?iFF>,m[SSF#M)BtoMtl-m].Qdd-]W_@**:kFu_'3Zjc\-,lLWBs?TcJZNkc2%U6)!@f + hI`fgU11b>R=0=CT:"&7hBWFTt92"mMp+BCIQmmB1&*"1U[?E+BY&rsYakiZh[CN+@(5q:` + hgRBV,U7(Br:mbcBW3b\V*YJlW_@**!8nJp[&)Up)]LIJ).G\T>/#Rql*4 + <12*2T`crI-F?_PE!aY.ak&B&pA7%o'2o>M%dquSUIK5:^#8_LT,51KcC?mQ4DVqpU&aW=^ + HXD+Y\2:R*ZcBk^AG(s-DJ(0D;*L(nc/CENsQIHZu=k$Dh%YRp8rk;HKqI?5Q"?b^WDZe7n + #kCV59S8!W1!`bn]jBp%<1W\8dc`I%d2=BO5(V+\cl+$+Kl,9oSKeElV_`JXs2*8%T1O4`Reldq&ELl[Tm8kN"STG\DS + AS!/5,`"SreQ(t,peUG+7un]+s5UM&f::pR_)H8e&8.H!fVVB4`$D+QUZ:@ncC[=nR[U7&C + (Ed,PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P + =4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G + :qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff + 8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.) + ;ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc< + 12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);I + r0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%1 + 90PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4 + F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:q + E,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8' + hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);u + cmu-V$gp#qZlacr+FA9*G;3Fm7>NjQ'k%ZN/nhZrEI?;P=4F<@5(P!,t@E)&_nWqsGDA]TJ + GCUj=Wnm#IA]'3ZlMTV]eaQ3mUEa'u;qkg6$M/N%=p4EKYDl59W,03YALBW4g[Q7*V#Zr@$E/W1Du/mPo*U&V0@q==FVm8H/*!;8`P + PmK#W9$gII6;%I^(\5TgIm!SkUP0bb9URZj[V\r+5lc'o99ff8'hZhNAO9#n!*=1>r;"L#. + mL84hH$pmaiMOoe^FY/5$Fs[BW4g[Q7GV8cTeJ%.0/te;Ir0fKb + CalRF"h4_"h+aQ8WU6:f2cFMj>h+=t5c0V94IWMYo%h4oNa$6[SOn=gr9SA7VM2cY_FFM>q + nmjN6cTCt5ioN#FZpTPd3kp%;6If9,h4S+N + OP2>$N]mBA:%3%4lhnT2C"Ug>45H]>#^k7>qL:Xq+Bq3E,ruF=Q]]s24YTm>O9PCD%JsIl" + =t9)uoB4FqQnY4?]mBE;Tu4AI'e4=hcsb4i3B(j2:q]63Ir4)W]m0),g(ebYUe.Sa$,F8gW + A:0D64$hq9PCDEFaNiKC#?XQd@s'H/uSFo;5-J%Q7\l+U/^S$$G'06:6dJ>?K59B;PZj&E3 + KGAZ$Q*.0k84Fl-^k=3niG[")pJ.W_@**:kFu_'3Zkj='T"ckF[6A@QD-ZHgeYg""9j88kM + _Cg9n==C.LmOl.\p+9O,&Eh>$O#]6h+=t5c0V94IW$(P"\rB1hA9OHTlF6O.opK.OsQuD[r1$5g2@4".\Hnr<@5(P-p^Lk + #qZlE-S@#Hq\Mr'gV%sClCCCqo>;)'BUk:*M\hG1Lp4pChgG#imC*0L'i9LJ.MGu8Pb=kqK + U)ts&f)6`Z=HO*4/e1+?@#39:8>U]N/Z7G-cK:tmFnskg,(ArE)*c>RF"j*">*V#ZrFPs=g + M_N]=XQd61k[+2GEdmUVP!rc0aB$qZBX87j!/$_hJWogGCJsE)*c>RF"j*">*V#ZrFOBIt) + t87n23bfO@06K'HW3!TiM-GL$Ru\od0W4*K8!UU4"93RL`96;*"FZrEI?;W/6T6:0``Wk5l + iM%V,9qN8@3l`/fa'PP>!_08(-:o6pS?+Y:5H],71^cBe?AO9%D'!tW+cr/j#eui:o_sMh? + +nb?o(ccWtqXs/MT0Ag8RsSe`o^qdN7urQ-IDUXD?[r#sN>aYq2@+O$KlYA&/UQQ@8'7)I[ + t"F,#AfEd$90D:W_@**:kFu_'3ZlUgk?+PSppNMX8;)\r6PDeS2p2\N>omHEoP#oET>(;rU + 56Nq_tsX)IL4+fm^O;(pnGOf#*7R4(_^(<5:NA;Ir0fKbCalRF"jjbUaN&_hJV[pXAEXX8i + 1rmkS)]Fk,*qpNA3-d\M_&3s)o!=t8I#BW3b\V*YJlW_@**E+Un))FFW35TfX#5:OX!BEdaDY1ccO:cO,k)EX^Ah,.On'g_p + P5L1G^i3R_0*tm&ZSuY$JZXc>MCF:&M>bVqR!`,;1_=jN3U$euY8sCY"_!;Z["%VG3Nq()F + >ga,UND/ss@5-Z>te=]pLj+'uBlfl+Y(2IXIUWDf^PGEDU'qtBDM:/4hIX5!*6ZY.UAdn.3 + g`EBQ^djB'(mG>N\r:@I?kJTYc27IpCA7WWu`emi6p?^Jl6lJ:=r9_sIq=.H[C8@p"(d"[f#3M:[6H/oBE0F[Vjp4H + hZr\"q;4.f]LGJ*C$faTr#nbQ3npOWA:0D_Dto8HM,ZU+#VJE7u\F`HEoTM$"q155aoflIDpO.oo@@V(Q,h]SD + 8tGeqAacH'%(gpeNYT3]'PIH?_q*dF#`2`J4gPq+e1g2tQ+0uo=s\)71V3,p-)4T*fdW+rHhWt/Y#A4rk005@?Ua/mIq`qc:mHW,r9=]*)Zk(jG*e4+XO$EVgi4smo=0?X1Oae3OW_@ + **:kFu_'3ZlUP?OD0\`]P?^)X^Y<"H5<^3&V&=YgYjbl\1\L_[3 + t-]=8TSO[YQ7P&+>KA3nUirccUQ'Jb%nRAcWe6TZC1M4=HogG,\V-\V#04):>k0U#%+44lH + PURi`Z\%Ct?[_UtmbPM:-YA%a:trEqXa9XCn`Rk:j_k=(gJVlBGOA_j-Bjpg]4fTdpYL8Cg + +A2r1N_j-.p&lE^)DLWHLL4X^OO+R$16HS'.m>W]i4.GWW(1)mfWk#Mg('VoX(/PHa[kM^/ + d+s]2bk1WF*DhU9<34J_8W-YJ:(JABC!8D-+BkU=/J_A*3VU>Zepi=K>ISgKob!8sLn!jd0 + =lgU>AF\J[e.PmK#W9$gII6;*"Gb08'dnr6VRnhKo44ibaea:O8?Z(@(\%R'C(,JAHu[d&u + 9%ho]l<46UGR@-02e##hQ',0hN-oj;5q!d7n4uqgJFm@HgL"b[[4am2!M_DeXedgQ3If9+? + ;,NL36UQ6K]SD8tbRBCD.FPP8:RU+@3_rCS]mB?E0>/X;h(iQa9URY)jqiWuVb`ZZ>E4IN* + AA`a`9+UE]6a.M3"rCl]8d+GcC\LFQ9%Y[kigRJH + XQpmn1]7uDiWU;\DO`/ + H6E"(qC.q<[D)60dQC8:O]e=-^16-=Ka)HYB>b#s + Hsl=EJqJ[tHgEIc[U-+A\VGTL_]WrM1B"Bpeui:/1F:f&;Ir0fKbCalRF"jjKY4t1F;G609 + 9usNGF*,(HLtnHcNN)l1o%d5qrZu#fJY%f[a[XQ9''8q]k-W!@[BN!ZXIM6h,8/)'u7b!C0 + FeEZY%J+SRI?f-,RR;D4$:QQ?qoM1"1Uk?EID=KS0II?4@.H<2!pKRV(BM7pI@Q]tM[]hQU + G+N)(QX41fRscK7ke>Z$-*Jo#d"Q7lVE^b<[M&6C7.s'ieM>,k80WDJ24.MGu8S5!$bQBAr + VmaS5"lC$MP@^5Rie&U8*d+t-IBk#i1BC4MQmA+^[_D^1EehJbad&kXFcC-W6L;S"l)`MZI + s8MohQsm7/`Ki)[B'juq[a]a&p6k\K^q3UK>4pCE;qAZ$NbPIZX]i-nMpKY;2a@)q"4QGAI + J\2?'1bnpDqqk-kn>IelY6tN*,P!M,#5%+*dP]rajdCpe(U4WJsIl"=t5c0V94IW$>6\^gG + U;BK[#uFX.JRhHM6]>qJtd@/R,ZjiCe>Hg/MBV&$YMEh5:4VR;3>DIQUaVi# + ei=JGic`ue>V8RY8OO,oY*;R8 + 'q?647>-t5.Qi4"eXI!:CfcDs>o('*Z-qU,/b(Q&f-"s85Tr#WZN#=E@GEG_)>WLtmrnqYR + a,d^MEp.rS#7e+aDQ__lL$md/>ICetCoN,+rC1qod\YM9OkW8MC!iZ/]k@,W$SR;gCj]9`> + 3_qWQ`=&dB)8Cnnb(L@>BPlEfi!MA1M0`H]fX0Ce>cM!HVCD1P9pLsd&gM2HVE@8'e31mHM + +;Sq#gg'fP)7f-;Cf50M/"8b(Q&f-"s85Tr#WZ(g1XRqQ&t@4U_++ghn^C8u)5!1WQ7>Lm[5U$ + njH2rIe>Q6PC/s*Qr8(/\IB:!pO+U[%dn`3!P*0:%H?U3RFI*HT=__IK$Pk:tC05JlXB;a% + 316n^&\>fnB?89>1]E^^cTLem_hJW>aBcE$mG,7YVl+0["q=mep!niR@DM#0P=_LFb(Q&f- + "s85Tr#WZ<3KV6G>Vf?%:JQH,9rsqc'ej'6\PmaY#hg`kg?.A/R#MugU8+aFt?q1<3-1+Zt + N=26j\Ku<3BKZWlNTP[T"t3Z.f6AUQ<.bk*mM]LA:ZCc^H`WpYUI-Z=M(Q8X'#Ckp,dmY$/ + 5Jp$:3_+"]Y2"tT$E]X,:kB^c'gM + !R6>idA2-"r0eSV:ph`Dp/pn?n2iX^sV[^\ATG + PA+;X$T->`!P"o;^\V0`]R\H"G:d-j1p3J7RMiE_HSNpXnU;<>_55F9'ic6<)fA.O'\T[A/\1AKp\?_TngV/+5FJgDX89Z + KP#5n2LD`(!W:J]l]HabsYT7?k9SaX%FT5q`"DBF\#.MGu8Pb=kqKU)tCP+.qVA@Z:==7,@ + sf@SWqi_$:a]63F_k006KN?]4qU(81/DPHkCT:p-qmEq\amN<)R&QV&.7MJ!M5JOO;cTZ/1 + nUDGSp"@MA^MJ:1F^(kJ-Q=$q*"M")dh)2jp`tQJ%3+Sm.GbH,9&I:,o3m9-V>g,OdiX);E + S[>&qsHOu'@Uft2Vc_QgXW?+`Bho-L%=?Kc^m:(UL5Dr-hloV96VB7pYUHZ3&fZZqYg0GlO + G*Ke%0\f%,M6DWjDZ->JGplqqqEkAE6(d*cSc5k>'hf;c6N3qn6:IG0`>GS<69ZjK@k/![t + 3-g7Qu&Y[Bc-EohCuC>HJ/mZ_f(>`BXZNZL?`43el+D)d"Bph-4Ip76Ea1&b,6U8?"cQ3np + OWA:0D_Ps%hIG2bW-R0j'oh>DOb*=KR9:+5#F30Rk=05Y;AAF0D2]DJtg`qkBP*hVME0@** + <8k]J$^E2Ad[cjUZh*>(1\g:9T76W.GLORK_WOI^6rJuI+_oN7YGiFQqf<,u2EbFa*?@#1J*/oh7HLtn,d2FiT?uU"\[+*iNEcO3am& + 3!)_5\$-04)Ya;/8q@s*]EOWm4Nrqbq=h-1 + =-C$YL,#P$076T4k8.;5\9Tqt'^>,k80WGj=k[VX>sDE[U81TIAK^BP2iX?0jq68M_&DVMC + (6h00TFbfAA^V@Scc"a5-h)[g4/(3$UHd2?2k2k\Bq&NC9=I?o*c#'GhBDC;,hs&FjO>W)a + XC&`Vp/$GN(LFRgSaf9@6q$66cerkc*8FGq>e-U+2;=!'.pfl5dJ0*dIf$88bA6V94\T[kJ + ).^%ll0lUTfo(,n*b165`\gU:tRVYcL=;56Tp&# + 0$.L_iHsVq%H:b(Q&f-"s85Tr#W*)#:jq-oJ$&q-RUUC#ms-e##jGG3#%Ghf?gm7f'Z0t>oD;3Y"BH&mJe/cfih*!e[ + g8[^_Q]R<%gF0i7nk3bRmGG[np6ahjeK3]&B:m`LnJ>P[dFLH]M3]V)=t5c0V94IW$E#Xlc + 5bY/=2Tb%e-R`K(]Z#%)*OJ%4tR,ZrAG>99ff8'i&>oZt[+0Y%GqIWLi7%[;4AhGIG,-n$[*&f[s<^ + cdoOg>WYM*Kt]= + V]fB'PD?QBnD]O+hKMda5-UV#?qcq&eu1FRIr;[ZP\?G^+JC`fJ`P=&8_6D19^66F9^[cr- + P?/QF.)<&bU;:QRF4EB(SQcHb"SDj'X.ofsUJpn@EV@Z?hJSut/8\Lgg+qsCl##OKm8McBl + Uqtk.>=K5=LK1"=qV2?M#H^Eb?Sp3U!6bb?11"miX2W(*;`/##Z,>Xab8Tt_9[T)(stR9#_t!j/0-B*=6Fj + $(&]&T17;S.,>W]ab=VG402E;fY+\pKm9S8;^aqmBD>gY5qVSpU5"eJKGP+@,hEX&lKBoCR + .>o@Ua'GMPP)fi":rBqi9mCX:5:%3.?(HZ14E9s[>_c-4B_>e%$3YhHi?]WGDIDVB`--rE> + .aY/fD6US7/:pt1C,N%""+Peu^p:gllgt/]DeZ*E9XKcVg9$gII6;*"FZrEI?;W1TP:S4f% + [.sFVO&]!I5E'tLq8A+'17Pdnj+cu:G3$`,]&T17;K_GQo>rAP=>f%,j2Z:Lbk(#D)]?f$/ + bS&aks/$k1W,I)LgQ\q + AY1V$^5&<7)b1p?^JDK=q3[le6tJDVWm!\Ja#&?U*oaI/`s)2@lCJR]8N\p4HqcD;1rdj*, + `mGhDKQ;Wa^Mb(Q&f-"s85Tr#W*(qG!VjMtrY@cSRinlsMT[u?Hq5F^M-FUusUDng/>J/K4 + B\mN=6O,l4TP[.L.?='5kP=`Objr99l?@2&sm2n:d'U&>>-RW[??F+6q+mf,eJds'tL\^oBHhp2(OkXKa([B^@=U\&>5%` + $:-SHP^JIJA&s/5XhrN?j#b)n%JII_2_e5"@T9^ZMEY(qsij"XI7W4m'V*+labm<]]ZM3rF + RqMhKuAm\T9(H`_P9sD1r@Zr.]>$_@n=(hd?lt6`jP"KZd!r3UL*W>U7NsAkZU3EWSl;>_& + Zn#qQgY'J(c^<2icLGFAKM_SSXL:.9X'mFehDn5bu9D+\Y5ED&HDr4$]u2/:VPgJdB"0J%/ + --*(j]"R=dcJ,]8A^rORD>57-X;PZhqC'T`1W@TRjW(N*l4fCfLA?"(f-5S48+Pai_Vba94 + 'YAsX=K5H+/n0%*JFHHA-Vp_&Zn#qQgY'ULI[V@Fl/( + GF(Gbl8m"C4%qJG6"U="nT@p^6@H1=A->HiIZ$$A]pASgJdAu03>;]@;/5K9-$*;XDn'eW` + @7/ZOmc]_Oi[e8P)Lj*Aj4]Z@!sp.d#mUe07nue,]XU#WFhjnmp\pLk/GcW9W_7#(qL'c'$ + fUqtga;aYF>&=)$6efo@(7<1P(5!jGWaJY`E#^f'7sQ3p:mlAKd60M\F=.b+,ZVG3O,Ik0# + ?O)sF*7;YG49;PB]._u82PURj4k/E5p=kZa-;Q1$l$@IauX?lWf7R6b3Vdq#U.a+=;Wm[V1 + $YkeR=mF(j,DDVX0O]QP$S:TfWHt1qNfFm[YLS3(i?9?fe@0W*q!Pc_aN]q=NHcZJ99g/m. + c:@Zj(7Imq)1)?]=:Tq:)H?jcB2^lKF.oiSpgnop1.W + s./I/3>Ep0!]Z1t&ilfOrUn + e:n)(1T=+u4%apBU6Dul7S-a6QXC.t6`SN9^u;l0tG&fA$M0(h2>eh$W$Tg%'UnB5)eYZ.$ + uV1nc9l8RUJPM'TZ5Ok4%DdI/`Zd'6!*BSG?(2:(?\o-=bC'Rb0r5TMCp_E\cD.mVHUe-b\ + :AXV=GMbQ5r`l;5.L[k.:11&O$aHJ# + V8tfD/#CsDk:qFV+R#qm'H0;]bCCHg6=!_K%`Mc=mGkVl]'BZbimfj0==?7[FD<_[o,:)'G + Mgd2F_.b@RTQu(!)t0HX^HYKZ].PY#qr\\eMOP'e32Pp%;=4QVrC2apBU6Dul7S-a6QXC64 + RCR@+q8S1o?cE5$J'C=Pqd67XQ:q-3[\YJ5b"_QkpG/6-;!Bc0'[ZuGp8lIF)EZRh;mX]r: + &Q"gk)VKU="Q?r>q@GqY-*^4tMhVS&&nKYG4PI8n]kKZs!SsPe1K\G'-;P]+f!V>L#=7>Xl + If3GFnHOX)baC7m\oc&^1FI<@B&o:cISk6.WilIsPnR7LhuYH0:11':"DQGg)0M%&042FhT + 0@6GP.KX]Pq#epDhYbQg9tikD$6.SZaR6JB[K/VI7m4+JWE_O'OS.VM4F.te#6+giX82[m8Y`'5p@Ks*$$%M.o$jX;e-_6Y5;$R^2fIQKDSk5cS_=Q)D_3gT,5%g6'DR54"&p$7bkPRhnJalU^4/%)Ksh7Mm=LN#`Y9KGoD(8dpJH?!!,9s$B*Z#V_?/;\NKaKA*_,=jqQ@cq\T[ + !pKW`1G+Y>&?9GTkiD@IW3kdOJ3!Wr%_l0g_jV;&X]Y_?tfs7G/97j"_#qQg1!L>2_YZ,#!&4[rP7NI+mqssUHSiqG1'M2R + WL+mi>>\T2PgY5XGB3ad-Q7B5L'Sn@J\"&FpEK_Jor)'s9E_:\)H:f\c5*I?i(+ue9oB&Y^ + MoFA!pu."lk\-g$-l,ai<.BCIlC/B2o&T?7p6JMu,LgYsZ5NVG=9Vj5A;P9WW`QBAb^*ZrE + WSl;>_&Zn#qQgY/=SP7U5j_$0JbM+EH*^^L%!m3U]-L>042H&Dr6Fh3?TGpA^8C:2f>k,#" + t4a>On,a9e'/C,ht.`hnFNgVP[%T6>`W?j2Sa]N-at[7_sY(E,b<@7>pTjV-G./QBp%S>.8B$C'kOs7-UFjSJQ8eCms*>,Ba285n$_AQ/54=AbHqV/G/&R + :Yh=?+O!%OXpV>#3O'nMcrBpVG3h[U/\-YK36g'[jC;(%[H\od2R\7S$);Guu?]ij'"?ORO4R[/ + ?snm/hK8Q9PeNfG[R+oB+uD;2Lq[RU&n + ]1P$mtI5<#RG,$^-,,)`5gP\BS3-nUg(n?-'/\od0lET0BkT4M._Z:U6,TqS10VT;ndk007bkKaP6c.ojN)>?Vfg9hG33[A + -rb1Eh(4$#D\CY%jnOX$SaB]>>Hbk;*b$E[OA^3B%;W&d:468i]7FR@d>J\QL(ll#K8LD7J + ujr5Mf&fqjMLkn$0i'?bf]a"ub`;Z`QgU?qRq2*p.>0+a<]2ke&)*.)B"dUVcYZ/CA=K7n, + ;LsZ<*ZeX_7Ld@G=B`"CcX*YQXeA+;g=b0HhS#BeQ-!.ombPKVY$<.MR>c8IDVVa0_#eCfl + fQH](G&ZBZZ`;9IQi#GJE<1X6N6oY7un]c$HQnphVR,_,E + hIb3b!eUc^l.5AdnPK))uT.W;]t'=g?RMLA+*%af(]!-^fC"6EZR-[r8mh\_5]jeu`.8Fd] + $irqJi[@>&(,L9X]XZ=HO9cl'TF+Vd1jrd;bH*W>m0s7Y2cZ[MXE5[\Z/o!2iMZL86s##hE + p4ad%/^V>81D3FpUW:ATLCBk7bOEUFmicLoBEX@6gCTaJ/ + ,\$DdNusuSF(U=G/Q1HJS2G)JE"+@6Au1Y<:EJMbY-+pg*^.[4$O>*/:J]=(gUBtK33dJ`` + i4m5e?3)HEOWm)`/ru8A"&mV]=YZgcXm#^.WKHJSN:m+m`Y(6s":`_3P\PS"I9D)!)&Rj== + Q"QaJas,-B!2SbhU)7@o*N.48%pkn'Iaqa,V/Z2/;d>GMe8R3"[--3tR_#6D6`".TNKJZ!t + \"q=9C@Ck2Wk`;XNCiPUGF7>jd:1OoE%5Q:Ff]mB?T[r+p!K:GKns".*B6tUrKrV,3-4Vh\ + US.Sb!\T6fQC##R[Rt_@k8\c^m9N:T?oT7sfK*r;?04eG@;O_/t>E!g + Y;`YZ/CA=K7n,;Lp/SHhONDG>JDt^nsQ`t + Dc5#JLh98;QUgpA=Q,uG2.=K#$RPEShr/Uiu)N>mf0'q2@+K!i"oE]Y^5eZ)WE(-jKJ`^`X + 3o'G$cQ6"uKkkN\hP:M[7G_ZbLL(>@iCXt$u4$*ZP#P,pr5EKA<@).hr(DDWU!*[5>3+g"j]9MA-4"q?gO:]H'8R2O3/eSEa;;5 + o)Q*&qnfAV]pBdmrdtIer:V;9)3kYZ*W6V#i9b;WS%I$8f]ggUBVb^SV^(o?TOKr`n"Eo&n + >KqXeJ.q[Jjk*fV'qqY^/qfZp?\N/;,*)k!p+#G"Ir@Udf`9bja\S:oCOP!.L0F__.>qGjJ + XR&*5%QC@__VB^+>.^u&LLO]@&Q_fE_99uMU5Uq[-/Rk\InV7-#Eqo-4Z,]B^YZ*W6V#i9b + ;WS%I$FE5u:f+cImF32+Un^81$B2a7]Qis5V-d2[(+jjk_?FX8%@4",N>jgB0O\Zb(+rk53 + (p8.,Y[f&Gl%%]qrCURg:)"HZ;DgG*BSFDC85-)e5ndOZIIqg'0E7jq-1=GAZW`$ffX\o^MO-6cH@&ZDd":#0m))EUXhRokK7e5`g5A\uVf<8P>Wf7Fnh;-mcf&2W]Y$ANYR + $6X.0EGR\b!M+>qbKlOKS>*lj[ia"6U?2!nOL]$H$OZaAK:&Dod#$4IU;P_HVt\@E[5uLR^ + :KX4?YimIJVRDdSa$FdF$A&[\Lk@\Nk]Ie0eJ_baG7$G#N,*Wg26$aHQal.OVH"^]di?SA8 + $RV?mY>,\*NGV+N0u%O#`B[VacY)`P&R>EBa%rr0@7[`!55f.^aV&32tKV?0Cb$ZXAm#7`S + +ekGkb^'Y`$:S0gVc<3Hp`JYPML(.XbAQ5%]KiTMDSs5P^aN-r:-HVZd]6sGFe##k:o]_Rl + 9qORqp5_H;:h3W=b*FXVcThGcP%BVVC@[]MMmmW^?F+66-kH?(O":kOgiO,],.3=4g!O + R<'TB_C/kF&YeLhnHcJ>>,:4-dS;CPAr#k21VOG#qQg1!L>2_YZ.7taEWXP?2j]d0554qV* + [B&X]r8/Rl1ET#:idnnRr.4#F;4\;Q3^!g4BJ97*Y6GN4Z]K)aRN->Uc\h=0Gp:2b74^0d? + c)$kR&-o1@]fPhBOPt3FeudQ-?QTjl+gtb+q"XBSMi5cNJ,Un5%>u# + UDIHs.J,]B;kKagX<2uaEJ:KY$k1$A/LTq7D1UHrNl]Y3Ec'pYUP*4mBRN0e%oB+T(=&818 + X=;>Qo]ah;p$1*%mbK*H$F-)W]QpjQBt7j#)@8Q1[r.aUZd-kA&t7&Ng%1O_>oGkP["O:l. + TWWAY"Dbsfc&V5:#AVoO]0.:R145(!"iP:'.\LPI['OkdaoD>ZWuq2\F3j, + aqXHhZsh4I!/oj9&&?'3HaB!\@>H@&ZD(q"jjTfs>>6PUSbAoOu[Ka`lWjQZ8Of2fE"HUs5 + Af-SdQ.r-0u+4EKYD^V@P;Kl,YWp$]ZqDV)$30dBRuTgFG?(+`RnABCiOWtHKtQ;*+P@\57 + Wl!V!M<'Ga,FQ15q"Uc*uf[u9oH,kpc]63Gj^OL`;>?`I&VfV%H.JWnA=Q8B$n(bI[G4!ui + './f\Empm[M6-[NKpjl7P5gl=3TRps1M.'C,uQ48=]5(jq=u$nG`ZV!Y[PG*%MP[RfW\eB( + +hRhkWjN7e>Q6)NfI2D>Z"=Z;^%`Qp?^HY99t\=P0K-Veui:?AT.MEo?X4ep?gW/mbN6GUubKF]"qXp%":[Zc6(V'Y"Y?sNUn<$p!\Qojl,q!cV.p?fJ:n`%HA&,Z1unLj`hJ>LBp//<+)Q7=8d; + uhH?J>E;IF9sKu:11&O$aq;?6 + d/"I:MbYZ/CA=K7n,;?6cD!gX/ncm>nq3J"".0#1BH"I9ApckEW_!.Z\QV90)q'lX2>.OVH + "!.^YkV#gX=#qT(O@&\YaYZ*W6V#gYh"=t8fTM&[lEWSl;>_&Zn#qQekTI4-H!!$:+99g/m + .c:@ZWgpk&!<@G_f@RLD+@CkliE[Z.!/LiF.OVH"^]di?SA8#'z9H707SA8#'( + LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!!Z;Q7=8d<5 + 8Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.=c-#qQg1!L + >2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/D#WH&&5"^H + SSapBU6z^r1f#apBU6Dul7S-a6PMz'*jgQ-a6Rc"^%dp^et15!!!!m**B52^et1L@&\/J9* + G:q!!"]m@&\/J9*JRNV90)q'`\46!5QO(V90)q'lX2>.OVH"z!##U'.OVH"^]di?SA8#'z9 + H707SA8#'(LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!! + !Z;Q7=8d<58Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`. + =c-#qQg1!L>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/ + D#WH&&5"^HSSapBU6!!$!8f@Tchl-kZQNl-S\Z`p[l>n0\nW2M+?:X?.I[n`JT[:@7;#7hm + :>nPF&YZ*W6V#i9b;WS%I$31'`&/#UrjiS;S(RMo:rjtmo2C2"^ba+!%^\sIBJNtsLio2"B + HK=&D0miW\mbPM,XBF#rbUi/?hR$u1mi$c6J>LBp//<+)Q7=8d;ufUXf\"h4B?o/agJ=4mA + a.X>QS2]@8kS)KP]Zj$r*3N5kKK>MCY#Qr)`G?UpPsGd9(M&bPAGid;G@:7&RE"lD:u4+;l + + @oU'V8<*B\RccC?oDp*E4h*.@_XrUf=fn*6,L9\om*) + am9#\g=ihk"\T$=#F6heYZ/CA=K7n,;?8I/gt^\<#Jaq`B%O4nk?TDJ#(rUPZY%)1C!`N(V + OqBo!L@K[>e>/2h5d:gEHcV>C^l[;N"7I>:11&O$aE_(F\dqWcV3]SiW8\8c#E^=9,\LNfS8JYf6]Ub + )2]Pq,NE/s]8EG3rE.o)%mjo<) + %FYgdc^PbgQlqNU6=b*MG9OWuCd_GYsTJYaQ:%4i5[1`'8/(*kRf:ggPe[XPq0I]Xh9M@!dEp8\oOJP6F.PO&j<(*p@V':`X!_^e,=B\m+O6NH3 + PB`G9`9Z$YF6Ch#gm=NkF*`1[o<)%FYgdc^Pbf!>:7OkWVdmc-N30ooJan;f,'j\L'gXYm= + DHFJq=EdfBESfYeZ)V:6UQ-cai_JS$\cpQ=gM`1Y#,4-WTc)o9-oouPq#de&($4N0,RoGV# + oZZ91AIk==So90!NhVbO+&nbEXUPeYDs3cTf0io7hI?iZK<=e]4&`B?rbenmo`T.SUmbC-# + &5;NnlnZ;3*FY?"Q0CtW%%DQu,(9*N[XO6RF'=-H1U1KW)4f$+;1BK=0LK + 'Pq-?R@X+4dKfaMHo^(8;8"^#M#@& + ^eS"F:09MWcq%"^#M#@&^eS"F:09MWcq%"^#M#@&^eS"F:09MWc + q%"^#M#@&^eS"F:09MWcq%4*N;>4 + IgW#'OkN\/mc1]cE8c?+\1?Ct:_M + +1$:F>8#Xf^u\3HJ6(>e+Fh(=IVOF&7%U/;t3dg_l_hSbf?2Z6*/rn_ + "aM1>7LCPVSr^MkcV-KVQg?d:d&%Tr&gU>?@meeC;//?QJ@&XF+\`hI>,9e>QpoS,NQ8s$K + UfL6h:n[q.4$A&jfU,)s7n<%(]=3"QhIXlrALTC"6A5csX]p"bJ-!i[00ascHq6eaKWQUK- + ?c:Q7[OO+G/oU`mFntkT0GPM2pKRjaJb8H3pC-P;Nc"r`:8QY68W&K^5rBbSiqE]GOCt[Dd + J`i<39>hN5f5;GThRc`j+%Gf[u`VGENH%/mXpBKB.\27uF7c`f1poOr+T3q)'j8JsK$i9DD + J6rqncd;iI"\+!4;(s+(7WQ7>m,q!W:baAK^$rE6I=&XcXuq[!Q8[r:/IE,b$oZY,OQj7(aM#/[SN>i?k3VI4o]]:g>:6m;ik/gNN;"27h"f&%nac8)[r:0dc'ug\B[3,.$Pk:4 + EcN@jfZB=)("[O&^etcX#*t,hRZ#HB2)$_'p?^I$MA0J=)PuJ\?[a/N*4:RTY@#$c4*GFk! + X5A7R1\FE6\Z"hF`i-(jpbf0A7S>M$!h2m-8f@M1_haq$`75RnQ,'fhO5@Y0n<`(. + >/Rl>7@2FY#QH[C*[EKr(XP5XU?5]jDDa,YB4hGpT-`3tJLR@BZrEa'c+9CZ.Q7Og7>$:7TtLH#ou=P@Hm2R5Sp99U[ePn(tb#5(+RT==U&s^etb4F4#uD + '($m<'Lg#4^]!l\UIUBp-o*2!B[itX6s/Ldq,MnBoiLkC7;YbrV%Tb4]6:=;D[b&kUIG]DD + &L/faT/VO\T0HPOXEqrfs><=,U>p]5s7ju(^qoqXAJDUP<]*F;d(KAaPrL8'4PU&qXfpA(i + XS=oTUe'W`5slCgg>EkDI(c^m;sl)107$k1RH.p&n8bEjaVU[%:']4Lu;8B#[%e]5^c'Vf' + f`f(c[YW5]82(C(jnDM+ip8)otefR,*PYd3/Q5U>Id@io4"Zo8B3HM'N9#Ld(Pu"AWV(Q)e + .'9ft5($2%Uji:=0bt<:(M@5f_ueu`/!lI8\2P.Gf%8h37UYZ+#oJYaQHk + +VrN4`]USTgFHt)B5K+W(h)EXS`E^&e5j=9T9D.@3V"0]V%ZL'$>BWpkZ^$e[*c@^qfg>lR + U_VCgVW0Q8%ch)O=!UEkQel'^su=_hZ33+otfG,37%?Hi*O(&j!(VV39#iAa%S&+MWcq%: + S(PS*R@]rG3pdTd9g>`D;2L!]>@OW>O&1dVfLtGXa%UL1he/H>r=/j/1aKJa2g'bWDb0AVj + ?>.3dpjH2>T`Gq'($k6suu$OuI=9J,fIK<+jace=8O?;SO%oJ"Y6!/#eX(a\@q0-]iiTe0s + 86_hXtHKi5]a&\SC7MBJ@GFtM8!gUhF`_J0Ji1,ZB\I + /,mMnqd.8R@+rifJ40P%hGo[Q75b0=gM]\4*DT!A4ZI_h7Igq7`;WB`JTU=)00>)GH/Tpm[jm69O=gR7@!<]2mR:9fA2f[iqhS"9B^Qr + *2B[M?\!62%'[FC<`8$_lOe60P8rDp%(2/_3:\4jGRjmqNVQe^nWq>W/DpkFQjP$+dGr#3AhgbYh + j(HJO'OKqS?naEOdY,:NG0#BWIMA"MQAXl`YZ(bQ>Vp2pAB;U^cTN-[=^,+&3HHN"/hUuKD + r/-0]65e'P`3"beREn+/;9ai+SHlm.p&mdGk#6oj_m][NupT`5+fsE;AUrjaOjVsnJqi>#; + 7a6F9dL2*Ze(2nP2hS`6_G[6maf[>ol=897?Ku(#u@&mFnu>o^pA[!nk8B%NQbeb0gP->K4 + Mo[+*a\=I(tf.TNLU@`=4k0>I(=HW!bie#-!NDr5GBA!='n7MA-kC'rjGo*m^taUO6b-.;c + 0qXNUdgUD)S>-s+aokJO0^O?!FYsK4!D;;Y+Xf^u^4aT_:kq;&8`'g>NLCYIRG7P&hMj.ja + KV'k&$k-ZoKVi>(QIi9FbLcmLkc%LY)Dl-Cd`?q>!sFK)s/`F]Oohn/nrH>jVG/!fCe,%+l + -cC3Q;T"qc$0L.#F:8226^$_d9O%lWFVZ"Y[Bb_JO/2-I>+$c+=$7_)`Ed4*_U:ocHbcFNZ + C3IV+i]l,eh:.JEFRoqh/26AZ&)Zl?)\hf6fn:DpJ^ + CM0OY$j.<71"mV2nWp&+XW_G0.5O^lLr-1$[5^3fTl`f(d(MA.3UN/39tr00l_WB^=MK9MK + 4FW)lQUYEG,1S`k+p"*Q0's^pkfed2SjCIlQnfkPeJ\N'dHoQ8,`;[2]fcp@62qcd[q=CR[ + jiWi]^tJVWksK<=>`r$`:;(`3:<&bcWUT#mQc.e'+4RK$5OEbX&n\FI$(8r7!$bMV + :sSS;!T:KSNE1C_7Op[ZM^k)[VT*dKk\WDL?3D:@WnYFT4[Q%a]^1SZ_RKrpS\!?.LcP5p" + $6Le;fbC?8Ne@mQ6[Q"s8G1 + AV\BB%MWcq%#_h=.*M1CkI,6^=BZpoHtlSJA(c?39YiP;Pmjft + -K,h)Gd-8.P,TjCWE*&#_G0.5Ob9Spkf/RC&JIH^//30N>,U;7N0e3HO&jH + WP#r7A5sB;Q'65Pq/3.L[kBAo2">24Zkj*N>U,BT07NJTpnLUQ7ATFkih5NjiRn=S0LN6QD + pdABrPufDSd>:GCF6:!;,R,9=X)+ldfYFeGfFDKg0_<^]E,Zjo?qId;*-h#bnkCb>Nb9I"[ + !5,'<(t7<89)%:n_&XfX1_&U/GC29I_hV;Ah.O4oW%[C(\5MF&ab,s+r5SUUP68ZQgb[V`l + 5Nu^T\$r:k9jQM^==POVR> + 6A7WMC+3]B!LAW,26^$_d9O%iWT;rbC*hAtIG5`Ug_/q_CZHN;C(XE& + aYmXV9YJbLYC%U>IPl"dS(A6\Z!]/u*+-U5[RjAd3A]RJcmP$S7f?4?'Usl;NiCgS,!XlL2Lf0&4ND5Q)k0Z_C: + 7;Qj?9,2.AR< + /(\I#qWQ5;IQJHmFoGE;jSA%cr + *)Wr(-cD/_cV9rVH9WDmDU-_GV]33G[1siPos$bXqcQcY/V:I4;RGl-aV+DqVFmE;LMS9dM + lV3h$f9LZI$^i%2o2c@D>I2,>IB!]*BW9)^0D_M3I'uCt%YkQ::/">l + Dr1i9;C0r*B?qXaY4MA\(2h'(Q:c;bC=T?+\Mes:q.J[[^O"D.;kg,8TL"2T7ujOW%[XK:; + A$SHQAQfRMhWc?0JJSl`nnCUj_osd# + Mu-.T`cX&["r59D.rLUqVVRNj<6>&mp_YbHVu$;C0pd%$\?hcCI$Egka?/Fl:&de.&D"TgO + Sjb&`f8J;"Q&*;&4J.XDV_nRm\n9b'.8G`<7XqR'.-D7:a^8;DV_lAg&A\m/6-_] + iSibF?+4tB/JE#q5_0!"4"CY,/=$'"Y1 + aHM'!>&N99"mhCso,9jFV1!Y.\`/3mrh_N@G2b(8r7!$b;V4K_jMHYbHV3kab?.OV9YPh:Ul*6A]dR3X=+dfe?WZ/;YQ$Jm,#E[\3e.dPn4iP>-D6q3Fs!Z + >^4u0Be2&,.h4+1:8uaBc^$4k0&2'+/=$(gW7n=W[k>#@W6`cq5cu+H)]P!0SICgAkV]SD" + OUI2A?!V0*M\o4'GMgB6cZl)[7A5O6(+WFE\k + c;EpqNZ&5RoXDRi*\EM\`_0[nfOcOALI<@&\0=V4R1"G':_S(sPsZA=Mp0.2 + IqOX!Ao:7WZVWi%DP<(*p@V':`XU*3/mGO?HYN&P\3aPTh+G3ssld]H`_bW`XbokNcB7.RS + ,e1?kG2Che-PdI$>71i0-?I.+,S3;4"\3cH32>PDug>pa8=KnIB0!o<>6BUFK(kJMUY*0iF + lD(B?Z4_&nBU27r`CXo/4?S9IFE_p^:nW?/9p!7IB[EDJT0CBS?#kIl,'j\L'gXYm%9_uhl + dr+IgqS>Gre?k#D_A\frr)_,p=W``G#=1qq!k,d_G&3Pa[$_\+`H5MdX!AY74bioq=<$`U+ + /*>g^pVb4\JKm+&g\S]T\i``!L>4G:6sRs2Jh"ggka?/[:-t-e.&D"Z"( + hQ7='<-P<6"m%?\76q3OkU*g7!`("$f)Wq="\NoQbV"F!D>lR)H\J@B + J(4/e>T;oC)PMSs/?QXbF:Gon5^MK*&@E$YHKUeaMj&R9<6=e/G8)GPLN(7]Y(%_p@u'.&L8n=Y:0LJoR*:)W9!7d4TgR=87o_@o=YEc_XoRKL\pW + MU#tmoaC"*(po&Rn[?*%'Q@&\rg"%u&obsb!c8gn#Y\8W=\7urtHM>R&9;`cN-NY8b@2Jq/ + =X3K-Fp$q(_e4*tDnA9u*Q9&j70]>Ki1hgEP^'J+?921+F&VCM[bu1H8T.[dA8sLmJhhpF7Gq>Y.iPL.sJ]=l2QAXl`YZ(bQ>dS(A^]4;FE#HFgn + r(^d\@T7L48\Bt1P$=cc-:r,SiqGoQS52j/PXJf8L%2[))Z/nKV"&i&PI7gF;/Vg:n^3FT# + 3H,>V%`9EYFg#F!gQ!R'[PZ>#anNBjdp'l_NC7^An1ZC*Q3Se8u + -$oB+!`J,hU!kgZSqn0SJY/o33Y"Bnp + ?GVO>b$,"q@J>l[$J\'?CR5/=d',)[68s<&/>pKG'/WS-)`mT + Ksb^JW`foadS(ALCYK(iJ"U4#5SQiW&G4!ui2r`r\74g8bNZ8ig?5 + -V8$!QVm;5:)WS2bLTCer$ELo!R/6r8[,K*Mof].X4^/[\EK6:N@J4?VE=`eL#$e3d"o9@Z + XBWR?Z/Y[@KS^F`ToK\DI6/2\RoTlAu-_AhdmZ(q4+)$0:="SEN)<2NE]C?4qnWJFj_919E + :79c&r'buue?U!F@lIDp_r*-'!e>6.NCY#S\[_oD^?c@m;hn=@aW]Us%eG]:=;qj%DkYVpb + -+%@56F`RKH1JUmnNuX2A-UR^F6:\\Zsle%4@rg$Z=qX[Wn%/CPu&X7Mj>kpNk4,\]tLC>) + 9l%cSND$2hN4.nR;qA(;hUo9O-VA%QFchUeu``K_I0@!?3?P + +.g(sdG+B-J\o]_RelIin"41--h7-YKe99i>IXfX0tVq%_CK;C#,>,mL=$[#\7%]ROXN5N\ + s+7%O^0AIeHhFMrW5=1`Q#n=3,kO3kKZ)/k+oFtHqPc-ldh'L<9;8f.8Ai',/:?m"uN.W,31"(L)*,G%P + GBQ'sRGNZC44_80R'Q7]8BY2hf@S2dcBM\[iGZW+G:lB*;]=DI0KT`[#e`q%'BPbf#H[V\\ + )$Sg=?]6:1'(BIX($m%ELUbPLd4'&j4lC+2_J>J.'mJd(]`JPD*mP/b.#n@GWC!`659'G*C + 2g'2pZY(Z[?DY)D"M/^>,2=D`e;RN@//?QJ@&XF+\S08d$1$3HVq.(!bNk7K^Y`n`\<5nI" + X9,re('Vd)0&-33Yd=+V37G$W`=tR]O--`jis8RN"q4:5tbdWkr7@`_=36m,NLD)6(InnN> + l=k7=Dm2=0>fJ*7bT:0L3.>HhZs-[rke&HXR-h*2$%lPesqMiu$N-ZDIQtn%XepjS%ieLJb + Fn$Fr<+]66oJZA"u)>\iC6(m^'C26^$_d9MpAe2ha;FAmb:T0Hti-QsY,>.&)r@hn!gkK]V + 3kZU5:^qbL'=dgQ$h7Hb3Y0m9I:l-aY8b^'6f4aZ5XhS!uSGOO.e+&N6.,q7=5o?TX"X"%,LeG8_!W + D,O(qGbu9#1Dd^rVEqG9aJODWPAE*S)X1=0k846q.7>e=ag2(:m-* + VTh7#;OTVbRu71:S'?Tr$Oc\uSeV?qH7_KT.'J>FH9%4i5[1`)u><@' + C>0:b7QQ@7;olIDpKQ+1el!Z@;ZKn]@!qN?CR)3+:Vh4+79:b(Vijq=O$5(ITc$FR.L0173I^lBS9FkG:hqMD^;UqF\jiX!VA5 + #WBgEJR24$1&!7ujC8G`Nn/+t"GBd9XJ6H2$a_j2[4a;Pf8LY,tp;Nd^pHhbr@EGse-*3\< + @4jJZ:lmdT2Qf<8OWG1#^3\">m7:3I5[`ejYVs+Xdb;l37Qe>ZBC8sRhQQMd.i1#rE1nF2P + 8<=ebb)cEo1p;I)+7J%L#.Y;=d)RWNGOTM;C;5d;7acjNM]=YCCI&%%\/1hbjc]F6?:h82K%:uW\>M:+-q,LdmF$tisXQO*^'5_+-RAggt\D:l\ZE-[VacBq!d5u?Tt[;UIPhlS#B5]9#a>V*NR\b<6 + WS1aD!<9GG9Va.RhIB,mDl;ap]ng8r/FbCtc7qgA>FMi5*9AUjXO4/`b-ZZkY))=Us4r4AR<=utFrqhH]+%k2c]IYr9Ml?XSqsUQQ(?+H,hnFN>l + IN:i=V<,2-qK?2-NG\4d;*-h#bnkCh,4RJhnO*^YbC'GcCI&+PEV1CpQ,?*GhgE)-ic>OccZhk`n)FhFj1fak>X3^f + '8ZcCaXea2c0<8`'Jp/N&6!gU<@q;*q*bjQl-$fle`;R\\A$;]u)[8@p\!"I=r/26^$_d9Q + `3If1+Q;VP(UZ*CS*k05DUW0#4JP"MWISMJr + cg6S3*ASGFcC[569E[fP0'T*\[/p[;,@Y--=#A8E^RX@rb?DOD_JH@2pSs6dp):>piG3RFD + ]e96^qsX:Jhj:nR9u0_k^H@qapYUHN50%p,_M&0M12,@HV6ZR`9A-U^7BQ3^+L"g5YCWMoL + utEZ925C@2=$8C4+@%j-OJNO5%SMFlf[FYoff'1F6Cg`mK38iZpq:L'M'Hik0/rJaV?fm`" + 3*,pI;C:']-NM7ns]m^YKSU>-pYP%Qen&'UTMjKnP*^GB\7^R:M+SBDf#Nl-cC`ld(OD[;/ + !QoLM`<7%nNl2&H`4+$Lt5G3@/A1Rk=5/4ATGo]X+tK.nW]W@.SfiRCe:1D;)F + 8lfR=Vn6KV:Kq+C(7ZA>!'K$boMWd"'#cTo_/&]B + E:i@S9TBa:T3ub_?OBW1)g_`JC>VG/)*\h,WZa97U#7jq&%"@a+"lo4JU*0J>OYT+MrbR6. + Po6f*7'D0<,)GBu@]>eC,UDI!V+X2ck0BMZA]b]B"rK::gl*+,*$$&\*'*TVfeXi`U*N+k/ + 68j>n0$oL\T>F,Um$n%5a7.jlK[Y,Ne3gmh9;9Cao>YQAe"QS%N[`'#)^n6#>GH_AM7E),g + tu?k-f$TWmpIf_al1j7073TNC9kM!\#^SduB=BHF/9)1`TJi@W + )>eG=/h;*MPlIBF;baLD)n`%M_:/5$&DEW+*&G_q^I/"hdnUQ,idLL8*7(8r7!!pUC' + '%(5[D@CHM-R9b67Yb3&m;(X1,S4h(Lm?rqsZh&)lL+]^#X77#?n_]mBA:qXs/%:7TtKGOI + crr3J\A#'K4\q=+j#C=R(S\8durD7XoXC27Us@Ddhh2fG/C"U.OfoGUg]JnQd@<)#&rrd=" + _o&IcOk?TD7!!!H191AIk==So90!J=JLlRMPZ=Sslkt7J9S>^Ko&WF%_,ldoF]`LhqoGUg] + JnQd@<;!bIodZ*Er;#sYmbN6ep?`LL4F6MT60HOa=l+(s=gOu+VL\dK!+;82;A$SHQAQfR$ + S5:@*#osH\Ra6j<ch=kV]SD"OUI^WTqm;B29;Zbagh>d@s'&Pq)IO2rCiTBj,9&XI503^q72Y!!'A8//? + QJ@&XF+\\M+nUI'YAd]?@]AnGWk04*_qlR)H\J@BJ-Mg2 + )#jU`JYO6_bY@:c>@E8*>fX7]8HXh!;$IH("$f)W + FrRs4Pj7'D0<,)G@_9*G:q!'i:j("$r-Wq//8-b!!!/j-be?k/nV5q?J + Omp#17i?5Bt6GnktB)Y6*99*]KWL0&^_-Lctl5"TSN&zTIR3$na)*n:Z,M3zzzzzzzzzzzz + zzzz!!'gALl.-Si,Ji2Q(X2s]T4!3z!!)5KFXp70CUY-hccCZQ"8tT4+#a0"z!73*u1%Ab/ + \o:_8D.UWcVZ;N&z!!!"t_lFUQ4Y6!2X.Qge7+M;>6ko\%z!*$dEqc3(@Vn(_%<<*"!z:^M + cjnB[nIgq?L)qT,,nVj-!WuTCG*q!!#sVr94Ggk=]jX9\Yu"AD + hkE!<<*"?n,u95/VerU=&V?>]TMs'A`s*!5KJ)+aM\jbM;PWgEG_'@*];=LCjLd!!"@gTtNCqO&\$-V$m";a!L4=MuWk< + &JG"edTBT=2]kb,i@GLe`mG!!"]eJj2[4m'20>\4+lO*P!=I+H6&W"9>CD_u"?W=Q+-H.m5HNT0C9\Vu + Qet!2+DnW]0[GMq0\_V^%L*"[L+5^[ea5Vkr0e2-S=grKqd=zXK5TOK_st%lQIM*X-^%W%0 + /HMJB&,#0eGW`oCh-c;ucmu!3d+O)*;T[>4,l;XbVjFp[#DE@2K!U+X&#VH.<5hpD+c[eDP + J3TCFrlz`:;o^:\XR+gda+\Lr5qhYqbd]O!aom/g8''ViT`PrKa11o]isI`Np)fO!ao-!!" + jtG1VZ-#;c4tpqJ]jqM4W*ScAcTGX(^=g35FKRu'=Lr:""K`tJFQ!!$1K0d19%hcL+[R1/B + Fq!e8ehM2dF+GEb7me*ql_YlBeO"=L[JG8R:!!!"L[L)R:*RGg"/LZf(*UJh.]YjW.!WYV" + +.p'onMp9TLMem$g,UVq.nTmD!!#8:[r4CLCmGE?\_Y)hkW%Eh'`^M^;c(D3>BfKo%Gdg]V + kpS(#4OgVzcjfkVl>J + pEJTX3R!;ucmu!3"&3*S7e3Gk@=d?'_$GI@p8="X$I%R#n[to*$WPHkE9(cCX[fI:9es%IM:(><\6JOqsXXe!!#:a6q51T*U:LijJ0o + r20ds+a7"9q@0!SKQd.bZf@>HLjfcjd)mqCY-D'rD"onW'5aK4SI;j\:jkRm@\r;o.h'V;@ + #mlI$%l+.]-TX;+e^>\tYBmlo@#l'%+$t5pA,lT0!+[8@gjFYh\CA]tZ**QQ"n=dt!9fgu% + t-nX=i^JMf5#\SY^bU(QM3ZL!!!!aQ=KAYbbV%DH?WP=o\^aB_8,q-"/%S^A)]GL4,r^^<6 + _[8GBk9CzA4;;=/RNmeqcHDHR5TMPYKnTQLDg0knDp:h(i*dPQaXW7g>OIKisYnf!._.D>[ + 5.AZ*)kP7/BZ^:.l+Bgdk&SO/`3$,!%2sPOf[iKW93mNSb?jO#QA*!!!#7PbFB\pcL!7SpE04`IH&+3M7f#b`k + 2gHKdzJFjZeaXc]gE??W@SIFqoo%^5A=K2RUFMu2;Dg/hGX!:q<0OC8NTAY.M!<<*"!5;2p + 6K7>\41L?RXoCUmf>=XjekmS6GLidKkgz1*n,,HL+HEm\?X1 + 'e>3]X-Oe5$]X.on,_I(T5QF2-19Ap*);&HH%.qdl/F19BB%:I,T*O$43Zg3bnn$R56+0i?nbhFo + 3c6=bi6ehIChPQIMoru'EA+5!!!SHod`hM\$tB]NlmfY1Nga->I460d)U+^B)r"Tj8Ho?k+lkLYHf\uEdP?EiA' + f-z!'ha?[p@rVTZYFABt;0-eVVZ"8DY]q!6X6co4cmP"'-380m3;"?!<<*"!'i.@K>D!D!U_0_A8n` + ;L\BP]NK*+L7K=QkM"#*P%Hi%[>0?df6In1=2]-e3&-)\1!!#WQOH;GGqG-J=.thG(n!/\% + hMdGFWr`_A()jU:ojY[RbILt>#`8MmI7["L;ucmu!9f4%kd\`a]5f!)+XquC!YZsFA,)pDV + u(RB`r0@4;Y&/pmI>0&][$rczKaA9JZ5KouqcF4tc/;nYp[#C*q)O3(W<'g7_s`$CRcVS9= + P@i25`jJhrnB:[17%[6!<<*"!2'ZB_4SbM4*)K`+_fE/X+U;(F2=ImGb6!!X7Q1!^mFkD0g + Ch8A]!Y*T-Ni2('"=7!;&t3a7)rYf5VmV+mIG(ElhM*j1[^LGb6*$/+W>[qh;@=YeH&&`b* + /DYg=fT-O9\P!!%Q7"T!n6(uW>\oS$fad=_]'m.S$b#1Ieu,ES"KGicg&C#c[A5P(#@ArO- + =8FU9KV[3>'!!%P3nFm;.eo*G?0c6'V`X[,OHLME1XT9m`)A7>2j2UTfCUg#%87i_o^aUr[ + N;&_Az?rZ!t$Q@f9-23N=,*5)R*OiRc#kSYhIBikOnDp:(_kI7#*6H,T]`/mTp](9o!6CVA + GniBauJl@8S9/=OcOrbM!R.KBGK!'gm0?O%)*NH\>ZQ9dYS2` + [LUrA&otklXV8KS7:u2kD[j^TXQs'(2YG+t=fA3;J'>];P]0!!!$!%ptr)R.XOUYo19)pU2 + Ror'GY#7"?XKDhGK9^4]W!fIj!rr<$!"]@/Wgiof=!qlKEo8j)VU5VQK>IGAYPZ?2 + UPIb7eOaRHC^:K,jF(V@zBE056Ih,o4IJegJQjKNHmr6&6gtRmW%e&usLa+&dn_^s^SQDGf + m^%fJM1d:E.5l&UiR,\Tm)E&oaN,4TB,M7)cp.0h8 + M>if#PqXVkC2,-MJ(5AS^Gi)][&>5zNBp$1A/rR:/;L0gmd9D=NSh$WlfG%*h^9`tnNPdEI + u+Gl^4,mWoBI!6VH;YXZ=#oJ3sGZb!!&)b)+Q8_G_#[I%T,=d\h1C\]D'BtgTOrg,UME3@& + ">NQf*#Tc.:,U-B3/UZEWA<1*C=EXlFD+AH2]1!!%$^UFGA+-b,6'&>Q):eac/8pDht0o=; + >;@KM!g4<4NZG^CEp;O;f$<'3/7SNZ=Y)b@k6CB2&HDe2!'jU*3H,of + 1THWTTA'C>b3f-+Xt2ko\Q-??_$a*S.lRVY^WY1]F*SFc2mtG!!)4&^\>Qo%E:.@#ZH%l>[fK + uKAG=rS"7kFhLFkFjepFrp]c6EX9j65NfN^V)g(i*b7dB.[r/pa_Z%o@$!W2X>D&>g&]TbK + \M<;X3:@Luz+A37])DuB%480=0U>>IGZl_$e0A!rk17o?MODI + #`T+N`bk[be + GmX)`Na!4%bT+^7m9I-:)^AT^4&WAPs%1\F71$An#T]9,U"=npO*q[!!!!Ab@*(AL_4SJ%3 + c(0Qqj_6(@Tt'=UU:t!rr<$!9f^^7m-=bPk!4fG6%u$A5)Ge9Ddkz!%;*coV>:GA_ + ]e:889j/&q['EIbg=I^%IQ_*>\\U!!!!Qn`ki.L]L9+a,gRY+=^sXaGkY__7]6Ez!'g\G@8 + ZWnn)QZq6kBJu4HB,j@UnDChdlfg!!!"LBTeMe41AJ'ZEW@QUdPas;'\:Um>i:!bPUE/z!+ + ^*!G"#U2:8VJHbPNT>LH"TS + N&!!%lg+.p("knNl3-6b[A0c8#IZ*IKEA^gIn`$F46;#gRr!!&ZSQS1JhgXUlPQkMasKJA+ + *3b#W;z!.Enno4c)*c.kg\#_F2Kbau*bpsWm4G>/&;!!!"l3q;`sS"7l-=n!Mb+p^&N_DuD + /7gJoS40BG0#2])Iz!+7oODnd:?HR8Ek."WR4\r7Kao^pOXhY0P@z^k'joaEc6YEZ^Df#_J + klIbqfb&M^reNW9%Z!!%Ng#".st4Z@^k0&\uN71^`&VbcJe-]WHB^*s*`zPMkPDs"W*MgrH + ?!Jn3P.Z$#Yb+3aUg#QXZ"g:R*W.-j$Hj8WGuR + J;+a,*2&-Or2FGEgK^qGR/hH@0cCT$Q1T+qB%Jdm3HHl=G7hL0@msI=*m'?[GK(Sa0D^mg/ + O\1dk\]KopmAN#,j%oaVpg)-=m;oUlJkrM3`^o]n.?8i<5tM%Vr/pcF^63/(nC^f>Af&QmO + ZmOVHM^(%GlRi'%]<+2k"Lg?T490YA94>Is(,,Uk]746J5N2AVq6j,P(pD9er"-,[Ek9B!8 + rEVh@Q/6D-cYQ<`0./?rlgnk0'Go2#mVG]t5qtHMjtB#;21)Rm';fj,).G)#sZ)j4r>]"ga + )=cao9oWenXdKbi"hde_5=ct=0q!#[2I(t_]*Cs)PNi7#*0;:4IpH0(lFrVajbV\]=5RB4* + (F32;)i7"m*&`+I"._`ZF/bFl'!5Ot`8e(4ErPeELP*NXnrP>)[5%k-#J7-Y]?[d"Ok2ghH6,AV%o)cJ1MisPk&#]esOpR8api7#!-i@L.W]4()XY-+AC-P-7Xr4 + \KZmhX7(&q"_c1^q(.FPEXMSY8h"!!'NaA27/3i,$^2B^cU;dR.beG#A49kpoLGPG-;>!!%6Tf<9=`6u+-/b7-X=9DXQ8Z>u]DeQk,I"Vh# + f;6R+0j3=FT6B0P06dPI(#.3CW?/Jre3V6GU!!#CNe;8)[cJBCcfTpVd^%QJlm&MY1cOU!U + GUS`seDWd>o:FYII.3GDcPFj]Er'<^k[O\p!$8_&JRhJtj0LNKK+Hq(I^aSuD5d?mgu.*uk + gKS5!/=9V?[pVH-_I!92Y]Nil.9sQ8#n.9H%[gN!+T%lT%LILZg>c%i5<)^`d;ku@oFsL9T)s>4CL + GX!.[;\fA"&apD:/KHFB"/&=].p<)_W:rMKVqn0b&fkC`Z#SpT1(ejr0`id"bn4unrL8;4e + $!kIPA!!)L)%1Wl>q4dQLIr#WZj@c8Q860X-ZJ?=+ + 5DHn;!<=7k[($!5\8'pN$2MEXIVDcG^0-?Febo3[NR7DP!!$Q8?b5[lW&XMCPdS>/!,9B;1 + HeoJ>'K"QGNeo=!!(#r6t2h_^tD05Z7>g&Y:lk7h@N=,4WFb.!5`Dbm>)NW:EH,EHomDk2K + _@cb2noFHjTiR,K.hG[s)]hCi4Dnn7CQBH6i,i5T.sj:N*2eH(t1:4S2nb!!)rJi8A!a;u= + `!Q'95L#2^GsLYA!_q9.[LFhAl`9)3-%cVdZCqWp;X+n:]Adb-hMf + k!!(fH<9h4OX[W\uV`e&lI'\q6@X$^TR_GR&]lj__!2EfnXn[I\B3okW/GPs5i@)%hn/KJQ + n`iahe5SC#o^mmPP5kT5+nklrCEI@Uo'D=Pi2_WTcPFg_\81tSSK2"0mi)6,i8I;)#+JAs7 + 9<#f[hmI3uN!!'eGqPj(QrDdKr]tS"Qhu#U@ma4ssfNapl&rBnSjg#VhqM14+)AFHB6jRYJ0;FA` + K)sr8tn1aZ\sER8IEoDB8Y.S5l*7Gh;'%HH3=3Jpn'(o>s#:bbj#pi4EDt3S"!]jIeCFMLK + eZQ\/kFW!rr>2[uRLp7r$AP?bQL8S + kPK%nCdKjU1q#"3"-n?aJq5!.hHX!Bq+9;HB@ngF1H7`uLm77__6=1<)!!"67It.%;`Qn=tkKC?c/ULu_k6;H6Of[=A3@26)I(ZS_^ + >VUUHX!DU'EA-k^@_'i``fMbg>B8K6g_LhJ$`TaZ.E4[A4Cp;#APd^k^e/!heK/H[YR`&*?!b5%@oG9lK#!Aei(pUge1Iebbg + Hn(VnE]oAo(jfY(9U&Xoh!!)f#;Q7JOf=P6?>\uOXmZ_OS'[3O7CjibY:`uAJXC7B"=)_6-(fN)$[?e.O + hIpos] + +Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/poo/diapos/graphics/Logo-PCLL.svg b/poo/diapos/graphics/Logo-PCLL.svg new file mode 100644 index 0000000..d42bd44 --- /dev/null +++ b/poo/diapos/graphics/Logo-PCLL.svg @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + +   + +       + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/poo/diapos/graphics/debian.eps b/poo/diapos/graphics/debian.eps new file mode 100644 index 0000000..ff431ef --- /dev/null +++ b/poo/diapos/graphics/debian.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 262 316 372 461 +%................................ +%%Creator: GNU Ghostscript 510 (epswrite) +%%CreationDate: 1999/12/10 21:20:34 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. +%%BeginResource: procset GS_pswrite_ProcSet +/GS_pswrite_ProcSet 40 dict dup begin +/!{bind def}bind def/X{load def}! +/rg/setrgbcolor X/g/setgray X/w/setlinewidth X/J/setlinecap X +/j/setlinejoin X/M/setmiterlimit X/d/setdash X/i/setflat X +/m/moveto X/l/lineto X/c/curveto X/h/closepath X +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{currentpoint 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/q/gsave X/Q/grestore X/f/fill X/f*/eofill X/S/stroke X/rf{re f}! +/Y{initclip clip newpath}!/Y*{initclip eoclip newpath}!/rY{re Y}! +/@/currentfile X/|{string readstring pop}! +/Ix{[1 0 0 1 9 -1 roll neg 9 -1 roll neg]exch}! +/It{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{Ix false 1 colorimage}! +/@85{@/ASCII85Decode filter}! +end def +%%EndResource +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +save GS_pswrite_ProcSet begin 0.1 0.1 scale +%%EndPageSetup +0.843137 0.027451 0.317647 rg +0 0 m +6120 0 l +6120 7920 l +0 7920 l +Y +3233.33 4125.86 m +3218.39 4125.66 3236.15 4118.18 3255.66 4115.17 c +3261.06 4119.39 3265.94 4123.63 3270.29 4127.77 c +3258.15 4124.8 3245.79 4124.73 3233.33 4125.86 c +f +3313.52 4145.85 m +3322.43 4158.14 3328.92 4171.58 3331.2 4185.48 c +3329.19 4175.58 3323.84 4167.03 3318.76 4157.99 c +3290.83 4140.4 3316.12 4168.43 3318.74 4179.1 c +3288.72 4141.27 3314.61 4156.42 3313.52 4145.85 c +f +3343.14 4222.89 m +3344.95 4249.8 3337.84 4241.28 3335.46 4231.03 c +3338.23 4229.57 3340.44 4212.05 3343.14 4222.89 c +f +3176.66 4590.68 m +3184.64 4589.26 3193.91 4588.16 3192.58 4586.25 c +3201.32 4588.18 3203.3 4589.92 3176.66 4590.68 c +f +3192.58 4586.25 m +3186.96 4585.08 l +3192.21 4585.56 l +3192.58 4586.25 l +f +3441.26 4212.69 m +3442.16 4188.53 3434.21 4176.79 3427.02 4156.03 c +3414.1 4149.6 l +3403.54 4129.06 3415.15 4136.56 3407.57 4120.23 c +3391.05 4105.56 3357.51 4074.34 3346.77 4071.48 c +3338.92 4071.65 3352.08 4080.74 3353.8 4084.29 c +3331.71 4069.13 3336.06 4061.53 3302.29 4052.3 c +3301.3 4054.51 l +3218 4015.31 3102.28 4092.98 3103.8 4198.94 c +3102.92 4192.22 3101.27 4193.9 3099.43 4191.2 c +3095.13 4245.71 3124.61 4300.46 3174.33 4322.85 c +3222.96 4346.91 3279.97 4337.05 3314.79 4304.56 c +3295.66 4329.62 3257.58 4356.19 3212.45 4353.73 c +3168.24 4353.01 3126.88 4324.92 3113.07 4294.41 c +3090.43 4280.16 3087.79 4239.45 3077.93 4231.99 c +3064.64 4134.39 3102.9 4092.24 3167.63 4042.63 c +3177.79 4035.77 3170.49 4034.72 3171.85 4029.5 c +3150.35 4039.56 3130.67 4054.76 3114.47 4073.37 c +3123.07 4060.8 3132.34 4048.58 3144.33 4038.98 c +3124.04 4045.83 3096.95 4088.11 3089.06 4089.83 c +3124.01 4027.25 3230.84 3980.08 3286.81 4003.49 c +3260.92 4002.53 3228.03 4002.96 3198.94 4013.71 c +3186.7 4020 3170.1 4033.01 3173.07 4035.44 c +3249.42 4006.93 3328.29 4013.86 3394.36 4066.81 c +3411.16 4079.91 3429.52 4102.18 3434.83 4102.48 c +3426.85 4090.46 3436.2 4096.7 3430.07 4086.09 c +3446.8 4113.1 3422.78 4097.09 3447.37 4132.73 c +3456.46 4120.23 l +3453.07 4142.67 3484.31 4169.89 3481.12 4205.35 c +3488.29 4216.19 3489.11 4193.67 3481.51 4168.73 c +3492.06 4196.4 3484.31 4200.85 3487 4223.69 c +3489.92 4216.01 3493.78 4207.86 3495.75 4199.75 c +3488.88 4226.5 3502.78 4244.78 3506.24 4260.33 c +3502.82 4261.83 3495.64 4248.51 3493.98 4280.09 c +3494.23 4293.81 3497.8 4287.28 3499.17 4290.66 c +3496.49 4292.21 3489.42 4302.73 3485.13 4322.9 c +3488.22 4327.65 3493.45 4310.61 3497.69 4309.92 c +3494.96 4325.95 3490.26 4338.18 3490.07 4350.49 c +3477.67 4376.39 3485.67 4347.03 3475.64 4361.61 c +3462.44 4402.75 3486.57 4371.16 3488.21 4389.84 c +3508.19 4360.89 3519.59 4315.99 3524.83 4297.4 c +3520.83 4320.07 3514.39 4342.04 3506.49 4363.29 c +3512.59 4360.72 3496.72 4409.92 3514.4 4377.34 c +3495.52 4446.79 3433.62 4511.69 3376.67 4542.13 c +3383.62 4535.76 3392.42 4527.76 3389.27 4526.5 c +3360.94 4543.35 3365.92 4544.68 3361.85 4551.8 c +3338.8 4561.19 3337.27 4551.03 3322 4551.78 c +3278.52 4574.86 3270.13 4572.4 3230.1 4586.85 c +3231.91 4578.33 l +3203.1 4587.93 3198.34 4574.71 3167.21 4578.31 c +3165.32 4579.78 3177.19 4583.67 3186.96 4585.08 c +3159.11 4581.4 3160.41 4590.58 3133.15 4584.07 c +3139.86 4588.78 3146.98 4591.91 3154.14 4595.91 c +3131.43 4594.53 3099.9 4582.69 3109.63 4593.47 c +3072.58 4576.93 3006.77 4553.72 2969.84 4519.09 c +2968.68 4526.85 l +2951.76 4506.54 2894.89 4466.19 2890.36 4439.86 c +2885.83 4438.81 l +2877.04 4423.9 2871.33 4407.01 2864.35 4391.68 c +2852.84 4372.05 2847.47 4384.12 2849.11 4381.04 c +2826.46 4335.12 2815.19 4296.54 2805.48 4264.88 c +2812.4 4254.53 2805.65 4202.56 2808.26 4160.97 c +2796.9 3955.53 2952.44 3756.07 3122.46 3710.04 c +3147.38 3701.11 3184.43 3701.44 3215.96 3700.55 c +3178.77 3711.19 3173.97 3706.17 3137.73 3718.81 c +3111.6 3731.13 3105.88 3745.18 3087.36 3761.25 c +3094.69 3748.3 l +3058.39 3761.15 3073.58 3764.2 3044.04 3773.55 c +3051.87 3783.77 l +3040.1 3784.67 3020.7 3803.59 3015.4 3814.1 c +3002.52 3813.59 l +2987.06 3832.66 2978.81 3846.43 2979.42 3857.09 c +2975.26 3849.67 l +2970.55 3857.75 2918.35 3921.25 2945.43 3906.47 c +2940.4 3911.05 2933.71 3913.94 2926.46 3927.13 c +2931.97 3933.42 l +2918.96 3950.19 2907.99 3971.68 2908.83 3978.84 c +2915.78 3969.46 2920.6 3967.7 2925.38 3966.09 c +2892.47 4047.73 2890.62 3970.58 2865.71 4049.19 c +2870.97 4049.61 l +2866.94 4055.72 2864.47 4062.31 2861.23 4068.8 c +2863.53 4091.65 l +2839.85 4119.01 2856.91 4208.1 2860.34 4256.95 c +2862.69 4276.81 2880.11 4297.96 2893.34 4331.13 c +2885.28 4332.51 l +2900.7 4359.39 2973.3 4440.5 3006.94 4436.34 c +3023.23 4456.8 3003.7 4436.42 3000.51 4441.56 c +3036.3 4478.59 3047.55 4467.72 3071.7 4474.39 c +3097.73 4489.84 3049.35 4468.35 3061.69 4480.28 c +3106.72 4491.77 3093.59 4506.42 3152.32 4512.25 c +3158.52 4508.73 3137.95 4506.81 3132.79 4502.24 c +3170.29 4520.6 3251.48 4516.41 3304.23 4492.06 c +3365.41 4463.45 3434.17 4378.92 3436.89 4299.39 c +3439.97 4298.56 l +3438.41 4266.94 3444.81 4230.37 3433.71 4196.79 c +3441.26 4212.69 l +f +3070.23 4105.36 m +3068.12 4094.89 l +3077.95 4081.54 3085.75 4067.08 3098.28 4056.68 c +3089.26 4074.27 3082.57 4081.54 3070.23 4105.36 c +f +3093.44 4106.26 m +3088.24 4112.02 3085.18 4118.94 3081.72 4125.82 c +3085.02 4113.71 3091.78 4103.3 3098.05 4092.7 c +3093.44 4106.26 l +f +3504.27 4195.56 m +3502.08 4190.04 l +3498.06 4161.46 3489.36 4133.18 3476.03 4106.95 c +3490.75 4134.62 3500.25 4164.89 3504.27 4195.56 c +f +3179.63 4597.85 m +3189.73 4601.54 3204.45 4599.88 3215.19 4602.31 c +3201.21 4601.14 3187.3 4600.44 3173.57 4598.69 c +3179.63 4597.85 l +f +2824.92 4409.23 m +2827.25 4387.69 2808.72 4379.32 2829.02 4393.54 c +2839.92 4418.08 2824.78 4400.31 2824.92 4409.23 c +f +2801.04 4309.49 m +2805.73 4323.86 2806.57 4332.48 2808.36 4340.81 c +2795.43 4324.27 2802.4 4320.74 2801.04 4309.49 c +f +0 g +2758.02 3347.25 m +2757.57 3346.78 2757.57 3272.19 2756.64 3252.72 c +2755.72 3236.97 2754.32 3203.15 2720.96 3203.15 c +2686.67 3203.15 2678.33 3242.54 2675.55 3259.67 c +2672.31 3278.67 2672.31 3294.43 2672.31 3301.37 c +2672.31 3323.61 2673.7 3385.72 2726.06 3385.72 c +2741.82 3385.72 2750.62 3381.07 2757.57 3377.38 c +2758.02 3347.25 l +h +2623.65 3292.56 m +2623.65 3161.9 2693.16 3161.9 2703.35 3161.9 c +2732.08 3161.9 2750.62 3177.66 2758.49 3204.98 c +2759.42 3163.75 l +2768.23 3164.22 2777.03 3165.14 2791.39 3165.14 c +2796.49 3165.14 2800.65 3165.14 2804.37 3164.67 c +2808.08 3164.67 2811.78 3164.22 2815.95 3163.75 c +2808.54 3178.57 2802.98 3211.93 2802.98 3284.24 c +2802.98 3354.67 2802.98 3473.75 2809 3509.9 c +2792.33 3502.01 2777.95 3496.91 2746.44 3494.14 c +2758.95 3480.7 2758.95 3473.75 2758.95 3412.6 c +2750.16 3415.37 2739.03 3418.61 2720.03 3418.61 c +2637.09 3418.61 2623.65 3346.33 2623.65 3292.56 c +f +2874.95 3316.21 m +2875.42 3354.67 2883.3 3388.97 2916.19 3388.97 c +2952.34 3388.97 2955.1 3349.12 2954.18 3316.21 c +2874.95 3316.21 l +h +3000.05 3311.56 m +3000.05 3365.78 2989.4 3419.08 2920.82 3419.08 c +2826.3 3419.08 2826.3 3314.35 2826.3 3292.11 c +2826.3 3198.05 2868.46 3160.98 2939.36 3160.98 c +2970.85 3160.98 2986.16 3165.6 2994.5 3167.93 c +2994.04 3184.61 2996.35 3195.27 2999.15 3209.63 c +2989.4 3203.59 2976.89 3195.72 2949.09 3195.72 c +2876.8 3195.72 2875.87 3261.54 2875.87 3284.24 c +2999.15 3284.24 l +3000.05 3311.56 l +f +3150.8 3291.64 m +3150.8 3248.55 3142.93 3190.62 3089.18 3190.62 c +3081.76 3190.62 3072.5 3192.03 3066.48 3193.42 c +3065.55 3210.1 3065.55 3238.83 3065.55 3272.19 c +3065.55 3312.05 3069.71 3332.87 3072.97 3343.09 c +3082.69 3375.98 3104.47 3376.44 3108.63 3376.44 c +3143.85 3376.44 3150.8 3327.77 3150.8 3291.64 c +h +3017.82 3241.13 m +3017.82 3206.84 3017.82 3187.38 3012.26 3172.56 c +3031.26 3165.14 3054.88 3160.98 3083.16 3160.98 c +3101.23 3160.98 3153.59 3160.98 3181.85 3218.89 c +3195.29 3245.76 3199.92 3281.91 3199.92 3309.26 c +3199.92 3325.94 3198.07 3362.54 3184.63 3385.72 c +3171.66 3407.48 3150.8 3418.61 3128.57 3418.61 c +3084.08 3418.61 3071.11 3381.54 3064.17 3362.54 c +3064.17 3386.17 3064.62 3468.65 3068.32 3510.82 c +3038.21 3496.91 3019.66 3494.61 2999.75 3492.75 c +3017.82 3485.35 3017.82 3454.75 3017.82 3355.12 c +3017.82 3241.13 l +f +3288.99 3163.75 m +3279.73 3165.14 3273.22 3166.07 3259.78 3166.07 c +3244.98 3166.07 3234.77 3165.14 3224.12 3163.75 c +3228.75 3172.56 3230.6 3176.74 3231.99 3206.84 c +3233.85 3248.09 3234.32 3358.38 3231.07 3381.54 c +3228.75 3399.16 3224.59 3401.93 3218.1 3406.56 c +3256.09 3410.27 3266.76 3413.05 3284.35 3421.39 c +3280.65 3401.02 3280.18 3390.8 3280.18 3359.77 c +3279.26 3199.88 3278.79 3182.75 3288.99 3163.75 c +f +3437.37 3294.9 m +3436.46 3265.7 3435.99 3245.31 3428.1 3229.1 c +3418.37 3208.24 3402.16 3202.23 3390.11 3202.23 c +3362.29 3202.23 3356.28 3225.39 3356.28 3248.09 c +3356.28 3291.64 3395.21 3294.9 3412.8 3294.9 c +3437.37 3294.9 l +h +3309.93 3237.89 m +3309.93 3208.69 3318.74 3179.51 3344.7 3166.99 c +3356.28 3161.9 3367.86 3161.9 3371.57 3161.9 c +3414.21 3161.9 3428.56 3193.42 3437.37 3212.87 c +3436.9 3192.48 3437.37 3179.98 3438.76 3163.75 c +3447.1 3164.22 3455.44 3165.14 3469.35 3165.14 c +3477.22 3165.14 3484.64 3164.22 3492.51 3163.75 c +3487.41 3171.62 3484.64 3176.27 3483.23 3194.34 c +3482.31 3211.93 3482.31 3229.55 3482.31 3254.1 c +3482.78 3348.63 l +3482.78 3383.87 3473.51 3418.61 3403.99 3418.61 c +3358.14 3418.61 3331.26 3404.71 3317.82 3397.75 c +3323.39 3387.56 3328.02 3378.77 3332.18 3358.83 c +3350.26 3374.59 3373.9 3382.93 3397.98 3382.93 c +3436.46 3382.93 3436.46 3357.44 3436.46 3321.31 c +3427.65 3321.76 3420.22 3322.68 3407.71 3322.68 c +3348.86 3322.68 3309.93 3300 3309.93 3237.89 c +f +3704.27 3209.63 m +3704.74 3193.87 3704.74 3177.19 3711.22 3163.75 c +3701.02 3164.67 3694.99 3166.07 3676.01 3166.07 c +3664.87 3166.07 3658.86 3165.14 3650.05 3163.75 c +3651.89 3169.77 3652.84 3172.09 3653.76 3179.98 c +3655.15 3190.62 3656.08 3226.31 3656.08 3238.83 c +3656.08 3288.87 l +3656.08 3310.65 3656.08 3342.17 3654.68 3353.28 c +3653.76 3361.15 3651.46 3382.46 3624.56 3382.46 c +3598.15 3382.46 3589.36 3363.01 3586.1 3347.25 c +3582.41 3331.03 3582.41 3313.42 3582.41 3244.84 c +3582.86 3185.53 3582.86 3179.98 3587.49 3163.75 c +3579.62 3164.67 3569.89 3165.6 3555.99 3165.6 c +3544.85 3165.6 3537.45 3165.14 3528.19 3163.75 c +3531.44 3171.17 3533.29 3174.88 3534.21 3200.82 c +3535.15 3226.31 3537 3351.43 3532.8 3381.07 c +3530.5 3399.16 3525.85 3403.32 3520.77 3407.95 c +3558.31 3409.8 3570.34 3415.84 3581.94 3421.85 c +3581.94 3372.73 l +3587.49 3387.11 3599.07 3419.08 3645.42 3419.08 c +3703.35 3419.08 3703.8 3376.91 3704.27 3349.12 c +3704.27 3209.63 l +f +0.843137 0.027451 0.317647 rg +3292.9 3486.97 m +3254.53 3448.61 l +3216.17 3486.97 l +3254.53 3525.33 l +3292.9 3486.97 l +f +end showpage restore +%%PageTrailer +%%Trailer +%%Pages: 1 diff --git a/poo/diapos/img/cesi.jpg b/poo/diapos/img/cesi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dafbe55de24691c42c68b12402a75d4f863000ee GIT binary patch literal 60367 zcmb@t1y~%-wl>-`gS!WJcM0z9Zb1{=2Z!K6gA;tPpg{)vfB?ah;2zuw5+GQDd*CPE z_H*|>_uT)UnrHfXr=)B3s?}BRs#Wta|F8z&s3<5a03a{`SU-M%hXVjt&fCh#4*&rO z!0$}pVFTltvaIZLEgek-Wi@#K1OfmIB{c`AD;Ng=T%cYaI*KyX&y0+zk;ecqfC?Z1 zJOE%}<>{ubtDyII4?tO7mfG{N(r^5abTRwb$77n}P|~8N{zv}*2;o|}d3XT;Nb9jS zpS6vr)gz90#Lm86Zol)79x;KX({Bv^{Tu`yj{-ho;@{ZrFPQz$I)A}Zzp=Fo^znJY zzh!o_cCr4AdmeGLkGIVuhNwN_C?5wK-$y+Ci0PfZT^t_q)gvZwv9a(300fNR`Cc|w z_K%qR5o37h>Bv4}F#tfpu=^)$`A^u(=H;WD03hq?=I7yHXYWPLY{f#&BP=XLtz_ft zY~$s{p=Dv^WZ_{=E$iyyW&!nk9GE|!`FAS-@3(HLAC)Y?BP<}m!OQum{=cXHw(#$@ z{(JCyZ2wZ@RQt~{0}+kff1OP(kkGgsDk37pP0BDW`0OG}e!k$^AP>E7ke)+HxVu_UteEN2OBHS-wOSE`hTtP_nQA1{8N9Nzx(^U?x^K#Y%RQ< zy{LaH)ymb`)!T#G)6K%lhMMEQ8u9;i!+#R%pX6ZIv9Y!Buz@~yW$-ifHy!okPYMmB|rsG z1Jnb}Ks)dW=mUmyUTmZKq5C|EB3Bm`FfT%zWAT|&$NC+eWk_V}Q zbU;R+7a%(j6yyyG1cig*Kq;VXP$8%SR0nDSeF6=FCO`|Ib-JOf?>?}N`F00bRE1fhX&K!hN& z5KV|N#1`TK35LW%G9X2e8b~XoA2J15gB(Dv5s(n@5vUP35JVA_5cCnO5Zn=h5#kZD z5y}yo5PA@%5Y`cn5bhB%5y=tR5JeD`5uYL2A^IXlA!ZS7E4x7wnz>pXC>Dm4Z01CCZv|8cBY0=_fQ|vkkcs9 zc+(WpjM3cEGSTYOhSAp2uF#>;3DMcorO|z+JEEteSEmo8ucTjOKxGhOuxH3*=x4ZO zWMVXAe9hR*_??NENtwx?sgh}#8IxI(*`2wFd71@@MTo_TC6DC`E0~p^)t)tnb({^% zCcx&vmd7^1j>s;|4rMQ5pX0#bkmm5=sN`7ZB;r)#4C8F({J}-fWz3b#)z5X$&Cl)3 zUBbP@gU6%76UNiZbHdBYYsH(xJI#m5r@$A&_kr*DDce(PS3 zP{2c=MqpQvUhsuruHc*yfsmF^ywHF!qOgo`h;X~`wTOU-mq@+HPf-q0CsDZQcQGb0 z8?h3xO>tUr3-LnnH3@2o7ZL>$YmzjQ7LrAh8&Y&q)>5TXJJKxDj?z`qKV-ONJY*VW zE@eezgJeI-LF5$WV&%r<@#OX8v*lM6Xcg=fDiw|t`4s~cKPn+AsVXHa%_&nTTPas4 zAE^kc1gZ3>VyNn>W~*+fv8s8fwW@>FRn$|}mo*qPpc>7ZfTpr$s^*Fola{+yn>LcR zmUfQzwhoU@piaLozV35fxbB6Xj9!x7l0LJ(xBh1XYy(q+3WG~SIl~mgwP#$y(mL3>;&U0=FRxUsoKxvja2xTm`xd8m4n zdV)O7JU@65Jd&vqZ)WdE?{yyupB$enUjyHUm$)yXFGu`X{bKxf{1yD)1t0`i1$+*q z2@DNf50VZl3T27eBr3yBEXdZqZPJQOX|DReZ9J1iyaEZi`>HG(4IRm5hbVq|3$ zR+LB7+-uR-`Oyf`4$)&Vd@)%u_p#QoLvh@38F6>5`OP(8(dzojQH~CiTZB0H!eq8=dfkVN3p<-cE5o1wCF;cNl@pg$pN&h>ccNL|i zrE#Ud%AjRyPxj;^@kdcn!;M5+PFV}KfM3gt9wy5 zTd!LGxk0F*<~_sv+(!Jy*d|buU(->uee>D}qYo1;DlMN|MOz!&INQqFY1(r-2s@HG z(K;hKAG-Xz&Of?+JoseyY4h{*&r99Ux~F@zd&YWIdk6Xy`nvn2`@06j2igZk23v-N zhMI>3hMPwCM;b@@M;pfk#+t?j$3J`#{?a-jHqkjLIr(WyZmMrud3tz8V`gGje|CP( zbZ%|ldj9)@^TP3>&*JUUt7XLH*cF_Wj8*d0qOUApYu5zUI@aaZM>cdfmNu<6_rH05 zyW5J`#@x=>q1vhV&ilQ6S7GZuar|%+ ze@b#%cJ}n_^SRdf>V?b2?Pcs0$yNEa&~^Wf;myvi?;Y|T>=(qG6iigq-(o!e#6>`);lV>fme#hwM{y73O)jh>K&6$@NvWsPCH!O=R`i)KwYY)a z>%G8)td(cDK9Qi1$K+Evy$J6{;)g}xQ3a10fZzg>Kvyp~RH{IWnE(wD94dWPTchg3 z2*#9+CPD7VWl-aw|0gA$tF2fN=Q5=gMc3 zjcTL8<|Z7lmgn9A`|x0;7$duu=5(*N=g+3k#U;6{j%psoD6{?5IETAL(NPP&yq^#> zS_<(urJJ_?c1R?cRM5(#&&%jZQT%ph;cF9)maw7J9<9X&V1WmN{0#XRxD%m&(;ynr zC)uli+DF`TrGdZpQSujPf>Y%10q7N>A|zDj`{g)`&lB-$)byF5#!9*_pW0z`uH|!n zt`?1mLg|6_=~V%f`q&q>UScWv_-LhS?+!j8lF)Mjh+5kOeji_f8P^a6(c{d7cjD&V z99m%gM@1~xFH5;E*RET-bUIK5-TjuwOJ_bsNto%ce2x0a8hh1zxZaQXVLf7fGn4Yf zBt$B<$1bz9CjAXhs))e$(}6G~t++5`R?ae)asezfP_L9We|+*37ar_01L&3{_>Je` z9b@}DqM{J2^O^%+T{B&Zc{QuVD~s05s#?tj49l^)0Dd#RC?XG|j$j}$9*UF@vh@~TE}(`4 z0fI)lWUiaGmo85PHro=nbWe@DFGsMo&VNo~yg#z`AicM(xvI-(R=7?$-`;5VvAQ!S zR&$BzqwD+jOZsYy?v<=V%|&oNOHW_w0FE{?pT1vT9#x9i&=<~u+VGbqjs zGHojKaYX4_>{>u%MJ1>YuQ}j7)|~RM z3bqx@x|MB6cl)KAcBtJ&DXs!PUWpH1aJhT_{Gv?;-=~a(9KE+l0jbdPeyEw1RLZBiJYUszU#QtGc z{hrU-5VqAhgu++4>j&TPkl(*NzHsYmo{&%}req$SJ8UD9B#M1@VKv8PT05c+e;+3l zjHF{n<(lQwu}b`M01YA4)@JNV(%6&{4;;^YHCvhqT(!ft^Nrf3s<>%CN37_X5ILJ~6wmNz5e+&{ zBDdMz-n|nOkXw(pJgVsMbJAEdta9pPHxxK^+`n08$Kpgnd?NHA z9%<1O?TNg9bfwP+ZS=Ufu4kR zr}|U+y7jiLY;F34BNxY020{v=nU-H>opPrYQn{m^x6Db;On4hR3bw2^NfVV1m}b16 zuFjXF$0Q>ZsK%t@a;<7fQ7Td9V`iXH(E>+hc{U|jWnNc`mTVPSaX9{XDmNyiZT57z zlqattl3&hB)DE+O_pnS>cu9O(BjtPGI$U4fztok5C%8Pil&!;ZYoufG%HebN%OA$@ zic(mtr5#FibaY~EmC^q1C z@YjX%)D*Ixz{-`LKP!iCVEhqgw?32NN#JdJoHtT0CP61~z%iL0eJaES6tvr}w!!Ul zJcluRx88~UG3(<`80R}TM%{)hGdD87mS}*qOL|n7=6|e}pgkB$zhz~Z9O>3fF!8c* z$TE%IAXFMl^a0pY6xb!R|7EmCrr~=Q#Xa)jb|3`#Igj>{NA233VMRQjwW&DL6MEBW z)?Yi0%e7fKRSOzALiqUUQY=Fx6~C-G4ns5pL+_|8um^)6`!udjHv!+U*KSdQRlidi zp$9yl`br&wJTH6lT~9 zf=r1Fq^4`o>RnNu5HXTMSD~}5CkfSvZgQOKiGq&T2-Zcu`@Sj+obJd^D5pQWpQ4-l4y@mZ_0V# zDr&j@D?xR#VOnf?eWIL-Zk{fj{EQrS>v=e|MQ^qB?Gkg2J^sD&t7Dy{Mu&Wgfj)9L z_}$ZhxhFS?Mlkp*VnjXysZWpQc(%{y_iNEvaGehM!$tj9Aw-aQ-cC7rLh`&PA>kW< zxc#-bmjYT~A_lFr;u{S_q1VDFmJwyU<1-U&oy38?VuilzzjT)D&$PUsWb&9|HVDou zd7MUgPeq}}=cQ=rFsCJ2Yo%e)jTEUQAT|h`pF6o6SNeWwLMmPyvJYS%ys#~=PT3(@ zhA~WOHJMF>o^)#!;=KYw-jQsiz7v&m~yXm5??Ee!6{v zDr$Y5`aXKSvJaY*Cr94s5f&-ph|@K9bUe!zewRd=p!Du zq^vu>5X@<%p*b{a);x%bXDT;&s{&HU48-gv&GFTp4Ri|CiY9d9(+Sl;;2C;R@bzCU z(06Q>>z=*e*QL`SWfMH)X_EPKw$WPtSs5&I7|j+}h` zMvwDWXG1eS9{u^66I9F5egRLD zNHAPO7Cs?oIgGRNkw7tBreT{piAN3tph=yW_#s!!^JJ65$04Ra47!}nv~+2zOG$2G zZW1sX^4!(o{F|Nb(3DTBZN5nETl1W{#1RKr@o>x!SaZBR~qGPI7 zb!_%t3!BHbT7(a6{fkp^O`z8!+I1gdb)6d*~YgtNLQHeb(+)_r8Yik?R_H>L-XpE=h5>pU&4xe%Oy`mn8 z*RIgc9>vO+_1l!wQq-J+^JDUMr;mj_A}aW4Ux|gtmJIaIZc{4ZY@f=gC)ZRZp@JDcg$ zj8!Ig`F@lPI+;0(RmzO0(P#6_uBaEe3~I!kubtowE9DeMUxpX1!g=ywhg+R|9<# zx(NBcKh^&LoY(ees8zG?&E0*PmYfgqssF)L{PV_Z>+7%IE}C7QvYB7EO)Mfp0Q7l_ z##@1=DYc6t&x4e4B5j-M1Cw|fa%$CaE^B@xAzw1PCF^JK(%uSPDZ|t>)38aF7>tTf z^72UgQS!Ix(ELjADNmVe6P+j7kxd)qVyZ;zCKe;%?3&T*W?louY$~g6haZJBS>HWyM?QznSluU=ba- zpcl@tf}|W0Ogj!@bR`mt>w70BXrHDCWXH1p(0d)|H9opv*0@H*T=0rY&-aUVjqAqf z&HC;|IJNO#L}DhO2x)HKIWPQ~exDseexZ-F^AuOR?PBjL#KDYBX@~5%GGLs^td_#) z3LWzuqtdlnPDr@Kbm2;sPSqZ3cf(@2V(Lkx(w1Y)1T>#-t}6K%FY>Iy`*W(=z%8#m zeBA|76Y8&XbYZO}9%^lCau~(jq(z{=CBFA5v=(mb{@chCsKEP98T$CV|B3nA&K`ze6aI__9VO4PF zn_h1BfE&(+7&EK-zG!pV53^csQ8EuK%eBCaj^ltvqt6QB>0YUNXQyyEjV*-(95YKn z+Tk~0?f^6K7M7SCGavg&4r|EC6m`h-QqsM8L8@8iaj9bbN-A_0l?{B6^kUplNWHs% z+{I`%ez95QJf63*#iI>jLYiQRT+NCY4Rn-%^u_DTr{M!2oO7R1Mr-iw1n=M6R@xUc_Z!Nks~Y8e1uQE1 z%~0JQ@nagn2zz5}$ zKx=DH8%oJHfrp;BL{$s?a(k?WJ!mona&iDOPySbkmr0j5h3o3Ijj)6D`v)K~PkFPN zX8~)h*vH_WFVP>t;J}s~GdmPa@tt1NC8+jXw-xHa zNIYd$wfsz`bV!qVE2qRV`lZ0UgG18!LFyQ_iV+KN z8lXliiSorwpi*2|RC=!yNjd&)3VR^FS1T0m?uV>8O8TPZ`xBKruB9cPxTkdyn@LNk zaly)x_R$2G$FKO>R$sqZQ8=V<=jpgzQQIn68go|)U=rz;<{#{|RP~^TH$kYWM!;%;p-?@wfseOS7~-Cnik3KAR}z|1`kR9) zLyY{fKV=+lS}niv4Jva}>{Z8;LECOBSsaxbsS`?;r64k_;yb1iIJZnW8V&sfA^keh4!)%}ks-tD7h(Tm_TN8MRR%X3b)8K3li{TIVVOnq{_iC@&+k z-JZZes{#0B46jURaF_^4%OF!!L{NiNe#g+!un~p>{Ov`>dA<61zmKbt(AN@ZdsCXh z1j$s?igqou^aJ~XoIJbe=&@%dpJ3+FcOhbs-(f&$OjrE<#ov>>rDcL95HCMbNUX2O z>F~pclIplJzKE&NEtOAo;DN5_@EXpPuI!gYyxO3BVXT{mZNrf zIE}DSXksdTVu`b3*s{4;3cA@B52Qx#{gT5rcWWf4Sx$qK5E3&IFdNY)(@vy8VMz0H zPoJ$B9|dV&0gi@Rr_g4H=7TIniVEA91}2+tBJZ^2q6-v|XA|d(&$jQK7rXD1-cuGv zip$*!J2G)v#pA!`kKDwl%&0{XMW-@e{kizA`A*u$G$|!9GWO?i8OmpqWV6P-UM92s zzR}dpUU@Vv+=A@A{|^fX0RhKyXe(ypRK@gCiJY#0c7~fJqZW(2uS=GQNBOG&g#DIh zJKT4)Rw(zQu96yi@EWBl+ls#6YPEnOTe@%2pFTUmVY`{;o;*uLolOv zYiny8ux+Ypl+&Z~Z=^vSZIVwpT*QCnwAiNTY26-2Ho4hf=WT5?;$uz@c`X^>-DP*@ z?eNo>IWd6FtaDQ85Iu? zg*+BkwgG4t^sk1W6&7xBl0;VqV}@54wG1+HA00dE@V&0rNr9%=P=3lr0Evvf6*Y}1 zmAZg!1K3gFjzNV!tNm@y?K6pX_m*N_lfzCZ1x}{LPd@Roo>FgDly482d7uq?gpD2E zxF)v%axwdSU=^LQU z9MWZpJnsg2-;E}6;g!BY=WWe-&yY=WqC}yWHApyY?k!zRR9{g8N)b zSG~fCOEW(Du!-6xMlqK;m1 zOBIpay6v48v^MV!7Rn}SEZz<;rf4n-`MIiyMf*3%oAQaUmM>V9SfOHAMhD4*!wSqB zU5kc6cU{MJd;4%W#wTX_2f&8wT{rZ3`aSmTMO?w+_P-%p|B=-p5((0Lm`; zz2}7{ZIchc5oO+eP1i0|NO!OHzQ8Z_Rz3emmRFF0|6KjQxwo|IN))}?rGjC&g%UnW zf{b}xuMoK!Te`^;VpVT7u-0xgsg`p0(g72t#44yF$g}y=7?ETD=G5VM!)bHHJr?K3 z8?+Ji`*=GJHH&YjShh(}Vbk=HKnXGN`HRxdcAGW^M4BL1VbpKX^!L)SO7M@L&!&l_ z2Q;);qmcH*`h>RFTw>wHi)gx4vBK^j87-7HWXjzjsW6oSJBT!w3DSD0@XpJQt|}JB zypH(bmq|l4q^JXWnVg8tQ1U$;Vb**rxABTZz(DRJgBdliB^YUqrs4cgBCP*4Fki!P zY`>h{s62p5D`V{Kk0nWhYr_B{lP6uB?XFb#p2N#N@oy?g{ES~roN=4hW2R~Aa2AdB zwg?Z&p=hC~-Xvz}-t^Qx04MGr9sss8ys7%1rNbO9Y*odMp=LIV!j3ChJ?-XAm$`eteJDgAVkvbd-kt2l==3& zhy|CwnC`t69q%O9yZSgSXp!AHaX5g*9op?xB6-+R?BVSh#ZxPw1G7dG)33MvWb zM?g7@3)M{4OE}Qx!At6v?#SRB@aZ${o4;gR;F?Nr;Pp;&_$I2LjSosmY2s2MdO{C5 zi+^sB>PJYQ5{YwxLK^<#FM&|0g7PQTCg1BnhH%{(-L&q(!?{&ZB^Ok8-Ig-9Lc;HV z6@3?I`CHWVKbr18`6|-#3Dfs)FqIyFNfW!{AbW!!XI*#5Wg(TdHztV$Hae zl-+Hq8I}Iq#)E%%ZxhJWFWT%@uTgjEby?P7ej>R;lIDJjuIL+MErXQRf4Ttq5b!PH1dwVW6qk{|6u5J=j zCP;$}A2-U32szT_H5kArUQ;^%`%6cn8nOMuZxXh}&gHGlTPBZh34B zxRi~BFPcEj+~UIhacM%i`xM7{N0w0^OgO-^9ouP>RRz&D=>D2PgMiB6FQ$bS>Oa#N$BumR7=X^N ztbv#FArz$kO6$zTYza2JlKi>I8SeBqt^9SJ`D;M`KbR)LyOlZI=RWuC9%n7p3l%7F z*LmpyCLZjT&xNE9R4ZjDL0>|bN?Kpo8WOhuD!+p=9^5UXj}DQgPX?LL!M-`atL2S_ z&gW$8$G~YV%UkrdyD-lT)y?n7wa)#9NH6l|@}3I{JI(R>N0K;?X74uZ^&0FAFEtu` zhu!APLMOUhk%Sb4=|cOkJf*Wr|k(lhy^iE*U{6-Nb0O9$F34@BYvC`W5x z8uK_$tpVe**u&eWQ(yU~a8HL#syueMw<}NTTQClXVOEg>oHIhc>jWcfH_>;Hysfb! z_h-5sgXJ+&du3FKTu;iBq9}FpWSXM%dYE(O!D5gEFn{2%0l=uyPF3}RA*)C6iU z`09eTgh%KrIiX`L8iVvxSJuVKs2^ozQ-)sK>^*nqogIm9yq)+JbJDkhEn8g4dCJts z^ocL6h-`U+_Axuo+vw}GT;Gk1WR1bfkwR>hcWN zNq1|GluAtsKnz?q-OR{WUBrW`%Ln?jlH?Kt)TnooWbrL zCL|dzmxldK_Aj6?_#B5FEu-6QTb7e&QvKGR9X7?PD8qN2C1EJh*-&^c9ob`q7$GWo z=tHtj4I@5~&biykfC0|Ob``=AFYHcgj*J|u^*|(c+i|R2u)H7dYt|eY@VHO-CHp)p zu9c!qD3~&UM(9?oeKerm?Wp%VZUD7Yk(4&F`?DqtLMcM6$t=v)j|I~bh^&GxWOt8(uX1Re5W4*8{MPH$hPGC8eIFW+ zX&4WZ3Gi_7Et{Hh;?1SFthDtY|}D3)M_tre3y$mQ`_mXVNk3>yxm@_;E6hw9?C@{ypF|aMk(MZoFmgpj~nM zed}H&<#LbinNj8U%X;#zg{|@#bCOP{26ERqtgn`v-SbqUM?o}kx@V6L#pcgyBzX)vEc%hm5eQ<9o}xO8cwH2J*68KL8|(zz5Ry@OY!FEmSc zeNI>yhRV|vW0|&@QIJ8DFY0P*ji;v~+oKHFerDIG1t#;Hbspw7?5D7_;KSz5jjJwt z1?ta64i+MH342_+f7%f*Gz12g+RZO%ewahEHGPekda8FgZfRM0f6{2VI`B-LHs92z zv6@8`Z_F-Zly$$i!{=jpm0qS}0nP?>#Y_FwgxS#$?O6~1pt~lO_{O`LO79t5AIDg> znrz4H5a9@YT%kT5J?9m!^s%>5{z1d0sa2;$ih8p@_p&hA1YvdZ`dbdo`ujv|ZP1+j znd59$IIOh1w9+$Tlduo%qrtGS|DQ84Vo`_q30g&BBO3udHSO4W|0HTT`HF5O6S8}g z-s=sq_LvO%FmnLX)3@2b&~4Ou3#HSVf?mwn9t3mfX&&V%-HJC5>JR4*r^6D__*zsp z0^Dn6zQZmQGl>IiELrDvx~GTpPXh?`h*$8p26oF5ebAx#;N@{xI1IO&Ogr%X-U0%_>u# z6|X^!#GHhKuJp@8eOYpQ`;BC1<Qu~>K>`q zb?6+jp8|b!ngpMQ-eH=5P2WSFqhIO1hdMy6NISaNrYSTFL-g;z8^_JACceLZL;duR zgx7hEnq}>R0UWND0iQ*J*c6$z+7t#`2*TfZrhOyhhS5LW_`G04RwI`Ih7INdDl{eU zz~RCVfFb9&pjlR$^`-j9rur0E8x50dk7Fk#Aq)+6Nh?V2Qt7;vz9;~I7yWSSj1-52 z5QZ@ACTaKcWQUHGn8&3GE|;<4qZ$rSi|P9ue)Q}=*xN&spB9hEr@E2{@-aZES?Gik zYI%rPT`FF>5tt=gM~H`MW7{Bn+Q`?#I=`xletOx)sTeKw*)3*hJ`T%lM{gTJh0%Qb z=&AQfh2P`(M2uQBgg$Np3=8gvjEyAY*)@Urr!KIk6YtbYMq4BI+Zwa2?@Zh!q)fx$ z>D}jCITv5m`|a@QvnFDcBCuph_z_C?5ZWBZXS<5yW`>zZHFkAHUKnaj%eVZ%aCJA% z+Mcj<#|x|7#yH1N_T@_gAY|$BYL#J0EK;wrn1F`aL_w-A_g#nQKQQSWB`LP?|FBg& z^(nF1aTBIourKNWi?s42%#R^cn^cYM#5#QNB~A5Cq_Wgn|7b4?4VBj7GH#x*d3FE% zs^Q#wMjz=#8eT|!=Hz-a*U$ri{OeZ!i;L%fpeFx$KmQ-hhKeUZifF$9y7X*W7;0ka z4=nd13=i`V{1AFs&H_ik!V0F;b-Q|r{mD?6?eQ$onDJgx&O7x2U?_)*a-noLGPB7oBxvQ2;sJ&mC71BHRy5w+XEn4}^zmRm7C0{K;!A$`7neGwaXGPloJx{LNS5oA7Ze8V0v!A^H08itLB${f<@QCagY@I zGoXRo8eK!0#l-Tw?gy%g@ow|C$v{YmOOwFh)6P+ek+=Cz!u1uxLRiSNW zuVLIuGZ+7!U83BapWc>qbhp_C0xDNzH?FGBNZ6#DV0_cmXCZ2^;ls+W-tIC$ZH*`Y zKAJi{+H~xHeM{q?{K7x2iDYs|)XN290ane2qr+dDc7oZ;LRLKj`@B+rTqJ!67?LY- zd6uvtz(?}j$982Yi*zz`A$rU&_ zIeo(14gK12xb(GgtMP2U;&*54e7h%ajKm7dzZa#`Ku~DR@s``bs4jIZJCRm#!9m=JYtf$m1UYGd0rArg_(<$;^54b{^wQ6e-(JY z&b9nAlHDn*K8d4koMSUUW6d@-asj@Fx6y785^^b8vwQg8Tu>y2cZg6m_j^gET_17KY{F-#r89RKw`=Zi$e z{owQB45@ozvR?KZikYoDDhtP?wo@n!30jF`t>`wpWk+-B#1ODVTYyk6e!tCBNp2=z zo>)IkXz}{gz1(!x=I+1&aZ}*Uib`{|BIt9WdqNwY!DRyL0pT&r639Uoq@NgtSWy&u zCaaN=O=@y)TkwmZZpOkNBR2cZLk za+=2awI%UWTlk?nQDA5mdrk=B3tc4!O4A1*qJ#mu1SaX8E3v~HySHILNA%e&OJQw+ z#;Ob{z9U%Q4{LP1p8QG_Mrbc-x%$Dbn&nEgW;QFWnKQuFl6SqClUQ)fa=XB;(7ccV zmk*b5P|jRYMSeg)-DkhVgEh8gTit&w-oSJk&WXS*4QkJwoXZ|H4Xw%!+++=W& zbnZi`%M3lb$5TheN|}KV2}VOMx9CAKvA97zj&YdVk|VaULhNvXi-4EGy|QCvO$=D5L3+^6KjN+lj9RP$ zKR0M2>KPd8V2LXv%+ku~Gj6+L3UW~wrgLXWSQas`zM`C?Mr*C!%kk@%WzQc}Ce2rUv{hplnw(lnIqlVPBCW{Fo z!cytCl|nmpIbA(9L>9DNIHUeY)L>qDkY4CVH7yWYPGaJjkj;L^VLzg;Ox=g-3I$Is z4{Ln|JZD10>=ssZ_zX1b3OJ?Rf|R=9fLI2oslgEKn3#Ag5A3D#$bX$LwS3){JU=h4 z&0yFmX&)Lz9e%h*h-IYPeDaoa@1)!lCLMgY0|8E8m^}rEIKXOW{*lDiDfh-K*Xjz-0}x%gPkh)Pl9MP}Ms9^NziB+Y%KMwTqb|;4 zo}liqZ}|?-`djKo|6F`QEid|7fjLP5F<{@vAyaJ2mo^kejXQQ#2FX6=p@I zf$Z##<}HR;R6=du-YL0w43EBT#A!7UDj^;KqCwExpk~6N$^V5I-@#%S!x40NHcC|4 zNXitv;2+Tt0hD{0QHT)+uW~Gk=z9_jlvd`*g~7@$WIwPvymAvR=kNQ^T!HcdD0u+J za@3!{z7xFaZDtnq`&;F|vNYtOuLArzsm@Df6yH>hkuK}FUXrMqA2s}lZu0aw9EOfI z=tsO~pH@A~w4o!T9rP@PtKjqqV^Gsb$46cGBPT3*y5HTF4$BLM#-h^Tr~HwUlwmd% zW|{luVxsN7t+Zj&Nn!>!{P0;gr^UuQ1T8Ilz_Dak=TfR~WV|YCLERg*~IN_BQ(8m)hn!QB>$jPB-`(*W$fG81}b2r2w z3q5inwlyw+Xx^?q400Sht@AC4KGuL(YTS$X;1e21{ET2;s6-y_LbY_YT7Fq<&8LanBo_R+8nS!@fJ zn>ueZk$#8;g&2tSfqnZ`+`n;*MY&3|8RSuveJwJh+nM{TCCN3@Um_-B-ygHf?CtyQ z>WSBwD-b?)^MMiT{e{g0+#kJeD$|)3XlT~{bMADNnbQ6*MyeLlzii}bC6qDNp=q0o zV6$17RO_3=KEHxhX^JKl=Tv;sIX3z%iSqz_r6Yje6ebmrCG843bF@)Swz8Su5labw6TVdUuUtO=Qt(W2O6W1 zHz2m*&I|&-@A{YX&C=GIs`uMur9UWYD>oLWYv5eYWv}Y6@}ajE-<#h#A2<+V()g(^ zH>GD;$_uA7vcpKMsmL2rbkqmu5YpIH3SQuXBN6WW|BEXfaG&}Bh`8_vQyqQXBw8+5 z`F{k&FuKJZ9Zg;@{{)p$O_L>aU|Fqw7|F^;r*;n9DcAi(?@{FLqZ~%hiSdD5Yh(IQ zE{vxCmF`~H(c5T+#H5N9PYF6ZWXmPUra&SkAtA;LvZe<{%E%J?8X9xS`Xc)i5jpPA zG*&cJDXFM6yr269H|&2<4L=^i53Xs27mVPAX8U7Zd`HM7R1-GY5c{5d_yzcZWdeB^4M^PiobTC@Iwr}JwoVC{o{WTRSiH=hT zvB>XB!31)sAKUD{jP&OW30A2cHomP9_0@;YXs>rVE>Nz{Q3v_&cIoXCsfw$~X=i_N z*5|9|sfq7%T;7aY_#EqU_;&C!6Pk~VS%9e0(4$`>&0)eMAzj*DjX;DCPVqrfwwy-O z=0@9H+D_pn5BbPtlce?XejW%O^)oaohj%Kp=|M|>W#!uuQK@yibl`n$cB(ZJ_1^6D z)g05+Y~pY~{56XI(+utX?xIW>M|0`K`?u{E{WBT4)zOB8Fu4M^^ z`@ZGyA_;Zh)68tLI3tjxJphO#3_`aE_B=YmSXm?4kvv$k#II?F7=*F3@nEHoN90SH zUxPpwufBwgBGsB_cYHqx`uM)zZud2p+41q>^whgd3Mch$RZ#-^Q(Lb0S-h{Cc@JBC z?QnB)U5MpK&6w%E$?53xU3u`K*R-WX!H@F^U7VNth#Tc>_KTL&ds~?0$+p+5#uKy+ z>*vYnl|0`f=3^(CdgwfGyEFc%n$c${eW#Y3BUdLV+%wF)fY?o(CucX312^4D_r}k% zQ}?jJ=nv3%o|#roD3_gW;IgpngHj5wTATR7J?igVya*ama5gCkMNa1Z@^S{L=sqa{ zeZXN#>PZHi>zN_0;dY~|0^h|k6}6rjLpYDSEysb^WWnu3NZq4esvl?(P=cA-L1H zySrQC?vmghLU3qY65Jtpkl=8>KIeJgy7zhBs#~|dxlHa6PXVYD>Z$Sjy}{oSvIQrZ>WwXSbrKZH8j8Etk1RD_?%J7L5=w|`B@5*9yj814{L21)%RFEgYnMW< z!;}Q4W43(vZXcJOE~FF1TK)DJHQ;f2cgsRUCeHL^eV1kC4po>hLeKvz>I%-aCFd$X zE#zc#^I?!u*DFx#LMLf9vW5yWI@sbRKF2;01?}8kSctt_eq|1Y+_?OT4U=Tjb!o#g zbx=6|R%0<}&}z6Ij=K-F%l+%T|EZD24fun&Ub6PO$htZX;Py^d>XiNX>L5UT8X~l7o*HOlR!cB^U~%~A zJdiPCFlPIdkj*?aV7nsh?Y!EF>vd*UaPs%+1zYHJLQ&5;#NlBzo;$@d#4O)ndFw%! z?i>D`1ylJ=LMXh=9OYt6lXhw`Z3q!afB-n({NR+s+iMf-iqwx7g?sr8gxs#8T~ zteq?p7d`xS#rT4*K1j?Pm?PyO%Tyi$4jQaxL+PSjn z`N@}2bLQF-l}Xs3QKubM}EK#Raz3* z5_U=2f10m2El%<-TXZE5Hf&MgGvW)@K7R6?ju-_Ebyva8JFnFWhnvc#MQo;on)X1u+uWEg2~JR> zPDW%*-NRZ(nYQpwvvLe<0*#c|ShECA#bG}!6__Mgoc{#p{mCf5VvPz~5?EF4XM&{3 z4wRW54QcUdZ5qmS3#SOhD%{m(62f^kPN+wyY8VR;>5j1SW1vu8-+cS@-b}h-p5%>+ z(~%K=B#eYCuR{n$w^kmY1Nb@Xr~?YpwLO@s#H-zU`XLW(0nf8Pg$y3e{A_aC}cgBV_oZi zs{5lW%*04ENj%bR*is&4L}`tn15!yC-#s_&DtJE5p3pKN7SQDNM0FC`~=I_7?Tdz`FRALByWr9H`17tOgO82Pt^s^pm&8Irm* zo9qJ*RIL3r^>5zWtkOX3E{;??S?$0npaFnWBR#y!Y_mB#J}_6!3{G7;1{x%t0!4(P z{cCK6xa(`NC6%+NlELE-L%vJ{BMNLi^q|>P5oL6l2X*ANkXcIx&;qGe7s50dY~mp zrNBKNREefNJTwV)rR+a(pQcKyP21SOkD$t35KA3>&Q;ePufeIIpa-_2KxUwv)DRq3 zqrTuk=!l4Koo!tIsNpt?v4|FT%X`aGM^zA5-_v zS7_lH`3rEJL4+Iz{MfJC@1v3doYm;2Or)caOQ&gXuYT1YyeNz*rO|*xTr=2Uj#G@A z8uhEi6`*?dm(v(hD~oclIjON4rgDfVZ%eCm8fz?+-RtKtGjev!r#sBg?StiZWeOuj z{T5gAyxR+;w@*{MXm@&qZ?Zbrh((vo&_M-Qx@Qh{pv8J-CEqbtyy92%8LXJje$Qq` zF=6zvr%Q}lbY*MJ&7b*`rAYpTnl-?bE9KC*su(uiU^fZtL24v(@n-*M=sqAs7%t$)b0R<@xKqaNJ zmr|ILW+(us65>fk_6@nUey`Y}0qB<{`FANnJ}dJ3Z@0eycV&>rzeYM7{rFa``(UXf zQ~B>Xv)-mUJGoz#$)IL)yqGkK9ApPK!&IKCf**J7St%-4kE0Uajg9tsXNg{hgsw z255GfbnN)MYV=ggN*m*Qc#v`PTs1Ipj}(lB(-Ew zGb+*xIfAVmi7BrA3{m1|Za+oIKJDaI)dGR#W=>oD@*GmEhQS{rKT8`bT;@uY+y)NB zawZ3l@_!`&-^&i9bJ{3$Zmm7EXLxckKN>vh9RhS(Gb0sR&@l8PO-s-8Hi zR*UMTpq0DeoFwUA@eUWWc}$VL?bH=IcmV>>KVz)=hw{I$_|`5P3LS@~P^J6fjU*`S zc{UM@9=p$%*%IoGV?qW0V)~a#2J5Xocv1+wX-Og5KD-hzg#c&81o1U$9oiCrYug=iu_ypBK64W2{~-bW?>M6k ztgqib&pkkhFIDm60Hz4XP1TbK*fV0}E&qU}WTA*jg1lFoeEW49rvwZw_hrrQg#5@% zn|gaA|AR<>sislM^l@Q_W{HUc(LQNz)%7)Or{>ALO5C~6wtaQR~quxs)2QkE5TT=;#FKUxKDLa`?7a) z!9mL6+>NYzVkviA?`0_*ZOb9TgV2H(rjg;Xg3Bqd=TjCneC-RflUGj?kP?{Ij(P!s_5Fk1kC@bu)C z@Z~-V=U*5+^I3H~1P5Dmwk84=u#7hEkcKTusaE zQATA+{vE15{}Xhf(Pn@SR_4DwQt|`wsnKZOJTnpn8l}C>6xuGwEdxoV2a2CzfiEUE zl+%2&RA|0Z?;GN#UeKJ z{pSaB6G$OF%;~4q>XVpme}~-U-kVYKE1?jo_M0=g!e9Snp44Z@i$6Nhb~U+ksuaJ= z4X@?}P70*X5cvmA5pKJ?BQsd*X7*6U;j$-R<=Wa}z-_Ba4x|amLgP*VkSTCeW=vyI z4qJ~udoF)QQM2K+h3E0=ENEsKX?f8iQy0+y!sCa>^)ww@OeSQ)%Bsq%W z&&035R2NS87eFGO0+|F;!>O<)5?6zQBivR8%iehqQ+;@cj)B3I;RP`CJ2s$${!Zq! z$7J8)m=&@;l7GRfvW?#hpr)}wh${y9Pw+`yNyC>lOO%k*kxC)Pz9^80mWr)$-lbo7 zRmorH*jOYFwC4nk21X1EjBmKfSIB=Bk z9NSrib%#54ozBSCI?vbT)>B-tfomNVJYN0I-$r=YsrAS81){3#kJ zT&9S&Ms}7+Bj2`$O;-pdI@uBcy!<<`jZOJJ8?K{RME0M_96a zU;22Y`u+n4y=LsKrWl<6*2F-rk@BJ;p3DDYtS(kgeqR>C<#OLu5+o;nA@gpvec>i~ zP84uw{DfZY8tnEo(Wi4TV>X)m>HGV!$=KdUwkrjrfv$k7ts=|rm;LS+afkEdUU9A3 zdA*#}LBB~jSS?3KtNvDgC?8t4Q)1$5$) zFb3Ct0owypORfi#5fIG~7o`~qGO`XpYg|;*;bD1rq z{xgLliy!gpPM$p!SO<%&q(&M+L3;PSQtf2m^>q&6cXiF@U-go6KYQmipR3*(=zyDHHxh{C|bt3qC%GEcm#mYcad_-Hn}7bo&-ACF>RGGHsU}?~%*7Vb=Ar zcnf%ZNp^F-DYm>h>o2mgiT(Q!qv!Cyx2Jy=`hVeQ|4p*~uUp{*h9H$V+rBF8aZMax zXFMVf0H9WX(uO1(;h(%8Gx7rxn>yG(!Ne*Ad~O+R z<+6q&U^ofa#Hxgg2uog_yj&Di5Z_{4!gzmKb+aYIg&=yDb(Q~t=n3!xJ4F;bw?brj zRO)M@y;(<>hM7*0MaR<5k7rkK<}i*KWatj6u){J`s<2bgOwI1pGLOU>XSp6<)73$f^Z z;`;L*sxoHer-%MUWH!KBF2XKr=@>U~nq+P*;Z}HpN|tdl5+fLZY^M+T&0Ccmqa3r3$p%aJ z9AG{bc&RT(rXvc2A{p&X-iQ-J{T}FSs|6JnGlWfAg!o8wbrvG1>O|;a3OHRoxPxx^I3y^w z)<1ru#G?4#_(tO3s{Nn-YQ? zPRwOj6tRef_C1lkGO4V%W`H&y*2~}pGU4>laG9*wzk7g?Nn|9LagOV3npBsmK)J;= zTgB;dxlhzi{T?M=^Dd2n^*R&r_HO|hi8ik5I;T|BE>7TK8E^2g-11w!4C(vdZy7@9 zC;#S!QC5H7^ZZ(8@%>uZ0u)(-PktGshU{9NfSLr$_AWMoKjS-4Fewx{`Fq5x=S1jn z)}Q;46osA1NgGXQ6~uj;iQBBEG=6$5cB;>UQ11Lq+B5&cPUJQuYrnh{Y7VweDiqeN84CK%<61XMC0U}D|_)ZPD# zG_m3u++1F~bm|isw;zKTJU>Yp8-@=5PCw65m9FqC9G%!~EaFp-ud;|!lZquMBS-vz zP`)qn7a;6bQBRCy8kEA4)?(3`VJVVkvmFIYWvYX&J8G}8mZTZi>n5j)XgKJs%KBN0vBWugsV-)nh#Rts|K zDPm3-q8a86G!EJR-xFIzp4P!qjlg`@vK6hwHJKq*Fh4bsOINph3#tn?u!tY;grOzH z_UiR5l^u#)+=In97F7NX0!UZe{j+lJT=i8ax;f%h+yLdiTrWAisYOOT_^jV2;P%kq z;++V0(O9n6EVO!@jBhcB34yvlF%W*OEd;n9eI%mB>$lNf@9(z>PbZ zUpYmX&b1k4IZoW9qZR|NCpw6C;6Ds3$=Q1~ql^@T+9Bt+cT|?=f9=tIi>qhlF>Rf? zxuaxdxk>;kdUele$1Nm9_Z0PM=u3-eBZ?TRVeMA>8GH<@dAlK&HjPqVJ?4qeBg|l=$=`t{Pm@V z@5F)>6`iVB)!gd?UU;^m*Y6>epsa}t0)1&e05lngtv7=3gYJ>DHdX23Nx zF;pDsHRUEJLS{-iwih5U7s47*U&wH1A9-BHbs7*vs zVBPON-Y+y01#>qEi%p)oQ6d5#Q3{DLqTY{;^v{JO6bzXLs~u;Sh_SAMi4FN*Eq*@& zkbl9vW7Ini;CE{l&al_n$3v01x`lZH^J_~V!{ z%BdGK%Jce$WDED)b-|i#hYQ?yRt?eo0CIZM#o84fk;^n~OEpJEfAHvZv-hU9_wd*@ zpYuGMx zTH|u1kc(=L0l;iIjZIlz1+8!MImV_0&R}k{tNkkM&GDa@^jxcQs1wXk zEuf;aMfS*csPp#LQc=|sE~B#XmX;)%%lXAoqAt00*SlvXTI!Z*WT3F*zEX2z%#!~q z9ImgF7ABj)k2F^F7hvM1ar|VnJjGx@`v6E0+gIedYSSPAh0wGLZ?o33`Qn*0{kgL7 zJgcy!;???up&rFiwTq$?t~hb{bGC+@E|`zK`G>}z%W_QuEnwSPMh1e40KfPMzy!}yyU*VF3ArBGfyBDe^jtq3r*V^~{f%0tecMSq* zh`cb3wX$Czp!r1Jos{B~ozHBYZDT|rgH7Hf2Ye6=9L_=c`BU!Ny-~+~3k&Nah?S;P z*Hhx8Bt0ITOhhz7vQicn{>pKH4{42U%GQQ6-WK#HES0sLp0fyB^#;6q@yL&6GRi$c z2sA0iSI;)E%4LIat8rGxdJc6Tz?)bCflJ)_%Xo+RRhQctuY|z|;MLs1E%#(}dwU<) zVH2yd2~aEp!>A!hoGfj}7)Wh7>5jX8M{7NkBADY@n^+1a#ZP?W5?(uav|_^}V##dX zGilXXl(qu5MqJ-b*3nr38uVH(Rg!1^#QQemVdHmuHv}Dy0Y^BpYg0jb%&U&FpYEdy%ILU~4k}ub@wz@Mn=Tk&R}aT`r#V?b$P6fqJ*?7p zpE^flA?6(z!v4ub-JUJkq2kCizXu~xTIgY9w~44# zi$Yeb9%kT?D^#^wPP=I2pR91sm5R1&|K@>aHub2h1P8xT9N;c3hHGD7AI^bgDD${- z-a5#xmynJPS!YcISZ0exyGMDogah+uCZy-;@%%5qDp^E!kf2eS{j7sYYx`>9ZEvTR zM}~h~v-7!REbFmqT7S!*^JGq)iBfZwgZNT(7_{&TH*T(-Xh*!Ik;nQTlX7`VT>sv! zA)o0T_b+=+KH@o)td5QQEBB^pcV46c{Ax-p-z*9X=Zpw>Z|IEFlLXOzFQRlMDrzEM zthO-3Nr-2U+zq;T1+Q<>I+pV`W;=3TG=te27DF3RqGe=oF|2oM6AKd0nJ=xr3DOdO z0bpnPb$K93C$yWlWgi(rCAkEh+A6ME;uv1f5-<_+;W`HY1^7~8HPfw%gMI_4xO7n# z+RW5hFkg*5lI=NGAFzbtP*=GhCo6XzJjd%&phg+CuJw9xA~SJk4eEKSkl_rknt;}Q%vvC@rs^ZU1xjY z__HXV^Rx#Lq2}$QX=QsuS0GB#o|!pyx}4Jecuv4Z_#gdza&n^>_hqB-qYP>?hiApi+3v$i$D@cKGMlj09Un29A#V{*cmuLZR7J* zs-3WT93Onp>iX+5A&&kpFAa_g79C8Xx)`y&D>c6Rrwc3-aGP>!iP0|%JJMxNa!US@1sQA5i;r6_T8mR2~}#v zPxKmm&+iAc~W96BY}c)P?DvtN@bLRI27W0yLl1B^s?6#W2)**v)*7@rUNeQ zJJTex6B#O%5vY>Ex6UpyI^_NwCRTs&O?(JT-CfRO72ju?y3H-nY8vCX-k)!o(Wb~0 zG{RuqPv}?%?ys@g+IVE!8_1PtPl5I*T&pk3cSEBSl#8hFe)vNLbSVi)M`P1s-ykag zj!MQSwKMpfSd`s2Y=OaL$2K`Su`ooR*4!6CM^Waa1-w`y_JUAtvck~NoveP;y498!fcgr2LWu_kOtRRV z+Hh$yH1Pjfk$}ALY~BgG2wZD@33ZUx(z8hQ?j=D_F>^+-pd9cs?G}6U@>d@JZh3}9 zP^Ch?fsG``Vy@#+GMHeM>3Qvak*=c|lj^v?q|w87Y(N>P7hc^$2Q`AP@_k+xtuD(y7b=7x88CrFE@iLXgV*MT*3DtmRz24*w_ScN$z&GU5bL{`@st_*moXJgTpa z9av|CQ?()!A$x(!e0ekRtr^`}?OZkzo$iP%J(U>haxAB~(lP2NV@U`HN1xRA?m$9R zN;^F~?5S)Zfu#*LA5if5C}E4@y7xqQe8c422>-}t5bJQCpB6z&gB#Q##hjmRf=~Fy zqLc7JYF9D;fnB}-V)|u%wW?p6ZPTkZHPMbDrHjHobN3|BiI7r9EF(r;J_1C6fsGGP z$3nDUY-PI_fbrQ-X1V{7sD*nfPAEUhnD<+zE#94JxZ-s)tMX6E(X(@k&%U4SA&#U+ z+2)<)%!eW>361=mQeJIjG{lXM?y79gF=55FNouCZa&4aF<9z|i7Yn=@69&L@rzKLj zMzi&)UMu-zY|2IMu^C-we1h}}jrB|=&!-`-#?c^E;`FocyTzTHmoj+^bWp)9;8IR9 z_`(n*FNKjhdWEQQ!e~)~-uv_P!0@t+>~rndNd0iQ%S$t^7&Nu-!bC2(_0g26ZdcfN3o2%q`>30YOt*^_P6=Xrd#>T`2aU+yIuHDzZO-}=1E&Wi>Pp;p zWC1*!KkJw3lYHn?qZjdNsGJMP8-80xl2i18w{nY$!H@yc=D4L+LAgz9-EN>cYA782av~{Y~RP?;`>s7NLA7dKv)J4 z%pbn@?OykbPT+V~{U^>%LQ5>kaoC`#sy9i+S<@AHGdowCcd~U|>)obvEe0^QxXfJg zYNzU|#LSwo3XY`2lC5LVqUUDMR*}Kc20oP?a~&es{FV->s{vY zFF+{8L;mVJW^^O))gklJJxT%eHv|^~tjIu-r)h!%=qM-SQWwWwbJ>jw2+8h_#Xu7d zj@`fW>b3T0>Zav2r2gwP{a?r%q;&$Ioxk$DJen6blasT-s7zw+A#kmuXKv*n|7h_( z;h2rqxfWD(Wz(YE;RC31AgT3$@j@<>-|s9;LB}rzcxA^mgi_++CgioKWYUdBCklH{*WrGvC{>F2CEq%CXgb8;%=W zRkw=HqQIAqsm!%5zD!(;-1(`|xTuV_t!**OUrj#3=RvinN<7vWA!QXaZ(zB@LR&r- z(Ifo31P7wq9tl%+NU4e(a-t9_>|Ux)9f0^1>{2e_=0hat=z(1FTdfDB+O&W6r!=Wa)R#Trxf9nEYz zch1Gf9V+S>aU5R+sK@0fTmOd!!i>G1W0Oi7re3yknOqg_)$TRZE848nor2)CABY{raVn>bvuEs)+`aItsXyOl{r>ic6`4BO#ye+( z&ny_IzGt1OKDt99zp5`*-sC9Mw_j&-OPJK#WL(#kVx@1eYW?Hn)2m{@XkuS%;r z`8kR$7}#IWt3%$=6i-#xXH%P-Q~zVi+8R1MA-L?5YDZbSV@- zrH4l$6_UOvRz!#iufibb3%TInh)#Lx1^`t9+daO^8E zBoazyEb|*Y8ax04HTz9IK+fnz-x2x443X2*2bNO{y4?YeKF7ntuSVq4MlGmB2Tt-^ zvstb;=1B#6{=5f{Su?hxi)^cKGriGg0{Uzyzg~Z^PSrXOuqW|sFQQemyC3+#?+URGleiX^~hq^A(OR@?e; z!Mbi`wwVeUZQmOQeU(EyX6=;pq5dn;k>KsoLGKMfzSrQWr4%`V}bHa}9Q?ysagH zvzDzSw=!9g@s|tnI4tl3HlJ{`HaQB0D-9GRS;f1xxYagX)6DsYZysQNIFZ<-a#846 zPMEKf@7};x^Plb_Fr3G{VFPpGv6XL76#)6V%jUJU;gzf^7vz?LWsoKP50^CS^Q*q~ zmDcvd0p2`{FMHpG#qZ@yD&dnot3h7VwJO3D8)V;FauL`z2a!QVR9RISoAfTP3Tq!>!*BtIl|Os|b8y%?B{Cn|@s(y_B6G&l79obgCg zfuTPlPU6babI&2^F>8%o_d*CaPY8GF^pP$7hKMX69HShWJ{N4fLBcwX&IsIa!}Nh0 z5G1>#10n-OD;h+GwZjn{-nle6pOsruQ~X!8=vtUDAcB_2DhMc060eHu6xUf4+D@J8 zrCco{x%--tO+u2YdPD>5y*@a{#gd_R(!t^6xH9TxHMGSg)f&?`L&}oi70{o%Hj3XI zE1U9f2T~iT1h>MgJa<#^VS*W`!{s!ttP`jGGrYAF2Ey|{>%Jdul^9g3Wmj3a$Tx+*KT)A&93qQyKY zqy<{t5{+g)taIDxPEJ&<(sPm8k_egeLJ(NytsyHBn4TH59&2jn0NtULpmJcBN0i5u z{+%T)tyNhnZh3Q+PO3#7kgdSO)w7q#)*H>(sGfbDAO_&Mykl)p5u{?9)Y@K~a@$_8 zW;j39<2f-)&8|$Q4Z-gWDnv5sEg3D0Mrs$e$D6zMl-^07V8iRR7?>((OmH$OoCjjK z8jB0v$k?X4AP&0z`UVlCtA1jW={xG&XPR%F)WH0p`AIDj#IkG6ID(Nqkt$5|pCt)z z7v5Daz0qlb2`N)Pc(miXq~O5(c=Cse)V-&vr$~|t9w#x=c2L>*BHvV1O9EA9f)!3? zxQ?ZugU&dcejoCM6YB|(ji%@L4`+`ld*>zb<>&yd+3(=ON?P;JB*C8$C;O7za@?5( zu7i;LTMJU{kk>hZI2xf}7{q)xExR1#2K{xDh`usjunRXW+i=?>=(?eq{OP8~$_)Wf7)ADjJp$Z;EoM)Xr%8)c>O z&cIAO=bh!v#7jpquL^s}4_o~ygm9-o(M6!=259n?wZYHQ=ps=&TImqt@GK)ov%640 zJT_LbJI8RcFiP#66k9e4imUPfI0?7$f%9zE0+6L74Lbe|1UV?}M%W&kmRFQ6XkPTv z>jA?KOIVIw#@nKD5`Om4Qxim2E7Ye^2?YG`rqd0#_=SUk^3`z5-Pga&rN-IKHH* z;>$7`^C=vB=y3Zg(atp^{H3Kbj-g;PC4;5ch{B*%A%;owzVaA;bidOYiy=0a?wv{z zSBbpMAN_f}8-8Z^=lkQN0hV7qo`pl)U$1*EGA7`XdTC0In?`?@D?ZYO>1FuXue!IM$Qa-?s1U=E zl)X@Hr>kLjakY@jl7od#=z!n^8I2E!eC&58J0?9W#LU8{LUZl6c)fIcKh-9T@nLlN zS<9C)a@x9#YvZtf+n6(KD@Hz3;FkBM%@?~3~X6txD( zOt$3QTNLRC${!pEr<$z${??E&;De41U&r$g`fal+Ff#`xtXpcoDe7y|_rCcNECF&R zb(h}xp{YP{YI#n_T-K{#i*bRE=bl6D#*^5yw}WNEaHwUc-ogtV-rc+N9PIhjy~5kq z(!tQ~9H`thj>vzrqV_Su;`??2xMd#v?c9mwKsS!xMQqEBFRt0ztqCD3f}H7N!9yky2uBvS)y&MDX=&4{A%a06!FV~sk8DEW_`j5~xfIByfLuB07IY#9_E<;d)dZ!nU zf4%tmzA#Y!Fl5znsX4pW0RU2r*3?ol_OH`v^8w>BzM%+Yz0xtQu>s;PtGbj+yq0UNPEZ*x*5gK(oF>Ue}HzE;(aiqgOvXAe?#y zS;{D5Bq9xB$DO32n6hTiS&Zsn0?`Zn-UPj~L~R^i5N?PnZ;GpB9Gqru3pQIk03JG) zNkl>hr31(3R0fMsAO~yzG1yi#}cA2kf`2Q#Vx?$q;%7<1z1zpX(3zmQ7)n<$^xJt|0eOT$H(NS#=gd7Tg+&(Y2<@W7*_Gd z`%}_V{NvU|ES~bynKsw?otL>BDoRyk5zQGxC1e;lDK;|H-1Ge}wQ9jA)}q;+Fi^)Q zj4H|uvWbxgqM$!#sAWEN&+HtArI?a<5(9#vO7*J5i$nyTj;+sCN-XZ5H zl85iHZ#>e*gg%Cb9R&$zN|wUxBs=E;6ulk{;b>feNrOICva5COcWIgCq$xXd#}x4; zYpR;)j5rtqb`Vv!Is;SG8O<~G#cb9)(aXft60Xr*g#8{q4{+%R<%SAo;E;+h3hj{q za0#jIXJnJLtwM*G`f{XdOV#$%RgLwCQ(-3ld} zZX~PGq3}!YJ3X$ZGZ4bc**v$cj(yT(1ZhzkGm54)*2ckQGJxQQDgpAKG64R~-MH1N zNNI~{!qzlX%T0$B&|p-Vt;{S>KJkkOP&Tw3%TBa%GM;L3%7tj-NL)qMQ~Qtt1DOhY z^&g!NIZ7rAL11Iz4INvTmaIN%hQ($FBt<2L89kNW;(&nZd5&$k>Ie#jnQ`AHZZit{ zl))svbLRbJM#)MuE5Nj-UzS;d2}W97So?A6N3K%zv8MC&j$$B>Jqz7QBh`ooTB&NA z&a)m~sN(Cpxp&m-HOBXQhkH_%0^@klPwGfH>VH8Pgf&9MJ!X z7KY`i)H2Kkv(s(8a`JY%Cfn_l?kicL)1Nf;Uo2j?D*MWscjuSsoVs?`MNGOoo|`i7 zf_gwTXj73xWR_<|o;dVc)@2K>s7->ztnvyGOSfaWUm_CtX2-OGsc~Q2(vfpORjPM9 zSqrDTHq~v|KG2fnE&z<>g})^w){>{^3)*r;{HjK5Yi@C4hR=P&_bcY9s&zEL5tc&e zdudWDo_s0^zy(&E5vPX>&ZBM+PxIJ5;+(?3jI~FQTGQdRP_UI>?yb$kX9sr2-?RP@ z$ZUwTIOTEH3%#qKJ*GLR_$3o>a)UM>mMf|3u$Lw+@Ocu#enetJr$`dU(M=;a3*0@e zRitL3L4hqm$YS4fqWZ7mMdLFsU0F3%Ad5KGNT;z|daFCnfHv&sCOgoMbgINe9vh=P zowoK71_ui^06+qhQzbUPfBrAI+p+rJ?A9{#Iu;On;D`!<7#aXy0s#OqOw22EGdSt^qDOh8VB5l<5HH#MuA%n< z!{VFvzprxS9Q7^Xp;^xUn8HJPwt~rT-k5h6kq9v>+}i!2{ukh>a?k9o&TVlU9_xwQ zVO?$5KpTNhE^Z#p64Z>(Igf!&GGO7VAkA;=n;I0!850AMg9!|Q%lme7#wHvSJ~pV7 z@D>*3LSq~;mOIC3Lm)j8rM#faOpVaflrMcdn%9pq(4|LnDX3q0RR@3H09O=P8)AE< zaQf-(WY_zqNF>V4@MhS&M^&OQG4|*%G0`K|)o*LB1*~6PI#EXyt6+$2t?(Uw^J9rQ z0_CgV(M%=aj5aiFF!(X|M2cph&dJ2a3O{-lVBPLt3c=|BRm7M|XYad;-hMGJLWjEP zm)Z)@3nmQ*GyDdSk!_L4eG(odL%8kUa9fR6w~sX{2?o+}=by;SV*MsJSI8;@D*;7B z`@WNiTNL?(eR~=+irYqj6UGy1Cyp(U#q^?P`;A!4kHHk02Ku80d+z~A6?lOdyNH}z z3Q*oG5{KIGk2541v!=m&VMBYjS<-BGON?;F)cqu%s+&VKeJ@=cG$P9no`CPxYaYh&AOObHZd zsXi#ROp=EoY7t1lQXO6Vp*+vBCcW_>dKkO$YyJ(0eS5<&E-BgBi|2pMDA|d9U4sh+4i6SxA`&{spj~n0c7d99dEQdfaM^-)0m% znb1x~-tLh`O_x`#0+IgBe|TCvi#UKZv<)GEq`yy+$?UZ#C+$B5c45eaX*h%6ivt*g zFkjqXQ#nGmR7_xtA$<^b#X)Rc!3sp#uPUZ(1bY|4cU2eF5Fg+9fiv7>JHDq9b(;@o zN?$iW0^K56+?jq+HINeO$7i)1GO8oJbg~`gGU_#SlQ1F3g1H&m5-l;Q{}_Q_VN0YD z6;rBh15BztkvhagzV&27^q>QLPq{gtjn-zwFqU{vbz$5#FEKkds9pC1`8|!;7DMbt zzUV6%ATZN-fZ~y0OVZ5+KN$*Jq%7t?wK}3di_M9(d5@4+^WWO6klzKB1le80i>tXD zO*e@DdXadZU&je9*q+YU51GG@fEe1T18drr8$T?x23PSEr>-87$Y-#MaIk)cUrCl~ z!Si!9=*pWPyLGmr;Igi?F^&~6tE|bBRVPfaHp-&Lltvf8;fcQcxrMS#O!bS+elVLW zv7w;YHd9Zrh5nc2#!EH}-UuTRlqQbS+8PC&`3vJBbgmi`QgnECaQEzk$zK4{;uq?< zfWH7`#J2`N&>@bIr0;A6>L&j<*z2IIDBj7h7c;-|K4j$7P)yC^5>1#GpXr*&9r9$5 z3amCak|HG|$YwUF+MG&uE5O5o^_YkFIASwZpi?34L;M&EO#kcyagf}{m~}QCp6KO% zY6RNZI z$t7KUKd7wSgIiD+hJh63CQD6=B-HE}u3tkKm!htw*!TqWtHv{#;pDU43>G$>Ib{^> z+&5&39t+BAHEDuqbUVb*Ye)r`cq3`E{K@p|YJ1EZxgGhx1=$3$t3a)=)J>{1i5pFp_WSo$zkG5l8L-O76qm2R zc#Ps410_BssC5aD#pqRas<6@jA6J`y?^}ZYZ((3OJZ;{XlITrS`eorF)7?5_FY=MR z7O|n}cq(u{`6VoB?HI0iEY{O~Im)6l>k0t_AF8`t;o!uxOArexA1WL!@F?I`_od&b zb>{Nv+w0M#*d%F0$4mDkb$_qz(7F)0`ANt@pu-1q9}J-Tf%1pBIDbb2M}9^L`2w^x zx951Ih@4EwxSNu|%EzK(pxY7$tnX?jjX%^W{-f9AI}sXkIA{ZdVB9w_|@QmI{T7+YZm2&jkV&u6d0h}qVCp$ zOo2*`HeLFRuBRR)6e%=Hsr2_2DW{yFtrN{1&NFOwhvm~5%coMQd9fvFQ!&=PsbKC083kQzq}k}eQLJlOpP3-Igj^F=^j z3DAU;xi$Sa5gDGfRkp3EGhZGsvpZK6epotH<2!zbIpcR?llB8egs!ib$F%JW=bhu8 zXjJB81koXHCAo;~lmP4swbg>IiY|}77O|p{Gcc(iUa_}DjlaEx&c%1ntoEQ#<^N;v zt%KtFx;9ZDxH|-Q8h3Yhg1ZFw#yz;ZyA#|Jv}q)`yG!Hl8X!POhTr#ob!+bXRn64g zJ9GcK|8?zsy6c?Xd#`oYde(ZLWB((G*8D9q=O)s+X^kIST|u7H+$tKRdZVG^W33We z)7FFXL+laZ%ox(F)ima#Z5k{1(9IP?xTrp_A4n~gGw^lc*$5c0&G$TGNegg4U8qQy zYXZpTC`FMme*C+714h+phFF~v`Clk{;-tGC2^`{4KQ}g&67CW6GmZTv<8S$^ThDu| zePae{*|`RTo+M|7BWt2>w1Z`xuXiUh6JF8#Qf>IX8<7G9>2Kn&gOy11KcxaaUUr_v z_P2)_e-eqRS;U=5zBqYa{}LbBjzKk*sN5Pil@8qKp+O~oN+Xb<|49m{d)}(WC=~uKmzoH!D4U)3!`!nI6}bE-C$Z1k(^S z-vp8;e9^(lQKHBRof#jU=@gp5SbKcsel^jwv~R``v)Lh<1@)aRl*+yc1m z09G*x*~p;yne(VBM&z!S%{jG>ra7h%ubq?HO8-M_4i1AbopH+4bisx>0b;Dvd=aKp zEH!m2Y#7j|3h7D49PykUnTf|4-pWa|*+k%wUcKjGBnC+-1*5WnCc z4NaQ(W6_0*!sTBmSeQ-je`?z$(F+x+E^vj^YA;Mf3BEds~NP+ghZ?3wu!MTb32iK;FG62>698q(_j|HQQv(nAPD`!LEr(1$>eo-1~|!}0mo3?yTZy`)~=Mq*T0F2+w)>D6S5NA-FHumB#R;az=F<9D(2(yjSCt?o zVw?BqLkw@#HGLU7=u-2EXzv_m=LZS5Hg72UqDsG-xfC8H94taeKo@{RZULXR2ZXcI zKrsjsS)h6Ov$R}RLVf-EFvFDdIUt=aIBoRlycm~&I%+akepIn~hzs{v+2_5%9>NFn z`HNBovq;hn9ZHj#>lVW>{<)C#Ov{cz#abRdn)rzRLRxxpOZsBxp|&r@vpe8Q;_eJ= zEQ7Cg%zSz-_$aLjF&BSYVxSb=baY~R6)fi~8s<*N42QpCi{#T^a9G&J+Cr*sd^ z0Sv%Rs0;@i?yqc?%2QFuG5Ki}P>D@z9)HmGKQNPnRy6=sc}=J$W%+S>e@{L}6i zS{!a_gpQY-I{1RLXvnMRZJd+BMTggZAR!Z zE{0L}iYAoH?t=OGPmmBIq5esKn#R}PDJZVV(t?ZMHKNtROmSKOrew5#`iG-(ieDwX;sjX|9n> z6Df2YH!6){I#OlDc$vZ247j?@G`o^_DLg)rDJ}mp0r6>jVn!!t1ZON5w%1hzaGok8*Cx>d$00S z_JUWV`q9zh9xIw4TA!%c?!DX1~{&i8P2%lrKRTKP*P?Uk1aq+!I2m4~oo*}nfi$H2}!r+Qlt-K`;!Mm^^ zZzp#12c%y(-zI7K5h%mx6JnYIK+${wke7!}Be~{K-V&Axj)^rjfZTWYv{fYwK;>1Y zx|W7@-baUSIDg4VSO^ld=5Gx&_<61Odkc*g1*s@Xa1X7s%$*}?8Eq^)J#1DhHDD1) zUt)gOiRh+{yZv1k$65?P+_)p?o{XdQg@v6%j~j%Ag%v>fuX&!CYHK1%4F65<)>NtD z=GtZ)3Y84`pQ%pXA^2KzKkfe2x&oMhc(K%&XV9WII!Z zlSg-=Q)@cIoEi#?^>>ZgLLi-lb~L=55d0w}Aey996@ft&9st`g>u%lbWWzU|)M{wi zdy>}ub8A%R9J2nRV)kAF^TOT&$De51>f;mPkpFz-4RAsFW%q{kkn2_9H%ivG1l7mbXB{c^}D2p)U zr9#%pSKbx#GOlo)E=cR;^MVM*rsO-}lQRo#g42A?Q8pG-@%W3E=~N~!>f4$^HB#`7 zAz)*zJRYq@qV|6_2S$ilhHHF-eEatcYpEtnx23O+eI{8toK_x^9X(DHvd7*O{hQ!p z78;X6FIIS`3(fG{PJI}P#yNJ}es1!B{|}u6`2)LQ>f`d0-?5}|X+osI!61mlK9aJJ zU=C;X1MVoh*ODe?nM)B>e`=_zc}l+`9rdIX6nwfr{DGk}z2h-x@vY&K&(W;q*=fHT znyOrF>PlJT@e`3T3qH&ZZo1@dD@oKlIVaM%=qx4{lK=bh;&*p@Q!w3vnQ(&0TfY7AeezWj2{xCf&26o=dv0|8#=j~un@L$o=kJeIt9NC`^#q?cQ`P&Gz&<~6<4BJ#k(cSQmBBH@8V4u#=&33B&V+#7610p5Kss0IWh2KV9(qG|> zI8x(M&3Ae7+GV85n&cQp%>cpCf#vV+=+ISQ1Z~FZyc0^&iWps&Z$+kw-)}3ZSdubwWjjB40`ziH$y>3+q9K(Isp%|(E>0YwCfbExYOArC9SHw zqmQg+BW<#}!vxYQmx*pNwQ&BcD_?LD7ckt`LEH|$J`7cd;bj83qjEwjk|E=oS$XM0 z?|}1%%c}R271qI-$=Sr}4?os*N19}3qOYT&gF|TG&9VZA;C7&&4QQpO+pF^t;F~JD z0welZMl6)+m31UQe!GV#Qc#im{-=qDg|?5uQ=55~j?GFQZXf!LPRoaz|J`yI#}yF$ z#X}o#^Xr}bZbx*y1$;YR2lSy;{CD4g0181DVEm%MIEDsHCP0fQd*!U{qn^eHXPsnFhv zl%D3^?#O~5HOXD&A+?odK6U9mdK~uBOTJ6Ri|R1B_)I-kq?Ya46_^dZ@yP+9A_i9r z60n2pchINmJipbfuG_6oz%i;;8&}iEr4mwV@70y&!4S?-(s++_sS%3WUT!!057MEt zgil`G-#EYG&(tOKd$`iD=Eb$_mGNN3In`$H4pAWpUR?^69z}K#(iPcJDl;{IO5Pt8 zMumYQZ}kRdwFN|O7;QqrPHIr$$Y#@Y4T}0l(mbM>rBS~kMy{0JHNjC;Lh(u92}ngJ zy(`2a3alL0h5_sO)^S{3l+#m}1A+Q+Z8vBvK5>b&1H2b~3u+1ECTr-YF;U(EM2kmM zZ@KGs^bn}hkb)+T2+IM!0K+pbt=yaO95I8Am>_r4Gy?5IBu69farP#(#={(14gxV+ zGxI!`(-d1n4W5E#`_Wu73VZ?-?nIBB{*H1FaOi4awDWY45jp*D|6fBUVRGZB2LU!h zL7O^l{)2gO`Yx=6`|;JbeP+yaR6`}1ifiMU@(P9h1qE(W*`uvJ%(O^^tNr3Kw3k1m z7#2NZV1)-3^3H?@^MZBo{`i3F%ktS9?M6vCW`>6h8yZLxVuc zDPQ*vZ}zbZC7XG)?a>YeopXv(dV2zzkOvgU9yd992J&`vBH)^oTL#0C?prO@hXoZ? zMrmVwN8u)!L#+=n$xuhoY)?b%P)Y?QUIx$j)2-LFg8B(lR;FH)v}+EkjW|riE(TA+ zns(6w*5=iSR)ph&KNKvVV__JoNW?{vQO)_{XK8QS@ORgekWvLTw!dd|k{lNB7&~?v z!qVPsE^$Aa40wM4Xm?7KGxGszp`OhNW9ivY!J|+T^1~>-P9bM|bAf98k0NpHo(lq% z1u_PizqPx)EIl3b3U7u!0#!Lu9jE-|z$5s-f7Yi6xT2VOQj@&!bXmwTM)P=i#B0qX z?G5 zNf2jg7uHiY1h|bNNZkVn_z8|at8CR~bi%)k`PCK`=4hbzTL3I*Iozxb$M*I0j&-{7-7T7# zQPRm^=aItQtyxj}pwJR8D)_XF3+!Y~by1xl{v(F$%+ACOL{Q6RGE<)1vG!ZL?dJ9F z<1=KCgxo9@8vr}Oj7+W~9+ojswInn`^nV#Eqx|si@4o-I0?xtrge5Ef@z@8nfLE(C zl)#ryf5Php0x@~8eqDE;P(CfQwYFZT=(NklL72l!1xWf3rYq;(5Wx$kRToCl?s zyf_3s2VG(y%kNS%DX;UkRv@eKd-L2A7k<5@4%+^(0%J3GeyiJ>nU`)!@ejo9YnysW ziSN0st>>Z4R)u_UMtwH^`MH7lF>YEix>(nvD7<~c=j&6`1YL`D6~YdrF>P}(l1Q#ZMYbTAYo!~f8zhVu}gv9Haj zxXe2rd6p#JZ9uqJuFi#2jX{Ew8?3W@&=wyB%qVG-^Z+G_7FfOt?MHGjH*nAK;_No> z!~wj&ItsR)0D9}r{j2jQO&%A8QVDYCc6$&RrCNa1@91Y6{I_bi1M0rA9XjApYKA&s zl(1Jrl>KVjr1r4)8-Vh||AAa6(x2j~<0Y)`^_wxAyy6>`@|lVY*GTgCp%WZYvD2$ zyAYwr{{Vf0ND&P(@cCUqf3?-Il<}OC+mgc?ofySxgrtm_?N9+n?ib?txLTeUtk*o> zbtbWc{cV|0I!x<`q4(o-j)n{^**){zAU}0uKdJN8*V98sI^r;DW4g21ta~fTPc+jT z&5dIYIbvkX86IkBx-X>zHF@+HwOaytH_46tv-+&+DGrqrNUNpUESmxymmCjjk8d7n zyIrQ~l-{AeZ$+#+eCaIXN&27&g7b*c6!g)A_>DMZ%Em!A=aeM#_^)l(2dUO;0t8bZ z3k7Od2BjmsE?fMPXmHIp2ZA|9WAa%UaK%eY1_i>od>(WhBfNGmTK#}_6-qn@($Pq@tRI= zR05Y%tNyoK*9W|d^J+c7DZjDp{uepUOYY9$sYSPGcInF>mzt%j1JrCm^dHUStFrki z+hC*NN_J?A4-k&`}u0MHgT=sk&v}w)B@uPP@Jrktb8Cm5-7T*}l*_`^asji+y zI~<2@UMD+?^@&&>T88!3ntBI~@IBgja@jIH0^Tug{e>d=a%_Td z;=8unDk!qK{<3BCUer}PdoMO1=KdvUV?)S$&7aToY6_)kMmDtM8A`k+gVrRJ_ROC@INvv*i~p7J6P^Fue$-AoWQHj{ zn1v11uOoj4o;u2#S_7J&I3`58ek2knq#XfW4IPGhWUbfiU}+oicHqwF@+}V&23eE; z@R&UskvG2(P&p6WVHel8j}Ht@Ou~& zokHy>oWUpQNgAe5+XMkujBmqG^e@!axy7HRw!cub3*&WrVgGd~>gj87{z<8oz)}-& zcCWCy!H$;|(k14OnIx%)wDgChA@*1JfBjx}+xA*(U|`*}pw-yK#JUZA(&Ew4{@CiJ z%@+ZFe_wDQ=I#ij?@)WkRqC>&?W|Mx@D^PGMD;6b-HAkDl-gsQUI(qM#(D0zVn(hC{UO|8T}eE<$mwVkXHh~SZo4)!GULf zqYM-d=<5Ba98B4JY=o`c3G|2~uF5!hV3Xeq1$E>GTU>-LEM1VeY)eJAe|dEDOCJmU_s}iu%4E2PwLWoJjabL)dq&9h_hmkdYtYN3M$xj zUxZsz^?=UW1fogtuN@j9F|rPs1!jWK`|tSawc9)Bsn%-ie2D|)rRTCL#K3}d65Ws_ z*2mBKajJX3958Ar!bvBP&he5SO-uVj1VO9mN#0Cy7HU~T%!6sX8(eyGdA`irdXk09 z{=^x+uv{pXP1o&1>lcHSx)dn>oVC*W^iPB0nDhX5SnZ9%w5f~Y$={8+-Xq@0Tq;~3 z5m40^z+zK{paQ^B4{qCcy;4P5wYb8}11*}K60B@~m)+aaO`o@BWIjm8eVurL>Ai9Z z-|2}FK?Z9hBO_k~yrDhz%TZm_>OFn@?AlvHP?WsUtCl@Q_(Fd@bi4-?3AE3hi*3!V zTZ3HamoG1H-QU+ws%gzNeKe(p@Gg2*HPJ(<^m4ZyDOMqc5HQ>@_T%_=s`l3L;Iye? zKp;*`4xe&eBL`oKnw!%O+#IJK;E-Hp`}TxKl8$MQuU-v?#=W~Q)97ffPZp|PjA^xu z^EA`1#u53%`wqwoM50=~TTJX0tz{PzWfuZ2k+K>C>MbEEE)m;l4GKD(-@Oge8a7lZ z1IF0KX&b8ZzDnfQN3^kk zQyIG2RBvH50X3KFksQI)6K7gid4Hj1 zrl5k5{bK*bwh&3$*$~X^qH&zgplmu*9s;?flVRPWSzkQVxKL}{T6e4;m;IB z>0~B_atJff*W}O)nLU)%1r@TTgGsjAhgUn4HVIJ6qgv%G+f%r4qEdbK=?oh3`VL97 zg`a8E{Fy8_YMKLMRSxDHQ^<$Afp?7JRb@74i8W}8(hLX%0oX*1G41*O%?>!92p%eG z2Xej@eqW=>qQJVP%hbL* z&1G8pXcIDBHKGf$;(5}Xw&lh>7eV6IOU9>gxbwhHgiFf|iz;PBCb(ga)zs3R%6=J;_Alj1V{EG#nk`dr!Sej7uKp#-k;ZOI-hrOHYeVLw}=ok)Zd zsZd$rsn#rAlM6BgEft0ayf>1Td|kJ^xmp$&@KVyfE_c%?an3vzD3M92CG^-d@W*p2 zw=gyqHcS63yd_;-Ut{f?im>L#IX+e91GQQcvN0DuUahQl1X#bZf;bB( ze*T40Eu0ffU1vi%<07?}ee8Q`*)kb>tUq@W>?fdoc9Y?V4Qs^<_1bdvzbD$)bt=R4 za^bWDhNTaQ*`+i5VEGq&DJ;$PW!tjbrj!(ipw+_RO3cOiZKU^i&d~X_RIh7LJ&w3R z+vO7$#T4J8N?h`hteFj;kULfOcUWaf0G(DS97DgLh@d}){k3h^Le*qKHAzCn>pBjb z`K!TLTkbAO54}-poz>^7R(j+1e97N~giBv-ABaehb07_e5}KOy?5I%DN@s{JL8WC!M2vvr=EMK#ep)1Etc$KW+n~jo3XEyZObdtv z3i)1MhHQ>E*dT*Z)V)#@oSAio_RB-0_{8a{4br>um5EA5rTf7GIP(}?#+h%{nM2)Mz2#6vYQ(cR)>?K?iK`v^0BR3#u5Q^5{}Jz_|K6W5`K$%dAo@L3>NZ1|OUu+8pT z)(PaORjsti3#fYIss6|?TCK@urpU)EuUxrA8Gd-lLVN?j;Ctt_i*ne(kd-}HL)H$> z*=DjEP<_mK`M_ACOFNMD?I^-9I-lA}NEMrPI!(P=k)oKzqY03$2+Pr{Yz{a3Sh*@D zZK%mhyPITA)67~%E?Y|~P&HXP&Ers>rW;L@o-WD*(xjn?=OcBOWO&_Zu3Wa~?3<&d^8f6)UNd$oF3(impIBM{5mJY>1;abAv|4B%?c!Mx^`gGd^B-LPoHvsDhJ!Q zw>nK~=GN)X-Coxj1*IG=wc}-tUT7)M5|*t_r5X(zRWjPukWij3torNv%N!NRS~|%e zIPq=G=J*q=FRQeyAR0dl9%NWBA$V2`UJmXN98nC{6U$Z2?r2SKdNU#y_9>VDTEw6F z2M@$e-8NmYYcQUEcy>Aa3S(sqFyMbQB(yMOXc0B};r1KuK*5lgXJ3F1Wn?Xz@tu92 z+3&0!Q0z9EBZZ4lz=`o)atOk8Qp<1&X`9aH_RKxLeVa>jdFK%$qb(R}0+DP+zfPh) zq`Rf_xhiaC)~C4$Tr9s`%n=xuvV5Z+T%r_=Nsq0<4wCr8N(}PZ^h%tSSg@3)7BwhXWoa*DSr5ylhopWtRUqt5F5FIY!dxv`Vpgn)4K3E*W_b~L^7>Aj&-2~j zbU{$sD^W*dna)gg#aOoTh|@tVeuACw*W?CfF;tBL<4HOH4OJ|zK$WoK`p>V|o`NS+ zhumY9Yj$|I>mSau)b)@SG(il$p~_{=O{A+o39CeV0j20ZzZszXZD}ELKVnfwSj4bI z8oD)Bd5sH0r#8ndy7{MaN(Z1U+mq%0QQsRQUVG)&C)tjSyu7hojvr*UJ(Lse?$ne?YQa4BmDRcvggOFd zPGt8{VAmiAH+Oe@miu=>n9$!74UxwkH~2tch6C$(x$n@|g8!r|?ey)#S> zgfX`!!<)J3uqS?tPaR#dqREnRqb47ki!mEHn2ZDHr^(lyuZ5E~e^_LLX^CUawBZ-O zuuvAedZb*DiP_?&z1ZVjih#u-9(p1kHXaj|j*9JHJ|lx)3k2I%tC-p+p_xrc56dh@ zv_@oatc6k5h2R7Dqg-D0V@7yY+Mma1`KX7lfUs(Nn#jmWoK`5!P75v5F}$6P1T8Ws#~l_b=EIBu`&}FZwwZz4O4-fM#wbyDUoBhn;p^yg%Dq zy1@A~tk!j4ZV2{7u!9V%cZihqF%zTbghf2I-I z0st!uT$(m(e4zq^zFx&>h!fuQ#C+BTEqtNcHYoA)^M)2fo@mm+4v<099N-Fe?+w4Ln@ zlnsa4yaAoODiDG6WF|M{77TSwP2UKf6~v6Qbfq$KR%fthFi$Ln*HH zakR8t&U)DQ@anJr{LR=kjC&g9TXDwlO%9kcjb&-3&Dkd~Htha~|Mi~!2P3e8&SUk; z`|o-~zEN6&9zjmShYqY4gK9Uxs|nxk1;jk22|5UG%bL-Epf;=#piH^6I48Vsfj=Z{ z9T&^ae78ueO($XaB|KrqpF8|*De>~OR`IN8_*s|}m$t-bklv*=Sa^@fHpQQ)NYe4G zyw;|M=NwS^PF70Ct`xY*%X`0EaGH`249nqGPjlq+>eAo`CuW*oFXP;LyVAz{MtQ4W z{nk!0WI%7>gP}sK+t~s2OGXVBAF@n?+!uKnmw*Bg0>^wb$1^e0HL4}Ww~p-tx!UFd z1HX|^*!q^N4!o}J*f#{eE-{ow;aBKQ6FSHc z$LaLT-(Q+W=*vP?dWho+5!fMtGsZoO(Ng3;w^XJFmJaz8}tYAwvsh_-IbL00mu z_gNQ1)Z-rMOmQaGf`|FKeZ4a!SBJ=lf~A_Eil6#B@Mdl%m){EexyH#jO7bP-VXdg` z1k!M@Sdm-i$ za==30{Z3YS9w)N^%>H|{0*S_^$>n0JgHr)2nl8Hm3|1tE@&|}Eg%&b7XaMpN162^C z@0qu|Dhm0`0ZsM@l=&U%+_4n&$jH5RJvxD33l=$Ea$DxV@P=`7m3NNxOa-&3h;#Qe z;VX?{rrga~=xu;tyGR?o>Cz3pt@1l^QW7|a4$8;z#CdH>3aQbuIidcA>daV4yN53V z3D5JgeP0}U?BW@)JllpbF4sl1_M|@DyYvw>iaSsk*u<7;@G&q_*w% zbC0HW%K%mfD8CrM7H*P5`X?WLjX!4I4~Z0Ii*! z5t(=;Z5Kd94h56z_WXH9nhc{R*+}ouEe6T9vx(o^{8edN+X8Fw)dh$3cJ9^K$8Q8< zO4hG3{;6|LV$O!Q zfkyq6&M5V?WY%1naY(+QaCnBfBFH8srWAZMpkFj0}Bg=K^j_E*>25yRsmF4LiIZObsv_AD1etMRG3vy=bwV@t}dL&w<$Z z9N=`pVM$R&K4q5dCg}-Aix^GiavVarC@dnRfQ`RU>iS9Y?{3Fmga1wvqQqxb$FMhQ zM}G^K-`e$gZjy<9S_Son=)*}XfyeiX+~DlH7@uH7m*P+rHY3rRZUeg&9V8?2dkzqu|f^?6+MSb2w?G>m)npSZFogg{9C)y>g8t z1u`8gqipm3{e0QZXy*x<3)9ltHNG=G z)pwf09^DTvB{OQdc{l&ZHvjzFG>yZvBMiH=IrOV~~)2{eCZ?**w9$K)grAd7QiL;lzOh!YfK;Zr$ zK#_Mi^~puRjg@q*N~I5?Q7x5ITm}cX$|J^4ya(lih2c|N@sL$d`log5+vW`Sb&2pw ziL!4(3wafHV;|9(;85pBrLHz-rYwe`)iG(s)nDf{wZeBI6-<8EOd?Fs9~grxP~5BM zF}_c9W?px;q;>K!T&0C_msDTk2z5|gekm{Hws+`@xQ$11SD_{*X1^1?6e*mu?9+!S zUTdB(i({admZXN*}JZxT`gA&(#`QRNA#!)^wSbxgqx zy5BGJ^3?bAFws{{+zVhgXEe(-aF*?ZW8O}a?lhxaZllW0ml%sN!>li@-+e7- zV|#TcRa%7=@{}ivyBtf$VXUOzB;Q*;aga)dozJj9JUDg}4zFs&UfUh!lB{R6$Bw60 z#PnR_pJ-P=H0sTn5w7lLLaY>ZYnur6wX+%$)F>MH$eMW}u%bAc?V!bauA-*=iquxh zHkrzbV~|utBOExZxM?Ck3(Gdnx_7PopohN~g_4HfAnJSI zy$XqTGqLS8h=N$pwl-S(bhX^Oe4ixz^A=p>>!DvOD3M^>d>AziaNS! zwaMq@nW~4r#+e?a#(cq-*m#4!=F3NY=5{eiVA6aGpUbr+)d}2?`^eZpmfYjm34H5h zuJrn?G6HRXeP6S6KIP|r z+~G!;vu8bhw=vKhhuF7J?{Ye@xhCxa+I}qy4S0*o0*jAJ>}_OT!;cMWE#}S+VoW2( zbF&0r46twOu6Qx^&<`T**u!k#7*AURZ?W@X5vvFG5j~b;L1rs$f*a^l>-XLl7*VcU zwo{qPQ->Argt(P*_e|!F-*(%$7O;~!FKjBTr>E{m&w(=BBpLD`#2(8ynbJQeydIRR zucN>$*UN##n}ED9S7=X!x=S<5l7SA5flnli%P@YI5>p-1=6jvEcGNgDN1LFn&093( zrP_+v4qw1Vl*bf$bBk06?OwMbuT{+gD{m(+X#Czuxpjo0yxlhMh)n-nCRSHLZ!Rl+ z&?yhLD@~)$>qs!mUn@r>FMgq|(m6P=lhB zSE>u!B59yUF^u;F>JRdZKU5dnZod8_`)Z2D|ARRCKc;jMmO_5g+VkCnR0fR%q)1Hu zB3OK?V8VenizEHB{o1T7+UzPS*h;2kxUMxakBOal2@xfu9E>M^Xujtu9O%~1u357v zO-Yv?Voxp=F2;E(R`FPcMC^?Co|Em7O6>CEdmp?7`wM9-!;12a){Gj?&2p;JC4)*> z&zEv8LDe%Ac{Wrx=rvV!>dM99IIt*A!=c{fH7Ne?A~WUwu8>t-XnnOiITe~k3rGIu z8w2DaDrx!L&#^IU9QpeL1yZ~p@|E2Q`|$^h!+X>_S6p8K4yRtKI`&Q3%afL#Y658j zxeC_8&ZHEp!+_veHbOylJd~S{T-gY#+@w-1+{{Msi?5E2QPz3*aVMIJno3kD=^URJ z+&;fj?dAJWRWI^s$l9w9gau;&NY!D234);{6Q2RREl=e?x3_Oq3?s(e&d7NzPIZ;& zNbo@@Zl}XM9i*~*n``OTnF{HG;-0E8xLODm6pVP{KgD#jW+8rGir?83+%!T*R`Z@} zhl|2q`L5k~!)5^hmXIfrVIe!`tRKuriVJ`0?&m)`Gg{bIW#(!R@%~XyZp&!F0h0;2 z`j&_Vty)If&?)>JA3Y@6W@TsWLy3ol9^U67im88*wuhrby zvAd#{Y<@TsQi+xiW==SCle30I{1g^IUR1P7vpnc^#}zoZDR{@XXJmDXz3TC>X)dHleBNv^sSrY1qLMBz3Zz<69b zwez6cBAeg%BgUJ19io4^eww(As&8*Eq@wqns4`5j8Df|7Dx@L)p6>EWh^>vT(z(p5 zJ53n9n4YD#*Y4DgXPLyugn)cR5U(QVkDSWCls><`Sqy*W^51>^vl(DvC1j50Z7Y}Q z>hJrUWg!9+9#>|_AB29VkS3>88hch&Glsc~@%r?}N|uX}@yG7>D*xa z;y2gzId^Z8Z|0UUNwbzy6B+z2DqMu(0HMU^2i=P>djoe6UUyCHS9%rck%lYYfu^6Q zRjZJ~V~-TrF&U|z(e{Rcrra(!7nt-r&I?0=BpgPy;=3djYt$Jf>h|e<{d0op&m*0= zX9-4giMMbQWG_Va7(@fpmXI3sBUjAlc>7Z>aM2Nh)4H%eZ2lxq98Gk{tjDIdB;)1f zI7b_VtTf=jIX*4q;ZwotLDd&(d)dKL8-m_Lq+bNC{O>ZvO10FU?1eurq|J9XN`a|N zbWKNsed9DxzZP+d{$Fku^r-Fq6Q>RO8)&va#v#QaQ{Vs6?NPIQhTp1zRksud{%HHw?isH5eTP<{{IzG!t|4yQ_Ngj2fnAnBJByDAUme(jFKy+XJYFgk;4xj96yFOQ z)fYw*H9qa(X=YWClnI2Fu?JjN9xLTmJEuLNZyf9Xia07@n;PNlZuQ!q5>v(7SDGNT zK#_R6`y=46O#6zs23S*Y+q^WOQh=YdTxM2G!na;c(x8R)yE?3Wm6H5XS%76P`!cNG z%x35nxt>^BsF&;COwIPYoUR@ccrLnbdxXE54X($>&>se;GG43Nj3KjV3XCIQhe*>9 zVJuOWudP-2aPvNHj^*BSrrgSRrp$W@JCiNx6WF$>OdP{5Vvk7VBIu!3_eNqT!-^wB zA*1m8(CgJ;bS>sNwEKgg5w@1ZWFToge15kM+_ikvgt;F$*M(j6Y@~lsj8_OBP3&>P)Wwlkmht6 znxzZ3*N^AWQpmIK+t#1={Mjf&O$32cTdK_sHmlRSMUtpS?G9VbSa*bhBJIP)rOpLS zDQ;fo-nPY|efzUNY6?X6Lx-gtzDeYTpTu5qXh`npQhYw7y+E|X^vWXuP>V27TAFGg zR&?aco39^o^j5I3iBW2yd_3J&Ulr2v37whAbsN*!G8oj|=P5LJs&D8FtUxaC2H)<`f}trDq|ptz6h@Od&jJ%wf}IdXg_m?A0tv0YDWj)O zAuH3`eqCSa3I41*V{#Yos$Gc*QEIZQxgkcUw3x9oq}eIT>q)Q{aHML#;#ZtKtX09T zrE@v-jKhB*0_{v+lr7IOk(cQ#W7adm{%xCehq;@3ul8)Qm6;GerU0HE|1f~er>&+g zWynX!jisNCfrLa04b$8Fg&D;B4CO%m;5oX8r@A(=NLx8Yepy*=%xC<w{)X>OrZV+@tpIl^iDGq z;Q_k{SDi{h@J6PsgN}ujccBzu(C63~WeScr;j$}$oaNt6guC0iVD6I6rEKm05^)KC z&RK}>+W-&gOuO5xOKtx*REszu0vh$QL@Wxp2Asj4zU7!pp2(B)D_v42TW+=+D&6Ih zl5fN{>VJJ|n-&l$c?DrY$Gb-d)=>xy5*#8VAda<(FmzAXm{Oz;ckuE(*q z)$Y6f@RjQd+ZWv*n-1>jAy$<$EUI49WAgRgkLev*)qC1XPe57RwlYoil~p>h!gMi+ z;#LHR;yA2+ho6CF+#KiT3fV_3a|)OJhCgWg4qVv{3bpJlBO7BCob&=|C*v6w(ZH|D zuiBl;O6ig>i|5W;XMGwD8!isH(*6+VaLe+$S+Y46MKSP_+k zSKUe#wv*xNk6qWO9@rO$rRgd|y88rL(z;UTY%x8ux#(ap(lu-X#z>gLONS4SD{+92 z=(s_Wb1zA7cC{dCyL*KL;|MYB+j*lr*U={?+W$pK`rq~dnlVfDTStD$ZC)D0&(yW$ zr21(sW!l(nJsM0A-%6^dq4nxFWAj@5*Vv$^^t|7rTV#tS$D1Qn*UDiBM^3(-H57U6 zcIc4Ee#xJuEH&l!A86fHqNCibdcWTwOr?iV=a*1A6l9;e@RiC6leJpD;9u0xcBgQ+ zMiNbA#@ueQJMHlZsL;%gwDm0$a%2%7bQV1GrHPoqw5td;hQ8NY(1M69#uCF#&G&W& zn*B5Q1XA{_=*JPubE?z!h&Ez_g4(fD!@rj@kqdE(mL9mvK1iAIm2!si?cWdmGT+4R z03u0A`IO%tpIeF_5`DW#LJ;o@ z^yuS^dFP_|!-J0d)DCwS+3=DL>^BbkAzufl1hmXQ_58gSZe_Y8sx`_Os9LrE2dsxH zRVCR#_qu262h12v1o;vq(vlzil=b!)dy$yu*lc5r8K$o5lhLOSNC_UK=6u$2D(cp* zY&E3r-cWts=PV)FXW`+{Ww?6L&fX--FkYp|t13Qt$cB1I_bT9D^OW$Gr1VmKh=aue z-&9@l6&D5lPV2wiU49RbeZL1eP%2w|>a*DA7o+(L^dYgXLTO2jj}nB`u-&&qzjlNX zjzb%k_PeTj_yQG`b>E$PudC^5fWUjJo-V!!ZNlC#y3RemW@h(IUhT|L<#TT(?F=N{ zrjJE%$_5CFIt4p`sdNS8*I>oX_;$nVs(tns`<(T(;@dtKsg&K2mdyBe+FV!q=H=sJ z`65CBrLy_dy_}(Jjea(I?MHr4WJRjBW>Z>m=I<5cK?&smYxafD`flBccP~7;Q3F>! zdxnd>3W#`e*gigF*y2dxH_?vZsj9Ts7rhgvS$o8W1adf9_1>Q!B0z>Q(bZ=!?^1Q{ zln`Elx>%6XigzjIcjTXGiwxGO4ms|_zmbVm!+o|LmoF+m(&AldF5q9w;4g3+@9(Zs_aPtVG== zG6V7ZZ#s{|?t@)Z zdZ(qh`>H};GPD$(uV3|HK_t()HF3tORUcrybf0?+o%l4CNZrjZcI-FUwOcvGL1W-_ z``6jr7vmqEN!M$3E^d8#H)1)P+3t__xj%UL#Iv62Q-sEklGIeUB@L~2vPpwZssA(& z7+aibJDCT6G*PK&tijzM^R4{%&Bae ziVv?pphChI`qi~O@?3MV23-?s56`?gbL9|Kan~;CV_wmNkF)&3L(j8&b~XN{t=}W% z>iJ6?`@8?hYLC$Yv~yx=q!cXa*y87wIUA~h$f23~CuT*_UyK3mqvNs>sjznB`@o|p z)Zgu+n<8I*JEv(cD#osvSoXCRpBYYgGfz7lI;9e2^!nq+7M+SKvAeTyw2IO#>%|?w zrYFI5Q9&#UI#*_^?=^8a_~^}GnZeoIw(oB`a;;UqPKXTJtL|0%mktXcwf@vD(dN@& zYwt*emuFV$1(Sq86$!bbhV~OjS{+pBPut(#O|Cj?QhB`cMb$%>x4Cy@zkjygumg*T z27V6P3;Z1|7b=7QkyP<(xR?~pY9Xj9AN6&!q*UcnJ*N|1jSE|%9A3Q- z_X+ktDqAk9?|ZIsK^fKaTKY;q&I5fFQN4z5at$|%i0-ZS;uNqS z7+pr+NJusEaU{fjLSsIWOur_FKSg8@b@(aVw3IE*Yw5Ppi*#Vzu#@glp&E++w2bZ^ z5q!PC47DNLPx~FwC@es=Cr@0hALrg6eEO6c{ODtgpMs2nF_raakA~Q#H*Z@H2``-; zW`>oYQVgd@#;u-pJ|4)x(amaq4JNO#@5a3}H`q@gLj5x(XP_W{+>!mdbsDX9E7KUm z!v^P1vsO;NX_IO|agO$7+cqR!)bRHC16iI@KjeuHkLvU^F(xHc-V+U~3hrUpMz|PJ z^Ni&B?F<6eG=4`6d-P}P)a5ev9z*(lMg0g(4 z#trvz+-KMtnXdcVydC zCXYG0f0Dj^!^vrncPd==RkUtMZ1}xnGR2utUdC2U307Mul%P7A&>2npoLH%RqG)Y; zWZB`3QQF7g?&$r-f#2@fWGLyDhu z*#QKnpxYVwW!5iO)0CPycO|c3Nd|3!iEckMqXYE@gN#eC`$vZDH_touA2EH2vM6@( zv{k#N%JfB;l1|u-7g(MMuX}smgn8V1S^hHRUF)r4n8i9{UoB~VuSNXr=!M1y1IZa` zQ6fE8FHM+L99>$+KmKf#xJsVaHB!==F-4x<0R(CNIoYbu!JqZLZB9c5jCEs!EQ1EV z%Nu!(9WqATmTsO`P9VJAd+VN$`ke?r^oPXg=pi*=MrOuaPpN|krP8!CWSzX7WHicA ziHRsLkZ|l1Ncw*Doy92yi@S!>IckUYOS+9nE}i(R&&9R=Z&&;908{G#A6@I121ogI zm9ns<-C6iPbEl`VQ8CXdpBBOfdip(5(r>H}IN27z^Y4qVJ{ghkKHU1MWI`c$R*P78 zR{v}PSHi{3|2n*E2SE69Ha2A3%7a$+Y=Mw{+5Q8I-2KkJCcy7jKLXR?bF{XXACqOYblzE2?WOF!8#K z$$_^)X|?hWChrNKTnL#}Wfz+7ey{b&rOlP_5Q$$B4iQ<^2A)~w!6>q6v3Si^Y^h&L z3}KM|O82{-KEt$`7wx7M;NGBIfBSU>?N@0DRzz{nu9U*Z{Q>RLghO*i&uu{cCnNxj zmUSn8r!~Nc)zb32!oPwBn+kCtC+ztrE<`Nrx7;u7YnhUK%iEM{Jw(cGgA+x>Jk^@( z8hbxoZ^aM`i#^-E+{pEmQVaZO7AP@v%7T$X{L4PJQ zIOT%m;#f)U!#NkQvwq2Yz4+tbULV$blT;6|jQJxp%i=D6Lx>O(4eWD&P@q~h=;GBqk!OpwbMnc?{Udwoxop3gkte<5!V~93W4!M?XudUl_W3{i)`sU6Yfkn>xz&$C>_5HB zK3TmXoz*tol3lG#?I-j<^-C%9S+eEf&2z>>AKb4t61%5DU7EGH2VYZ-qs*WP?3Bjs+ zuDTMILU5@kuzmkmXXELum!_rMALku21$2Sf>ML0$7!HKvRj`nZw93#;)P&czyHFl; zorkRf4bw^56gK)^j0u=mBNV?D-vLMu?=C=SWz({wmh#$=nK3v%x*X1%h?|G4I>N&G zUAkvbpA-0PLYSNP4q#ZwpLVQRUEantM*qEim3)wM?m0_zu66~9l4kaPUhYkvq-E9b z09fH1&+Q5R%={FgiQ>m_H_12dPjQ;mODd*GS~X z^VI@Hg%%1@=_flI;&lS(yCD~Thvof15Cq3;s`nhY`G?7?gd8Uqf^SJPnZ+Eo~6aQQ~%npyt%O8fKt|Dz(?=IU|a!lv;R^ zI=V|I1iulvDh^3UH=+Zpjlw}-Gcn=#0O`;6bMR(<;l&O@R%ZP%uscK0KFRYc<3J)f zj*l4*&XP1H1&g2zO!d>ze!-g|QSII4T<(9?S-2el6B!=G1LItG0Fu|ExX2xVkgLl? z?*ROlZ+Y%3Vg{iNsgceb!IAdUv8L9HUKW$Z3!GqXe6NRb-fcC2LfPmu zG*I^pGgxQi8B?-hfF_XPIsRN1V&(lqGxnAW`wKBV0CM%_EpNwa!gGQ5S*x&_wjF>D zV&W8bxd#=lqYO_k@LT7*GMIvL0dT6leL@Mg8O+_r-2=LfaT?JEF7bQ`Dl!H!q3il8 zGL@Cr0iv#yOEypmwO)+XNkN=s(=-#iE$KpJ`}^#DJ`p2)JKEQWqKoJ)c? zo3?o-1Oiv$3zbsyXR9pSoSX%uxHBBBnn}>=?V^}bGi#w?NYAoEd4*vHWblb#+!}%# zna9LPctkZ3>!4`TOsj%q<)dXp{X%H+AGUv|xd{;Tw<9Ovpo&o^s(j$J#e#W2N1Ob z;6d-jXxOAM9x~B@vpPi|J8u>F8=q+!je&p+VrYjwc`zFy{F# zBcy~0Of`@xO;Tf2Tg+ako zaU8ir(Nk!r1WMiD8iA}yNf$m?CL(NP=nfzlGf~+sNg^66LXn>kl|MJ?hL~q0#BVuR zc_9B1JTse$6lFY|v&x!fNljGF18Jm!ZqwcoP8=s~2Vf7pU_!_&4R>N=e3*>%u?MM# z-Itzo?r^r6T_Pe!70+@m{e)vFj`KMzNK;*~mq6$$238DJp&i26bwXv{dB-p|V~`ye z+UF?#?--R&?yHmFRs;u8DJg<|Ytbf6QJ1*9**`E?1ztV9ZXLfYJ|!qHP>&ZZZ5VOu z)K$e$eV&UoGF6p58YK{g$PSPm2i1|S#=*}+Z5E#J3fF#p2AC<;1TsxzqO#<=(OPhI*tLK)R2!ZY)B`He@nq;!!tuY5FM7?h zUGzB0tWWshZC7$XIgxKR2OT-S=2g2@Qf*?D1fp_W!QlJN!pvawFT34{vB${-^76eY zDI`ovhlys&#C$OW(>c*y9r=8D8{JW-#QO_9!*+22jY($aV3G^@Ia^KGCopDB+-DF& zwz5G{pF`zTFkH2NnUS+^h6f08vw<`OwzjsBhbNkJVg+N2c%d&j5)hEnrpRBgjO@j2 z45hANMW%KhuM@F}sVmWLpG8)qCmSC%h^zMFC5KKo()RYWYX4uM$2e)uhMpfOl$zT zOAY?%~hI&h?5l+IsTmYYu4rA-=ad%0G{yEz9V650p`i7)wnYj)5n99 z-?|+K*9k;sDLI0?B6}1~R%6lAO5sZ1rRJgDYd@N3WDw`FuS{#?fC%z90r_wKLkrQMXhm2jhc0}3&MqEsv|-vkQM=B2e1sD6v%(hYTzK_ zAn5Vo9QHv>qy{Tw0aIV+xM@IYI=boA4ly>(W4KD3qbWXsw?;7)feX)QAZ;GLk4i^B zp38|#s;^Dp?f~@LS-^>zE~sb|H)t#>0FBHZpH8eC<;yUt1w~{VSf#oT>kb1M5{CYT z=w7}RB3>xhq)6>D^g02OH%g(AZTIRuE9V=lt4K}H)SmV3+ z9AK|PtAtHA2Y8utB1@bYpk(+z8*!0nrebIoh&Y3kAiVcuL(+ i0W%p@BWy_+jwEJ*g?_WmsUheHHI^pO+##hM;(q`Gr6Mc< literal 0 HcmV?d00001 diff --git a/poo/diapos/img/logo-cadoles.png b/poo/diapos/img/logo-cadoles.png new file mode 100644 index 0000000000000000000000000000000000000000..de8ddc0506f341a1bb5d22eb69e46950fdfedb10 GIT binary patch literal 17924 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 R0H6Q>002ovPDHLkV1n_Dg{c4l literal 0 HcmV?d00001