Aller au contenu

Introduction aux algorithmes gloutons⚓︎

La résolution d'un problème algorithmique peut parfois se faire à l'aide de techniques générales, ou "paradigmes", qui présentent l'avantage d'être applicables à un grand nombre de situations. Parmi ces méthodes, on peut citer le célèbre principe "diviser pour régner" ou encore la programmation dynamique. Les algorithmes gloutons, souvent utilisés pour résoudre des problèmes d'optimisation, constituent l'une de ces approches générales.

Nous allons d'abord fournir une définition intuitive de cette méthode, accompagnée de deux exemples.

Le principe glouton⚓︎

Définition⚓︎

Lors de la résolution d'un problème d'optimisation, la construction d'une solution se fait souvent de manière séquentielle, l'algorithme réalisant à chaque étape un certain nombre de choix. Le principe glouton repose sur l'idée de faire, à chaque étape, le choix qui semble le meilleur à ce moment précis (choix local), sans se soucier des conséquences futures ni revenir sur les choix précédents.

Un algorithme glouton est donc caractérisé par son approche directe et irréversible. En se dirigeant rapidement vers une solution, il peut ne pas garantir d'obtenir une solution optimale. Cependant, il fournit une réponse en un temps réduit, ce qui peut être acceptable, notamment pour des problèmes NP-difficiles où une solution optimale est hors de portée. Dans de tels cas, les algorithmes gloutons sont souvent utilisés comme algorithmes d'approximation.

Pour que cette méthode soit efficace, il est crucial que chaque choix local aboutisse à un problème similaire, mais plus petit. Cette approche partage ainsi des similitudes avec la programmation dynamique. Toutefois, la différence majeure réside dans l'ordre des opérations :

  • Avec la mĂ©thode gloutonne, on effectue d'abord un choix local, puis on rĂ©sout un problème plus restreint (progression descendante).

  • En programmation dynamique, on commence par rĂ©soudre des sous-problèmes Ă©lĂ©mentaires et on combine ensuite leurs rĂ©sultats pour rĂ©soudre le problème global (progression ascendante).

Exercice 1 : Comment rendre la monnaie⚓︎

Nous considérons des pièces de monnaie de 1, 2 et 5 centimes. Notons \( N(x) \) le nombre minimum de pièces nécessaires pour obtenir \( x \) centimes.

Question 1.1⚓︎

Quelle est la valeur de \( N(0) \), \( N(1) \), \( N(2) \), \( N(3) \), \( N(4) \), \( N(5) \) ?

Question 1.2⚓︎

Compléter l' algorithme ci-dessous qui calcule \( N(x) \).

Question 1.3⚓︎

Appliquer cet algorithme pour calculer \( N(14) \) en considérant maintenant que l'on dispose des pièces de monnaie de 1, 7 et 10 centimes. Que constatez-vous ?

Question 1.4⚓︎

