Liste d'adjacence, matrice d'adjacence

Un graphe fini peut être représenté par une matrice d'adjacence ou par une liste d'adjacence.

Une matrice d'adjacence est une matrice \(n\) lignes, \(n\) colonnes, si le graphe contient \(n\) sommets. Les sommets sont numérotés de \(0\) à \(n-1\). À l'intersection de la ligne \(i\) et de la colonne \(j\), on écrit un \(1\) si \(j\) est un successeur de \(i\) et un \(0\) sinon.

Une liste d'adjacence est constituée de listes regroupées dans un tableau ou un dictionnaire. Chacune des listes contient les successeurs (ou les prédécesseurs) d'un sommet.

Un exemple de graphe

graphe orienté

La matrice d'adjacence est :

\[ \left( \begin{array}{cccccc} 0 & 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 \\ \end{array} \right) \]

Cette matrice est implémentée par la liste de listes :

[[0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 0, 0], [1, 1, 0, 1, 0, 0], [0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0]]

Liste d'adjacence sous forme de dictionnaire : les clés du dictionnaire sont les numéros des sommets. Pour chaque clé, la valeur associée est la liste des successeurs du sommet représenté par la clé.

{0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2], 4: [5], 5: [4]}

Liste d'adjacence sous forme de liste : les indices de la liste sont les numéros des sommets. Pour chaque indice, la valeur associée est la liste des successeurs du sommet représenté par l'indice.

[[1, 2], [0, 2, 3], [0, 1, 3], [1, 2], [5], [4]]

I) Passage matrice vers dictionnaire

Compléter la fonction matrice_vers_dict qui prend en paramètre une matrice d'adjacence et renvoie une liste d'adjacence sous forme de dictionnaire.

