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

.1280132mhS)cleP=O3tf.nqp_:aRvgby;s56ojr 1(]k}8[{é4iwu7d/050X0i0n0v0T0h0C0I0g0h0v0C0C0k010n0T0s010406050C0V0c0c0v0H0A040e0F0h0V0?0F0q0I020v0c0s0B0I0w0i100H0r0V0i0C050Y0}0 11130{0s04051y1r1B0Y1y0{0X0T0x0+0-0/0;0d0T0y0d0h1P0d0n0_050$0z0h0i1K0.0:011O1Q1S1Q0n1Y1!1W0n0H1z0n0d0+160C0s0v0q0;0b011$1M010o0(0i0q1e0i1W1|1~231(261!290c2b040a0I0j0H0F0s0F0C0T191b0!1`0H0H0i0g2w1r2d0q1z0Y1^2I1=1@1?1X0X2f0;1S0q282t1W1H1J0,1%2S0T2U0q0F2Y1W0s2B1z2G2I2:0|1}1b2!242)0H100h0_0J2F2@0`2?2e2_1(2{2}0_0b311~332G2R01380v2~040m3c2H0{3f360;3i3k0S3n3e2@3g3t0_0D3w3p3y3r3h0F2|3j0_0E3D342^1L373I39040W3N3q3Q3s3S3K040O3w1C2.1r2Y2L0X1@2Q3G0g2*2l0Z1I1z2-0i2/323(3=0!3}353Y010M0_0!0o3(3X2#010U0_0I4a3F440q0o0_101=0T0g0i0t0x0i0H0C0t1H2D4h434c0^040K4A3P4c0q4m0v4o4q4G3g4D0f0u3D0I4U4g4b2`473w4W4i4c0F0_0k4!3O4P0_0Q0N4T4V4,3G46040o3I4+4X370_0T4|4$240F4e042%514B2`0z0_0H1~0y0i4O3G4D4F1s3~4}3s5b042i5h445j5s4I4K4M5g5l3d4?5t0_0f4R4;4V4=5n3h4Z5A2H5C4C0_0P5v4Y565T1(4D0L584H534)5!4-040P5Z5N0`5I5I5P244^4`0H5(3G4J040G5_44544 0q5~4I5p5d0q5f5W0;5u5-5;375p5r6c5K6b2=5K5{4n0H4p5z6k525X5R695L5V6h6s6a0_0L5F4S5-065/6H4#591(4^0T495-6J5#4~046n6p6v4D5S6y6K3s4 6W6B6Y6r6!6w5}6Z6R6A045,2:6Q3g4(040k4*6P6d0;0c0T2 6%046E2:6G6I786~6w0X736)5m6z6w506.5)6=7f6+6_0p6v5{0v0s0s287c7j5i0_5k6*6/6,730f5H6@4@5c0#0V0H626}6l5M761r403|3)7U0Y3,1r0n3.7Z2O2J0v1Z7W3,1x427C2B0c0t0o0v0M4r0d0m0_1j1l1n1p0I753~1E331y0l1b7u180I0v0V0/0T0I180(0T0C4u0I1!0*0X0R260q2v0T1a0*281`1f0H0R0d282u1a0I0!0*1S0C0n800#8G4p2w290T2B0C7p841G1I3g1*1R1T1V7.3g2h282a0_2n0e0g6o0s0n2o0A1^1a3(3{7.2;3~7T8(7I04486v554g7x4j4l6T4L6o4q4s4u4w4y0n737A7m7C6m7E823d774U7a4^2B0n7L7N6?7a4D0Q7q6$985Q7463246X9E040M9J6L0_5@9P6#9N9T0160569z327H4j655e6q9m5)9l5B6l6f289k9M0c7d9M7i7B7k5F9W6M6O9A7P6T9^9G5U9`9+7y6;7e9.7g5{9Oa56t6;9W6_6{9W7072ag6:7l3d9$4c5?4{7Oad9Fa17g9Y57ax6+0q9(679*ac6+6ja89%0_6g9{a99-5Oa29@ap014Q0f4:6F7S3?2I8|3+3_0{7X0#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

.1280132mhS)cleP=O3tf.nqp_:aRvgby;s56ojr 1(]k}8[{é4iwu7d/050X0i0n0v0T0h0C0I0g0h0v0C0C0k010n0T0s010406050C0V0c0c0v0H0A040e0F0h0V0?0F0q0I020v0c0s0B0I0w0i100H0r0V0i0C050Y0}0 11130{0s04051y1r1B0Y1y0{0X0T0x0+0-0/0;0d0T0y0d0h1P0d0n0_050$0z0h0i1K0.0:011O1Q1S1Q0n1Y1!1W0n0H1z0n0d0+160C0s0v0q0;0b011$1M010o0(0i0q1e0i1W1|1~231(261!290c2b040a0I0j0H0F0s0F0C0T191b0!1`0H0H0i0g2w1r2d0q1z0Y1^2I1=1@1?1X0X2f0;1S0q282t1W1H1J0,1%2S0T2U0q0F2Y1W0s2B1z2G2I2:0|1}1b2!242)0H100h0_0J2F2@0`2?2e2_1(2{2}0_0b311~332G2R01380v2~040m3c2H0{3f360;3i3k0S3n3e2@3g3t0_0D3w3p3y3r3h0F2|3j0_0E3D342^1L373I39040W3N3q3Q3s3S3K040O3w1C2.1r2Y2L0X1@2Q3G0g2*2l0Z1I1z2-0i2/323(3=0!3}353Y010M0_0!0o3(3X2#010U0_0I4a3F440q0o0_101=0T0g0i0t0x0i0H0C0t1H2D4h434c0^040K4A3P4c0q4m0v4o4q4G3g4D0f0u3D0I4U4g4b2`473w4W4i4c0F0_0k4!3O4P0_0Q0N4T4V4,3G46040o3I4+4X370_0T4|4$240F4e042%514B2`0z0_0H1~0y0i4O3G4D4F1s3~4}3s5b042i5h445j5s4I4K4M5g5l3d4?5t0_0f4R4;4V4=5n3h4Z5A2H5C4C0_0P5v4Y565T1(4D0L584H534)5!4-040P5Z5N0`5I5I5P244^4`0H5(3G4J040G5_44544 0q5~4I5p5d0q5f5W0;5u5-5;375p5r6c5K6b2=5K5{4n0H4p5z6k525X5R695L5V6h6s6a0_0L5F4S5-065/6H4#591(4^0T495-6J5#4~046n6p6v4D5S6y6K3s4 6W6B6Y6r6!6w5}6Z6R6A045,2:6Q3g4(040k4*6P6d0;0c0T2 6%046E2:6G6I786~6w0X736)5m6z6w506.5)6=7f6+6_0p6v5{0v0s0s287c7j5i0_5k6*6/6,730f5H6@4@5c0#0V0H626}6l5M761r403|3)7U0Y3,1r0n3.7Z2O2J0v1Z7W3,1x427C2B0c0t0o0v0M4r0d0m0_1j1l1n1p0I753~1E331y0l1b7u180I0v0V0/0T0I180(0T0C4u0I1!0*0X0R260q2v0T1a0*281`1f0H0R0d282u1a0I0!0*1S0C0n800#8G4p2w290T2B0C7p841G1I3g1*1R1T1V7.3g2h282a0_2n0e0g6o0s0n2o0A1^1a3(3{7.2;3~7T8(7I04486v554g7x4j4l6T4L6o4q4s4u4w4y0n737A7m7C6m7E823d774U7a4^2B0n7L7N6?7a4D0Q7q6$985Q7463246X9E040M9J6L0_5@9P6#9N9T0160569z327H4j655e6q9m5)9l5B6l6f289k9M0c7d9M7i7B7k5F9W6M6O9A7P6T9^9G5U9`9+7y6;7e9.7g5{9Oa56t6;9W6_6{9W7072ag6:7l3d9$4c5?4{7Oad9Fa17g9Y57ax6+0q9(679*ac6+6ja89%0_6g9{a99-5Oa29@ap014Q0f4:6F7S3?2I8|3+3_0{7X0#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

.1280132mhS)cleP=O3tf.nqp_:aRvgby;s56ojr 1(]k8[é4iwu7d/050V0i0n0v0R0h0C0I0g0h0v0C0C0k010n0R0s010406050C0T0c0c0v0H0A040e0F0h0T0;0F0q0I020v0c0s0B0I0w0i0~0H0r0T0i0C050W0{0}0 110_0s04051w1p1z0W1w0_0V0R0x0)0+0-0/0d0R0y0d0h1N0d0n0@050!0z0h0i1I0,0.011M1O1Q1O0n1W1Y1U0n0H1x0n0d0)140C0s0v0q0/0b011!1K010o0$0i0q1c0i1U1`1|211$241Y270c29040a0I0j0H0F0s0F0C0R17190Y1^0H0H0i0g2u1p2b0q1x0W1?2G1:1=1;1V0V2d0/1Q0q262r1U1F1H0*1#2Q0R2S0q0F2W1U0s2z1x2E2G2.0`1{192Y222%0H0~0h0@0J2D2=0^2;2c2@1$2_2{0@0b2 1|312E2P01360v2|040m3a2F0_3d340/3g3i0Q3l3c2=3e3r0@0D3u3n3w3p3f0F2`3h0@0E3B322?1J353G37040U3L3o3O3q3Q3I040N3u1A2,1p2W2J0V1=2O3E0g2(2j0X1G1x2+0i2-303$3:0Y3{333W010M0@0Y0o3$3V2Z010S0@0I483D420q0o0@0~1:0R0g0i0t0x0i0H0C0t1Q0C0n0i4f414a0?040K4A3N4a0q4k0v4m4o4G3e4D0f0u3B0I4U4e492^0@4w4y3u4W4g4a0F0@0k4$3M4P0@0O0L4T4V4.3E44040o3G4-4X350@0R4~4(220F4c042#534B2^0z0@0H1|0y4z1q3|4 0/4D4F5j3b4^4h5d042g4O3E5n5w4h4K4M5i2:5l014Q4R4?4V4@5F4J5u0R4x5D5k541$4*040p5z4I0@0v0s0s260V5Y225n4;0f5J5K4%5b1$4`4|0H5a4H4Y040G5`3e56510q5 3E0q5t5f0q5h5*1$5y5p2F5r4I5t5v6e405{6c0@5o5E5T3q5B0H4n5R5q5F4D0O6b6s586B5G0@0L0f5I6k065:6M5;6m0/4`0R476k6O3x6t6v6E6z6E5N526k6g5+6G6A6(5M0@5~6-6r6F044=6U6)5U4+4,6_5F0c0R2}6Z0@4S6K6N776V654Z5P4#6;5=5m4:6#51736@6E5V5X7e6P3f5!5$5(7k6p5S7f7r5}7k5.765L6=4`2z0n0T0H636~6=5N4!6w3m1p3~3`3%7U0W3*1p0n3,7Z2M2H0v1X7W3*1v6l3e2z0c0t0o0v0M4p0d0m0@1h1j1l1n0I752:1C311w0l195%160I0v0T0-0R0I160$5P4s0I1Y0(0V0P240q2t0R180(261^1d0H0P0d262s180I0Y0(7P0C7o1D3?2X421(1P1R1T7.3E2f26280@2l0e0g6u0s0n2m0A1?183$3_6l2/3|7T8T424`466E574e7p3x4j044l6u4o4q4s4u7P7v7i907B82306L7E7y7G0Z7J7L2.79426z6,6q7y5N0M648@0@5^9u5Z049t7M7y61589k309m6h5e5g7Q8?4C6o6#6i26988}7a9a9U9n7h9X9z6%9q7q4D6H7C9l6`6Q516T9,6.9W9%4/049p7x7q6$7k0L9`6x7N0@9B9@5x6G9y556|a81$70729!6*7l9C7q5@4}ai6W6Dam3E9E59ap5s9K699M9-6?7wa19r9R9GaB9(9Paf509?9{9^6I6^2.0_0W8=7V2G7,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

.1280132mhS)cleP=3tfnp_:avgbys560or 1(]k[*4iwu7d/050P0i0m0s0L0h0x0D0g0h0s0x0x0k010m0L0p010406050x0N0c0c0s0C0w040e0B0h0N0+0B0o050Q0=0@0_0{0:0p04051b141e0Q1b0:0P0L0t0Z0#0%0)0d0L0u0d0h1s0d0m0.050U0v0h0i1n0$0(011r1t1v1t0m1B1D1z0m0C1c0m0d0Z0~0x0p0s0o0)0b011F1p010n0W0i0o0s0c0i1z1Y1!1)1H1,1D1/1;0.0a0D0j0C0B0p0B0x0L110o0D0S1W0C0C0i0g29141@0o1c0Q1U2m1R1T1S1A0P1_0)1v0o1.261z1k1m0!1G2w0L2y0o0B2C1z0p2f1c2k2m2Q0;1Z2a2E1*2J0C0^0h0.0E2j2U0/2T1^2W1H2Y2!0.0b2(1!2*2k2v012/0s2#040l2?2l0:2_2-0)2|2~0K312^2U2`370.0y3a333c352{0B2Z2}0.0z3h2+2V1o2.3m2:040O3a1f2O142C2p0P1T2u3k0g2K1=1c3E1d3C2S152)053K0S2P3j3u0)0H0.0S0n3A343Z010M0.0D3)3Y2F2{0n3$0L2h0q0t0i0C0x0q0^1R3_0i3:2,3+0-040F453t3=0o3^2h0L121/0L2f4b2`480f0r3h0D4s3/3*4d0.133S2@4u3;1*0B0.0k3a4B464d0v0.1|4m3k484a4z2l3s3d4f294j4l4S3X4J1*4o4r4t4U3k4e04410C434H4+3+4E044G4!4I4c4%0.0I4O3+4-4y2Q4|2`4^0J4=4v4~04504!4?3=0c0L0.0A513=480G5a4C1H3#040n3m5q4$2.0.0L5x4}1H0B3-042H5C3d4L040C1!0u445f5b1H4Q5m2X4x5V5T0.0f5p4!064t563k5t5v0C5J4,0.0x0B0@0T5/4@5G5I4{5g5W041k4g4i0V4Z2S5S0)484q5%5)5)5~5s0.5-5_4w040=0g0g0i0%0i0N5.5}67015F5A542)5*524W4h0o4Y5Q665r684 5Y365;5?1;0m6L015o6a2Q5(6c6X6e6M4.0s426n6R485e6H5y6!5=5@6Q5R6I6S0.0G6+3T6u4-6l6n6p6r6)6^6i4D4F741H5i2$4)4s6Z015t2f0m6r6y4A7d4-4/4;5%143V0i2m2N7s3D1l3F2p2s2n0s1C7v0Q3E0:7F0T0V0X04.
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

.1280132h)=3nqèAp:agysD0oBr k}*éwu7dmSclPOGtCf.,_ÀRvb;561(]+[{4iex/050D0*0L0m0)0H0p0v0G0H0m0p0p0e010L0)0k010406050p0B0E0E0m0u0o040F0s0H0B100s0g0v020m0E0k0V0v0S0*1a0u0h0B0*0p050,17191b1d150k04051I1B1L0,1I150D0)0T0^0`0|0~0c0)0n0c0H1Z0c0L13050:0U0H0*1U0{0}011Y1!1$1!0L1,1.1*0L0u1J0L0c0^1g0p0k0m0g0~0b011:1W010N0=0*0g1o0*1*26282d1=2g1.2j0E2l040a0v0I0u0s0k0s0p0)1j1l0.240u0u0*0G2G1B2n0g1J0,222S1 21201+0D2p0~1$0g2i2D1*1R1T0_1;2$0)2(0g0s2,1*0k2L1J2Q2S2}16271l2.2e2?0u1a0H130Y2P3114302o331=3537130b3b283d2Q2#013i0m38040f3m2R153p3g0~3s3u0(3x3o313q3D130W3G3z3I3B3r0s363t130X3N3e321V3h3S3j040C3G1M2{1B2,2V0D212!3Q0G2@2v0-1S1J2`0*2|3c3*3@0.3 3f3!0~0w130.0N3*3A46010A130v4c3P4e0g0N131$0p0L0*0Q0T0*0u0p0Q1a1 0)0G0*4j452/0112040Z4E3Z4G0g4o0)4q4D1C404d4G4I0d0l3N0v4#4i4V34130g3G4%4k4G0s130e4,3Y3J0U4o2i4L3q4I4K4T3n4@3Q4O044p4r4|3Q4X4!4$524l134z0u4B4S2}4-4F2e4:044=502R5l4M2e4I0$585e044+5r045t3q5o0y4?4(1=5w5y4G0E0)130r5M5v130!5I4.2e48040N3S5W5m3h130)5%5u1=0s4g042;5,4^130u280n5j4U5X5K134 2 5J3C4*5S5 040d5V5C064$5E3Q5Z5#0u5?53130p0s190/6j4e5/5*5B5k5d4N4_045_0g5{660~4~6D3r655C6w5T684Z6b6d6d6K1=6g5$5C6e5z170G4C0|0*0B6i6V6R0~6s5;6u3c6W4N4P4R6G5L6J636H046m6o0L6@5U6N2}6c6P756*6{5g5i70045x6_5~646|6n2u6 7e5(6E5U7d627f6{6Y6!0p6$6(7q7m4H5U6q4/4;7C2e5O395b4#775Z2L0L6%6.3n6:4)04794C3X0,423~3+7!0,3.1B0L3:7)2Y2T0m1-7$3.1H445-0~2L0E0Q0N0m0w4s0c0f131t1v1x1z0v72401O3d1I0q280@1.0^0{0v0D000B1l0n5_0k0c1/2L2`0z7v0g0L0z0v270u0v8n8k4B2G2j0)2L8k1k0L0v1.0@6}7j0@2(0v6m8y8B8j0g180z2A8z0p0P0v1k246o0g4C8Z8D8#0E8%0s4r8D8Q8W7i0/0@0m0T288O2I2C0B0T0s8K8E104p4v8P875#8:2G0@2I0H000*0+4v0G5i0O1M8c040I1b0v9p1u0k1.6N1P3`2-4e1@1#1%1)7@3q2r2i2k132x0F0G5h0k8O0I0o221k3*3}7@2~407Z9O6k040K7F5.7E6)6`4I0%6G0p2b04021x8`0V0ja00Ba29=7n04897R776^7y7^019}13a5a20tak0L0V7b0Pa8ah9~an0V0qav7b0!ar9^7rai9 a1aoamaGapaC7z4Iab5sad137p5}7zaEava4aJaqasaVaJ0May7lag4IaB6v6`a#a6aoaxaYa)4}5Ua,6/77a/a2a%a?a-7raNasaeaTaga}aHa(afa^04aAa!auaJa=a:aKb1aM13aO5DaQ7c9|bgbjaXbjaZaLb7btalbab6bc0!0x3N3O7z5Z4a6G5:4ia@534n5A184v8`5|519_606G540n7b4Y7J7S5)bS2u2A1Aby5F9@bla*130%bG6O5c6`547QaP6`5o5qb?3q7H045Rb{7K6`6T7xa{b}6l8 7kc43Q6,5=b:9/b$bP4eb3c96P77b~bTb.7baSbX7r548S6pcq4W7Bcn6rb=cecC6I7375cacN5Aasc2asb~cU130#asc63act7L5^0/7PcW4*cx2D7X9-7#2S7=1K040J1l0s0U102i8O8h1R2N0)1k8J8L059-0%010j010l0v0r8+010tde0v0Ydi0Mdl0bdi0qdl0fb`c=8b7?0R8=108D0D0B8Gd4d60;8L0.8U8$b.8k1/cE0L8*4i9-8@bUb/9-8+8-0u0z0G0B0k0i8L8}2?0E9l87dR914u0G88bO9G2,3q9K1_1(2_3,2 6Jc=cf7h6~b/cjcK5pb4b^b!13931.6%7bbob*7g0_bWc07rcced4Jef04eobxea6;04eh7wb%cU5:cmez7TdWcycG5n139ueMb+2F1ue9bD59600db`731Bdx9)3-3{157%0/0;0?04.