Adapter cet algotithme avec le système de monnaie en Euro :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5
.128013oèP;f 8lkg5:,bry2a1h3tvw=u6e[(Sàn9]_s-c)7im./4p0d050X0C0w0s0Q0i0L0g0N0i0s0L0L0z010w0Q0V010406050L0A0R0R0s0p0q040F0b0i0A0=0b0H050T0|0~10120`0V04051i1b1l0T1i0`0X0Q0x0*0,0.0:0,0H0k0A0s0k0C0M0V0q0w0u190g0u0Q0k0u0i1N0u0w0^050#0o0i0C1u0-0/011M1O1Q1O0w1W1Y1U0w0p1j1I0*150L0V0s0H0:0r011!1w010f0%0C0H0s0R0C1U1_1{201$231Y26280^0a0g0d0p0b0V0b0L0Q180H0g0Z1@0p0p0C0N2t1b2b0H1j0T1I2G1:1=1;1V0X2d1x0Q0H252q1U1r1t0+1#2Q2S0H0b2W1U0V2z1j2E2G2-0{1`2u2Y212$0p0 0i1U0s1L2z0f0:030K0K0N2%0C1Q2#0b0M0W0M0t0^0g0t1b0s2.2;0_2:2c2?1$2^2`2|2~0C3001323436382T3b0M1~040g0r3i3k1{3m2E2P013r0s2{1j2}0u2 3133350Z3B2$3D0v3f0v3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0U3f0U3+1c3-3n2=1v3q0b2_3R3t3V3v3X3z3!3}3$3c0l3f0l432-3.2;3O3=4d3_3y3Z374j3a3c0B3f0B4p453/483;4a3s3T3u3w4x3|393D0P3f0P4G3L4r3o4J3P4L4c4N4e4P3{4i4S3c0h3f0h4X2F4Z472Z4$4b3?3^4f3`4h4z4.0M0I3f0I4?3M4s3:4{4M3@4O4g4y3#4B3d0W0^0t0W584^4t4%4}5f505h4A3D0t3e045z5p465r4|4v4 4Q4-3~3d3F0t3I0T3j3,4Y5E5b4u4)4w4,525L0t3(5B3*5Q3K4@5U4#5W5e4*5g4R5#405B425*5S5,4I4`5/4~4+515i5y4m5B4o5{445T5~2@5s5H625w530t4D5B4F694q5-5 6e5X5I5Z643c0t4U5B4W6n4H5a5.6r5:5Y635x6w4:5B4=6B6b6D6q5G6s6g5?4k3d555B576O5}6Q6d6S6G6t6I530r5l046.5D6c496)615=5K6W0r5A6}6=6%6@5d6_5v6V5j0r3F78581m2+1b2W2J0X1=2O5b4y2V1s1j2*0C2,3l5|1j4y7r2c0Q0X0:332E5y3t7y7A6,5#1 2h0C7G6h7I2G5R6?0:0N5A030g0x3R0C0A0p0)0Z0)0V0Q0c0N0C0L7t0`6a2F5E7F017B2;3D3F5e7@6u6J3E7J277L7^7H6|1U5{7R3P0^0L0q0L0w0C280K0R19260Q0C7t0g6p210b0^0z8p8r1$0@040D7t8x0:0R0Q5m8C8a8z0n8w8a8F0^5P2/8J0^8L7;3G8D018O04688R710:8z0J7/8I4s7~0K7C3c5%7}7z857N6W3(0g7K7M763%883j7:8$7x8@7_1{3D5^8?8~6{5j408|839c5!6W9a898%017T0^7V1Q8f1Z7%0g7)7+7-0g0G0g2z0H0X2z8+8V7?968/7`4l7E9K8_5j4m9g289i6v0M663+8a0H0^0(0w0K7)2A7-8M9n8t048v8V8q8S8A8*8V937s3N8.8:0M6k9b8^8 4C829Ua39d3Da15*9{3L9J7G9 6ya27 534U9T84ak5Lai9m4!4`9p047V0L0b0~1Z9B9D9F8o9`8,95ag9M0M6Laj865j4:an9V80aMas4_2@8caz8i0s0KaD9G9=8X9/9;2-9?9n8Z0t5`6o9I9}9K9 6YaN9Q3D55aRa89j5ja{acaH2u9~aK5n9OaS6i5lb0ap6Wba7P7waW1$av7V2R1r7,9w0b7!9w10357!0Q0p0g1Y7(7*7,7.aGa@8-a_b95Aa|a43d3ebfaO5ybMaV4t0^0Q9-at8s8ubZbl3;0o9$25b63O8z0Eb-5V8c8e8g8i8k0H8maF94b(018z0Ob%3O9/0Mc35ba:9Hb~0gb8986w7|2}8.a}cfa6aobSckbjad7=a^aJce3d8=ch9PbO5$clbc5#8=bV7k7U0g0obt0+9u1Z350H8f0p0A2B0Q1K2w0,bB0Q9t2v9z9xbFca9|bJct0H5y9acxcCbh9f8}b19Wa;91bk3O0j0^0y1M1Yc75.aYaA0Ka#a%b}3la.b!1$9/020k0w0ed34`8Z5obIdd8(0^0mc)aecs859 0t9Yc:c^80dycBdB6i9Y5*0gdJdcb 9#047X1Y7!dkb#9:dS3qb?9tb_8l0$dadu9n8z8BdodMbXb;4#8)dtcrc+dwb9a1dAbg5j6jdEd{5yab3jdKdLc}bX0fdV3;d5a!a$25aEe801df0idiefdNdP7Z0pd.4`8zdsbHcbcdc-6waid`cn3damc@d exc{e3e38XdNbYa)8ac5a,db8Xc9etc*aId@cu0taMezcj3daQeDeAeYeGdK8Xc~04370Ld$d=dpc0drd;c|ev5ya{e!cza e(e#0tb4e2eHdJeJ9$8f9)8nc(d+c40^0SepaX040s0V0Vedfj8y0^b:ffb=dO7YdRfud/0^c2eTd%eV97ew3E6/bNa93c6.d~eAfNbjf7f89!ea0Cd7ec9Ea(a-a*0^0MeP3Le4fvemfya?eubKcu6}bbdF5Lf?bRe#f?cpb-e|fMcgcccyfL3E1~f{bO78c{eJb*042*2R0wfqdq04ftcb5b0L3F010dbE9zaCed2z0g0m01gie^048Uf#fU049%fc9+bGgmfA04fCf/7s0T7v7c7q7e7n1b0w7hgX2M2H0s1XgU0T7f7:0Z0#0%0L04.