Exemples
🐍 Console Python
>>> m = [[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
>>> matrice_vers_dict(m)
{0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}

###(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 : 10/10

.128013[snaR{cPmy7)f]4O_wu2ql3 j(6}ev8;ébokp/ihSg1t:5=.dr050X0D0S0e0N0w0c0y0h0w0e0c0c0V010S0N0L010406050c0t0j0j0e0Y0k040P0J0w0t0?0J0d0y020e0j0L0G0y0f0D100Y0v0t0D0c050M0}0 11130{0L041r1y051B0M1B1D1y0{0X0N0E0+0-0/0;0O0N0Q0O0w1R0O0S0_050$0I0w0D1M0.0:011Q1S1U1S0S1!1$1Y0S0I0J0X131Z0Y1z0S0O0+160c0L0e0d0;0u011(1O010n0(0D0d1e0D1Y23252a1*2d1$2g0j2i040a0y0i0Y0J0L0J0c0N191b0!210Y0Y0D0h2D1r2k0d1z0M1 2P0S1}1|1~0X2m0;1U0d2f2A1Y1J1L0,1)2Z0N2#0d1_1K1Y0L2I1z2N2P2`0|241b2+2b2:0Y100w0_0R2M2~0`2}2l301*32340_0u38253a2N2Y013f0e35040x3j2O0{3m3d0;3p3r0p3u3l2~3n3A0_0U3D3w3F3y3o0J333q0_0B3K3b2 1N3e3P3g040l3U3x3X3z3Z3R040F3D1A2^1r2)2S0X2W3n0h1_2s0Z1K1z2@0D2_393/3{0!433c3)010K0_0!0n3/3(2,010s0_0y4g3M4a0d0n0_102T0N0h0D0r0E0D0Y0c0r1J2K4n494i0^040A4G3W4i0d4s0e4u4w4M3n4J0m0T3K0y4!4m4h314d3D4$4o4i0J0_0V4*3V4V0_0g0C4Z4#4=3N4c040n3P4;4%3e0_0N524,2b0J4k042.574H310I0_0Y250Q0D4U3N4J4L1s44533z5h042p5n4a5p5y4O4Q4S5m5r3k4|5z0_0m4X4`4#4{5t3o4)5G2O5I4I0_0b5B4(5c5Z1*4J0o5e4N594/5*4?040b5)5T0`5O5O5V2b4~500Y5.3N4P040z5 4a5a550d644O5v5j0d5l5$0;5A5?5`3e5v5x6i5Q6h2|5Q614t0Y4v5F6q585%5X6f5R5#6n6y6g0_0o5L4Y5?065^6N4+5f1*4~0N4f5?6P5+54046t6v6B4J5Y6E6Q3z556$6H6(6x6*6C636)6X6G045=2`6W3n4.040V4:6V6j0;0j0N366-046K2`6M6O7e746C0X796/5s6F6C566@5/6{7l6;6 0W6B610e0L0L2f7i7p5o0_5q6:6^6=790m5N6}4}5i0#0t0Y68736r5S7c1r46423:7!0M3?1r0S3^7)2U2Q1^1`2S0e1#7$3?1x487I2I0j0r0n0e0K4x0O0x0_1j1l1n1p0y7b441E3a1y0q1b7A180y0e0t0/0N0y180(0N0c4A0y1$0*0X0H2d0d2C0N1a0*2f211f0Y0H0O2f2B1a0y0!0*1U0c0S890#8P4v2D2g0N2I0c7v8d1I1K3n1,1T1V1X7`3n2o2f2h0_2u0P0h6u0L0S2v0k1 1a3/417`2{447Z8;7O044e6B5b4m7D4p4r6Z4R6u4w4y4A4C4E0S797G7s7I6s7K8b3k7d4!7g4~2I0S7R7T6|7g4J0g7w6,9h5W7a692b6%9N040K9S6R0_5}9Y6+9W9$01665c9I397N4p6b5k6w9v5/9u5H6r6l2f9t9V0j7j9V7o7H7q5L9)6S6U9J7V6Za19P5!a39@7E6`7k9`7m619Xae6z6`9)6 719)7678ap6_7r3k9/4i5|517Uam9Oaa7m9+5daG6;0d9;6d9?al6;6pah9:0_6ma4ai9_5Uaba0ay014W0m4_6L7Y3|2P953=3 0{7%0#0%0)04.

###(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 : 10/10

.128013[snaR{cPmy7)f]4O_wu2ql3 j(6}ev8;ébokp/ihSg1t:5=.dr050X0D0S0e0N0w0c0y0h0w0e0c0c0V010S0N0L010406050c0t0j0j0e0Y0k040P0J0w0t0?0J0d0y020e0j0L0G0y0f0D100Y0v0t0D0c050M0}0 11130{0L041r1y051B0M1B1D1y0{0X0N0E0+0-0/0;0O0N0Q0O0w1R0O0S0_050$0I0w0D1M0.0:011Q1S1U1S0S1!1$1Y0S0I0J0X131Z0Y1z0S0O0+160c0L0e0d0;0u011(1O010n0(0D0d1e0D1Y23252a1*2d1$2g0j2i040a0y0i0Y0J0L0J0c0N191b0!210Y0Y0D0h2D1r2k0d1z0M1 2P0S1}1|1~0X2m0;1U0d2f2A1Y1J1L0,1)2Z0N2#0d1_1K1Y0L2I1z2N2P2`0|241b2+2b2:0Y100w0_0R2M2~0`2}2l301*32340_0u38253a2N2Y013f0e35040x3j2O0{3m3d0;3p3r0p3u3l2~3n3A0_0U3D3w3F3y3o0J333q0_0B3K3b2 1N3e3P3g040l3U3x3X3z3Z3R040F3D1A2^1r2)2S0X2W3n0h1_2s0Z1K1z2@0D2_393/3{0!433c3)010K0_0!0n3/3(2,010s0_0y4g3M4a0d0n0_102T0N0h0D0r0E0D0Y0c0r1J2K4n494i0^040A4G3W4i0d4s0e4u4w4M3n4J0m0T3K0y4!4m4h314d3D4$4o4i0J0_0V4*3V4V0_0g0C4Z4#4=3N4c040n3P4;4%3e0_0N524,2b0J4k042.574H310I0_0Y250Q0D4U3N4J4L1s44533z5h042p5n4a5p5y4O4Q4S5m5r3k4|5z0_0m4X4`4#4{5t3o4)5G2O5I4I0_0b5B4(5c5Z1*4J0o5e4N594/5*4?040b5)5T0`5O5O5V2b4~500Y5.3N4P040z5 4a5a550d644O5v5j0d5l5$0;5A5?5`3e5v5x6i5Q6h2|5Q614t0Y4v5F6q585%5X6f5R5#6n6y6g0_0o5L4Y5?065^6N4+5f1*4~0N4f5?6P5+54046t6v6B4J5Y6E6Q3z556$6H6(6x6*6C636)6X6G045=2`6W3n4.040V4:6V6j0;0j0N366-046K2`6M6O7e746C0X796/5s6F6C566@5/6{7l6;6 0W6B610e0L0L2f7i7p5o0_5q6:6^6=790m5N6}4}5i0#0t0Y68736r5S7c1r46423:7!0M3?1r0S3^7)2U2Q1^1`2S0e1#7$3?1x487I2I0j0r0n0e0K4x0O0x0_1j1l1n1p0y7b441E3a1y0q1b7A180y0e0t0/0N0y180(0N0c4A0y1$0*0X0H2d0d2C0N1a0*2f211f0Y0H0O2f2B1a0y0!0*1U0c0S890#8P4v2D2g0N2I0c7v8d1I1K3n1,1T1V1X7`3n2o2f2h0_2u0P0h6u0L0S2v0k1 1a3/417`2{447Z8;7O044e6B5b4m7D4p4r6Z4R6u4w4y4A4C4E0S797G7s7I6s7K8b3k7d4!7g4~2I0S7R7T6|7g4J0g7w6,9h5W7a692b6%9N040K9S6R0_5}9Y6+9W9$01665c9I397N4p6b5k6w9v5/9u5H6r6l2f9t9V0j7j9V7o7H7q5L9)6S6U9J7V6Za19P5!a39@7E6`7k9`7m619Xae6z6`9)6 719)7678ap6_7r3k9/4i5|517Uam9Oaa7m9+5daG6;0d9;6d9?al6;6pah9:0_6ma4ai9_5Uaba0ay014W0m4_6L7Y3|2P953=3 0{7%0#0%0)04.
II) Passage matrice vers liste

En s'inspirant de la question précédente, compléter la fonction matrice_vers_liste qui prend en paramètre une matrice d'adjacence et renvoie une liste d'adjacence sous forme de liste.

Exemples
🐍 Console Python
>>> m = [[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
>>> matrice_vers_liste(m)
[[1, 2], [0, 2, 3], [0, 1, 3], [1, 2]]

###(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 : 10/10

.128013[snaRcPmy7)f]4O_wu2ql3 j(6ev8;ébokp/ihSg1t:5=.dr050V0B0Q0e0L0v0c0x0g0v0e0c0c0T010Q0L0J010406050c0s0i0i0e0W0j040N0H0v0s0;0H0d0x020e0i0J0E0x0f0B0~0W0u0s0B0c050K0{0}0 110_0J041p1w051z0K1z1B1w0_0V0L0C0)0+0-0/0M0L0O0M0v1P0M0Q0@050!0G0v0B1K0,0.011O1Q1S1Q0Q1Y1!1W0Q0G0H0V111X0W1x0Q0M0)140c0J0e0d0/0t011$1M010m0$0B0d1c0B1W2123281(2b1!2e0i2g040a0x0h0W0H0J0H0c0L17190Y1 0W0W0B0g2B1p2i0d1x0K1}2N0Q1{1`1|0V2k0/1S0d2d2y1W1H1J0*1%2X0L2Z0d1@1I1W0J2G1x2L2N2^0`22192)292.0W0~0v0@0P2K2|0^2{2j2~1(30320@0t3623382L2W013d0e33040w3h2M0_3k3b0/3n3p0o3s3j2|3l3y0@0S3B3u3D3w3m0H313o0@0A3I392}1L3c3N3e040k3S3v3V3x3X3P040D3B1y2?1p2%2Q0V2U3l0g1@2q0X1I1x2=0B2@373-3_0Y413a3%010I0@0Y0m3-3$2*010r0@0x4e3K480d0m0@0~2R0L0g0B0q0C0B0W0c0q1S0c0Q0B4l474g0?040z4G3U4g0d4q0e4s4u4M3l4J0l0R3I0x4!4k4f2 0@4C4E3B4$4m4g0H0@0T4,3T4V0@0b0n4Z4#4@3L4a040m3N4?4%3c0@0L544.290H4i042,594H2 0G0@0W230O4F1q42550/4J4L5p3i4~4n5j042n4U3L5t5C4n4Q4S5o2`5r014W4X4|4#4}5L4P5A0L4D5J5q5a1(4:040U5F4O0@0e0J0J2d0V5(295t4`0l5P5Q4-5h1(50520W5g4N4(040y603l5c570d653L0d5z5l0d5n5:1(5E5v2M5x4O5z5B6k46616i0@5u5K5Z3x5H0W4t5X5w5L4J0b6h6y5e6H5M0@0n0l5O6q065_6S5`6s0/500L4d6q6U3E6z6B6K6F6K5T586q6m5;6M6G6.5S0@646?6x6L044{6!6/5!4;4=6 5L0i0L346)0@4Y6Q6T7d6#6b4)5V4+6`5{5s4_6+57796}6K5#5%7k6V3m5*5,5.7q6v5Y7l7x637q5@7c5R6{502G0Q0s0W69746{5T4*6C3t1p44403.7!0K3;1p0Q3?7)2S2O1?1^2Q0e1Z7$3;1v6r3l2G0i0q0m0e0I4v0M0w0@1h1j1l1n0x7b2`1C381w0p195-160x0e0s0-0L0x160$5V4y0x1!0(0V0F2b0d2A0L180(2d1 1d0W0F0M2d2z180x0Y0(7V0c7u1F3|2(481*1R1T1V7`3L2m2d2f0@2s0N0g6A0J0Q2t0j1}183-3 6r2_427Z8$48504c6K5d4k7v3E4p044r6A4u4w4y4A7V7B7o997H8b376R7K7E7M0Z7P7R2^7f486F6=6w7E5T0I6a900@5~9D5)049C7S7E675e9t379v6n5k5m7W8 4I6u6+6o2d9h967g9j9%9w7n9*9I6-9z7w4J6N7I9u706W576Z9^6@9)9:4^049y7D7w6,7q0na36D7T0@9Ka05D6M9H5b72ah1(76789-6:7r9L7w5}53ar6$6Jav3L9N5fay5y9T6f9V9_6|7Caa9A9!9PaK9;9Yao569 a4a16O6~2^0_0K8~7#2N7^3:0Z0#0%04.
III) Passage dictionnaire vers matrice

Compléter la fonction dict_vers_matrice qui prend en paramètre une liste d'adjacence sous forme de dictionnaire et renvoie la matrice d'adjacence.

Exemples
🐍 Console Python
>>> dico = {0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}
>>> dict_vers_matrice(dico)
[[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
Aide

La deuxième ligne du corps de la fonction, matrice = ..., sert à initialiser une matrice remplie de 0.

###(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 : 10/10

.128013[snacPmy7)f]4_wu2l3 (6ev0*bokp/ihSg1t:5=dr050P0x0L0e0G0s0c0u0f0s0e0c0c0O010L0G0E010406050c0q0h0h0e0Q0i040I0C0s0q0+0C0d050F0=0@0_0{0:0E04141b051e0F1e1g1b0:0P0G0y0Z0#0%0)0H0G0J0H0s1u0H0L0.050U0B0s0x1p0$0(011t1v1x1v0L1D1F1B0L0B0C0P0{1C0Q1c0L0H0Z0~0c0E0e0d0)0r011H1r010l0W0x0d0e0h0x1B1)1+1:1J1?1F1_1{0.0a0u0g0Q0C0E0C0c0G110d0u0S1%0Q0Q0x0f2g141~0d1c0F1#2t0L1Z1Y1!0P200)1x0d1^2d1B1m1o0!1I2D0G2F0d1V1n1B0E2m1c2r2t2X0;1*2h2L1;2Q0Q0^0s0.0K2q2#0/2!1 2%1J2)2+0.0r2/1+2;2r2C012_0e2,040t2}2s0:302@0)33350n382 2#313e0.0N3h3a3j3c320C2*340.0w3o2=2$1q2^3t2`040j3h1d2V142J2w0P2A310f1V1|1c3L1f3J2Z152:053Q0S2W3q3B0)0D0.0S0l3H3b3)010p0.0u3/3(2M320l3,0G2o0o0y0x0Q0c0o0^2x3 0x3_2?3;0-040v4b3A3{0d3~2o0G121_0G2m4h314e0k0M3o0u4y3^3:4j0.133Y2~4A3`1;0C0.0O3h4H4c4j0B0.234s3r4e4g4F2s3z3k4l2g4p4r4Y3%4P1;4u4x4z4!3r4k04470Q494N4;3;4K044M4*4O4i4-0.0b4U3;4?4E2X52314~0A4{4B5404564*4|3{0h0G0.0z573{4e0m5g4I1J3+040l3t5w4,2^0.0G5D531J0C3?042O5I3k4R040Q1+0J4a5l5h1J4W5s2(4D5#5Z0.0k5v4*064z5c3r5z5B0Q5P4=0.0c0C0@0T5^4}5M5O515m5$041m4m4o0V4)2Z5Y0)4e4w5-5/5/645y0.5?5 4C040=0f0f0x0%0x0q5@636d015L5G5a2:5:584$4n0d4(5W6c5x6e555(3d5`5|1{0L6R015u6g2X5.6i6%6k6S4@0e486t6X4e5k6N5E6*5{5}6W5X6O6Y0.0m6;3Z6A4?6r6t6v6x6/6~6o4J4L7a1J5o2-4/4y6)015z2m0L6x6E4G7j4?4^4`5-143#0x2t2U7y3K1n3M2w2y2u1U1W2w0e1E7B0F3L0:7O0T0V0X04.
IV) Passage liste vers matrice

En s'inspirant de la question précédente, compléter la fonction liste_vers_matrice qui prend en paramètre une liste d'adjacence sous forme de liste et renvoie la matrice d'adjacence.

Exemples
🐍 Console Python
>>> liste = [[1, 2], [0, 2, 3], [0, 1, 3], [1, 2]]
>>> liste_vers_matrice(liste)
[[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]

###(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 : 10/10

.128013sn{c)wuqAl3 (}è;ébokÀp/h1t[,aRPmy7G]f4O_2D6ev*x+dCiBSg:5=.0r050X0S0A0D0Z0k0b0m0e0k0D0b0b0)010A0Z0w010406050b0h0G0G0D0,0H040#0t0k0h100t0c0m020D0G0w0q0m0E0S1a0,0i0h0S0b050x17191b1d150w041B1I051L0x1L1N1I150X0Z0T0^0`0|0~0y0Z0$0y0k1#0y0A13050:0s0k0S1W0{0}011!1$1(1$0A1.1:1,0A0s0t0X1d1-0,1J0A0y0^1g0b0w0D0c0~0P011=1Y010L0=0S0c1o0S1,2d2f2k1@2n1:2q0G2s040a0m0F0,0t0w0t0b0Z1j1l0.2b0,0,0S0e2N1B2u0c1J0x292Z0A2726280X2w0~1(0c2p2K1,1T1V0_1?2-0Z2/0c231U1,0w2S1J2X2Z34162e1l2^2l2}0,1a0k130z2W3814372v3a1@3c3e130P3i2f3k2X2,013p0D3f040l3t2Y153w3n0~3z3B0M3E3v383x3K130(3N3G3P3I3y0t3d3A130R3U3l391X3o3Z3q040I3N1K321B2?2$0X2*3x0e232C0-1U1J310S333j3;3}0.453m3+0~0u130.0L3;3H4c010g130m4i3W4k0c0L131(0b0A0S0O0T0S0,0b0O1a2%0Z0e0S4p4b2_0112040n4K3*4M0c4u0Z4w4J1C464j4M4O0f0%3U0m4+4o4#3b130c3N4-4q4M0t130)4=3)3Q0s4u2p4R3x4O4Q4Z3u4}3X4U044v4x523X4%4*4,584r134F0,4H4Y344?4L2l4_044{562Y5r4S2l4O0B5e5k044;5x045z3x5u0U4|4.1@5C5E4M0G0Z130+5S5B130K5O4@2l4e040L3Z5$5s3o130Z5-5A1@0t4m042{5=4~130,2f0$5p4!5%5Q1355365P3J4:5Y65040f5#5I064,5K3X5)5+0,5|59130b0t190/6p4k5^5:5H5q5j4T4 045 0c616c0~546J3y6b5I6C5Z6e4)6h6j6j6Q1@6m5,5I6k5F170e4I0|0S0h6o6#6X0~6y5`6A3j6$4T4V4X6M5R6P696N046s6u0A6}5!6T346i6V7b6:715m5o76045D6 646a726t2B757k5.6K5!7j687l716(6*0b6,6.7w7s4N5!6w4^4`7I2l5U3g5h4+7d5)2S0A6-6@3u6_4/047f4I3(0x48443=7*0x3^1B0A3`7/2(2!22242$0D1/7,3^1H4a5?0~2S0G0O0L0D0u4y0y0l131t1v1x1z0m78461O3k1I0Q2f0@1:0^0{0m0X000h1l0$5 0w0y1;2S310r7B0c0A0r0m2e0,0m8w8t4H2N2q0Z2S8t1k0A0m1:0@737p0@2/0m6s8H8K8s0c180r2H8I0b0C0m1k2b6u0c4I8,8M8.0G8:0t4x8M8Z8)7o0/0@0D0T2f8X2P2J0h0T0t8T8N104v4B8Y8g5+8|2N0@2P0k000S0V4B0e5o0*1K8l040F1b0m9y1u0w1:6T1R402@4k1_1%1)1+803x2y2p2r132E0#0e5n0w8X0F0H291k3;438035467)9X6q040J7L5@7K6/704O0d6M0b2i04010j019~7t048i7X7d6~7E8101a613010!ab7rak4O0Cacala7010Qaqaj535!aua17xama8apav4Oaf5yah137v637FaHa9aAaRas13aE6B70aT0YaV57a2aYavaTaz7h0KaZ6^7da$a(aNa*aeaKaPa5axaJaraC04a:a,axa.aF7FaLa|7ia~anaa7ha;aga#a a^9`4k4O0K0o3U3V7F5)4g6M5_4ob1594t5G184B9362a)7x6Lbz5F0$7h4(7P7Y5/bC2B2H1Ab8ak5u5wa!bI130dbq6U5i705a7Wa_7xbYav7N045Xb)7Q706Z7Da=b+6r987qb!7F6=5{bW3Q13bMbK4$13aM147bb_7xb,bDbU7haQbH7F5a8#6vca6R6gc2bXa0cvc75GbP6Wb~cAc63Xb:cF5Fb-5J7d5u0Wb;5V043hb^bQ4d5~0/7VavcibT2K7%9_7+2Z7~1M040N1l0t0s102p8X8q1T2U0Z1k8S8U059_0daU0%0m0+8@ao01d30zd6a%d30Pd6azd30lb(c(8k7 0v8~108M0X0h8Pc`c|0;8U0.8%8/bU8t1;cq0A8?4o9_90bEbV9_8@8_0,0r0e0h0w0p8U962}0G9u8gdE9a4A0e8hby9P2?3x9T1{1*303?366Pc(cDd#avcHcy5fb$6M5a9c1:6-7hcdcU710_bGb.bt136nbb67aWcze9bgcZ13e27CbNd{5_c5d}cJcjc$cs9 049Dex7m2M1ubVaBd~4P0fb(791Bdk9=3@41157-0/0;0?04.