Exercice 2 : Les conférenciers⚓︎

Planification des conférenciers⚓︎

Des conférenciers sont invités à présenter leurs exposés dans une salle. Cependant, leurs disponibilités ne leur permettent d’intervenir qu’à des horaires bien définis. Le problème consiste à construire un planning d’occupation de la salle incluant le plus grand nombre possible de conférenciers.

Désignons par \( n \), entier naturel non nul, le nombre de conférenciers. Chacun d’eux, identifié par une lettre \( C_i \), où \( i \) est un entier compris entre 0 et \( n - 1 \), est associé à un intervalle temporel \([d_i, f_i[\), où \( d_i \) et \( f_i \) désignent respectivement l’heure de début et l’heure de fin de l’intervention.

Afin de dégager une stratégie de résolution du problème, commençons par analyser cette situation :

Nous allons utiliser une liste des conférences :

tab_intervalles = [[0,7,'C1'],[2,5,'C2'],[6,8,'C3'],[1,2,'C4'],[5,6,'C5'], [0,2,'C6'],[4,7,'C7'],[0,1,'C8'],[3,6,'C9'],[1,3,'C10'], [4,5,'C11'],[6,8,'C12'],[0,2,'C13'],[5,7,'C14'],[1,4,'C15']]

Question 2.1⚓︎

Compléter la version adaptée du tri à bulles pour classer ces intervalles heure de fin croissante.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5
.128013oP;f 8lkg5:j+F,bry2a1éh3tvwT=u6e[(Sàn9]_s-c)L7iqm/4p0d050$0G0z0u0V0h0P0f0R0h0u0P0P0D010z0V0!010406050P0E0X0X0u0r0s040J0b0h0E0`0b0L050Y111315170 0!04051n1g1q0Y1n0 0$0V0A0/0;0?0^0;0L0j0E0u0j0G0Q0!0s0z0x1e0f0x0V0j0x0h1S0x0z0}050*0q0h0G1z0=0@011R1T1V1T0z1#1%1Z0z0r1o1N0/1a0P0!0u0L0^0t011)1B010e0,0G0L0u0X0G1Z1~20251+281%2b2d0}0a0f0c0r0b0!0b0P0V1d0L0f0(1|0r0r0G0R2y1g2g0L1o0Y1N2L1^1`1_1!0$2i1C0V0L2a2v1Z1w1y0:1*2V2X0L0b2#1Z0!2E1o2J2L2=101 2z2%262+0r140h1Z0u1Q2E0e0^030O0O0R2,0G1V2*0b0Q0v3g0}0f0v1g0u2?2_0~2^2h2{1+2}2 31330G350137393b3d2Y3g0Q23040f0t3m3o203q2J2U013v0u301o320x3436383a0(3F2+3H0y3j0y3N2I3p0 3R3t0^3U3W053Y3!3B3$3E2W3G3h0Z3j0Z3/1h3;3r2`1A3u0b2~3V3x3Z3z3#3D3(413*3h0k3j0k472=3=2_3S3_4h3}3C3%3c4n3f3h0F3j0F4t493?4c3^4e3w3X3y3A4B403e3H0U3j0U4K3P4v3s4N3T4P4g4R4i4T3 4m4W3h0g3j0g4#2K4%4b2(4*4f3`3|4j3~4l4D4=0Q0M3j0M4`3Q4w3@4 4Q3{4S4k4C3)4F3g0#0}0v0#5c4|4x4+515j545l4E3H0v0v5q3l0Y3n3:4$4a5v504z534U4;423g3J0v3M5H3O4{5L5f4y4-4A4:565S0v3,045,5t5!4)5$5i4.5k4V5+445.465X5J5Z4M4~5?524/555m5C4q5.4s5 485K622|5w5O665A570v4H5.4J6d4u5;636i5%5P5)683h0v4Y5.4!6r4L5e5=6v5@5(675B6A4@5.4_6F6f6H6u5N6w6k5`4o3g595.5b6S616U6h6W6K6x6M570t5p046=5c1r2:1g2#2O0$1`2T5f4C2!1x1o2/0G2;3p601o4C792h0V0$0^382J5C3x7g7i6:5+242m0G7o6l7q2L5I6g1+0i0}0(0e7b6t260B3j7F7z3^0e0}1^0V7K6+1+0|040I7R4(637O0u0q0O2W0z0G0r0A3V1%0P7X4}267U0S0l7b0 6e2K5L7n017j2_3H3J5i7~6y6N3I7r2c7t7 7p6!835X0f8h0f7G3u0}1f7{3K8k0^0b0}0D7:4x0q0}2l8v5f7U7W8o8q3T7!7$7(7*7,0h7.8A4)7?7_8v850O7k3h5-847h8c7v6!3,0f7s7u6Z5n8X8g8i8F0L7O0r0V0G7b8j7L018s048u8o8`7S0^0i0R0}0o3V0P8^8o7`2@3R8T8V0Q5|8Y8*5R6!448(8a9k5*9m1Z5X9c7a9e8Z80203H6a9j8!8+9B892d9q6z0Q9C8.8h8F0R5E04030f0T1(7P0f0K0f0q0E8M0G0.1 0r3a0E2E0f0;9/0V0P7)0f0m0E0P0W0E009Z0R1(9|9W0b9`9/9(0f0w0h0w2d0L0z0.0P0b8@ad2A200.1%9!1P4e0$2E8R8E9x7o9g6o9D86574H9o9I9E9l5nay9N917Y267B040B1R1%8_8:8=8@aS8{8}0D8 2=aK7;7A9504970-9a9d92017U7^9b8S9y8U813h6Caz8d5n4YaD8baA5Sa|9ua@awa`0Q6Pa}8#5n4@b19J87bbaJ8ia$4xaUa-3pbm5faYaWa/940}0C0r0Ebp3Pbr4)9Q0}9T0u0E2A0w9#0z2A000E2z9*9,0r0P0p0f1P110!2u99a60.a9ab2aae0f7P0w7/a?au4w9fb96$bc9F3h59bgaF9r5nb_bk8/8{aN0e4ebuaL8l047Q908F0b7Icc8na#8:8x040r201I8O4~8Ccr2|8mc9a%8r0}0Qcx3S0X0V5qcu7T0}7@cC729R9TbSa4bU9^9`9|9~9/000u7,aj0(0r0L8@0rata.7fa^9g5r7ma^bd5C5pb~b36!c/7x3Kblc~9O8{8;040x280L5GckaX8tcL5=8H7%ad8K7-9(cH0^7U0Hdj8Gccdn7U0Ndmb=ca0^cEcGducya:0}0N8_c 9PcNcW0x0G9-1(2Bd50f9(bNan0t0G2da8aaacbN2B0R0x0ua29;9?bB5Zdz0fb@9A6A9Rb`aG5C5Ec^a~d^9t3nc dFd10}d42W5Wd8a/btcee1041#de7)7+dhb:c+dAdldnd2cde6dv8|0}0ndb4~dx5.dqdCdteicDcFewd-8BdCc*9wb?c-b95Vc:bh6m23d`c=6A8f3n9v3P7}eKd:3g8X328TeSe#9Hb2d{6A8-d~d bl8FaN0V7Ee9a/d2e3d6et268}020j0z0de cbe}e5eIepa;eHeXav8cc.9ie%c;b{3g9n8)b 9K0v9ib6d-d/0L69eNfp870v4qeRflfBd}c}e;e0a/bF9S0f0!7*0X1c0u2y2Aa70tdWb*adeh49fueZfw6AayfjeO5+aCfoc_5n6nfGfId aTeb7#eddg9%f!fea/ekeEdcdpg3csdC0pf63^dd8Jeff~ex04ezfadAemgaeq04ese`epevd7gj3Sdrgme8eogkgcdfge8Ng67=0}gig0epglgqdA8}gpgzeBdyeAeF040Ng9gMbnf`8IgC8LgEgT8PgHel0}engugUdDb;eAfv5Ca|f+fz6mb0f/e-3gb5eVb7fgeLbbg`f:5Cbfg~e)0vbje:f@e=ea7Pd+8pd98~gmbwa*98hkbD4~fL9T2+a5cY1e0.2E0L3aad0rb/fUb(dXb+0.2+2zaq1e0Lb/fd7|ff9zf(6#fyh86Ab}hbfEc2h2f$b8e!6=hZg h.fDd@3hh.c|hhbv0}2E0z9-cjbqf_ecgdg%dig=7a0Y7d6`786|751g0z6 if2R2M7#1%2L6}7`0(0*0,0P04.

Question 2.2⚓︎

Avec

tab_classe = [[0,1,'C8'],[1,2,'C4'],[0,2,'C6'],[0,2,'C13'],[1,3,'C10'], [1,4,'C15'],[2,5,'C2'],[4,5,'C11'],[5,6,'C5'],[3,6,'C9'], [0,7,'C1'],[4,7,'C7'],[5,7,'C14'],[6,8,'C3'],[6,8,'C12']]

Compléter le code suivant pour obtenir le planning optimal.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5
.128013oP;f 8lkg5:j,bry2a1Ché3tvw=u6e[(Sàn9]_s-c)7im./4p0d050Z0E0y0s0S0h0N0f0P0h0s0N0N0B010y0S0X010406050N0C0T0T0s0p0q040H0b0h0C0@0b0J050V0~1012140|0X04051k1d1n0V1k0|0Z0S0z0,0.0:0=0.0J0j0C0s0j0E0O0X0q0y0v1b0f0v0S0j0v0h1P0v0y0`050%0o0h0E1w0/0;011O1Q1S1Q0y1Y1!1W0y0p1l1K0,170N0X0s0J0=0r011$1y010e0)0E0J0s0T0E1W1{1}221(251!282a0`0a0f0c0p0b0X0b0N0S1a0J0f0#1_0p0p0E0P2v1d2d0J1l0V1K2I1=1@1?1X0Z2f1z0S0J272s1W1t1v0-1%2S2U0J0b2Y1W0X2B1l2G2I2/0}1|2w2!232(0p110h1W0s1N2B0e0=030M0M0P2)0E1S2%0b0O0r0O0t0`0f0t1d0s2:2?0{2=2e2^1(2`2|2~300E32013436383a2V3d3d3h0r3k3m1}3o2G2R013t0s2}1l2 0v313335370#3D2(3F0x3h0x3J2F3n0|3N3r0=3Q3S053U3W3z3Y3C2T3E3e0W3h0W3+1e3-3p2@1x3s0b2{3R3v3V3x3X3B3!3}3$3e0k3h0k432/3.2?3O3=4d3_3A3Z394j3c3e0D3h0D4p453/483;4a3u3T3w3y4x3|3b3F0R3h0R4G3L4r3q4J3P4L4c4N4e4P3{4i4S3e0g3h0g4X2H4Z472#4$4b3?3^4f3`4h4z4.0O0K3h0K4?3M4s3:4{4M3@4O4g4y3#4B3f0Y0`0t0Y584^4t4%4}5f505h4A3F0t3g045z5p465r4|4v4 4Q4-3~3f205B3I0V3l3,4Y5E5b4u4)4w4,525L0t3(5B3*5Q3K4@5U4#5W5e4*5g4R5#405B425*5S5,4I4`5/4~4+515i5y4m5B4o5{445T5~2_5s5H625w530t4D5B4F694q5-5 6e5X5I5Z643e0t4U5B4W6n4H5a5.6r5:5Y635x6w4:5B4=6B3L1o2-1d2Y2L0Z1@2Q5b4y2X1u1l2,0E2.3n5|1l4y6)2e0S0Z0=352G5y3v6:6=6I6i212j0E6{6h5#1W5{6c3s0`1Y0M2T0y0E0p0z3R1!0N6+0f6p230b0`0B7j7l1(0_040F0F6+7r0=0T0S0`5o6a2H7y017t0n7x767z7B046A2;7L7H0`7J7E6.4_230N5A000u0t007K6D4`7t0L0n7w7V7G7A0`5P7Q7*237I7)4!4`7=04687^7}7`7T7|7X1(7Z0`7#0r7(7:7R7,7.863O7 6m82870=7{8e7_1(7 6N8m3O8p8v5b89047#0x8d8y4#8g7/8F7~7N3j8q837s858N8n017 7@6*8f8Q8J7Y7!0u0W8E8W8r8o0`7-8I8)8O7M0`818/8S8x8@8j7N8l8`5b8_6P7R8A7#0k8(918*7S047-7q8X7u8i5b7 7D8Z8P047U9j8;048V978:999m8~4#930u0D967F9d8-9f4#7 5`9n9t9E8K0`7P9v7+8Y9O8!8a0u0R9A7W8w8,8h8R8{7C9K849l9(8s8L9+8+9*9#8z8#0g9W7G8H9.8T7N5)9I909B988k9{a09X9=9T0K9^9C9!9I7 8M9 9Q9r8S7 9~9R9k9uai3O9x5naa988g9cau0`8.ap9g7N9Ham9/aoa19s7 8?aA8GahaH8Sar7%a49ZazaO9$048}aL9P9:ad7N8uaE9J9;9w8#0t8caS9aaca)9ha:aGa69F7N9qaV8 aNa`4`ar8Da:9Da+9L80a^9{7 9NaZ9)a_7Gar8%b5a=be9,5mbab7239Gbp9Iar95b50L6+0|9#6`016?2?3F5N5ebC6u6J3G0f6 715?4k3G2I3lbA8vbJ0M6@3e5%bI6;bD6|5L3(bN2970b(72bRb#75980i0`0#0e9{0A3h9{0J0e0`0X1A0J2T0ja:0Gb 780s0o36480Ea:0Q0lbz8ibXbZ0O5^b$bP5KbR40b,2acr5!ct74bUclb%bE1}3F66cqb/bQ5j4mcvb.bK53cH5*0fcT7k7R0P5A030f1/0E0s0C2xc(c31}c51BckbBcDbYbF4C6_c;b:5j4DcNcx6v0O6k3JcUcV980Jcbcdc+0Jc-c77Vd49s7n047pdd9_ayca04793rcgbq9kaUb1br7N9ia)7,bydjcWcY0f0s0m0b19c)0f6%7A7d0,0p0w2Uc%c/bWc;cn6ycIcP5L4Uc}cJcs5jdX5*bV8`cmc?0O6LdYb)bR4:d$dZd@cA3oc:6{cn554NbXc`3F55d_d?5je1d2cU7Gd6040Jcd7b7d7f0h7hawdf7oen8Seg0`2ic8dmdocfchdTd-dVd/5nc^c~bLeEe7e46w5lbTd}dUd eD5Ad=eK3f3geJcK5yeScSec7Ree0meq3Odgdi2/deajdwe*6YdD0m1_0J0@270y0f1!2x7dc5dNei7e7g1#dFdH0y0w0f0Ic!cc0Md9dbeAapd.cF6wbH2 e3eYfn6~b-eG6ibHd+cCeQfm3fb#fpc_frfCftcwd%cy5j5$d|d37Gb^040e4ae=5.0`0SfV4`0bb}042TfZ2_0o0`0p1}1Fevdr9oafdyb0e/4t0`eg7ae`ejf67if;99cifjaVfl0J5ycpfEfv5@fIcOe8g9fOd3e$b@fXb{dBd5d7ce1%dqag9eg2eefYg27,dt7;e;gz8,f)1(dg020j0y0de-3nf_5Vgqdpa:gBe%0`e)gE9agUa29-gY0Lcjgo9scX0`cZ0u0b0T1|f-0S0N1M2y0h000v0E0C2Bf02x0w0odI0Zc(0PdPdRc(0SdE0z2Ce~g|g~h02y252wh6dOdQc$c(gX6od~b(cn0tcHgbfKc hxgegcbRhCeNgjhIgPfWdnfffhc69{dg0Udm0s0X0X270Zf:9IeeexgsgTdmgygu0L0Qg59Xg75yd1hzd`fMc|bOhAeHd1e#hJgk9se(gG0=e,i33PfXh.5Eh:6wdXh?ggichDh{6id*cBhucEg86KeFii5#d^h`h@5yd;h~hK4`fR2B0yg 1cg*ergqhOc.7Vd,6P0V6-6Q6(6S6#1d0y6ViU2O2Jcc1!2I6TbA0#0%0)0N04.