From f07da80edb92dfe27daacee926fb05c372d0892e Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 08:33:02 -0500 Subject: [PATCH 01/46] Fix andes interface when empty model occurs --- ams/interop/andes.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ams/interop/andes.py b/ams/interop/andes.py index f1af05c9..778b18bb 100644 --- a/ams/interop/andes.py +++ b/ams/interop/andes.py @@ -96,9 +96,9 @@ def to_andes(system, setup=False, addfile=None, -------- >>> import ams >>> import andes - >>> sp = ams.load(ams.get_case('ieee14/ieee14_rted.xlsx'), setup=True) + >>> sp = ams.load(ams.get_case('ieee14/ieee14_uced.xlsx'), setup=True) >>> sa = sp.to_andes(setup=False, - ... addfile=andes.get_case('ieee14/ieee14_wt3.xlsx'), + ... addfile=andes.get_case('ieee14/ieee14_full.xlsx'), ... overwrite=True, no_output=True) Notes @@ -279,9 +279,10 @@ def parse_addfile(adsys, amsys, addfile): # add dynamic models for name, df in df_models.items(): # drop rows that all nan + df.replace(['', ' '], np.NaN, inplace=True) # replace empty string with nan df.dropna(axis=0, how='all', inplace=True) # if the dynamic model also exists in AMS, use AMS parameters for overlap - if name in amsys.models.keys(): + if (name in amsys.models.keys()) and amsys.models[name].n > 0: if df.shape[0] != amsys.models[name].n: msg = f'<{name}> has different number of rows in addfile.' logger.warning(msg) @@ -903,7 +904,6 @@ def make_link_table(adsys): ssa_key0 = pd.merge(left=ssa_key0, how='left', on='stg_idx', right=ssa_rg[['stg_idx', 'rg_idx']]) - pd.set_option('future.no_silent_downcasting', True) ssa_key0 = ssa_key0.fillna(value=False) dyr = ssa_key0['syg_idx'].astype(bool) + ssa_key0['dg_idx'].astype(bool) + ssa_key0['rg_idx'].astype(bool) non_dyr = np.logical_not(dyr) From c7025d02004a4f99cfe20c0682a85d0d437a1c93 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 08:38:03 -0500 Subject: [PATCH 02/46] Update release-notes --- docs/source/release-notes.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/release-notes.rst b/docs/source/release-notes.rst index 269efce1..470138a7 100644 --- a/docs/source/release-notes.rst +++ b/docs/source/release-notes.rst @@ -9,6 +9,10 @@ The APIs before v3.0.0 are in beta and may change without prior notice. Pre-v1.0.0 ========== +v0.8.6 (2024-02-xx) + +- Fix ANDES file converter issue + v0.8.5 (2024-01-31) - Improve quality of coverage and format From f0c97525972b1154d02838d6e5b257b5bbecc02f Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 08:38:11 -0500 Subject: [PATCH 03/46] Rerun examples --- examples/ex1.ipynb | 116 ++++++++++++++++++++++----------------------- examples/ex2.ipynb | 52 ++++++++++---------- examples/ex3.ipynb | 8 ++-- examples/ex4.ipynb | 18 +++---- examples/ex5.ipynb | 33 ++++++------- examples/ex6.ipynb | 18 +++---- examples/ex7.ipynb | 20 ++++---- 7 files changed, 133 insertions(+), 132 deletions(-) diff --git a/examples/ex1.ipynb b/examples/ex1.ipynb index de4dd2fd..0ad120d3 100644 --- a/examples/ex1.ipynb +++ b/examples/ex1.ipynb @@ -51,8 +51,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-24 09:37:17\n", - "ams:0.8.1.post5+ge752692\n" + "Last run time: 2024-02-19 08:36:36\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -127,10 +127,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", - "Input file parsed in 0.1218 seconds.\n", + "Input file parsed in 0.1072 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0021 seconds.\n" + "System set up in 0.0022 seconds.\n" ] } ], @@ -164,33 +164,33 @@ { "data": { "text/plain": [ - "OrderedDict([('Summary', Summary (3 devices) at 0x105584d30),\n", - " ('Bus', Bus (5 devices) at 0x1056110d0),\n", - " ('PQ', PQ (3 devices) at 0x12f9b8df0),\n", - " ('PV', PV (3 devices) at 0x12f9caa60),\n", - " ('Slack', Slack (1 device) at 0x12f9e0910),\n", - " ('Shunt', Shunt (0 devices) at 0x12f9eb3d0),\n", - " ('Line', Line (7 devices) at 0x12f9eb880),\n", - " ('PVD1', PVD1 (0 devices) at 0x12f9f4f70),\n", - " ('ESD1', ESD1 (0 devices) at 0x12fa065b0),\n", - " ('REGCA1', REGCA1 (0 devices) at 0x12fa06b20),\n", - " ('REGCV1', REGCV1 (0 devices) at 0x12fa11160),\n", - " ('REGCV2', REGCV2 (0 devices) at 0x12fa11940),\n", - " ('Area', Area (3 devices) at 0x12fa11e80),\n", - " ('Region', Region (2 devices) at 0x12fa1e640),\n", - " ('SFR', SFR (2 devices) at 0x12fa1edf0),\n", - " ('SR', SR (2 devices) at 0x12fa2e490),\n", - " ('NSR', NSR (2 devices) at 0x12fa2e8b0),\n", - " ('VSGR', VSGR (0 devices) at 0x12fa2ecd0),\n", - " ('GCost', GCost (4 devices) at 0x12fa3a160),\n", - " ('SFRCost', SFRCost (4 devices) at 0x12fa3a7f0),\n", - " ('SRCost', SRCost (4 devices) at 0x12fa3ad90),\n", - " ('NSRCost', NSRCost (4 devices) at 0x12fa471f0),\n", - " ('VSGCost', VSGCost (0 devices) at 0x12fa47610),\n", - " ('DCost', DCost (3 devices) at 0x12fa47910),\n", - " ('TimeSlot', TimeSlot (0 devices) at 0x12fa47e80),\n", - " ('EDTSlot', EDTSlot (24 devices) at 0x12fa50940),\n", - " ('UCTSlot', UCTSlot (24 devices) at 0x12fa50d60)])" + "OrderedDict([('Summary', Summary (3 devices) at 0x1478df070),\n", + " ('Bus', Bus (5 devices) at 0x1478df9d0),\n", + " ('PQ', PQ (3 devices) at 0x1478f81f0),\n", + " ('PV', PV (3 devices) at 0x147906250),\n", + " ('Slack', Slack (1 device) at 0x147906cd0),\n", + " ('Shunt', Shunt (0 devices) at 0x147916790),\n", + " ('Line', Line (7 devices) at 0x147916c40),\n", + " ('PVD1', PVD1 (0 devices) at 0x147933370),\n", + " ('ESD1', ESD1 (0 devices) at 0x147933970),\n", + " ('REGCA1', REGCA1 (0 devices) at 0x147933ee0),\n", + " ('REGCV1', REGCV1 (0 devices) at 0x147940520),\n", + " ('REGCV2', REGCV2 (0 devices) at 0x147940d00),\n", + " ('Area', Area (3 devices) at 0x14794c280),\n", + " ('Region', Region (2 devices) at 0x14794ca00),\n", + " ('SFR', SFR (2 devices) at 0x1479591f0),\n", + " ('SR', SR (2 devices) at 0x147959850),\n", + " ('NSR', NSR (2 devices) at 0x147959c70),\n", + " ('VSGR', VSGR (0 devices) at 0x1479640d0),\n", + " ('GCost', GCost (4 devices) at 0x147964520),\n", + " ('SFRCost', SFRCost (4 devices) at 0x147964bb0),\n", + " ('SRCost', SRCost (4 devices) at 0x147974190),\n", + " ('NSRCost', NSRCost (4 devices) at 0x1479745b0),\n", + " ('VSGCost', VSGCost (0 devices) at 0x1479749d0),\n", + " ('DCost', DCost (3 devices) at 0x147974cd0),\n", + " ('TimeSlot', TimeSlot (0 devices) at 0x14797d280),\n", + " ('EDTSlot', EDTSlot (24 devices) at 0x14797dd00),\n", + " ('UCTSlot', UCTSlot (24 devices) at 0x14798a160)])" ] }, "execution_count": 5, @@ -269,7 +269,7 @@ " PQ_1\n", " 1.0\n", " PQ 1\n", - " 1\n", + " Bus_2\n", " 230.0\n", " 3.0\n", " 0.9861\n", @@ -283,7 +283,7 @@ " PQ_2\n", " 1.0\n", " PQ 2\n", - " 2\n", + " Bus_3\n", " 230.0\n", " 3.0\n", " 0.9861\n", @@ -297,7 +297,7 @@ " PQ_3\n", " 1.0\n", " PQ 3\n", - " 3\n", + " Bus_4\n", " 230.0\n", " 4.0\n", " 1.3147\n", @@ -311,11 +311,11 @@ "" ], "text/plain": [ - " idx u name bus Vn p0 q0 vmax vmin owner ctrl\n", - "uid \n", - "0 PQ_1 1.0 PQ 1 1 230.0 3.0 0.9861 1.1 0.9 None 1.0\n", - "1 PQ_2 1.0 PQ 2 2 230.0 3.0 0.9861 1.1 0.9 None 1.0\n", - "2 PQ_3 1.0 PQ 3 3 230.0 4.0 1.3147 1.1 0.9 None 1.0" + " idx u name bus Vn p0 q0 vmax vmin owner ctrl\n", + "uid \n", + "0 PQ_1 1.0 PQ 1 Bus_2 230.0 3.0 0.9861 1.1 0.9 None 1.0\n", + "1 PQ_2 1.0 PQ 2 Bus_3 230.0 3.0 0.9861 1.1 0.9 None 1.0\n", + "2 PQ_3 1.0 PQ 3 Bus_4 230.0 4.0 1.3147 1.1 0.9 None 1.0" ] }, "execution_count": 6, @@ -343,23 +343,23 @@ { "data": { "text/plain": [ - "OrderedDict([('DCPF', DCPF at 0x12f9b8490),\n", - " ('PFlow', PFlow at 0x12fa5fa00),\n", - " ('CPF', CPF at 0x12fa73070),\n", - " ('ACOPF', ACOPF at 0x12fa736a0),\n", - " ('DCOPF', DCOPF at 0x12fa73fa0),\n", - " ('ED', ED at 0x12fca9100),\n", - " ('EDDG', EDDG at 0x12fcb40a0),\n", - " ('EDES', EDES at 0x12fcc7ac0),\n", - " ('RTED', RTED at 0x12fe09fd0),\n", - " ('RTEDDG', RTEDDG at 0x12fe1c0d0),\n", - " ('RTEDES', RTEDES at 0x12fe42760),\n", - " ('RTEDVIS', RTEDVIS at 0x12fe684f0),\n", - " ('UC', UC at 0x12fe7ac40),\n", - " ('UCDG', UCDG at 0x160845430),\n", - " ('UCES', UCES at 0x160866370),\n", - " ('DOPF', DOPF at 0x16088dd60),\n", - " ('DOPFVIS', DOPFVIS at 0x1608b0070)])" + "OrderedDict([('DCPF', DCPF at 0x1478df0a0),\n", + " ('PFlow', PFlow at 0x14798ad60),\n", + " ('CPF', CPF at 0x14799b3d0),\n", + " ('ACOPF', ACOPF at 0x14799ba00),\n", + " ('DCOPF', DCOPF at 0x1479b3340),\n", + " ('ED', ED at 0x1479ca160),\n", + " ('EDDG', EDDG at 0x147b163d0),\n", + " ('EDES', EDES at 0x147b28df0),\n", + " ('RTED', RTED at 0x147b61340),\n", + " ('RTEDDG', RTEDDG at 0x147b61400),\n", + " ('RTEDES', RTEDES at 0x147b83a90),\n", + " ('RTEDVIS', RTEDVIS at 0x147ba9820),\n", + " ('UC', UC at 0x147bbaf70),\n", + " ('UCDG', UCDG at 0x161db9760),\n", + " ('UCES', UCES at 0x161ddd6a0),\n", + " ('DOPF', DOPF at 0x161e100d0),\n", + " ('DOPFVIS', DOPFVIS at 0x161e223a0)])" ] }, "execution_count": 7, @@ -396,7 +396,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0130 seconds.\n" + "Routine initialized in 0.0114 seconds.\n" ] }, { @@ -466,7 +466,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0173 seconds, converged after 9 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0171 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { diff --git a/examples/ex2.ipynb b/examples/ex2.ipynb index caf3d407..3111dbb8 100644 --- a/examples/ex2.ipynb +++ b/examples/ex2.ipynb @@ -36,8 +36,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-29 20:44:33\n", - "ams:0.8.1.post37.dev0+gf76a132\n" + "Last run time: 2024-02-19 08:36:57\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -82,10 +82,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", - "Input file parsed in 0.1167 seconds.\n", + "Input file parsed in 0.0956 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0026 seconds.\n" + "System set up in 0.0019 seconds.\n" ] } ], @@ -270,7 +270,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0141 seconds.\n", + "Routine initialized in 0.0113 seconds.\n", "RTED solved as optimal in 0.0166 seconds, converged after 9 iterations using solver ECOS.\n" ] }, @@ -416,7 +416,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0025 seconds, converged after 9 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0018 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { @@ -471,7 +471,7 @@ { "data": { "text/plain": [ - "StaticLoad (3 devices) at 0x1379130d0" + "StaticLoad (3 devices) at 0x1490457f0" ] }, "execution_count": 14, @@ -690,7 +690,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0020 seconds, converged after 9 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0019 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { @@ -1007,7 +1007,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0164 seconds, converged after 8 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0160 seconds, converged after 8 iterations using solver ECOS.\n" ] }, { @@ -1421,7 +1421,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0159 seconds, converged after 8 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0191 seconds, converged after 8 iterations using solver ECOS.\n" ] }, { @@ -1492,10 +1492,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", - "Input file parsed in 0.0386 seconds.\n", + "Input file parsed in 0.0412 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0025 seconds.\n" + "System set up in 0.0024 seconds.\n" ] } ], @@ -1514,7 +1514,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0101 seconds.\n" + "Routine initialized in 0.0115 seconds.\n" ] }, { @@ -1628,7 +1628,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0158 seconds, converged after 10 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0157 seconds, converged after 10 iterations using solver ECOS.\n" ] }, { @@ -1749,8 +1749,8 @@ "output_type": "stream", "text": [ "Disabled constraints: plflb, plfub\n", - "Routine initialized in 0.0086 seconds.\n", - "RTED solved as optimal in 0.0141 seconds, converged after 9 iterations using solver ECOS.\n" + "Routine initialized in 0.0092 seconds.\n", + "RTED solved as optimal in 0.0140 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { @@ -1870,8 +1870,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0101 seconds.\n", - "RTED solved as optimal in 0.0149 seconds, converged after 10 iterations using solver ECOS.\n" + "Routine initialized in 0.0079 seconds.\n", + "RTED solved as optimal in 0.0147 seconds, converged after 10 iterations using solver ECOS.\n" ] }, { @@ -1952,7 +1952,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0103 seconds.\n" + "Routine initialized in 0.0090 seconds.\n" ] }, { @@ -2026,10 +2026,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", - "Input file parsed in 0.0946 seconds.\n", + "Input file parsed in 0.0887 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0027 seconds.\n" + "System set up in 0.0019 seconds.\n" ] } ], @@ -2075,8 +2075,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0108 seconds.\n", - "RTED solved as optimal in 0.0155 seconds, converged after 9 iterations using solver ECOS.\n" + "Routine initialized in 0.0099 seconds.\n", + "RTED solved as optimal in 0.0141 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { @@ -2175,7 +2175,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0200 seconds, converged after 325 iterations using solver SCS.\n" + "RTED solved as optimal in 0.0162 seconds, converged after 325 iterations using solver SCS.\n" ] }, { @@ -2283,8 +2283,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0057 seconds.\n", - "DCOPF solved as optimal in 0.0092 seconds, converged after 225 iterations using solver SCS.\n" + "Routine initialized in 0.0049 seconds.\n", + "DCOPF solved as optimal in 0.0082 seconds, converged after 225 iterations using solver SCS.\n" ] }, { diff --git a/examples/ex3.ipynb b/examples/ex3.ipynb index 4cf5e99a..e206cc32 100644 --- a/examples/ex3.ipynb +++ b/examples/ex3.ipynb @@ -36,8 +36,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-29 20:44:50\n", - "ams:0.8.1.post37.dev0+gf76a132\n" + "Last run time: 2024-02-19 08:37:09\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -73,10 +73,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_uced.xlsx\"...\n", - "Input file parsed in 0.1210 seconds.\n", + "Input file parsed in 0.0981 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0020 seconds.\n" + "System set up in 0.0031 seconds.\n" ] } ], diff --git a/examples/ex4.ipynb b/examples/ex4.ipynb index 504dde4a..4a92d188 100644 --- a/examples/ex4.ipynb +++ b/examples/ex4.ipynb @@ -45,8 +45,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-29 20:45:03\n", - "ams:0.8.1.post37.dev0+gf76a132\n" + "Last run time: 2024-02-19 08:37:28\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -89,10 +89,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/ieee14/ieee14_uced.xlsx\"...\n", - "Input file parsed in 0.1268 seconds.\n", + "Input file parsed in 0.1071 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0023 seconds.\n", + "System set up in 0.0022 seconds.\n", "-> Systen size:\n", "Base: 100 MVA; Frequency: 60 Hz\n", "14 Buses; 20 Lines; 5 Static Generators\n", @@ -131,7 +131,7 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/ieee14/ieee14.json\"...\n", - "Input file parsed in 0.0042 seconds.\n", + "Input file parsed in 0.0022 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", "System set up in 0.0027 seconds.\n", @@ -169,10 +169,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/matpower/case14.m\"...\n", - "Input file parsed in 0.0066 seconds.\n", + "Input file parsed in 0.0070 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0048 seconds.\n", + "System set up in 0.0056 seconds.\n", "-> Systen size:\n", "Base: 100.0 MVA; Frequency: 60 Hz\n", "14 Buses; 20 Lines; 5 Static Generators\n", @@ -224,10 +224,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/ieee14/ieee14.raw\"...\n", - "Input file parsed in 0.0096 seconds.\n", + "Input file parsed in 0.0091 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0021 seconds.\n", + "System set up in 0.0022 seconds.\n", "-> Systen size:\n", "Base: 100.0 MVA; Frequency: 60.0 Hz\n", "14 Buses; 20 Lines; 5 Static Generators\n", diff --git a/examples/ex5.ipynb b/examples/ex5.ipynb index 78fd5a0f..e602a69b 100644 --- a/examples/ex5.ipynb +++ b/examples/ex5.ipynb @@ -40,9 +40,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-29 20:45:23\n", - "andes:1.8.10.post31+gfa2e2e5c\n", - "ams:0.8.1.post37.dev0+gf76a132\n" + "Last run time: 2024-02-19 08:36:14\n", + "andes:1.9.0\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -80,10 +80,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/ieee14/ieee14_uced.xlsx\"...\n", - "Input file parsed in 0.1181 seconds.\n", + "Input file parsed in 0.1334 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0021 seconds.\n" + "System set up in 0.0019 seconds.\n" ] } ], @@ -102,7 +102,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0136 seconds.\n" + "Routine initialized in 0.0141 seconds.\n" ] }, { @@ -129,7 +129,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "RTED solved as optimal in 0.0200 seconds, converged after 11 iterations using solver ECOS.\n" + "RTED solved as optimal in 0.0194 seconds, converged after 11 iterations using solver ECOS.\n" ] }, { @@ -151,7 +151,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Convert to ANDES" + "## Convert to ANDES Case" ] }, { @@ -174,9 +174,9 @@ "text": [ "Parsing additional file \"/Users/jinningwang/Documents/work/andes/andes/cases/ieee14/ieee14_full.xlsx\"...\n", "Following PFlow models in addfile will be overwritten: , , , , , , \n", - "Addfile parsed in 0.0847 seconds.\n", - "System converted to ANDES in 0.1945 seconds.\n", - "AMS system 0x109a2c2b0 is linked to the ANDES system 0x109a2be20.\n" + "Addfile parsed in 0.0471 seconds.\n", + "System converted to ANDES in 0.1425 seconds.\n", + "AMS system 0x104242760 is linked to the ANDES system 0x160757c10.\n" ] } ], @@ -266,7 +266,8 @@ "source": [ "In the interface class ``dyn``, the link table is stored in ``dyn.link``.\n", "\n", - "It describes the mapping relationships between power flow devices and dynamic devices." + "It describes the mapping relationships between power flow devices and dynamic devices.\n", + "Note that a converted ANDES case has consistent power flow devices with the source AMS case." ] }, { @@ -406,8 +407,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0041 seconds.\n", - "ACOPF solved in 0.2367 seconds, converged after 12 iterations using solver PYPOWER-PIPS.\n", + "Routine initialized in 0.0032 seconds.\n", + "ACOPF solved in 0.2399 seconds, converged after 12 iterations using solver PYPOWER-PIPS.\n", "Attribute already exists in .\n", " is converted to AC.\n" ] @@ -465,7 +466,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Send results to ANDES <0x109a2be20>...\n", + "Send results to ANDES <0x160757c10>...\n", "Send to Bus.v0\n", "Send to StaticGen.u\n", "Send to StaticGen.p0\n" @@ -490,7 +491,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Run ANDES" + "### Run Simulations in ANDES" ] }, { diff --git a/examples/ex6.ipynb b/examples/ex6.ipynb index 22dd6be6..2b6dd65a 100644 --- a/examples/ex6.ipynb +++ b/examples/ex6.ipynb @@ -37,8 +37,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-29 20:45:29\n", - "ams:0.8.1.post37.dev0+gf76a132\n" + "Last run time: 2024-02-19 08:37:37\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -75,10 +75,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\"...\n", - "Input file parsed in 0.1208 seconds.\n", + "Input file parsed in 0.1013 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0022 seconds.\n" + "System set up in 0.0019 seconds.\n" ] } ], @@ -372,9 +372,9 @@ { "data": { "text/plain": [ - "OrderedDict([('TimeSlot', TimeSlot (0 devices) at 0x13ae9b160),\n", - " ('EDTSlot', EDTSlot (6 devices) at 0x13ae9bbe0),\n", - " ('UCTSlot', UCTSlot (6 devices) at 0x13aea6040)])" + "OrderedDict([('TimeSlot', TimeSlot (0 devices) at 0x1640de250),\n", + " ('EDTSlot', EDTSlot (6 devices) at 0x1640decd0),\n", + " ('UCTSlot', UCTSlot (6 devices) at 0x1640ed130)])" ] }, "execution_count": 7, @@ -554,7 +554,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0199 seconds.\n" + "Routine initialized in 0.0182 seconds.\n" ] }, { @@ -581,7 +581,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "ED solved as optimal in 0.0247 seconds, converged after 9 iterations using solver ECOS.\n" + "ED solved as optimal in 0.0241 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { diff --git a/examples/ex7.ipynb b/examples/ex7.ipynb index 635c455c..96e7657f 100644 --- a/examples/ex7.ipynb +++ b/examples/ex7.ipynb @@ -42,8 +42,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-01-29 20:45:39\n", - "ams:0.8.1.post37.dev0+gf76a132\n" + "Last run time: 2024-02-19 08:37:45\n", + "ams:0.8.5.post1.dev0+gf07da80\n" ] } ], @@ -79,7 +79,7 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\"...\n", - "Input file parsed in 0.1613 seconds.\n", + "Input file parsed in 0.0972 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", "System set up in 0.0020 seconds.\n" @@ -101,8 +101,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0075 seconds.\n", - "DCOPF solved as optimal in 0.0092 seconds, converged after 9 iterations using solver ECOS.\n" + "Routine initialized in 0.0090 seconds.\n", + "DCOPF solved as optimal in 0.0093 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { @@ -145,7 +145,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Report saved to \"pjm5bus_demo_out.txt\" in 0.0008 seconds.\n" + "Report saved to \"pjm5bus_demo_out.txt\" in 0.0024 seconds.\n" ] }, { @@ -179,12 +179,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "AMS 0.8.1.post37.dev0+gf76a132\n", + "AMS 0.8.5.post1.dev0+gf07da80\n", "Copyright (C) 2023-2024 Jinning Wang\n", "\n", "AMS comes with ABSOLUTELY NO WARRANTY\n", "Case file: /Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\n", - "Report time: 01/29/2024 08:45:40 PM\n", + "Report time: 02/19/2024 08:37:46 AM\n", "\n", "\n", "========== System Statistics ==========\n", @@ -267,8 +267,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0167 seconds.\n", - "ED solved as optimal in 0.0222 seconds, converged after 9 iterations using solver ECOS.\n" + "Routine initialized in 0.0179 seconds.\n", + "ED solved as optimal in 0.0244 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { From 75f70ab12ddb0490b1712cf504375d7f7d6f3e2f Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 09:25:05 -0500 Subject: [PATCH 04/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index a46c9a51..ce95f301 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,9 +48,9 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} + bash <(curl -Ls https://coverage.codacy.com/get.sh) report \ + -r coverage.xml \ + --project-token ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 83749ee6f41742d7084d2d6ef139b162f3aede76 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 09:34:03 -0500 Subject: [PATCH 05/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index ce95f301..b908cf1b 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,9 +48,10 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | + export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" bash <(curl -Ls https://coverage.codacy.com/get.sh) report \ -r coverage.xml \ - --project-token ${{ secrets.CODACY_PROJECT_TOKEN }} + --project-token CODACY_PROJECT_TOKEN - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 13f31cad2554096daf41048120ac19db80a41db6 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 09:43:08 -0500 Subject: [PATCH 06/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index b908cf1b..8ab61161 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,10 +48,7 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | - export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" - bash <(curl -Ls https://coverage.codacy.com/get.sh) report \ - -r coverage.xml \ - --project-token CODACY_PROJECT_TOKEN + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token "${{ secrets.CODACY_PROJECT_TOKEN }}" - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From f1fa8183ba2ba809a9e62164019152b6ad9eb00a Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 09:47:54 -0500 Subject: [PATCH 07/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 8ab61161..55c2fb81 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,7 +48,8 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token "${{ secrets.CODACY_PROJECT_TOKEN }}" + export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token CODACY_PROJECT_TOKEN - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 6539111dc52a855895257955a8fe6a482407d062 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 10:03:04 -0500 Subject: [PATCH 08/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 55c2fb81..2e27bba7 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,8 +48,7 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | - export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token CODACY_PROJECT_TOKEN + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 256aacfc39dad4246861500a128ed41bcfacb62e Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 10:19:39 -0500 Subject: [PATCH 09/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 2e27bba7..4a515724 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,7 +48,9 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token ${{ secrets.CODACY_PROJECT_TOKEN }} + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token "$CODACY_PROJECT_TOKEN" + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From c0a6c7e5151f24e301027160fb13f82da2f34755 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 10:27:58 -0500 Subject: [PATCH 10/46] Fix codacy config error in pythonapp workflow --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 4a515724..9a0bc549 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -48,7 +48,7 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token "$CODACY_PROJECT_TOKEN" + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_PROJECT_TOKEN env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged From 4bed6c2df1b8b277e27fd2d0261657aee7cfc281 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 10:54:52 -0500 Subject: [PATCH 11/46] Remove codecov integration --- .codecov.yml | 19 ------------------- .github/workflows/pythonapp.yml | 4 ---- 2 files changed, 23 deletions(-) delete mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml deleted file mode 100644 index 7a83f416..00000000 --- a/.codecov.yml +++ /dev/null @@ -1,19 +0,0 @@ -coverage: - status: - project: - default: - informational: true - patch: - default: - informational: true - -cli: - plugins: - pycoverage: - report_type: "xml" - -codecov: - token: 5fc2d41f-bcba-455d-a843-f85beb76d28f -ignore: - - "ams/_version.py" - - "ams/pypower/**" \ No newline at end of file diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 9a0bc549..94e0f7c0 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -42,10 +42,6 @@ jobs: name: Test with pytest and collect coverage run: | pytest --cov=./ --cov-report=xml - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload coverage to Codacy run: | bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_PROJECT_TOKEN From f9b878a4393ada4cabb1371f843d67557ddc1476 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 10:56:08 -0500 Subject: [PATCH 12/46] Ignore coverage reports --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3efdd590..34fef577 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,8 @@ icebar ~$*.xlsx # conda -.conda/* \ No newline at end of file +.conda/* + +# coverage +.coverage +coverage.xml \ No newline at end of file From 752304b1eba2d8ea5baf5dcfa37f13c25bfb6b21 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 10:58:27 -0500 Subject: [PATCH 13/46] Reset codacy config --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 94e0f7c0..33c3e5ab 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -44,7 +44,7 @@ jobs: pytest --cov=./ --cov-report=xml - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_PROJECT_TOKEN + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged From cd801758b0a3b556388b740abb0414106c68c5af Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:08:12 -0500 Subject: [PATCH 14/46] [WIP] Check codacy token settings --- .github/workflows/pythonapp.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 33c3e5ab..8f7068dd 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -42,8 +42,14 @@ jobs: name: Test with pytest and collect coverage run: | pytest --cov=./ --cov-report=xml + - name: Debug Codacy token command structure + run: | + echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Upload coverage to Codacy run: | + bash export CODACY_PROJECT_TOKEN=$CODACY_PROJECT_TOKEN bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} From baf7f0c9807d4ae8f7c40386c6294685d35fbdb4 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:15:53 -0500 Subject: [PATCH 15/46] [WIP] Check codacy token settings --- .github/workflows/pythonapp.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 8f7068dd..854af822 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -49,7 +49,6 @@ jobs: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Upload coverage to Codacy run: | - bash export CODACY_PROJECT_TOKEN=$CODACY_PROJECT_TOKEN bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} From 92dce1b1706bfd1926fe7533479a15e4f222a711 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:17:24 -0500 Subject: [PATCH 16/46] [WIP] Check codacy token settings --- .github/workflows/pythonapp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 854af822..e0e4b0d8 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -28,6 +28,11 @@ jobs: mamba install -y nbmake pytest-xdist line_profiler # add'l packages for notebook tests. mamba install --file requirements.txt --file requirements-extra.txt python -m pip install -e . + - name: Debug Codacy token command structure + run: | + echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Lint with flake8 for pull requests if: github.event_name == 'pull_request' run: | @@ -42,11 +47,6 @@ jobs: name: Test with pytest and collect coverage run: | pytest --cov=./ --cov-report=xml - - name: Debug Codacy token command structure - run: | - echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Upload coverage to Codacy run: | bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml From 861c2ab7ae8901efea183735d49953c145f55176 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:33:19 -0500 Subject: [PATCH 17/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index e0e4b0d8..644e4670 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -22,17 +22,17 @@ jobs: channels: conda-forge,defaults channel-priority: true activate-environment: anaconda-client-env + - name: Debug Codacy token command structure + run: | + echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - shell: bash -el {0} name: Install dependencies run: | mamba install -y nbmake pytest-xdist line_profiler # add'l packages for notebook tests. mamba install --file requirements.txt --file requirements-extra.txt python -m pip install -e . - - name: Debug Codacy token command structure - run: | - echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Lint with flake8 for pull requests if: github.event_name == 'pull_request' run: | From 09e65cb0ad383a3f568bdd6fd186ef754def156a Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:35:22 -0500 Subject: [PATCH 18/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 644e4670..44176102 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -22,7 +22,8 @@ jobs: channels: conda-forge,defaults channel-priority: true activate-environment: anaconda-client-env - - name: Debug Codacy token command structure + - shell: bash -el {0} + name: Debug Codacy token command structure run: | echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" env: From dd9d4743c77e14900733943cf05b1ba8a9fe1034 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:41:50 -0500 Subject: [PATCH 19/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 44176102..f7e5bc8b 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -27,7 +27,7 @@ jobs: run: | echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - shell: bash -el {0} name: Install dependencies run: | From 065ddeef74f99b78c32d9c5d94c41ed3de899ede Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:42:03 -0500 Subject: [PATCH 20/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index f7e5bc8b..ce77c3bb 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -52,7 +52,7 @@ jobs: run: | bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 76ed1c8794f39ef4852079d751aeb32878b46923 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:44:22 -0500 Subject: [PATCH 21/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index ce77c3bb..910c9b1e 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -25,8 +25,9 @@ jobs: - shell: bash -el {0} name: Debug Codacy token command structure run: | - echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_PROJECT_TOKEN:+[TOKEN_PRESENT]}" + echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_AMS_TOKEN:+[TOKEN_PRESENT]}" env: + CODACY_AMS_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - shell: bash -el {0} name: Install dependencies From 2c7b280360a933440b62e7cb344592ff26aaee89 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 11:55:55 -0500 Subject: [PATCH 22/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 910c9b1e..cf45bddb 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -51,7 +51,7 @@ jobs: pytest --cov=./ --cov-report=xml - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token ${{ secrets.CODACY_AMS_TOKEN }} env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - name: Build a distribution if tagged From 52cbf2463fec88b01bfd5c9fa369c4eafc556693 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 12:01:05 -0500 Subject: [PATCH 23/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index cf45bddb..60fa10d4 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -25,6 +25,7 @@ jobs: - shell: bash -el {0} name: Debug Codacy token command structure run: | + export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_AMS_TOKEN }} echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_AMS_TOKEN:+[TOKEN_PRESENT]}" env: CODACY_AMS_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} From b3ff9443ceff089e78a22ccf4039909e8ac023b4 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 12:07:28 -0500 Subject: [PATCH 24/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 60fa10d4..c97cb90a 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -52,7 +52,8 @@ jobs: pytest --cov=./ --cov-report=xml - name: Upload coverage to Codacy run: | - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token ${{ secrets.CODACY_AMS_TOKEN }} + export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_AMS_TOKEN }} + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_AMS_TOKEN env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - name: Build a distribution if tagged From 5b5292e0b4768dd438ae42f1eaca08f797a4b769 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 12:13:21 -0500 Subject: [PATCH 25/46] [WIP] Test codacy config --- .github/workflows/pythonapp.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index c97cb90a..bc2b9d66 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -52,10 +52,10 @@ jobs: pytest --cov=./ --cov-report=xml - name: Upload coverage to Codacy run: | - export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_AMS_TOKEN }} - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_AMS_TOKEN + export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_PROJECT_TOKEN }} + bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_PROJECT_TOKEN env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 23ee3fd9ed8130aae5ca5ab3176c75f65fb0f081 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:04:00 -0500 Subject: [PATCH 26/46] [WIP] Switch to codacy coverage reporter action --- .github/workflows/pythonapp.yml | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index bc2b9d66..d6195f81 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -22,14 +22,6 @@ jobs: channels: conda-forge,defaults channel-priority: true activate-environment: anaconda-client-env - - shell: bash -el {0} - name: Debug Codacy token command structure - run: | - export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_AMS_TOKEN }} - echo "bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token \${CODACY_AMS_TOKEN:+[TOKEN_PRESENT]}" - env: - CODACY_AMS_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_AMS_TOKEN }} - shell: bash -el {0} name: Install dependencies run: | @@ -50,12 +42,11 @@ jobs: name: Test with pytest and collect coverage run: | pytest --cov=./ --cov-report=xml - - name: Upload coverage to Codacy - run: | - export CODACY_PROJECT_TOKEN=${{ secrets.CODACY_PROJECT_TOKEN }} - bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r coverage.xml --project-token $CODACY_PROJECT_TOKEN - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} + - name: Codacy Coverage Reporter + uses: codacy/codacy-coverage-reporter-action@v1.3.0 + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.xml - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From cd45442bc653e638996ada1c5df9bd2a482eb540 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:31:16 -0500 Subject: [PATCH 27/46] [WIP] Try to fix codacy --- .github/workflows/pythonapp.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index d6195f81..71fe2f36 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -47,6 +47,8 @@ jobs: with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 54c887fbd4abfbe3f97d73604fd6472b8542d386 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:38:43 -0500 Subject: [PATCH 28/46] [WIP] Refactor workflow, separate codacy --- .github/workflows/codacy-coverage-reporter.yml | 15 +++++++++++++++ .github/workflows/pythonapp.yml | 11 ----------- 2 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/codacy-coverage-reporter.yml diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml new file mode 100644 index 00000000..663da599 --- /dev/null +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -0,0 +1,15 @@ +name: Codacy Coverage Reporter + +on: [push, pull_request] + +jobs: + codacy-coverage-reporter: + runs-on: ubuntu-latest + name: codacy-coverage-reporter + steps: + - uses: actions/checkout@v2 + - name: Run codacy-coverage-reporter + uses: codacy/codacy-coverage-reporter-action@v1 + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.xml \ No newline at end of file diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml index 71fe2f36..db207c14 100644 --- a/.github/workflows/pythonapp.yml +++ b/.github/workflows/pythonapp.yml @@ -38,17 +38,6 @@ jobs: name: Test notebooks. run: | pytest --nbmake examples --ignore=examples/demonstration - - shell: bash -el {0} - name: Test with pytest and collect coverage - run: | - pytest --cov=./ --cov-report=xml - - name: Codacy Coverage Reporter - uses: codacy/codacy-coverage-reporter-action@v1.3.0 - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage.xml - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Build a distribution if tagged if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') && matrix.os == 'ubuntu-latest' && matrix.python-version == '3.9' run: | From 3f5c8e5022c67351ae3b1ed693ca246345630a8b Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:41:11 -0500 Subject: [PATCH 29/46] [WIP] Try to fix codacy --- .github/workflows/codacy-coverage-reporter.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 663da599..4cc79bc8 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -12,4 +12,6 @@ jobs: uses: codacy/codacy-coverage-reporter-action@v1 with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage.xml \ No newline at end of file + coverage-reports: coverage.xml + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file From 7c4e2a767a367b5222bbefdd0754785124705575 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:43:22 -0500 Subject: [PATCH 30/46] [WIP] Update codacy action version --- .github/workflows/codacy-coverage-reporter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 4cc79bc8..244b5bd8 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -9,7 +9,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Run codacy-coverage-reporter - uses: codacy/codacy-coverage-reporter-action@v1 + uses: codacy/codacy-coverage-reporter-action@v1.3.0 with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml From 0efc14e8dffca3dae117a2b29993caf1ff79b086 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:51:05 -0500 Subject: [PATCH 31/46] [WIP] Debug codacy --- .github/workflows/codacy-coverage-reporter.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 244b5bd8..bebcdd1c 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -14,4 +14,11 @@ jobs: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} + - name: Debug token presence + run: | + if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then + echo "CODACY_PROJECT_TOKEN is unset or empty" + else + echo "CODACY_PROJECT_TOKEN is set" + fi \ No newline at end of file From 4500720b47b8549d19d47fd58ca6c9f5434f4f8e Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:52:20 -0500 Subject: [PATCH 32/46] [WIP] Debug codacy --- .github/workflows/codacy-coverage-reporter.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index bebcdd1c..6dfab8e0 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -8,17 +8,17 @@ jobs: name: codacy-coverage-reporter steps: - uses: actions/checkout@v2 - - name: Run codacy-coverage-reporter - uses: codacy/codacy-coverage-reporter-action@v1.3.0 - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage.xml - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Debug token presence run: | if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then echo "CODACY_PROJECT_TOKEN is unset or empty" else echo "CODACY_PROJECT_TOKEN is set" - fi \ No newline at end of file + fi + - name: Run codacy-coverage-reporter + uses: codacy/codacy-coverage-reporter-action@v1.3.0 + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.xml + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file From 630357d65e908713efa2aa667c48080ae5e6de8f Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 13:55:19 -0500 Subject: [PATCH 33/46] [WIP] Debug codacy --- .github/workflows/codacy-coverage-reporter.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 6dfab8e0..7ae2346b 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -15,6 +15,13 @@ jobs: else echo "CODACY_PROJECT_TOKEN is set" fi + - name: Debug token presence another name + run: | + if [ -z "${{ secrets.JAX_TOKEN }}" ]; then + echo "JAX_TOKEN is unset or empty" + else + echo "JAX_TOKEN is set" + fi - name: Run codacy-coverage-reporter uses: codacy/codacy-coverage-reporter-action@v1.3.0 with: From 1bf49b41a918394058a9eff4dbbe0fe48ce48f73 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 14:00:37 -0500 Subject: [PATCH 34/46] [WIP] Debug codacy --- .../workflows/codacy-coverage-reporter.yml | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 7ae2346b..cb7bfb6f 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -6,6 +6,7 @@ jobs: codacy-coverage-reporter: runs-on: ubuntu-latest name: codacy-coverage-reporter + environment: codacy steps: - uses: actions/checkout@v2 - name: Debug token presence @@ -15,12 +16,25 @@ jobs: else echo "CODACY_PROJECT_TOKEN is set" fi - - name: Debug token presence another name + - name: Run codacy-coverage-reporter + uses: codacy/codacy-coverage-reporter-action@v1.3.0 + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.xml + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} + + codacy-coverage-reporter-bechmark: + runs-on: ubuntu-latest + name: codacy-coverage-reporter + steps: + - uses: actions/checkout@v2 + - name: Debug token presence run: | - if [ -z "${{ secrets.JAX_TOKEN }}" ]; then - echo "JAX_TOKEN is unset or empty" + if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then + echo "CODACY_PROJECT_TOKEN is unset or empty" else - echo "JAX_TOKEN is set" + echo "CODACY_PROJECT_TOKEN is set" fi - name: Run codacy-coverage-reporter uses: codacy/codacy-coverage-reporter-action@v1.3.0 From f094917ad0e8731e86dbc3a3ab3fd9bc94139154 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 14:07:09 -0500 Subject: [PATCH 35/46] [WIP] Debug codacy --- .github/workflows/codacy-coverage-reporter.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index cb7bfb6f..9f850c22 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -9,6 +9,9 @@ jobs: environment: codacy steps: - uses: actions/checkout@v2 + - name: Test + run: | + curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Debug token presence run: | if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then @@ -26,9 +29,12 @@ jobs: codacy-coverage-reporter-bechmark: runs-on: ubuntu-latest - name: codacy-coverage-reporter + name: codacy-coverage-reporter-benchmark steps: - uses: actions/checkout@v2 + - name: Test + run: | + curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H ${{ secrets.CODACY_PROJECT_TOKEN }} - name: Debug token presence run: | if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then From 39814649d74bc2fb18f7ee4cb4188051ca45e85a Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 14:10:44 -0500 Subject: [PATCH 36/46] [WIP] Debug codacy --- .github/workflows/codacy-coverage-reporter.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 9f850c22..2c167eb8 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -11,7 +11,8 @@ jobs: - uses: actions/checkout@v2 - name: Test run: | - curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H ${{ secrets.CODACY_PROJECT_TOKEN }} + export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" + curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H api-token: $CODACY_PROJECT_TOKEN - name: Debug token presence run: | if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then @@ -34,7 +35,8 @@ jobs: - uses: actions/checkout@v2 - name: Test run: | - curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H ${{ secrets.CODACY_PROJECT_TOKEN }} + export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" + curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H api-token: $CODACY_PROJECT_TOKEN - name: Debug token presence run: | if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then From 34e6c5b5884e4d6c88eece818571b92a30b1ba38 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 14:12:52 -0500 Subject: [PATCH 37/46] [WIP] Debug codacy --- .github/workflows/codacy-coverage-reporter.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 2c167eb8..94b370de 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -9,6 +9,13 @@ jobs: environment: codacy steps: - uses: actions/checkout@v2 + - name: Debug token presence with PYPI + run: | + if [ -z "${{ secrets.PYPI_PASSWORD }}" ]; then + echo "PYPI_PASSWORD is unset or empty" + else + echo "PYPI_PASSWORD is set" + fi - name: Test run: | export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" @@ -33,6 +40,13 @@ jobs: name: codacy-coverage-reporter-benchmark steps: - uses: actions/checkout@v2 + - name: Debug token presence with PYPI + run: | + if [ -z "${{ secrets.PYPI_PASSWORD }}" ]; then + echo "PYPI_PASSWORD is unset or empty" + else + echo "PYPI_PASSWORD is set" + fi - name: Test run: | export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" From 1ea3f43d7055b1f421145782d0ee445716e90266 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 14:24:02 -0500 Subject: [PATCH 38/46] Add codecov back --- .codecov.yml | 17 +++++++ .../workflows/codacy-coverage-reporter.yml | 50 ------------------- .github/workflows/codecov.yml | 32 ++++++++++++ 3 files changed, 49 insertions(+), 50 deletions(-) create mode 100644 .codecov.yml create mode 100644 .github/workflows/codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000..6a437d86 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,17 @@ +coverage: + status: + project: + default: + informational: true + patch: + default: + informational: true + +cli: + plugins: + pycoverage: + report_type: "xml" + +ignore: + - "ams/_version.py" + - "ams/pypower/**" \ No newline at end of file diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 94b370de..89ba797f 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -9,59 +9,9 @@ jobs: environment: codacy steps: - uses: actions/checkout@v2 - - name: Debug token presence with PYPI - run: | - if [ -z "${{ secrets.PYPI_PASSWORD }}" ]; then - echo "PYPI_PASSWORD is unset or empty" - else - echo "PYPI_PASSWORD is set" - fi - - name: Test - run: | - export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" - curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H api-token: $CODACY_PROJECT_TOKEN - - name: Debug token presence - run: | - if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then - echo "CODACY_PROJECT_TOKEN is unset or empty" - else - echo "CODACY_PROJECT_TOKEN is set" - fi - name: Run codacy-coverage-reporter uses: codacy/codacy-coverage-reporter-action@v1.3.0 with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage.xml - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} - - codacy-coverage-reporter-bechmark: - runs-on: ubuntu-latest - name: codacy-coverage-reporter-benchmark - steps: - - uses: actions/checkout@v2 - - name: Debug token presence with PYPI - run: | - if [ -z "${{ secrets.PYPI_PASSWORD }}" ]; then - echo "PYPI_PASSWORD is unset or empty" - else - echo "PYPI_PASSWORD is set" - fi - - name: Test - run: | - export CODACY_PROJECT_TOKEN="${{ secrets.CODACY_PROJECT_TOKEN }}" - curl -X GET 'https://api.codacy.com/api/v3/user/organizations/gh' -H api-token: $CODACY_PROJECT_TOKEN - - name: Debug token presence - run: | - if [ -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then - echo "CODACY_PROJECT_TOKEN is unset or empty" - else - echo "CODACY_PROJECT_TOKEN is set" - fi - - name: Run codacy-coverage-reporter - uses: codacy/codacy-coverage-reporter-action@v1.3.0 - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml new file mode 100644 index 00000000..63c9f6d0 --- /dev/null +++ b/.github/workflows/codecov.yml @@ -0,0 +1,32 @@ +name: Codecov + +on: [push, pull_request] + +jobs: + run: + runs-on: ubuntu-latest + env: + OS: ubuntu-latest + PYTHON: '3.10' + steps: + - uses: actions/checkout@master + - name: Setup Python + uses: actions/setup-python@master + with: + python-version: 3.10 + - name: Generate coverage report + run: | + pip install pytest + pip install pytest-cov + pytest --cov=./ --cov-report=xml + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + directory: ./coverage/reports/ + env_vars: OS,PYTHON + fail_ci_if_error: true + files: ./coverage1.xml,./coverage2.xml,!./cache + flags: unittests + name: codecov-umbrella + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true \ No newline at end of file From 961f7909a36f8fe04779342488731f6ca8432994 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 14:38:02 -0500 Subject: [PATCH 39/46] Add conditional check for codacy --- .../workflows/codacy-coverage-reporter.yml | 17 ++++--- .github/workflows/codecov.yml | 45 ++++++++++--------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml index 89ba797f..3a0f43d1 100644 --- a/.github/workflows/codacy-coverage-reporter.yml +++ b/.github/workflows/codacy-coverage-reporter.yml @@ -3,15 +3,22 @@ name: Codacy Coverage Reporter on: [push, pull_request] jobs: - codacy-coverage-reporter: + build: runs-on: ubuntu-latest - name: codacy-coverage-reporter - environment: codacy steps: - - uses: actions/checkout@v2 - - name: Run codacy-coverage-reporter + - name: Check secret presence + id: check_secret + run: | + echo "is_set=false" >> $GITHUB_OUTPUT + if [ ! -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then + echo "is_set=true" >> $GITHUB_OUTPUT + fi + + - name: Conditional run codacy-coverage-reporter + if: steps.check_secret.outputs.is_set == 'true' uses: codacy/codacy-coverage-reporter-action@v1.3.0 with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 63c9f6d0..7e83f406 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -1,32 +1,33 @@ -name: Codecov +name: Python application on: [push, pull_request] jobs: - run: + build: + name: Codecov runs-on: ubuntu-latest - env: - OS: ubuntu-latest - PYTHON: '3.10' + steps: - - uses: actions/checkout@master - - name: Setup Python - uses: actions/setup-python@master + - uses: actions/checkout@v4 + - uses: conda-incubator/setup-miniconda@v3 with: - python-version: 3.10 - - name: Generate coverage report + python-version: 3.11 + mamba-version: "*" + miniforge-version: "latest" + channels: conda-forge,defaults + channel-priority: true + activate-environment: anaconda-client-env + - shell: bash -el {0} + name: Install dependencies + run: | + mamba install -y nbmake pytest-xdist line_profiler # add'l packages for notebook tests. + mamba install --file requirements.txt --file requirements-extra.txt + python -m pip install -e . + - shell: bash -el {0} + name: Test with pytest and collect coverage run: | - pip install pytest - pip install pytest-cov pytest --cov=./ --cov-report=xml - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4 - with: - directory: ./coverage/reports/ - env_vars: OS,PYTHON - fail_ci_if_error: true - files: ./coverage1.xml,./coverage2.xml,!./cache - flags: unittests - name: codecov-umbrella - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true \ No newline at end of file + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file From c93e67ef223f236b4a51ec02e7d91b864725fc7f Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 15:29:11 -0500 Subject: [PATCH 40/46] Update cov badge, related projects, and pypi index --- README.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 41fe8672..74597430 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Python Software for Power System Dispatch Modeling and Co-Simulation with Dynani |---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Downloads | [![PyPI Version](https://img.shields.io/pypi/v/ltbams.svg)](https://pypi.python.org/pypi/ltbams) | Try on Binder | [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/curent/ams/master) | | -| Code Quality |[![Codacy Badge](https://app.codacy.com/project/badge/Grade/69456da1b8634f2f984bd769e35f0050)](https://app.codacy.com/gh/CURENT/ams/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)| [![codecov](https://codecov.io/gh/CURENT/ams/graph/badge.svg?token=RZI5GLLBQH)](https://codecov.io/gh/CURENT/ams) | +| Code Quality |[![Codacy Badge](https://app.codacy.com/project/badge/Grade/69456da1b8634f2f984bd769e35f0050)](https://app.codacy.com/gh/CURENT/ams/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)| [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/69456da1b8634f2f984bd769e35f0050)](https://app.codacy.com/gh/CURENT/ams/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage) | | Build Status | [![GitHub Action Status](https://github.com/CURENT/ams/workflows/Python%20application/badge.svg)](https://github.com/curent/ams/actions) | | Structure | [![Structure](https://img.shields.io/badge/code_base-visualize-blue)](https://mango-dune-07a8b7110.1.azurestaticapps.net/?repo=CURENT%2Fams) @@ -48,6 +48,14 @@ Use the following resources to get involved. - Try in Jupyter Notebook on [Binder][Binder] +# Installation + +AMS is released as ``ltbams`` on PyPI. To install the latest release, use pip as follows: + +```bash +pip install ltbams +``` + # Sponsors and Contributors AMS is the dispatch simulation engine for the CURENT Largescale Testbed (LTB). More information about CURENT LTB can be found at the [LTB Repository][LTB Repository]. @@ -63,12 +71,9 @@ See [GitHub contributors][GitHub contributors] for the contributor list. AMS is licensed under the [GPL v3 License](./LICENSE). # Related Projects -- [CVXPY](https://github.com/cvxpy/cvxpy) -- [Visualizations of Mittelmann benchmarks](https://mattmilten.github.io/mittelmann-plots/) -- [CBC Solver](https://github.com/coin-or/Cbc) -- [MATPOWER](https://github.com/MATPOWER/matpower) -- [PYPOWER](https://github.com/rwl/PYPOWER) -- [pandapower](https://github.com/e2nIEE/pandapower) +- [Popular Open Source Libraries for Power System Analysis](https://github.com/jinningwang/best-of-ps) +- [G-PST Tools Portal](https://g-pst.github.io/tools/): An open tools portal with a classification approach +- [Open Source Software (OSS) for Electricity Market Research, Teaching, and Training](https://www2.econ.iastate.edu/tesfatsi/ElectricOSS.htm) Some commercial solvers provide academic licenses, such as COPT, GUROBI, CPLEX, and MOSEK. From 2cae39ae35b3076d0b4c3cc970cfc2070bf85cbf Mon Sep 17 00:00:00 2001 From: jinningwang Date: Mon, 19 Feb 2024 16:00:26 -0500 Subject: [PATCH 41/46] Update doc on input format --- docs/source/getting_started/formats/xlsx.png | Bin 0 -> 171220 bytes docs/source/getting_started/formats/xlsx.rst | 19 ++++++++++++++----- docs/source/index.rst | 6 +++--- docs/source/modeling/routine.rst | 9 ++------- 4 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 docs/source/getting_started/formats/xlsx.png diff --git a/docs/source/getting_started/formats/xlsx.png b/docs/source/getting_started/formats/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..d0389c44b911629e6c6fe75cb91fba81aa901fb0 GIT binary patch literal 171220 zcmZ^qc{o(>|NoUrWlNI8m}E~zA)2v_B_W{@m9>y1`^;DeMY1;5nzHW`icDdQeH}w# ztl62d?=!Zs|EBMC{r>yB-Pc^#xy~H-ea?OE<@I_zpA-4WK%4#i)$>eDOzgTk_l%gB zm?=z5Ck4))VVp@*4F1Z*bpEH4rsgAEP0eeMyxd9L3On{V0IqfS3|`K#EL zomm`x`tf5wpvT$O+Kq9gwIB!CIv8vY>LVrx-eG?8t(7aX$L2IsPuLLo5md$>{_rM1 z@zk~HtP^K4J#o*jztYjUpyrZ)Tos6mZocl_@zQ8%qVBjPzm4MHdE$-61%pX@&t5K7 z)UOJQ_`Cc}CIIrF^(X1%X}5PyFGbYfyX{p?AiZ4rhYrgc^N9Bmn~XO!yYCY_3Ss_Y=pzy$K3mE z2SjA~L#PZ`+4()}R6OgeyHa;7@%F;i zxvZoPF}|Ap_R93vO+~?p5eEe^jmt9a+X;U}AF#%^Z1f)39eqo^HT2hITCEes9>4P9 zy!bV{_iv#WPC$N~HmGM^c&2u;`5Mdm3EGJL2JELeZ*%(vXC08{3rlii~Y zA0uG-f%8O8wreNP(_%9@e!W$_b>gy4KB}I__ayKFQ;7QAh!c8Dydt4+kv02Frf(;- zGEcdj7*QAf%eoy3@wg&zT6*%*T^3MC(c~E%v*1a|E2m@{&eEA$h0Zpr+eMr&(1gSZ z*>MbMu(bhbZ$mO4Nt}raPq-!|^7ect;?X&i^G`JPGyUhy=0)Hfc(yH#ova|oEB>s3 z?;qbfm*4RG2barfIU6y7v*AtAQzCb{J40Eg^gT{numeLb{(ejL#m6uE9+=!N6nOH%`CeHT{!zsvqduuVarw*oTD_#pj%L50kduG3 z9J0-_6|<#Ci1}A=@x9Ae}-RnRdsdOZE1P)5gRJ$dDyAX0txzVffRpSW_{wc_dxLXD$ zB3HS`BBq)zk*~fyT^jHEmL5SjVEh?&K6A@TRdXw|2pi?9)bl#@%FuZrB6l(Rl6FFz zLcFuCgYJ&*TALk~Yba4buT#wZ`e0&LVn!Ua-FQZNW{9S|`-Jv{_J^i8V{Lr)lIHnD z?7IYQNsK^_1*Y2Qn#2{!AD8Z)m*OeBWN>3sGUkR6kL#sSo?afs8-ga)-|ptVGnO@? zJtj-?+*mP#l*p@TJ>Dv~c>|3{`M>dh3(;xniE(mye*XJA@6Q98{EtnI%FR$FollC5 zRKMSRqF!*N;K!356NMsyCzVCCXHWD#7POmqH1oKB{D~~+%S_u_6Pfjy4U=z$8sc7jcEL6M=5XTmwD++)#6qNN?`&bh+d}(u-tg{K)2eK9^aWPcEkR-eUp^ zKJvVu*A&*$qQ5LDo87JOcgr|U3~`FLCE1YN3tsZsRSsZVXk{PYKKa&fS_CR`AK(~p z8esVb9F`b5_4iwu(@($GuU~bPeaF_gYL{=6ncELK@3fAOrn}b>j?$U?U(`1FhjWCN zpbSti3HJ#v#F;U^7)ygdwyVPLO5;6=e3a#x>h|5F4RKy=vaf{bQ>~t zr`7Alcbl}W`+oa=ya79OiQRj2lRaf>|As!zbsa#3t#|AwEyYqfHzyV+2m>!+LtD%7 zOqe%3C(_>L*8iw)ug9prQYUAY@2(%b*&UgMKDWWC;W9<9ocbABaT>~Tn}f)<>nh~^ zqOGwotV_dHgH@xd@#_n{CXV-kXLrs|2prvN6w$ay;?j+biT)NV5KTkf_>gelT&pCa z_G%87aD>x`mX`ai1I;K9?b)wDl1-|n#pBVjmeyz(ueDWnsfa6aAulN}HIG2PO?^yd zq11VVfcsNPr@R}B-*JJWt3vk^=7>@h_Kh)m-oad?TV!6OrmmarNW%L>m4uE&>vK;- z9yFv}I!>yQv@K{TC@bK0dhDdXK;NWqCTfVjDEuL(sU)nJV`c}saZy*!QntbY6~Wwc z=h>qH^0xt(t47xldJjdQI(x8DSfQ6HDB8mNrrB+?&m%RXF1zn%x;Bs-K}792*oM-1 zIP1Wr%@Uj9zZDmsfBAv6{diQ^_$0LG&~)&-P_eEh%=P=$a8KFVpw{=-QhhfpEbp#| zPH?ho(X`0fwOhqYJ4X>mkJoLx&Q!50DI%q2d8{Q%L6S1N*!U`HyP*Q~$$@;Sq^EJ$ zE5e_Ea+`{?6{BN|rDeq?rSc_kn~?+8KlYngGInPK?N(>uW?k#U;u&ri{_FbJYy_sE zQ(CFcM9gfwfL7={oLBj}skn5kdQ5T0chzaMsI0d1 zV7bl-KWwDu)!xs^&z*h!{fFsu-sgkQ)=aE}A8ky|p24a2+(JsMc7JFZ4>#wRzPfX# zK>nk^32hN=tAne@OJg~2wUtn}QFjCtm1~zyZQb*f>#MHz%N4EE8ot^)93VSsr=9Y8 zBy!?raFI%0K;hyq+QOfe=IzGqNI5@;`(06;wGcGiEz{PC(6m9CbN2x)FIQgho$Aq= zh@PwZZ0P{1w1gmrW@tpI7%6EpK#78n5#=e#*4A(Xfm!;lnCkv(t8>Y*v*Zrrvb)wC^&mJch9GH zA|)5q(|b66IA++Ct|~CeQGFo16e|-N*45V4p0T7{0>lC!cb1iql$LDXP#G;5f;G=! z0e!A`P^={OcxKmZM`yEblAoFqS;0S1P*)V_eq3uSZ?{Pd-{hp&wgCH~1A#A*i+ciF zySsF(3{Hl}TEDJ5ko92O@p|A(jb<)b{(}>jdM2CiF^vzLR70J37Fruzx8rU!3!e z3U`6PtG?q`y=4bJe#bvq5(~E{GY;#R-bJ2y;}--|U_`NZ?Vswt(${CY!8kt4bRyh| z=@jGW1mkm+@nHnJnJ54M8D>f*^Z!3SDe&)0`rFhxCMGo|-FxaLz9*K`&W)C}92}Qy zTMj$PBxOHQG7`axMlDatJRTa<(LJ!!70tENzi}@Qi=XDhk#D3A$NAIMt)ns{(QmkJb3besP>xu_wW=r%MzE_MtC*0Ufc>CW)RrW{Yc`3U*XBNuw zZdWk&d~YP3PKh-q7$G;k6mkbXL}WnF8cn* z!`J`*qqdSlJPbL6_w9dT_GEwgry)l5OB;AD z)wopTa1_=B_$#f{x^Hg3Jc``-!#twPBj`V$wHSQ7Z~egS8U+g~>TzSK>H$X40S}puLug`4Z;eyIjrcZ{FX7v@vla-pCaULl)4wcRB2X)k-CU!-W=DwmI-wr>SyG1h7N&;72_iM09n@HEv$^A~4 zG*j2IepAnWrcj#Ef6b0oD055&2satB_}4b}Ls8qHrO#Np!5P7(X2$nb3C>zBl&Ui`3zqoAlMuV0-w z7+FfU!o)GT=ScoKalqH*d*6ZRQ*vv!Jf&i=+R}j;?7{}QfR5ehf1Z|H7G0@lcV zi*MfN8Y;}Mk?Ge*xt8}Xp~#)opSSsb85^qHsZD$JsJe+m32s5l_hYm--v?_$3|jJv z^Za`E<}FySc95~kr}|2NNNZ2=Rx5eJ#`dXv;{!N!9e6OwqMse_v%gYd)*)SCVOW`3 z54Ws|d##uCzgMb<-e+1jd|Fwa=c^8}uMj2%%-sRd1Qw3xzD;Xk>bsfDo}1cA7qoXG zgi#UD(CxG}WccFO2Yhz1H(a#}>@xpHu_?B<8Ls0KhgDXz99HvXynY6BATaic&U4bU z|9d9L@_kNHr1UzyQ5?1(`7&yt*W*}gobicWS{?mAH>clmY<(bOYg(k?w^hcta~gU0 zDRm-nXDrb5je;xxv;SDgCHOw$`OZQyHOsOcc9bH^d{u|e;Lt|pXL(}ROIBWQzk6+z zVqyhq6>v2QeULgsCXz0eRa&JL-!>@2!Kl-Yu){avCms%7!8{+W^!55BatNzQj=rs( zlJa(zaqWYcP={-1f`F?>2L%%!Ew0TEjSV$#Z%NEyck_FB$Lsd2BR9X+&n*jO@bjM^ zBWM2okC;MK!}qzDze#5*l!LDRtCYHN7njGlWO(wExT!F&ElQ#EvAlT~qn117d;oMQ zl{38bD{=79EWqZweYa|xm@m(~6)#}^!$bQY0aIbTCj2fxrjmg50V%Eg z4vJgyijwusb(wA?z-Ba1{HPSvHTmt4Va1o?ilkW5tM=$oCyoS>Pc9ra9d zyaAM|<9$7gY^2QnCDdwV{psv00p#_TpX#@LEoz2uk&v-kRQ-2`Gnr`D7GZFjc43$F zS6u7GF5elmQVCw$NL_{2ll`EU{!6iT1ab+`GS(i8RA|Zb73ob9CO$lq%3oQq0saVU zF1^xaJFs?mONAv#_+>$dZJ}H|qGi%^Ysvi=c-}r(zH}1{zFbR=XNSfnL8)TQ?HDr6 z*XVd>A~^T}@hz!%V{Iz@SdngnB#MS>uXz<`+WiGQXmyfIZ~x8zDM98IW6`>(cayYG zje-2k>a?-o7IZG*P~MVv4{g)AERmwWo$QP4FNx{oUC4WMkdO1KHZk;8DNc>q$V+TY zg`(pvG3U^rEr_+gEO-QzF^upd#CI%gC8)<5@dl)f96`(OoHfK20EagJ8uKkcl9aJn zq1ugmFbUOP5bJ`6i%l!waS`#9Rqm^t7OJI0YN>PzSrf+J2h*YKlzcn z*c+!u5byNRkiE*D*q9|^#^z`-qvc}!2v>S9dL=am%H52v9=XW*xix`i;@-0+Dy-T~ z(G67ULcEJMO!GAgoR3x6cAN`(DjsU_+^bw9krH{v}%!+Wi6$w1j)vAdcIAEFdZUT@O^o3b;xm zgF!0lb9t&gc(?#Q<^T+|P`!kvX9oZ*ys+ZHkc6%VlYCNV(nr)tyow{D#XcDs zA?~-!4cK3&!;X?jB>S zG;_rg#rjXO-i(VvEPe>}JYAsn=0>*e89b#g#m=o}Yry&A6H|4U0bW{uwg5!mk5SuO zGAo*Wv4>Rp=95%H2Q?FHT|TWiGvlJelD;Vteng3_Xw+3g1`+c!m%#c8&5W68dK9lu z@d_m5rR2=`B2+J7-~#!O^`0x1jiyr)5YIcqr!N&{_S)w#W@G}-J5WmZrnn!~Qgx>TfR+Z|~bE1nhHAosOUY1}XtMjgU*TdjLTyOw}80+XJH6tWkyWSUUj!|Wq z_q&N|%DJn5yUo4*^=tUC4B%@cY_BIlU!C+8d=)-)+Atca&Wi#JdJ0sg0x@@p9W34w z1y(7;hjs8v=uIPNk5@|exdE#0^#NMK(Uo!$srlROX6Hqv@bIrnhH%G9g{atcdbX~3 zneJHhK1|@tuk;Neb6OET6aJMI?cxmNBb~}BP)lSdy#XiFX`*1#TUz{L#q)=4Y$X@s zQ{md}oIB!U8T(9ze&B$Fg4eH|jTKJyKGia`y$q1ZK!uwSt_LJMuKBZa1f9`kk(`U< zU{@wAl`9M6z>QK0sz>0}x?L2F)l$OKJA)`oG(u%Q!=nr zHA=}A*3?~kwtFFkAZ}eO^?YP;{n$o4N zg&!2h|F+=QTN`i!Ia4_E3zpq}jZ<9Jc2^>xd-FLjyZrwy)pInWzhx$*3}^w_lcd!v zrhWyjzZjchX}jfm>-S+^a_16@;TFsH!QFb)#%S^Q$y`|kt$0Kx{ikTM&EkY>RZOpT zXzZ{4K#sfCI2+@boXD1yO3tBnk_CYZc{b!60sp8qi>Rfzm7rE-56NyFo(oF)xNEYLRQb5ZD_JhA_(}ox+TJi${L#~O zv4HjAj=qrqmbTcXyPzY-7m3ny>`}1_f(t5wv|ANa9Ory;XVY8gBnvPE`yAyh~^bjsK~p z+yGIT8=NX0VI|!6w}u0Dnf!wV`D(@8Z)_;sw!iz4GzrNIP+@h^zLfkY=p6ohwRz5bszY7;IO&UrS!jhZHI$sVua;*CbYba|}78*_j>XmiTv~ z977TipNAihAw)8IlIOvKdwbkK9paE1jHXP)Y~Mo{HwhT-b#k*?Vv5pxrkl1zq&_eD zsCEQDSa=_64P=20r%JoXQh5Bo`OB$I%9n?{4K4-9@-r@Neg0Q{U2xq87u3vx7ivBdi6{;TRv3An%@)pJ=k zL33_<#9hX{Sx)=C=A38J$hBL94$_%2;fYl}Pq1{$5)yL+^P2MJ|1;xT0Bi|& zv9xd_Q1hP}fp^Rau;a!hJL3sAXv^4pN&+nTAd2PPeNQlfWvbG}Ifs{1RqOUF*;$Y6 zcw*Z2XrFwiJMMDZKJ2ip{l$n7nuorbC2<4$t# zr=IwL_l?p!g2@)tE}b>BA0_A@=?8H^AVI28APIo4B_y;*pl8+L(_^2OLiIo&xd301 zSU&Vf_vY)GDlayUTx>el^ZqPLOI^(vz-*N))As3qICY+z~NHTi0SS^y@Ye5$9W+%oY|;ho6GU_GsV7b*Q5c zQ^!)jxtx#$AEu@s~ zFB*E!n8Oz$(lv;cwH~_{?wQdF01Ik9ev8G4w8)=!Wg+|X0OP`nVh zFDn|Bf+PB>@@G31;Cz5W#x??e=7^Au((?z+;kYpf~N$ZI@Ji+>0?nDpT4ozkcZY7Tp84M7XIFme+@}6_Um7=>k-fuoQFgKpBGZR ziqSn|sF80?y}l+s zelEsqGn#lcBILVu^_iAmh>h7i6X|fYZoYH8H&{n@KlzV$_7@fvKi>yy)u~MHVlX-Vxu7?7VV9qOeGdC`r>a_lgX;;f z3-?2^iq17YttneC25zxr0go$=dT1iH`pwJ^K=beU-L9;>sIUft2Hg(?IjOI&Ey4*b z)cC|dGxJm7z~W*C&Hg{aiF=vT&tQ|vt0zv1 zW^vFuII#N2%*xL`^251Vq)qooDkP5Mhc2j}KNsb?s~fo9tGqcizyRo-bHWKc4-sdm zY3=Q=Sgt?n-9|l}tY~Rf)ZUDxOI}AoYgZY_d-0!A!GMA_2B2)pG}MlVzw!i74;4}d z;>1e-WjvE?rhgsP<%9*+baPF{I47&9s8qtz&f0Y!-mYw6h zoih;|6V?|AJO!N(W+)cXq3&+K7&?f_daXd|O!;Hm8gUyE)%M6W`?=w!__$q->;=vo9)Ef3heFoCeszM%B) zT@`f&ZU5~5*AkuWO)KmzY%CWulF+XJzV$38S59OfeX?Uh`u0ha#tko~`V4CwwS4M`*R zleB?jeg!9M3|(R}Hx6QvA}|3p01LqiLC8&jgt zVPJ4yS$#+7IR~SeyIzecNTJ?lG_*n#nGv`h8JLykJzOwskG2%Kx)yE03Ed;b7Gj`> z3;jp?YZJQ%m#q=1_7%GK4eXi_*Gu*BWcf$a z%ZxZ`gJLc9gL8^&d4bhl4;uBOkp7}?N;v7gUDp0>n1K1P_C3!IR7d2eMvI%+#9p-W zdY`f3hn;$Hl?7eT5LD#wO2tI2|C0H{@a`_QZz6N6wZRuu->06&21qVA+OQWt+}i2S zW(5gw9>qHx=R#}X07hik%HMg}+=a{OKpY5YyzpnKaR!PJ{-Rtm=3U18jKB!7X?DE}g3+6AvO|Tt z%GMLm)wxSk301)}NE^+Tz&S_yM|L{OIM)4M=tG-(g7UE+{hxcO8uRt1*by7{$9HO- z8FJbu-#I~0ja6x;#1JZ8D0%4yXM!i7=5&0uZ($DeAJ@Bv3dRyjl4%gR2^IkSQA^F* zWGLtA-?{Hha^%Ck#8hM-gKx9q!L_}NM68*6%vCKhmHZ%!KFV30nbOmYHe4*=97_DA zx#0J$lLd%B1@VhBxPieRHNdyJJ!R9^QYZVhJ~GLD)sGJ7HCfSHs9j@*~4J7tR?T-T)0HjW)8%2xOdoc)w;9QL@B_0|WUYHeMyY z&M9b9l%+`plOs_vj*V%9`7??NVRKrlM#+O=9ohyge8U}7hmZBK!3UHm;<@wkHNT?Y zty^EMn+Hn-7gI`csQG#io_kO(AjI8rfSMYcw1!x>P=2Tb3|KBLb>CcefGQQeT(`~LEzr^|&N%)jAtKD20{CO(m!*fI$l7&<12j7Ii7S53zh5c63bu8) z5%gGvUKc*65wU`*5Rl4Ho9g5q%c83Rc&`Oxg)9*2;}KMkEaA?u!6kJ{?YqI2>#E&{ zQVI=U-IdyfOXzmy3e7N8c^)F>5i;}Op9)Ns{(FK&;KGPLXp;Ks%4aFsh>Rgk(9nQ4 znXJLkG}iD2%sXUd46BbS!E&ylQ)x}W;podb6YYEDZw1jVdEKtja|-X2O1}51u7U#r zoI7hcm-G4MPYkm<0t9g!m%=-8_nNO&TEr9-FZOr_kWYuEZCE4!ulYIQ4~#f-4TtP? z>pU%%2bZ}ZBQ8@_5aadM;41nh_d~?iADjy&NL1!CC0bm9FZOggow52DN{ydf-_~@9D2ZFA6UOg#}o+b$JdMIQ7kh6CJ%ghn+Bp=3Mc=FHYSHIxU)m zvom{yPcR1f$w)#8dan4GeKVI3@JRP(kEzrB|5P|f`Wz9Bd-q}t$P<$fqbAEzk(?DkVSz@lru{gm&u z518s)69-Krtmfb_`5}ZA6t`&<5q!jOQD7Gtwv~u9gYkTm7Fc8QHLpu56Ov)#G7pIe#8;Z;mBm(sJ5*B##%i${7K-+WFv$1U#YIy%~ z%>6IjHHq(E@-%xx>DO-Cbiul(g=hR~K*j1W3lcxNs-rtd${MyzRDoZnFS4ZBaRbY-uEzuOv<$Bjjd~K67iBSD9qdY~0T*03){t|R(E2V-l zHm8ZFAd7brGY&*na~e7#dkvvA!*+@KFYDB>AqCPySES)pByT!{^$l&~J=BS8CoOqX zpM)};4M>Z^!%m-C*t-Igpm%E5a1T)#Jzlguq9OH^<)G8yWN}KM z7vDdnW#Dt+`OcfwIQ-yTuxkhB<3{vU$lmG0~Z8bGpgyzeqNBkOF z607G6=Q8b(a@r&>n&fxga$vgM5e;2u;*jcje`|l@xb`G3AQ+{%ixzkkoUntRHW~p5 z*O;^}9FiGidCIDO@!I))u~fg=FP;gsuQ{l~f36vm>LN=9aWx_OO&-l*pxcICEoSCvSwc*KKey}UO9l~{G~eGJ8%X6O_2BOLOn@!CddyT>op)N2 z(tpm#qka5G+#c{fb02W;eBsP)jurpho{K;y)@F9hI!aC~P4=AFHuu7Ul@hoOw`*$W zv!h!-%Kpoc1&SEE=H#JPMu~Cy|vBtGUO9l5n0}hMaa0xIml=y25}q8hA?=8 zq~%tUIDR?r)<+*zse9v$_{H=an+?&w7#GxOh7wb%@ohSo-LLg>fxGYf|2Cv0KnP8MyIE(H38lQKoXi<1?6 z6_3L^%3tcNH2PRFb~=A-lVUdI*N-dMZt(PO@vE z3pp!CQKUTQ5Q_kyo8FHYxaL>?0{LC@Zi!WW|49TgHe+nzNxa{V8JFQSchPAqWb!y_ zJ8^-(X8D?Ua8Kl^{VvzODf&C{fDi-jRfXUB_ZYYYBU|{-Pv!aK6vDI}$w(Yy5{(#v zdBEJCTh)C73|dnJ|ACfrHfP95-u3n!6fc1<_=Jt7z+i?~YvtD$)Yn(XV=@Z8`2EKg z-IrqN`u+*(;ffS}>>+I$xGN8G)c3wrw|R;OlR5IWNmS}{>uG@HuHy(5qhW5097O-Q z?-Ca?lc)bn*meiF$A?iM$aZxe}r!E+5LT>&HHKs8Rr7l2e0D<&;}g& zlv8%2D%6=YGOb-ZMecX#D)_>Lkaw=k zsH>iWb|^Y$!|VMRrDihJ+I*5XqP1ufDQDo}^ro+-0V&-1n*^7PRX%b=?59>0X=TS;;`Pyuh>i7e-x)EJzQYA)@+18whe!&;C=arSX=+m9{Q)A5TlR?G{!ISpkKyulzW|qFh3GY+VvLj)4zXRrbhm9 z|7jl1t$b)pSjAa}Qi2WB_#R=}R0yixz{X`JQt6w0!rS;n>z# zETwo3PB1nvWZtzhIXqeMv5ALQIVux517EbWi%wL-4KHm^iW%hsWb=x1$W*u zT)dDY{K=}QDkQ^5fYw-0E0HP=eYj_O<*MwsLIrCvx!kDQz#6XxKV=EM7=EN@Z&Vef zeaoTCwW{{uT~${1SOpOzv}xZben&W-gy?m@7vCF^56{-5INT0Zou*#Xz1 zn-$hWeQP~EJ>iK)AE)XMa!nwz^7a^1bT3M;++Nc&o4HfuPDYuP&lrOA&;Tkcd#r0( zep>WKE%H3X62j5K3s>+h5iTzC#Sah0kjeQZI zh;Y^WE^w`U*S&qw=KMCL!#<34c5`YWcI^dSFhO0i?snCnRR97qRh%-cx0HbJ2Y`m$ z{-Si{)2!9nZOZNJugq@l4qY8Tbu`HWjc|2HJOi0V%5|U?X(}#xftu|@8m$Y(iDWIXZ1PlkBo1Z(|hmh2le{)_!kz9PLrJpq#*9JpA=74A26ZC@I_h- znRJ_RXdGbWQwbTJ0WfUuh;uV~SdjR0K+?BsUZ^U;42d5HasBGS48JV-qN@U&l57(x z==~)Tu{{3EO^+&hkiQxm3;97q~mcV2i?kx z;j>+)Cq3lwH)nM7v=)r7>jRmbE@A-*DVDnW!`lA_dcZzf-|AU@har$wBv(sdU?W@4 zQTu=Ve?+#aOM=>i#7PrGGeSXw?>2Tj&1z{MJInq|CUreExx^Z0OB@JKwr8;qxHJv11zdb!)FJ!33X0fMo+ZZ^%!C%W5 zR{Eb27NYisPXou}CiUD89JaC@RFybt?_4+os-h>ncvP!a_T+D~v?4#4OFh0-#x?D$_QI#=mAj&@5O>74)>PKib3h0Lw{gj9_{je+#^LlMa*g8Mf4$*)4fjxgXmMZ z@Fw4(wLuOr?)Ye*f>r+H)b)op$;|m~#v>Y`p#$rCVHc-vXN>4PW|)qZt@b(JUHLm2 zzx0+U89a$p@uY|KpMoNRu!!G7TJh5{!$k;r9=y9-{sU z1qE^7ktmtugSJyYM#Funt_x~+gS)&)F#`Bh9Yl> zr_Z;C&C`TbxA51~#GVmz6>@U~7?3$HRvEY1>?2XTbQjvPG`%=K&$-xyFgosY>Iz<~ z!8}JsPIX!ho9_Nzh#rV#!#byIdhI4jqd%rPI>lfIOE}Ri4r*;Sng6g@ls1j=WYo89 z({u}F)p@u%0+QglKiM9=o>YS06pcOJou#~Pj}HX4OhT}U8bmcSbM2gxeGO-8#BMw% z3Gm>)eAyF7l->bLqsYR`sj$e+Q=&4J0!iO|!GK-ZGh*a@OE0Xb1Ydt%kw3@4kk_+{ zfUYs0Cwek+UdH`m)`#@^j03iw`z?}y#hRD#za7aMJ18YL*2EJXq25t1!>=7eWCn@$+s(I}|xpz=l{DB&yXhI7VYf&UVoKz7+Vhp)5Vl6$1uXi1uq&7+6E9 zyPvw0wvYo8XATlrWD5>Q=TsGGqH8}qzu?&_PtxIZ09AfAXlX%x(aim(*HOLR%KST> zg+89wW1j5`I-Gz7%|vz#*wQ~c&r{dXJMQ(31T-50BdIzRD$ZEXdtkMW37+YWlGAr} zK>g^ONa{O1ZQ1p-S>N`h`LhcrX83OpeblGk)4nh7@!+4mYuM=UFk|@BC#3w)Z<@xq z1XfB3o1#IC1f>|D*)c*g5S(wf9W$iG&$WH>xZ_N6K`bP=?SagPCkl35OWny)F8Q*5 zy90H$-`wbdB~$cQ;y#E;?6>_glcG+(ejS0{Fe7Mk@5&dKx6B@sNbR@KNh*$l(H-); z9W9G^h7|%Oc1#oZBavXq({^2c*_8$lU{zo+eYMH6Vg~PKOpB7@I2FFi(!*;KukrrA zA54AIXy3FnnO&uishlwx_XAthHgEVdj02bsYk;Bm+hTEl$C_@Aq*NF0E1GAKRFRZ+ z2@uH=G^3kuEiuv7QS1^W4w21%Yn-Y*7QA?SrosJ2fh(~cMZP%p0wtcj+>TnhGgY9< za5|^-@Tv@ie=1iLIx< z>(;Hv1cQ8UqB_KW6!_i*nQ8lc=>sY|BK+EjRVp3}_+$FEbn0pSJqCwQaRMZx1%Syf z)l5CXprABWtiCec$#WN^eAbyRTG#V2m2lP&&XB5_OA-xN9;k*zu_{SgIVdrH!r$RD zrP9f~Ft}@GKAO+4YA8E0uC_smA1A~Y&-c8|*brBld&{{KbAPeYMWzbNNZnX>t}yHh zeY^((`u?3T3kH~uVo1rNkiI?gZL6puvAxNnR2uLG2fV4`fq;!WMFyzo6APpkjB`Mt-JQ>w`&sXo zcRlx-Z*Vwg&OV!K@AIo`r0sS`_LqvvwCTUOgFJ%vMExVmL}$l)5Cfnu5dnnRgTWF- zluOyGKUfw`oxk=uwXMV4T>!9H&qpJXz9)WsXFG?$M4?WWyd*aqpgLU|1_2oY$YF+Z z_)I=rh`1NL9VE2cD1^95Qs~%5= zCF0dV!TUb*>~${E^!B2tnH`6EKsTiI$x#_VH|U?+W9pP5q#7W~K)u{NUQu>GY{~Pm zQ)?IunSQL_Mx5BzWYF)fcbLa9JGOPw64R2k@ZnB`q9*DBOFf~tuR^rY?YnLts*{LB z6SO%$k(<~sFN!ocn~b_~%D8P1N1+@F8V%?TSV@+UAJ1|PevPHhv4|Dfsp-2uW?oP~ zKx?!H7063sgZDuW>%&{K=N|OS6af&ICKdbR#CfoIAM*_PeCwyG*%u`2MN7bx1UBmg zO?u?O8TI>Er(j!aR-2JoP7HsrOS#;oDqHr2Z-Lv{cDS+vcDIe9DaQ%N8YqJm5mJ3u zPpQQ6uFA1)Cm-%cgQJkl`7!ss(C*3Bkyk7U|HNL*spSF*cFhPiPwu_F=($iFBo?IVuY(;I#*H(H?k?c^Jp@VlKDtgxXl^eIA8{iK<0z5mOo7Ov^ivsF3phQMuH?^nvL}i|oUOKj< zEs3UFCyTU~A-%3#+YVWPis8S{9q*QLyMDX^2ng%8H;dA?_i1%>67^#BqZN;H{axBB z*FhJFy_9zArcE1^^*7|h#!(0051L2okl!?qH*TBSPSzK$psA4GTR2VaK$rbC)2yCM$S`E#I!sz6-;AZU3WCA|MeVycf_yliT}TWPX8yxmv}5GGFu@V$5pZ8 ziwgf@>9ZhJOgh_YqQ7Ikx4PUi))sj5%w>cC9FyjPRcr*Od?JXIJ~3ukl);0&h{4&a zN=o0g8*3wMZP9|(p3$j3v~3V@W#%;MBMw^|ILDlTnznehj+J8jo@!G7G46j*m(v21 ze|25dvMZ%U2JEGQ)tM5u<+As#Z@o|v?(TBE*#r`0AHlLOkD|`dmMH@il&g+3b0x^^ zg5TRx!7Q|s<_aLAviB;2PndTEvqj+URY;HDs_wtRx;X>+&U*3!0~^2sE#o*I+j99o zqO~ut>BsaL7~p+P;sc=x|I}37i*q^JcJc%@+-T358@PUX zb|#v!i;>qS%vSb``kOBBfbIC>!T)nL7tkE|Ui&B`0Gw78)E>qAX zRi}U>G)&@rw0-=F{u1h6jI|`sj`Z4k!7VZu6G;KpvK~jzkzea`U8x09HpkpzRbzlT z>km`&s2q75J?ewu=vj~=Y%hdGJeZ5MX|U^}$;@y3i5rc>kt2X>k7>oUrvWp-#TzBU zMPtRrC9=8Nxc6>XezA!TIXFJKK_ZPpp2{g7eqS)ofNtVEiHm15RSY-W8x$ zW4zZWq7NyW+92ak)%ENYJ;t-S09j)bU4xmNTgr~VBDS8-7w_%gdLA2EE@KfQ$C8M+UdTSQvkkC=b^?bsxb0hdsLRQ6GIh7Rmlk z-8M7x9$c|qc}$Eyst`O=s_v8ejPAZH!tlF%S96)sJ6wD8nA3-maGt$jIHdrr0t*xw z+waN;F#%mRWSepOX9)BEmj%!k=KO0*h-&Lm9!beWBH{6GK!t$*f0!5{dbKJL&i3VJSD9J^`L|K*l8(x5(vf@sAA_W)57#JQc>KlUE0y zysT#Pxft2@J${op8?;0AjBfvNJV-bq9B|*rQrS8M6JpS%#J^`Kb_C&3;n{x|rVRF~i8gNNW?8h1#Y!i;Jr|SA6MA@b*3Q3d zW(jiNBMc(oxmEK*TDOlRaGA8zJYSHo*h9*B+c8$VD(yY=i6vZm783-*tq32m+0@Qj zrYmXxyuFRu09?;Y?ihr>gIT_=TUEh!nv$GZze&Dtg6-TKG?%CFqwf7-0iuR?<9G81 zT9z-@gf%bVjE;x!o1a7V(rmYra&`XWgqsIx4Q+|r9BA=cX?J-QO5sS_QP zdV6U$J?N%77dMwYM#J(c$i#qIOD3L(@(|<4 zkDcK<3%A;fG^dfG>D2X$F3DR2NwowHnvFUGEYGbwi%H)pMKe^rR)1HQ&ZVF8eQ00# zLEySwO?GwB{-9r4^^d)}aw}c%VQV$K%L(jy5d#z5DLGV{&5Dhk3(*5K55^?|E=~@H zkQko%FU|h6@~qbf{x}SUTuqzMv0e$&Q$VX#PBW1(Cb-s3u1Z(B9WmOBj9U1+01fQ6 zZhY=A=*fyOWVAY-i{NA9y zP7bGI3b5_-iOc$yt6|`77VMh$fWvJJZ|2$3u{4h(>L!VM6>KUt|KCRD|C?GMU}?07 zjXW6^v#;I!K_KMGvG~7dPW<-&riYF6LV4_7wHLbzujymibMe$icP3kAeDwxMu5t!I zjzX4w3rO3_>wrPW7hWQO8~Yr1!UykVml{zSvaI`x$?SP{ zRKNduk)}N(aB{U+Iq-e(bm=BjP@4kmQQIAiDe8K=NI4UzZ{P9#BFx{Wj*ehD2BRx7UEscf(z^)Ll5vgVk zoV$&MDM`C#30dJy179S(Q0mR`_hnu9^|USOc3hFWl)C%=tlXErdo3=`drQ&q*@C;L zh1-1l-JX4AIv~TyEHK+;F8u9(^bZ4d2}m3#zX6ccCZGFmWuN>tj^t%0mq$??;V=Ig zKm#<@ynI%+Z7F#(SMs6%?gDPeSvPAkrDIb{DMYFF(zeC}V8w=0&i`fyGk91n>Nx`l zYFWnZ8mrcUJIu42y&{^hg673tAs`E4^nMRhiUF+dwW7!f{$jEH22%^cikf1;Pi~|{ zLw#a&n}LH;FNfO(Z*MLU7v4Yh`Dxk|zf;y+28ep^HPFgYCTUe)i*JD)0xt{GRXxUI zZV=S6bBL7(`HXl5O{h)g4e(g4i#dvNY>4zyLdEo!!FIrCd`9_BE`jai| zck%7QTv00Dqj1CSdW;gPtV8*b(6Ho&?p?t9{ufA}XxvURjSBs4F0xcL$VHoYq5u`R zJxGRmS=0h|uc2#ODc6(wMilmjKd(YpSLXXm0pBBYiwEbdT{?iz;TzNntk)GfUR<{^XWG&ktbBKBr67^uMS zA2x*AMa&nv@4m0cYwd%ouiS3+ z_b5ppogK9H<96qPbt8Lv9W^xJ*6_VAj4 z>w_2thN5X81OgHrtLl^Oe?$3K+y|hqyXzd69HY&CM@nasif2SG@)L`!krwr-Qe>Q! zSoU~6-}4>|H&6$celj>onUQsuur^!uPZWzoQ)CFstqkge0=4fN7#Cdg{U^Un{~f6z z40_Kx?tan5@RxbcD|j{-?gDe{bK1b5Q0tcRR2WAY^>?tn_-0ms*|(38nH5$Nhc}$hJ9R=s$_N5rZk=&wx;)^=)URkc?3+Gw7EfRd;RiuId1r_kul{slS}! zEhR3VM7@B?dHX2Rx|jVuye){%f}Z^19T&e?Bwy(1F3Iq$Nlc4T^ZF&`*v%-)e)_k; z0-eUwb0Ui*Jt82a!Tm6l0O)&au&-{A@P|d6qt=C*dofhI_fAlFi%ai;3hbJZ+vIXO z+U2Blv@?pO>k0V|f=HnxIJTIQ;brOQSDT;_g|(nmFvpvnDB&hV?^^?e*u^Wk@NR=irjPlt`s_(}7;&b-bP|l~JvyNDJ#gA%65#k`X ztbI=qD{cDuKvzg~MP_2u!{GpHOYCh3W+ce}+rQb5OIq zm;XDTcL7W%vAP$|QB3Jb@q?C=I;czqrD!a0U0CU1R;2JA0m(njO~0ONAlrxGtU=W= zt;@{91}L9VEkOB~JPx50-)GG}8CzYXjfUPqTJZOt_ws}QW9yd6O9Jw=k^~)-iL#Ov zFtAYT=t-^^n{aFgjeIL{+J{4sk)@+sQ7)&`!1gaBSY;Cuw1iKe53Zgvd+n7$W=et; z_WFE4)rW7|T4)cY8f2;@PS`D*@~JS1W%2{hNVO#4OC4hqi42rzUAEI4ek^6>u(99M zu1f@oFZB)(vveUFOt}|4;OBoAsLEy%VGOO!yTO3f@mNohpYJ@!jZ!g-yh#FsJ;-$wt_ zWU7IhZN2+u{E(@cWERcq03(j&Eagd_#SbXZ)Fz|cTJ!g$y=Xb`xo9pu@Ir~jFkquf zdGHo;>}7{6Gre6wk{tsJ4>!IK<#N7}9@K%o4GofE4-uB2To-`x>~_M_p`Pu&VHNg8 zO!WEB|ES1N#NrTqJz78zPz_wqHmK7oBGOa=535LHZ;VNSxm8(;-huYs#6)|&O3?yh9~?IN{u6Z+?w#3X{}JKsKdrWLeDY_X6Hq-6%8~Z5gu_@P-VC01c3WS2A$~RiPX4Yz zQZ76Bsdn2nF_y28PayX0gSt(SQ(EYn*&4W2?bnN5@AJ8WT43FlXK??s`BgCr`p2*( z|D|ci1B6R;9aUGB$8_QCraCyxQq&jJ9;T)^_UaOVZbUf3f?!K127cvL{i{jQq zk34yj_JJHf-G)V9eT8>4hi5ZuL`FAgga<`P{{j0HF|2DAH1#-LicOSowl6mVWptYp z&K0(2>=-YdmLjksiU57`f4Use!%m{Uy{%M;g#=E^M4`OTGxyfOyb2rHE%tDGQV*q# zr4~g!*_+1ro*hKBEfDHY&|*{8m@kw1-V8YC8x~9++Xn5yFcnLtTNlk5P9uq{NMWDe z8d8;~88%95Xh4w*`O*pD$G)HJ(ml|g@lE+P6G%xaf}L+X(H6p#3w`@2GshEU98AyR zYU$wCL#ZV@&tZ7=@3rJt0CM+b@<`;F{}mlOQFB`P6jMSz|gL)mzx!~3oSizK2lC>|qb#3;=_ z<>@>WjB;nx{3z?r_&k_Wma~jepW7p$DY9~9-{y_0USb>ZUQTB2fZ(>$OEv|<*=#U< zVJ4k~Zm304gr9|wK95Kyy-f^+$2#^08l-ocd#$slUR6TUMCjC?sf zRw>gogzVOv4`v^znA6@xicZAP*j1$~%WAvI8YlmLno#43SKVrm4u+IFnKr%EMsdO+ zKQUcVH}VPjm9nAc7H<|52~a;BJCDt0;%y<%yP4ZNc>JOV?`F-De%w00?jAU1|ENtr z_BDzlWuBDb6`8s9(;zREMCdX2V^ZXv*UxNK)hs734X7UnSNk6ZY>SwZljkkGVTzL? zmfG|3#N7k|*ZBIB34*G%|A`Xw{!vpA$-4%MIxQH6H4}jU9dSbRaZ_Eku&(#xF{7dm zo1Rb{k5RZo)7?|-OpQ&Dh8Owp7ny`NRq8RT-^W#s->heR2!g3Yu&Z|C@``MQ?hfW!I)1l1r?TFY%s$<86-Rd?BhiihB>A+wA2702M@KmQ?LX-eF}Vo<_emmgbbc zH~lKvlj*7BI#LT0$&rXP)XkAwKZb`8M!54xsJ>OLy_62`fm2(yG|P58HH1|1aL$4* z>B$BjlQ|!6nc&&CR%bL+9@10F!Ns?;(=?LuWkso-gq_mJ-NLu;WeV)gB(aq@_2hFo70(ha zotH7;GfjGL==}QfJ~L-2^J>KR7nFBhYFM19#3u|+#AjWE7Gm}s>`jRn!~Kgi8+s`d z+XBw)pIPT7*6g<=hXvQCR$AY#Vqf5#DA=v%!aK8uE+E3B^05=HU{%zhU#&KKGtUIRyfn^Mo-%1BBC?Nqqbg>G<^g`$U9%z(yoXo_4&h z;B0Gru}Qs0rOk>lAj+30%MQ4k`yfA}3#DY-n?CJu^2- zAc%D5Y3u(%pb<^)^1%f@!(C!0a#^z7X|JbO8`aj*bbvT_ENe_RHd=@!j*i~KZNl63rp$O_qLf>_Yl zK6-aPlJxUHZuLKP3!+9u)ybt2hjZcVhYZ&fme*di(*s@3-#Myhb$-aw3fF5`V$-I< zKTbzA>m;CNFg-xFB8D|XVNOpLCgC}J6d6OW$0y3!}3_bRKCDIikYz$ZN_j)546uicEv9mCDyMxZ$p@% z;z6p#>aG?O?9Dlf4bKsYY})j36&>wi1|+iX;P6hV#N7) z&_IrKwI~jIseW>1+i41%0_RZ(KlBw{EFXWVgB=eh?0KvuhP|9fVsZ__iv%vAwflZV zmfT*~dth6A=!w`L{?GsXe&Jz{s4Y8!39XszJ?7|XukR7=FiX5sOyOV}VHwMp89P56 z^^^W&s||Cj@JRVbVVC#wZ60cT1`#B+_>I(dvcK6ce`A_4l#|Gj1}BVqT@&N^?4qUO ztH$En6hlVDCI2jo{QQVW=PQ=I9FqQjq>f=+~dF zpUN!p`JDca&a87vl5Z+CRMez+HeNSwo%joX-DecU441?S;}WEH0K<%!iDKtV0x!2z zeV^S#r*x<5ez!dyyy~zNUc3>J+`_UM|5-PtQu^4GFC0_sj$t2fEusxG=;jrQ;Lg;R zud&mN7z=W(u*SQ~I!f{H&k^;-;eSz>?w2Z{x){$NEHn^Wl^e)1SYo0N>6KL$FYU2E z#)aRAymTVT8co~~fr|h9fNQX8-Sa}UDN`1KUh}&5uH-*q`RA38>kIpH3qQ1c15&Xq z^H|0+Eh+^Xtd4_hB^{Lou@Ogp<+>7*A?Z@)tj+1lN0o%1s`r!~$vac=-Hno8kv#Tx z6C~T~-grJECCNJ~g4Cgj-U-Si{ESn~2EO;&WgP@8aZ_5!G}+BHP_Y>Ia1lS zo*t1VbVYsODId#?8e`jFJz@EKD%ywYb^0-&vOFE>21H2F(?0~%`F^_6qy36sDy0?$ zmz7BrN>eHx&7A6x5q0@qnwvY*9jhOVjKN}&yreylwvCg@SlT>HlpyHMO;_GS?!ApQ ziPeygrR@=<(x2;>avZr5O5pok>8^CS!Y!_#XHg@JbzNb+Z8gQJ7mbIzFGR=M>)cf5 zS0Z3kCGSa=*Ey8=pT#%*4_gJ^0sZHu_Qn5(5?s&!J=p&1g4Dabv}S_|+ z{{Kh82VfY3Bki~A+-`z}skgXcegF4>d%jO%)R_^?jzjON=#EC3_f3e@eaT=vY;Ad~ zVzOib+J z*b7p%ahMmF3VM%MLFW>1+NRbUc~Ud+ymAM6i>gI%-f*Kt4-YDFTB-6q?=Pn_#Ur#I ziRlt}ug#@ljbLVkr(vxb3sRlCtft--d5KR1&tO*uFyzkL_wsJjVbAyjLJ@=s2Zquja*>Z~UFQZ_BBK;Yhrh z!AE=Ipg;R2^dQH=iTG0FWgA&qsmO{?|3#VYGeKPfkxPIqp%lkLUGb%|@}i zO6x^?Klp2b3HfE=NvfG8dvqOajpAjrIF>7$Sk9K z4K-iO`m~`6F%41wO=WWRXRH4$#+Dh2pBXEXv2dHSUPx2m`Od1p7YvNvZxU%4oL41k z*uKlfY%o(#ypL~y)x;3H&5eQ{pj-WqPeerM@-(~A~&nR&NsNt^1}NAISdd9#Sh zp@V-Nj)T6v0LYbA6Y?szwv+TJ0EtfgK0l>psPB!Wg%>txqV2d^Xm+B?5h-Ve%vAN> zR+|EdEzMFO(4^Ml;V@WIeKA*X&MbEOyS=Awp7)#C_u;1hmWk2tGk*a?ME)RlDlvmY z2jBLO=u&kZIosBlxkF(LPbE%) zOs9t*bap`2@{yS75!zwUE8#!lQuZ`M_kN)-nBG-;v3Whx-Ya)f^w*BX!`(%>!BLo& zb2^;fA5Xr20__)d_xZO3FpLYK!Haahw?|VnmT8~S;oFpZhv#7X+)?f?h~ysOjoNbW z?=4a7SHt$MnivxnQFw5hziB?#TT?+#4XAH)b11d>c=8DY$vJhQa`X79A8Q|XUJ;O- zjxe5~9iyda{;Twm^cy+{y!7yw-4YtXtRS%Bux%rIfcA_9sgX3ZC?xayxOq%Jn2~lJ zsMbj<6xCj?hSx(?f=Vl_N6Z@N5lpwFx4834Op8F~bSYpw3+Fu1HCE^*8z!J_h|C%m zke*E{29QZ!oa~9QDUiMvX%`mjzrfH^h&b5iCz0Oj*`o(EF~Q+HpF`*JadTEaJ=LzM zh*GdI1VY_W4_yJRqKUoSMIcsUEYuhcF4q(t8*c8Z#(%mFGX+R2>+eAJWjb9!9|aSg z(8$%ORG45_2gkHX9Rd^X0dND8_~hL5zG&JEC({o1;uHl!iBx(U^Ndm7<47F(zgDn= zX0<3LI5{^ZjK)On;gf$qTFmlpJP+(Ni6fv#Or!1Z;4HtB3o82c7KLMSQF<2xkkhbR|Lpjj`&>JS2f6&#!ruEK)i^D6$d9 z?zaW})ZC~~xeuLJG%U2DjVMt~k*l>>T||&{gb*P_cE1CC?)18!Dqeqr@xqeeqgVE= z4|fOAx1-t7Ej*jiXJ}lw76^S&0Nt9%u7M@Bt+Io3&^~OATS6@kC59Skpi7_DENNi? zOnt3~+XoCnLA&K`fGT7gM6{!0JkBDRXxek)ke^ub)fD)htTM>A3p=6mK)Kl-ARWnu zAAkb&6qd_VG}VKgUwwx5983UIa{5aKmXlmU_qAj+$=_omO!!6DcocrzmUvnjlfd(t zw44nB(BU&*&I6}iRI@Wr0kl*iN`%^NRAm(pYiBdllU4*TwY3&H7&Z-1Y}5GM0y+h0 zjvrYi)~*O*UFn~pGBV)C{OkRFBqEQBAG)i*ExF7@dhPSaer>>ko&U!oTHuTi(d66D zSZJ$sPE2U&v5QVkrG07W%WxfzX&k|`vYz{k~D+(!bnPDS^f0lO&lO~^% zTrWP0a56>wSlf62P4ez$Kki6TZkDwx|QCf!HXH;GQ78_-*pF9FwoF#{H8Mild zE?>}5!VYklm7)*leY#bfN!v2LZc{v_rEMHE9V~I0t)lH*yhTwEbbGk?8R0=}U#Y&Q zw?hx5CSyr;=i(p5v(K%brpDkUB>_N~Oiy`8GnH5sqF_S@Am^PFqNT*Ja4F|MpaNWj zgp^*o8EIdQ;{ScT`dmBUsDeGGXQj4`P?Q>#tkS~1t-iC&DvHY7FC9&aW3`)qkJr9Q ziqowG`Oj3RA$np=fwhG`+7^4vd0ZpO)`aw()ILBZJ>?*-TfUyI?-fPKLy*&mynZFd zhza-gG%-|~lgWg8XjdQ+`AdqZCE&-Ip8JhQbT6J#?E9wigD%(_J1>D4r$rMeiO4$f zSEBs4b6wrUd`hFS3M|3s+Rv22sZ_)JVaSZ)4wsv7jYiLb8;`>`?Jc4K8(GAJJy{ct z$2UUhz(Uv>NXZvd=7dMXvYLdej>rqTHfypELH)Y7(Qf?jfWX)#yqblMJK#vuhJ~c} z=GsC}QOEC^fYtepB4@4oZDKRv*}0*yd%fkFs2#l_ zb>c6f*-2e*dDCv{zG};vru&ABh@{8=3#n-5X9*DD&A6`1lm>?nF|)H(4oGpSYaubD zT90q&WuHwIx2asAAl4f;4dc*k_{C+ZbHYUBE3S*?ExOFnx!>0jes3tv+%vg5hu=n= z9Q`2RDg?GE>2#j+7^(9aE&2rfdv3KYp zb~Zl8*6Q(D+WvC^3HVVGRQITmc!>aIm=w4B3;HiNWQT!@)gjgENgVIG|>T$=5Edcr4OV6n@G>8jd0mSt(e=_7;?7nz)plA9AT4 zlc(*`4D^TGT0b9Yocp5v66i;`b4AADVlr`c%CEIaau_O`v{DLvWpIXGK?0LTm?UWO z4hNLVq4x8PZj0a}P=4lrn%|uDvAi_9S?TG@i#}bh1;IXP3#vZoXSN)QL_FnGL`_Ig zO60Ce$Y(nL`cD%>!>bMIuJduA17eW{=HXKCIr8_^=L4-cR|VG(GnwfH2lKeBEWURB zIVrVaAwPEU95Fn(h+A~|hK4!@Q}o!GVr%WEP|12Y7<_>Md6vV>gpGm1|LPdDu2xZG%oCLM4OB@%5TEHvBr^p0&aD4jjaoTSj9 z3fcNWy1rklu}&$!#sjfE`YRV8l=f9y{l_dv`Uf6b@E3utbgOS0(K-<054t`1Z}KASv1flp)<12b zMBYo4(Rdx^2T1M*Q|x;?ViDbg5ksOv< za#!^A^AQa4e~lugrSd>TRtgd-3k4vXjG3{$T_q1_{0z1;C zukV~hi$SupbG)|8M?HgH^?p$2hS!+L3_+tYIm69JTJfKxOl!9Nw zTu064gzb;F6E-$>s~^1|Ohp?^!_srQgsPcjy|BeZY*Qt z2GnRs)a#YqoRP9Yiq<8I!{NIW`b~`n#%dekARpXVUQvaRc+UY_Hl;tGlCstobAE~G zE5`72J>qKoI(>_44L(+%noJXa=%xSp0&qvno;ZA0=URr(Ow&0)Dse)>n_QbwM#6tK!yr_lew| z?|HRe${vd7$$Gi(olW4-N+KVa<~=Mj^hCgg^CZ6{Gg&h|w{d^qpX3G&#}#0?oM+~ZXT*Hs1AQqXg#Ny zxylK~%p)&WULT}K_KQMR15`ikg8i?I%UiMTlpwd)BZ+*Ctoo+JFR15zZeuCxBaSlY z%zu*NX3F;n_L#QMvK${1u@N_TkH3MuV>6GRF&QB9sO_`K1u>;d(iHCVC-c2>DbQarPZ9*1v1IdVE zUQ!g=Vd}Vi`@M|OT2A7SJU~Sy1j(|NVh>&Hs_tmDHfoPj2OlJ z8ePxH?_*C`=ZVESEHHS*!TXTpI&(tW3s*}XVoSVmcULPQUhcs)=k7}i=}d~ftTUW} zzPqLxvaF7qSUwkND5FA zH*V%r=lMqs0dpb;xm41=!Y{HXJUJRPPbiAgeRMEY)_hJrN5>KO_Sjmz9!KK%y zP4Qa-cX(lP3CBy5daBinkI~eq6Vm-vpqVC9dAyP$jA@E#|KJxj|0>#t1p`d79nnRd z1xprk7JV!b();8t&AnN}2&(5x;heK9Mx3mO85KR=^iS+}@C2Da{-$C#Lf^nhS}J;C zfS84P`;3qtX{FSRd-=&jt@WKnx%oi%3(A)yzn%Wv%CW^L z@eatO{Odj=dzfsfG`^zL+&#P1l+7AQM9C@r;8~|3R+DYURt3*{O;BYI&RW z6w86r>3t1NlASC6bL(C@&R)zfUj>$buYG(LUX;;`uj4GR(9;$w^IuJ*)fWeB7Bz)G zb5=%U*S~&lXqeNsb~zv!*y@xhgKzY&PrR-L=Ed8vJWavB)hv!W+W5yWvAulTIOnn3 zh;&4}g)%|~9Rsaji;-FBwp=9Nhg30DCi=i@L2s$cU~xODeH zn6NG_7;p-PkiD{-WXq~aH_i0_uIaw_hT(cqfZ^XSvwW)rCkkd)b9@xVLKCqB$GptV?r8-T;q0ya{R+jxJBQ@;Md7Cxxl;gJK9afx_j73_MJaga=6TPDh zuO8tg4&@gF2Mv{~#I*b)o*1NfM~`O77n<5NjCyaN7L-Xx^1`E!Xt+rukKIgl3V4yj zm)Pk;5hRonqUkh@_#nc!{1OxgliQ-$T@m%y^r?3s>hPBVle?C6YIhpOy|f6BMKA68 z&V~Rla%r)*Z9XCCXk~%3DW2w_9!tn2?xmAK3#%b-8KfLk?9|YOFzXI(-rKsu!}@=J zO8ef);Mk2@bt(0c!Z}paMqF}1ahMd>%Ga?xzy6ocCo)2T$p``*-U&Ukwm$wPavH2< zHR-Fqg0t?O3{oG^a#y}(UPTJ^CwQU7&V=?#vsNpKdhJ1hD=XnE!Z_2cZKsz4CR5-~ z%luz#q3_OkM)#dM16vGbEa>ueBHm_-4+=|qwa7OMrnh7aED1PvN!~vU{u8=uaz zHeI%QEn@}O_<3=y4<;L)vIHE-Wxzo11-`_i0@gZ8`#K%sZ!nxNfdiwk4nLi_#9URR&pZxf4hZ_`*}J2mV^%Y`FQr2W zW*A?+5jJd6p??3rd^TMP1`XNtas8FFhyMOg6Gn_O3muLEmXOxKA$|~O= zzf+U$#re%H>I#tG(gB_O%q4fz_^aoTudvfVV44@o;3ie$3)2OyAIp>iZ42oG`=+h@ z3V_uJDk{imveU37H{vqRun>>-ueRHQO-f}x9sRje-Y#+5=XOT5(! z6R&$fqg-meQw@`#P3i)$;ys=TCH^99Bb!cow?#6RWV7EDz$k4THC?X7szPTgO}ki9 zZF34iW^KMeI%gNqg_Blr-YOT=#{P6=ACMMv?Kx?5cA_bdj`<2eVg3`Hx@}xNH|+{Y zjenwJu9YP3PT#r%0;JCuJ&(Vuv_~nY8oIB?zmuHwdh9(iPXTL>1|5f_2KJf0^yvUd zAOKNB5vGtJ(ZvEEzqAXh!GnV?f`(X>Ng`>=t(O7L>9Z3&Qm6(DJPFtlX?@I5w<<=N zMUwH)A!;zpKHRW3=`mXVJ%rmGanErHpvkDKdw@$atDE7gzSBtNWSIM+$hm$bzkAh? zZW6`@8m4|14YZrR)99%PHU#=yR6bt_cizxrk9#_D zjLFiEaQgw~#G#1F5!|nXnAbw^sSsTf0F+XQwzPZU1EjeQwcRWoT%Q5`W;d*_O_d7! zVxxI6{1~r+xHf)M(iT-K1AhP9unRGP2mX7yR;0wu?!@0WdzIe7b7;Q77C`#WZiDF@ zLr?({2zqzcUe<%2G)|+^4RPi7h%4aybgFz(f$-|K7`rxyDl`t6(c9v4JizMNgr}tu zA6(-CbX7d(D~TB*=-pj&w&3byZ@ z<$iQ>Oy@L&*g|`hcpHl@(0op-&ox#J0Wu+TLxtSPUG#(<0A!!?nP%~mzrRc~`w?|} zXT{iFkm11|Ee5oH<)8kBVc_SyjiV30NMn+RX`Sg&ZRqW){~-40w?XDTmJG# z8rK1NnZ;WSdmuutTZWBcfu$=GWwSKYYB;y6^aTF`V~C-{uy7mV zCoRR^fpn`9!yZO@Z$#=TNMQjmy==i>M^}V%lr_A(0o(zrk6~A+%!3a@Vk<2SEi;`% z4c2e?t}lU>w5vmMt%6liegOc1G2FE}dthdDzfc*;wM#FFN+I5sjde)U9V zI3nNxD9qD%8WV+Eyl-E4lfS$L5_04FWQ03F(D$i=1MTsTS-otw&4`4EK2wo5m;43V zs~RdVk&g28lMYM{(rG<*a2S=sSs%kP?^Vv-J2*X?G4!Ojc(QWg9t79pf%TrO0Bs(U z>YrQ(y2iJ{0rkCx8XU;IM|Mk0NzcmoVdk%&c|mj2sgNgUfVpHcd_bzh|5Fabp>h+= zCIK$jP)mlH7 z89m6R?_l!Y1M=ZD&JAAdQ2&tK=Gn=a_n`QO zy79+EbAVt@;dsenaR*c1EjmMHsE{A}{W|(L#Joi*Q^1(J|AZ^rIQ+%0Zc#1p*M-8fAg9a4rT=67Q7P&OLy$>nyfmx-#0jleC~ z%Lo^I$j~ZezZ(84zd(-ufP5&D!qOF%9(7PbQ_6G%rK!c-XaZ>HpPr6kG=mjip| zslV8cDG8Eiql59mIWW$=NcxOjNEtYjDWG{H^oBr09>kCZXdW6+V17@M-=BfBQSJgS zDR$SI$gK}`Ie!Lfz;R$1x@N~3wjGL8xV85Hcb29S_s#pEe2VvB?loEhu0#>d?2q1| zP^_iTS076|+MqJf<`#e2c6U1*k3jXwn`<$2_EvU9v9zbY+W2#{gB~wsI}}okZNk5KkQnD8a z{O7ofXAU)OKsVBRM&&bsfBK$?1t*gmF;8ZRP79RVC0mS>Ucaq!aE&>7K0=HQWE5t5 zRlQUZ;4#nPWU^juiQP5Gc$UnNB$?$pSEF`{O1O8k4>vC?_~|rE(5}ma<(^U1ZtX*1 z`+pXm;JIgbG7;y?5ZCC$(spctFAnbpW?>vvHrnNZ-bsk%BpSUcXke#W2@LXfbJW_}=n07U}B|WC?CH~!e zxCVJ6PJ$8r#Y$TiOIwa>G$3ma6MwQnOZn4@5amg?idAF|`B~p(uZ%^W-D|%}uXY+H zF}nz4U>Cf;?AP$h7+3;3w0|*qBG3>TYW@Gu?zMl$rm2BuH4bGEcE3xetlcH2-K9t*(Dq8r{zF zk!;%uYxIiVrapocO17u`5(!RL*?9e5l^ zIQeb@o{^Tnc58!GuYuv(O+f5>t`s!M{{b(b#Tmj<5xX< z*nuOuSE;N0Fn|Pwk8$t&^C4LZ499HAp1IW*U+zVAJ&o9IO$q`&t$SSb=0W4)RH9$3 z)qVgG0=}GtrGqx*PaaCmtyU%Q2915|G%PUOqM?&l5!IS^Z}~1}udgi7_ULC9Ic+hivvJ1}v2~ug5}q}U zC>S-c-wxJ8A4&Z|L4NNklpm>i+Q*YG=XJ%vg z%l5$DGy=#{ljzBvX)5zZ`Iq~&vsCsa<0R7|TNe~0?{I`%6L&U#?87vQPb%^wT08QL zuyMO&A!{QT$rRWclT&6G=Of#q3!>Cwi zLbp^`yO@GbZkjx}HxPKjCiXgUT;i?5@vFe@c~W?rEF=6I#w`%jIjXfl``}w9X&77I z8#yz#Jr2I_J_WBj8;h5SUNsjKS%+yrh+5+na_31HQoN68ck#Jlw=z~z_+}bw69!QHVtYBTp}&@XD0X}+ z0lPE)sxogYZvX2qHHHU@h9~2U+$x63;LWi*!FH5 zf$&Bz7N5Lgp%_u0%J|;w=0Y`IZTGEVli{C5Pb?z{7rfEqvvq;03i|s+KixS}OOiiq3j*nj+27|@%`;DbeM#n8ExM#6Y{#>vJa9q=$^vCI_K zajnE!!Gk@}{#8=<{Zt9a$V0Yl0=wx+AUiv+(+?Q@X3pN8Br>aVjO;gaK;LAbpgwd! zSoFy|oQfJE@P?s7d{kXeF%r8EwKDbma`bJ9_I-Q^q*H4jR!sU%I>5`K<zE>CG=c6ZB@) zY*rG;}uwvqrXeHL& z!FzCwZ1w4w<*4>gd7nU8oE}L4#vHJOeDs76eKpp(PoJi$p4>>NEl_5}Mn?B0E=Be_ z^*uQMKLk%qmQkZRUr3>hXnR5dA7=d^5QntnnJm z;8)L0qpwjlX4`(F#G%JGXg}$6$_EOFPjlq(7hNOsw^*)-@>G1N z`Ic&`aHxAL>9if@HO9-_Q@YO(WygO1YuJ+?l&9aVjBY%|AGi4VocqY411tNOKZe

d;(to)$>>qp&Pm(#dwkjgHhIBot?Ki1#`o^>x&Z?MT7L z@ZR0G!uQ)0|JyMN9em5YO+%=e#e+3|V3EOJT3P1O={@ZC-@c(uQNk>zG*vn_L_aQd zq!2_y>pzLLXC* zE>Kq&-^NCoaPu%H5r0L;^`6AaPEu-l#mfGV<_r7(7^9kie0TgA4)kT7W==6h2|)95H}8KXzK$Ke_Bb>Bq_(!wF2S1upQv>kb7$t#*8GJJL&h3 z&GhLjLS>X(VmbfSyqwgE1%kXwy4CCpDSp-wnOz(8X9d+#{*Fy+0P4EIm*u$t1!!m2 zBeC%q9n8=qL>fed0Bi*t=HF9;G|3$pC0s&mcKI3Xkt|tbubL5|Kd!RA2O8}Ikep+eyuiH6wdGcU2t?tdV)MlQ~a zneAE&-B#>CIGXJQbZL~GPp-7-Tnon|92hS?5$ZJ6H59{;Z+C@o zgA}P~3`1dzq#vh-Ih<#7g>EnmL>)At@un|AWl!tt!k=$9%5rm+qZzZXuxfCHfK(`S6sxhDE}` zNRz`M#;G^v=g}KOsN8Qrhj=gffVo=E9+*Cg9>If$u=covw=2b9`;kxj@D4^7Py|+7 zokyBfnknPIPQ&Y5_70we6hz;v`!dc8sxhesT!9tECyh?Y-x2i`O(W~rd~xU{#f#qE z&}x7pZ^D;vehLsHKm>~*^cpUT8DUJijC1b4zSGsu^6>`BU8Sw5&t)H`Lxm8OkhJZ@ zmu}34V7gi6 zBx)|vOMQu%5N|G3av8pZ*Pp^moXC6|O7c~As{x4je4e+$!QWbap4lA$EG(Y#yghp! zLlV9qqU-f~pnEQ5Gawy?M!@f6ZXVCD!z5y3Isi&NFk;H(X+5i7mZf*&v2PoU11=8knJZ5-6f6-_FfOiXHz`$c*Ux|%Cm8nU4pPmdkBpGJM$f<@WWmPbU6UZ#vT@Jh&9^z z=ExZUe~JSgH5{?}Ll$Ut!l>@;a((hzuhV zZxw?k?j#CEXc_mmi|qnLxyc0^3w0BS(~dyRv8!p1M#4ivPpGo<*uw?Ul-y(3Kq#?r2Z+ zOcJ=feHt%$qJ(5x2+w4(`)Rru`)rG*^8w=;_H^D>oQe(%V?WdVW*b3H|DIVqN zlm!ZN3FkyfAWs$z#1JI1rkr^tITfG)*giTJaHZ{U zh;?qP&hvLkVS359*;Cju9-6v*P>G^eg>!qrh$xfLU&H#(T3T0)4s+=rbB(uXOEW)$ z@@Ml>7`L?cR`z|yy;LYy-cd#8C6svkE@ctox?XkVS-tP=`JPR3^`<(!m(trS1vac!Mv~JK8@h8V z7I#J-?q^Z>!Mngr<_z!q=CA36Ddh^(AJiP?;PBnKUq(QX_H zzrS-tm7|)-E4f-;rTh14cL=H_q`4(SPN565=eQ%ai3^ZBiMo0uid7NCFkP4)D2jF= zao)&)cA&ZLWKIO}jMH;Iz~<+o${1uxSw+sxJFvvsX_yb)nCU07#l++7ePUw!3$s^~ z)bC)QW8U-a;eJbCMufM@w)}J$C8J%g0Dat`_IzAL!*4Absk0`zU>L|t?u{yNpk`*h zt~IQ!(YryJYh%43&Wg+s<8%cw!lv4n@&{t%9={m7ADVs|fNk#}DDn1n>2HBROcy<$vooPR&02DxT#?ebH&d|(L-HN@Fq1*|A*V8!ExV4myyL~kLoc?^;q2)0zJ zO1Ql$&F;}X>Bw;#u2x+d+Vpr8XGgMQg5!9W!p_B~RXcv##eobwdbO3GO+i~_rbE)& zFU#!-91?>D4gV8y)TXRK*y(;fe0dWH zHmHyc984iVFTpxQoq?zV<`!>g>hfK8ux&$>_n!k4Hk3B*D zrd*annr&a=jF?+>CYN?m8*!Rbpj<7UU!3F5rlmqW`%vd!4S1SVi3f%YbfvueN-fpD zo~qZjBp)*kzP_T^%}4{~|~9A%55tb0;(Hszv5jaHwJ zQ9=J!DTrabnzJe0`MPPw4Up$TZSR`|v@=W(_O&)(0UH}~X&>UeGBE0_R2ZaO^PK~c zZsnhfTtkk7(3?z5Byazg0uHV5T5e<%qh@tX&I|$9U%e{spNQ~VosZ4(oLb1BaVIZm z$zsO$OQI&$Ys23Knk9!(@o*?khmadF&vJbn4BWjtIKl2dVct)6wG_*J$Zuwk#$T3H z?5HY5^c7l_E9iBXKVJvasD~}%9&>IUHw~QmM^8Gw9><1F-omGi~NjQ#R~>O zmSPqtKf?%$>)Kt2+eaMoUT%DQ)hEq@k`zb6kND+$ts1Ohc$H26d+ct#>GcE9*21!_;TI4DM$Db-b-Iow29EUr4iygiEHfcM@q~bDgc6tUQRApK1*EEb|xo; z1P95d;w+XZ%`{mkUr37(8c^IhdDjCAycHxomV3sr_B1{+X2F16i4t#?LqyU zy*;j7uEFDFTCd-g&HUtwr~gLv1AFt99{M8Un`vV=H`?r;Qrytsj8>Nm9O^2Dv|ygj zUF#!0vYz1n0*UFuBa-0wur^}dG{}|{spyKYgQw#dmznX!LV=5ca&f3h@BCQ{-kQH} z-&!FA#s#rO!G`x+U!hI>NAF==hRQ|U*9fnig*Cf9f*)k_xYKyZE_phZC-bY{E$|c?ZOLk+zii$9*oV@a-E8g1Luh>x{uT8++9Cm&}5G=MdHVA z7xi(oZE&M^VCX%ICQ-7b#`47XLB*>gPZV1WNL`7ZFe3NuZUiEglnZK;N+^CK^eX_R zSm^mOe5#DnHS`Iy;?Fh#Zh!{?`w=<}g^c;Ma7-^>ZYEf|edQ!IE2|A`>R@@$ENWHj z@a~IfqIOI#k7Bg>WXJKS&!8z{V4+i_-EDv=h~qu8{PulQ3!xi92l{*J8DTASrY!S_ ztC+-ua~64IjpnXTScp#+&#@booCXE^*ySd4kWtvw%PvS;{J>pM&L4 zGs6tIEAV&2HsR%F)cE{#v?q7sSMAA;$s1H0A63b$3gd_g2{=BA^Faqd#j)>z$a|NF z0L;D5#)t>QGTaPkG7$MNBE?%MI;_9qPMq1yO4# zv86xn>IigOMe$RYcNACD22iL?f49X5k`a-a^9^z!`upUycX1)O&Q}f1Q_j`FJCO31 zrc=HPRb{M|)2dvuIVwT~N)M-ceA=yf^AsoYYg4^$1j%dA#0le?>6(>gvkM)FJkx~f z)%@CA8}2Hu&9FrM=@1F}9(EbV_cFsM=MFFfwxwJTS@Sp5RA0NoA=12dDao}} zVy(hL^Ksb3qmrJAyCfU;iwSOOJU6%o0g?0gtSO((C_Zx9t6KB1iz%c-_Yi#xZG3=}PLrA3D0yY8n8uR%_JXTLnEq3xJroQ4w0?z8}3%gqN zHXPoYl!he^-?fHA63={g9QL2{O2Z)xCq7K=>o&_k{b&p;a7l&rp8SAqRj$B!zC zx)L9pw2m~Jf%iEfl^*{?`pO`9{4zhz48~d3Z1ZKLyzObOColCiHoI${IWB2#a)Z|K ztk!KKmwdcIRy2^@<04I(n9r;?X6=ov$g*eL$zR;}Xx^UN2$qEyx5oo{LLeH(o0If6 zTn*lwJ_v)ydLexZBOSN&QqeGi>k+~g+Ux#c5lSQm$mI!~LzvEc&W!A?MOfX-7 zBU-=`WB$1-_HubuWZlv)ykErCPaCfCX~aGTu`GyKxL7T0_{L`fefg5T?!+2?)A@5t z&f<6k9U~#WZeM)o+r85ivW^JBS5IRD+WTUZ-$L=Cn{#glKc+Lhu1}22Ag5XQi5U=y zfWYFF)PT~ae>*G)aepbsGQzdLj#M-WMdS2%)wL-(b zuS<$M?6)^511CdC$}yH1dJTGjM1M$~{1R^~SD$JQ6z9-8zJxok(%ATSdv^%mQ9+1O zbTcqj_9kICyde%k4V?l4RMaWMMUpK{8JV;}lra_768>h1kdXi;S+`v^s4-|f5jIFg zLLW#b8h-!Y+eHo@8dW|LZ96{%roGDDnZWEM=f;ad8$2~yGS zJifFks?*cm(uA7r4PEf=u6p=C0_Y+X<;&_1D}9!%v}{Hfo_`;+;?_3}O~F&*?}O}< z&*}u`h-KMEyE@DMDAJG!BU4;8B#S(j555D%R(-&Au@F$dK~_7_!m%-&Bf)|KH1^XE zk<<6tJgV<@cBNd`gm3z#`Jjwr>@QM0m|62f2Q)THdAz{f;j*ldRVhGoF?=T?)!8Wr zmjCvM5t^Ulkz&X^ozcxfh>*`RWICHS34Us=yM80in*T8!9*Kep_MzY%g#|0BB{vIn zrEe4a;|6L=mu6g_Up;m+9r`_0LmPX%3my~X5_id*}>F8}8VbjKAi<6+=5`~o}EYl_vB2S2K zw+GQx*M?vU7XnM@j&FStDJPvJA|+J1uOGnjgxEf567}n^@KBviH;1*=;Rlp zPgR#=`d6=6bzoDlL?<(L__Xkc;V^`{huC#y*UxY!?pL-!EN;JnytSoS?2b_PdnV`5 z#G&uIU$P|S8q=5Fm}D3R`YVc53iti(bBuBW_z}|L_mA$R zx2;>`tosEW^0Vy^e9W)=bo09`_&GU`nI76I888<8n$tCekg%BNq_4Es`Jnr}(zAWY z+U@^ZZIbR?2uF{|nJ2AOP#lGYl{6$*_$H+*{rOk%@At;n62d%Sm}fPgIT&+9{VUbR z{-odgJ#nz5L8b9OngLe%D4jOBx{RpTvYcV6vDY6(jBiYR`X;Pd^vZl=e<>z`b_wEp-kt|7(wpQ4?cO1*-&R>d_|d-+Kn zxZi{j{vh8X?Q@wI&)pvF*@Y~$lziBp#8^#M=>7o-?EY}hp)ogCbbWuL!v>@MLN8!S zxGB*=h7g7B@@JWBHKArE2O*gjFrnk^0cGcTalJ3L`6e&S-{HT^k~A4taV6+%kJvEC zU4LZm277YQq<99QMpIlA%3Oci3n94<4sYn&F;vyP{E929%HYMGc{WBeI*7@(O{B#0 zw@%M6R{Cd=EDCUd|LrIY3-V{TXHd7o+H$K~z29j1`6~M4h4;0hSbU9dYY>;kmtuB5 z%anK%-Z&BYMwMyU`Fou+T{eMbb=FDHLL z+xB^#LEkIpoupt*8}N+Z-tL!HqprUE_e!DImro~aic z3#hLC6x1xhd)D~_=sdi$>G>!r=?RxUmBbq?wEhE@02BZP>zBJs$`%5Ji@qs%_4H6Z z{|%yJ*yAJ@BAfuWdzO`$TPQKA%Si|@E7cUcZ{2O6b@#b~E@Oc#05{EtAMsNamDas( zf8oC(Ge<7mxc}593*1y8S2hFi2C;lL$KfIeiThR05IV01mVhQ5 z>s8ux`a1p?${F;2H!P1@UFmh#W*a2Z#0|8g)ExgqYu5H$)Oe44Gm)O)(1MDU%>b4CBV}^d1 zgm}k25FO$pfA|-)C-ThRTh0WioIL$emp$MpOb)Ne%C9~Nn&LQ^Vskc#>du_tCmdK{ z{&$l7Z*6Z9z}g174p0egS=@sZ@Aa>K*|5D$(AhCs#BzGuFW$=u#9~nc=ZB`5F+mC^ z;16(V?&yoXEBEu2>qU;8?Jii-Oyb1h$-%7XLx9y}1PlO;S^xA`80R*=!g312Hw*M3 zG_zk-7oY&KGqO=M%z4;30BxtlXDgpIdNZW*{B_fh0}x?;?J9}pNDaLLAntKmQcnNl zT7Ph`t?yjg#p=`!QDe zO|~!Q3|#eDW$Bo*b0!H`>^G2{A?5HZ`zj11?InTmpei^M`Wyj31Q`yR9{RR{U&69X z_uwC>o*=v0d9#j2v=t6c96^>$FLqd^tp#O~!wtWOltMPuzL2H)cf}ZTL20BG-4?CGf4woQ zQ!?CHezUy&e1^-Z`wWO-(>{$J8T};4Jq1A6SsLd!KBULDqv2j3ga)u8G8t=^qh#1#wdPE#A1B-e4^jKgBsq(s=jpJKxAy2WB!JXCbeW}7(# zyaA<2K5{K;6bpvz~3g1Xc2+dr99h#V-s2JZC~(Ise2MD9<%}o4pGMZ;Fm;% zWa3QQz(%g)hOg!~$R5MaG)yHv@gFd7gRKoR#**D(`wu{dYItDSBE^8>wJIME>1U~Vl0d_w_63{wK8GCSb1R#54R-U}?h01&NP znDLT8d&7f&E5;TnmPz^q!ME0fmN}^dTUF=tIokwxNR7#hL0H%y0IAWuG;$85m`L%- z{cz<-(_WdO;}M~`e?*q^?m+@b$hs^W?>@(i%L2h>JHQ(EyVAt9Pi)ro52FQlCU`=% zwdBCeGArrrcz*6z5({9hAXa7BR1=t+3nrvqc5lZnCLg@R!IkEecjYf9K7Af=bYIj_ zWB*_b>Ps$DK&UKdeI_Pvvd`bn<^lxr+1dF1P+>v5PtDDepv2}Qn&DlwlXrkAde&W#HUDb)*2Lb8t|qV8yU6VnA9N=0te>&C zW~Hi1HIEaY#Jv4wkHlCbgR9SHna0n(m4r308Nl_V;U%VOCo`*GkASKUV`HHQ*2`q@ zc1#RYY~{&!SZykd*6ZB<#|&V4=9gl>_Fy&Z6WKvb-$^4mz8sBh0418&8Nb$yy{@faoPxaIW0tB1r>+plQfvtI=*cZd5TEoRJX<_ql7IW zkT~>N7C^Yz4yXAcOsdp5%`qOxG5R=}KGV(vLTNJJit4Cpk=*z$8wY5Rr&dC0Ic6lM zJIX96mU%x}pBITVexl*9-bhZGZV6z!GI&LHr5QZ7Eq>G zTrsy7VJwIP@pQ*V-@v0}>5JlY(M3jd8c|{wc!$dIFiO*w>Z<}ifT9kf!LKt zKI_V^nCj2O40inji0}N3)lWHT>IiboU z5n<^S4sD}>#5!~n`J_Ui0gFQfSG%Q6e%G?g5c6u#=~FX5(galrUySnUg50b zub-W&rmXD%JHcR2*UNSNc_soj_y$o(J037fjtUV(OAx^DJ47g`S{Nu9923R_YDHf) zr;%}yZ2%azKl0-+Mqn6*#~n{g2;}Fw>Ucbyu9Kc+S^N{6yUJYV4&h(9Q0*Xm{_7&W zJCp>9Ps&wH>}y4aya#W7!mWCFcSp;J6w+KMDh%u{H&`O(S zD!N6h4Ck;T)AJ|gqYv{z^91gDiWZE~nMLx?`71Obk*G$hK1HWKiEr#+4u+0nK!CuN z=YiM&$~}_!w%y%7jToMv&7V_VV}|LnU5U$8Q5Jluq8ls!nu@Jp2uaO)*!9p=UO z`?pTD=voAiV?sj*)l=hjybX@_j8wn>Oqq>hFb96GRl+9=kBwN2Ag`Bp-1?2PH)@CI5qvJP(FEjoO%(Gz2>QMqy2VE%d7kz*vAjB!@fvi( z2A0y5$FoJGUK^qTuoKa5<<*aW>dtq2{We7l;acrpH&EgV#eppWLW$2zGW2fXliJF% zwlb$V(qBu%+D)ewwEq4?u52Bz7%X)|HMB8L68V6z|2I<^LK5++OiCk$Nn;0fgHpjs zt=_yJe-=NNI5_?tUyH6U&aeK!gvGg-jtHvx{QA@<+K&O9l$^)l%A8-FvMoC}$U4Yu z98nzFCVNBBW^pQny+e}mt^x^@&`Az#ioQkT_LWlU#GUB;ehaGW1^)i$ls{uWa0TeU zpcN*kw8(fGf7ss-q#zwah*&J?LsAO1mjj3VK=D>)t%aD+1VXlj%K74#*CD-V} zJ4_o+J>&~?W%bIWQ}~b&*Ki``X#5CB)jew#rzauA#BmN$Sxw=GUo%Y&or}3kNIX<3 zUuG0W&?&y|Z)=n5xMdRjZj*<*j1(FgW11n+Dyzig0Hgs;4|TGv(0mgI>tA2XPH9KD zGT22p5&6t>;@{${!w7&}sL!^)q9ogj#j{wW*VdX`pLS{k$ymz{Mn#7Rm}|0^0@ zMk?Xa*BNXz`e7GA{JpS=6ls)_~Lhk0LZjyDcFg_~$4lw*;EXyx?fkRP= zECmtavixjWMY}X4_-SIn9vho2%Ve1zO0^J(3!*TzZoFt3SXfo#<}+2?^`CbA}m(7qUylQ$9iU1nF*w*?nv4&*$7@ z_moMT)IoBj4HgCyPt~+ey&LzC__6cQ=FdV&CkTf#Sr}msQ?uC(6S#Lsdn{~SE>(vOmFo?$a>sd#=w8a)fu{5ONH{!*&Og=O$|WOp z@Mo_;$!ee)E|YeF=$EL$tV88v+~J>&P}oIf_Jt6&qv)FM3J&D~NSli(N8Vgi0UTB>J2D zmK#nUo#RPX(&pLuj(t1^(F03zmj8M7E?X3FZKi^wirRS*K4KPNm0>7Sji2H4PSwll zn*DuF(wN*M+bJ)wZ+gi?oV;1$WWN%6M}WlkpMPx5|MjpX__&$0`6IIxh z$;B!x#*-V|qIFy@_b-yxx8}y!&pk5^4u3Q9z9=m}OvojZh-aa-Aoa6MyUyWdenoF1 zVS7Y68v4(F`E~)x(Y6~DP92il^m(xVja%YFyj$nD<)}Z5bz>xLGi?glXkvt2MHc%k z;Z$+o5K7IB?9TYd?VHy|6&5sfPVF}R5>krKE`tVb}M|J7)S4D2o z4eYh%@n#U2{lt2)unNgA;f9uYXXVQRX>0cT z`Yh&xTr%MlUYllps#iF+pGUd@-S37&8LJxwIDI^~AJK z-)X(caTo^mJ+m4Oa93-i;xTQ0vtm48qdU4Ym`4V~KIL0Ix%R!kCBaD~bb)z#=Qivu zx`98i70LGaKFURF>Beh~v;*}r(VgjQ4>6w0ZPPF2y~_v8N&-m&wK%^>97KA4ajP*g zgXDAp<3d-*V_bF3@psKMhh59)vh*Q(!Dp8sg)ECjLR_f1Ez0?gdZ}|-5QI^~WFi~Y zou#RF*UKHpUHvv$+UL&l#4F*F{!#6>maPJ|wyXkU(9NPJ8lP8^5@q2p{i~(U z`^DTX|j&x zEuWMb!5m{kyb(=$d`%Mhg*Ht@3oBLaZp>P(%+q-5e&Oz(+qu5s-~4T-Ce!TMl}{Qj z$8H>9FO!&ieC_^OD4Z$g*p;$8JaO;s9mALUYx~2)cJyq1`iout{i3Y7aaRq!#eOe+ zD`)C2UeRwaBdq>SH0v6fD)%UG1R7B+*mAUlIO%n~y2GV)LVqXrZB0`|u;jldrtN`P zJU*b(FR)M~Y}B1=Hk>t7Q=-a~3lV_7J(YnuN*t^-F*!GB2c&f7UdCPMyKcZ18r1dc z*ZqEY<2uE~yiH(^0o!NMhO0>;t3`l2>8!J0%Y&JAXl?lgI2#xi*8e?S_h=uTs^O#= zm!aIRwR9a-+<15bc=6DnFzVl;c%2%8F{WBx^aZllBKfs5;zj>rW$$Ezk>kG|4qb}I zNTZlyk0iDvyF{Idlmjp;w`c4F1*nkT&GB&>Yt`b1 z1#)&CP~pal?x_!6H;doX774OWs(o4|++-~iDOdZp?uw7dU6(X7E|I3jFh5^%#-l=K z{V62C28vbmZ17Ag;Mkv7K6Jf5FkW_=h8H{0FKJd38`r?L>RHko13$6(_c-Z5QY45w zyf!X3JhG+x5iH9nR5JRV41LeVbn`{MJu-m5VSiZtRjJT?i+z47ve53#Ml!~8lKJ5I z{l^yQkZfVwE}`d33CYzXakV(tS#^lu^+;gW7zmeiDgv*m*A*%}aAWOYsqcZl&cGjS zugJeqp~t1Cv!*gng+Rp4%z-)S1dGg8&h8#J_3y$azLb|2)#z3fSs$>Iun1aQCp&qh z#N5@T;c+1=C)SoFIM93K+ed>EjyVJU+-IpfU%WYUB&bcYJ}`k0SsKohVSOEP54FWDanR zql<}~b^u~G2O<@(nXCAR73~0$xF7&=!-W7QZVtlUseH>sx_GYS(Emw}0#fKz8ngai zOk76OC6?3wHwyq@25q3w0JanU!#NTFaC2QA4KETK|5_#+FZ=BWT&@K4yq6LGJE%-U z1%7XKyc*hEP7)MGw>9kbvmybK?F4v^(O&VJxXtg=Knv_AKVkhTwhbs!pBf0CT^~0M z@Ehp*y;DDTQOY+5aN56Hbzr&PJ-#@c9%%k?DzU_WPxh=^rr6%=8|K z@uNWpM6u$*ro9HUbJETGbdPI#Agsrem-J9Wy5}_8&q3+ z2{LhBm)XTAtO}0hgD5MwFW`l|vH*?JIvy~_zAIGGaa~Jhk$E#1r`ROo32<<~^Q$ZY z%Wlp1_IIp^2#;~c&mUe~yD}wQZUVBX$ENt|&A1Ai{sYcS-$;!ffLGhW_QrmNx-a3b z^vn~We)b~EEkpXbg6CC?&2GbvOw2Y2*O7}?X9QwDa9c}rwh`}mvsZr1Vi7$DlE&C~ zcz$&ArPuJ+4#=Nju+d8hl8h?%og8WeFHhixcfufwr*3_TThi%&@%7eWO@{oZ+g^Ktz!31v_`V6@Ku$ZSVjNS6-m2qkTBc@pf98&Ip= zY|aINZ1&4faoZIjMtSOc#c&@y_^5JJS2SLHn7hWT&cJh5wxx?JWP`fKL*`c+-)o>{ zcg5Y>3A^^7rUgF%;STau9)Rdn>p}8|8AVAb8_ky_*G9Gq3_7Jy*%Pw13I|wMI$Qb^ zAYwOq0N7O2w9jPUsVnx*p8EpsdkdP+DO?UP)=V4qfcw<(2N-7lwV-s;IJ?(RICBiP zP_&wI`OuEkh3L7t2pVeek0Q+nb{lb0v6k>b{Om}N@(0>tPC|C|Q$Q(x*Q_EZO3q13 z0{oEcK=4#fO2dPR!1N2dSa;-D9x(0*!--%XP=1*4%KO5Hz+|ZlMTDPYVJfy0z(d&b z=;n!$`!g`r!+y_FcE+!0fNG8@fBJo1@bj-FexN;MDOd)gMt&UFKPjKd5tlmhiz&9B zJ{FS$Q>+}9eE}hg^C%>5IdtfMJ5V-K@s;~+yMJD`AoH#VSTw;;%pkdI^JmFc-lH4w z_?}UY$Uv;dH{(X|sk7r8#UO`&|BN}W;oZ%xx@FGNq^GlB3BagoSge6--PlumF(WgO zAP*mITndEY;yp{G87#ONP+#rv(5`@X&<|Mi+5n}I^~Dwrk5*!4=+ZSvOvd1c7T|a+ z^w2<8O-{oFplcBCQQ+uoc}1R``Kbf4BBB6}2rp+SDY8EqSM5I<=Po&>I|NL$N7a6g zGJ+CWMiS;LYZqvP?xXR-Rh9qi7-(GGM4m0G@JX5Nj#&*L$Sg{0-4hVS*D8LLyH{vS zSjc`czoMO)Ic}H1f=gw2X)-L5D9Y=$cc^@f2W4^I*!sLQBlTn)K*lzXjpF>-4iuNd zCcS5SW?$X**+>U6WCGXG@OS?!O5A(odc$W5<&@{AWfd39jw^=-q-9&%TB%5sEADL-S3xi6PZ-@VwpZ zi?(`u=`ESgEg;DgFte;ZxF~0vP3TZH^!XU0>R7znr(OFx!$wdqrU{ZaNEzzve?Akb zoTNz~_(&kzLp`_I&sN*fAyp@XtV#mq?uS_YN?~TD!z?1TcP>AIdQU#y zC(C1K@^M>aW(ohot{*+O9CZuLx&%)k1>THb2HzM-MXJma7}hqBnf`-)V1#iSkb1^@ zx~di{v`v1cZof;D2>Z6*j78BX{ndBq5x>j`RS1|1BYixg{Kmj!RC`*&#JXzcM5p^% z#yF3I%N+^i>&_G=dYVlR@zl{qskJE@f&6#3Cfu+;JeqD_%k7iZT#NVTo(R1jP6sDa zC|)8}ISMNxTNShEsE-LcZ*3r7XQ*7&n7ff*pzif6O~|6$wO+gnVitpMHZ7|ys;^rtQ#F z9msrV#~@S!iJyde3C7#l9}p1ljK011+7a8}(m#}sdN!D*5x2IQ`hxE>gkCJ5o28L` z(E%MZ`|uCVd2|)$7jYXxFPh)WXZ$A-Z`jV6P8bu?#v;wez1cbWCm|yo;m?iZoPMt+ zo74iJQj$9dy-P^>Cuaehpw1qs;*gae9sS$7xaViNCOHuPmHwjfyOE2;OG^jbOQ;mm z2B!-n3y`CYCM0^6;Th}0bia*PFp1VnnuN#!S$xg6LhNf*x=<;s^2lnm^TgbfrlM^= z=0`$$uCXFG@!B9;ZVg=hq?^)e@=4E#Q6Q*_ZCDEf3&8LcSD73>NNRimQ_2n8(-I%Z z)g`#a4HZa$Q^*&4l99v^q_Z^9%o6iMF>IlsVY@BZFGqdcOdv49BkR~n37@Z+{D-EY z&dRaA+c9(Xwe~C7=qe5E=bX;Wh>dix0^cwH2ULZ9Dpuu!1WV~i1_$D4voc>7OSpieSU*KQiQsvqv+1ee35?v^0WH{VcD!W#mZvt1=ch0m$70O@snBPsj?YFwnxLU`du>4z-VUd1+SB9ido4fUz z-~cFVR#EDo_mWTZq%Cnl|MclRal!bue$~m#TfB9Ttf`@#lssn9&;z7R@k`~AL7NJ} zZ?dMe$!eXQJd}!lw+)F}2ds=SQy|i@#w0@9y@7Hl`PL=U+JbBeHfkaYS7PtXCwNrK zcd9ky(VAYC{3a?p;A@792mFUgOFS%k8B~wCj@k|5s@p@;cTB#My(Z%^fx?{rNzco{ z?lD50`Us_L?MGN>H;^r`HpLIHfG1eZnxSne@O7uWS%Hvn5%Ir{mVKpo743hCqT_%D<^KeE<)O} zL7He6zGMd}Amvx5l^|O~sZu8*YEtNBo}w@$$j_d)*r8I~`%=y2Dk2SkpJX>O5YTJG zqa^w)kx%MNlL?koCutU-l*L|hb$=#pBochWkB9!f{q59Y#O5$fWUFc<7PT1@R;VTU zB(}Qv4s@;0_CC*tp~!EX1qN;;+*b!#brgpG?D! ze%h`PZNP4J)bMX!*EUfRx^}EuJq<-of|f>9{f>DS^kh-_+-fTfj*bI z0Rs~fVclC8?zfi2GA#E*)~c74D2!iqa`m$ubqV>ebuasKCKuVr+phjMJ=*=EJX7WC zJuvW_V=>WL%7F0Z%^ss4zZoGHdGmuJ0L*^(;T-mMvyR)RS(Y~2#8=U~9-eUyY7M3o zMx{iz8!eIPrV0@XAe z)D7Kud~8_q-CNN%QDcO2T_2;=M$*?s--D3*?oofJ(J4CBbBE8|qFg$1XO zypCTL#TA>>G<&OD*qqRyDB1}`b1)H}tA?kk5jsoAmX- zRD73jV}-U=hWT;RT;#53i=-U48s%)71ndlDvt{oJ!E*g#Hdp-*yHAZKNWDvMcXQ<) zJEJLMOBV&9M2Qf@$q5r0X@=x1`vjMN`nFWKF%jmk zdSJ(|*NlfJyI@qj157z~17!9y<>SgN*zdVgg?-g*iJ%dN@NjgIysE+8P%%dCAkfpi zI>yzG7Mt^@v0V4@@0k2BqU!F{a8b%FHOm6gpYJ$-YstnvaiFkuaP)F;SbN1%^t-o0 z!3udiUYH&uvl8<=tDe<8X?e$3*43)`^PJAK6j>5#2TMbfhJ+h1&H5}>(Y=?JgV0pN z{LFPw3j&NE{zW&#sU?Rk7DR=Xa8`o=O{McaGYF(82X<{7a%V(Fv^>H_-CAH>iZrO7*$DrJi|+50 zTLMy*e1Ut*89RK3gzij|oXIsF4IlP7(1HiF$#W$`;oqJ(P&No;+4S@ZJ~5SZpOPD( zA3*hVk=WFq^{tdW9DdCf!9T~4>5A(5Pq@DrklEi*@jag?& zPVyzenq@jOxS8_c}J zDphm>Kb$5n;aDU3%Sd0mtRqeEAXtZ!erDmYo_hxVtc!URGbQ|^@dS5`1M$b`f?a7K z5*4hF;8xYsyAqDGC|SlOf1`FMX=FSDb6_&^hQTrKf+6zG2uRC#tOfWQ~6J(Yk&k zL`YsgRh#`j&mQf>!XJm#JHHU$+Zev2YaV(Ar3C#?C|~&B^I%~}5%`97jg0YF<{@kAw z_p~ZHvS8C$!QM$-Pp88d-DzPb!N@N&HLVu@k z=B=9vOCMd?3x8n3aQZ~7^WT;`2h?1w|GIzmP1=_}WuK}F29oJ1E)Rud^paSIzsK~QkfnMsiz*u2Z}hE z-$Jul*4VjL&$B$%GmQ;l%SqBt)wS5==shuP{1y-DlSe+Va_p*%aDCYPn=jfXkE?_S zm&-D3s6yWlH)wP}k6_eplzzvvSem3IIQT3ZbJGw0+5sEe<^T7-rxGpiCS)T=Qpo2< z!`+8X5lu=Z?kB9Cg?5gW_A}{TC!JWOcXWbVB|or2fBU&p$=r75EAI zT>I=W*nNqLsI(snjys8tBLVQeT)8XV(#l&|eqEn?&V^M76LB3K4FRd-=dB`SUO^mT z_Y1&N<=y#)eTf7$+(q@f>vXq@E`>M{-0hjg%#K#7{Ta-I$9#?K*>{jTV(b+DlS@QZ za~kPHP62P0Z+e8%WM0QXGGpb3vM;OhN2`|k(rHN7G~X$iOB~g-(Wn8i(n$Mtoa&ju z?@^8atRT1!b8Z;Fi^kR}wA`XU|BfV6!bD~{-8Ugkg>ADa`YAH3HpJ-T^kWx0%(XfC+ki5UZwTnS zQNDdf_ZiDOZMv!a(ku_5|A4acG*FIbdvrP1Q~AV?Nrq7?5DEXK0xh9I)vK5UGp=QbpC%;>MbKt@~caLTJ4 zD3r`gVD-VHjZA=YV)fPqA!7q186V>cNw}73!pr`ArJ%qsX&*$mIq-4hG9Zwh`a*T^ zOT$fWF~^=jv9|@Z=oMDVpDH0>k}wL$%C)vxVC^wSRiznV%+*8squfnQ*{&&rllmWE z6zn&;fl*iUbgEEBNA>I?RlMoQ zt`@jfMEiuOz?T|KKZa}PayY@a5U(OG?3R!MFC*bH7_2r&gQT{YHb95_KW7wMA;mJ| zm2eaA&)R`DGCp#up0%svVeHpVB^wC<&3q-_dalnb=WDJL;MVZ^E#Uh5m;flw<8Mgi z)rUuHV3L)w4Sa924&9cnVLmu{?&104@@{Gxpy0cw+?_5+sI2oL1bj_2_rx2$k#(zw zC23f$Og%qtHv&g|+Fj)mf9rj;C?2xv&A+|}G&~Oce!|(bNkteDjUpnM4Kz0V*1y!S zZx7zb+AC6UPXT+R9WQ_$DrTMF1@eLAm#cbhEl|7sf((Tm-3a4>A#QzEwh_}nlNK15 znSGF_-(9Lm{y;OEsjF&_wGbK}8l|Vgp8@S_h1{B=3Em+RFi!902?UDe$0fxQ9hV?5 zBEU{c%HgeF3)Y3#o37!ah?fDY$1}MNv5D_DSR1ay3FN}?;PJlj4no5Hh~Xk&(I}ze zNZz@>Q2r+%VNOk>a#p57vy^>t0dPL@1@T3K^H%`a5vbY$M}1F%=|{k*hd?2nD+9rq zH5jOYcxOy9<{LrRcTGv`i_E);7NnTQsi z=<f+_ZZ9@m-s?WZweL6I4oQ@S1wUc=QH-6v4N32v{?7w*pyssBX3>dVw!Xp*#pY zMWXPPl@QYOB|ODGLkng=kQ9~v1eW1qbITT>D^5x;pBAhGH)ZQQM_HVg*>(evWLTL@ zY{C$LBP55Ux+%ef=wvXg4UO^P3_ki}3*zIO4>X3H5Q5y{^2ofmOy1w->Z=HM@$ zp)#tr(>HdzrE{zq-^fvHQzS}>xtM=1H*awLn=Vo1CeWMyEr)WkudJFQLXcf$!D

    !7?6_!6QNe=dQMWM=#S9`RN9<3AYace@I30+?4?Px1u#=mv3{o zi&HcxxPlMNOUoEHU@PyBgHOJu^15HeRdMa%r~{KSnTO>woK<^d*v8=^L#8|E7&RY+R<%`DWSCOPiN&L4;kC~-CY5IzrX6l$m$seJw;c#G zfE+*9C55T)L$eH^)xgfcz1P-yD^aF=_WXYRpOJP`yZz7EBgkkJt`V7bb z=g|RQ`f^~M!iu=;72d9OC{`NS&d5VM9R^f1{lK2OR$~g`HhrVqcq8#hP z-s=e>QoVd&B^ntK4hYXcdoRy&j|;O} zrM@H)H8HB@K}iQ4>z6_1EB#sQAq6VGF~b45AZIH|D#dxel%>MI(2Fkk8#u^7c%l$= z_nC8&v|8R_zzQM8Macwg4oOrzK0vyJcV@aOzTQ>&ZDjcS?@*?;PW>@}!kL>@AUkHP zoUYP8KbFSHM_c+%OLxUN3De&{f*UK-Pc2G~rz25{%|GX9r;wWI5N_1hC)d&$^@O=b zQwN@dtkL8iXvFmuL$qaCIdSmTMqm?t5r-N*=_SOJ=ws*Gzh9K_ywM(Hr_6W86Ur?^kCK~**@n>d zR=oRpwrgcx`Wf#Jal+YOFtnYw=4{cpy0DqlZ*iIUi&zp7nO)JP)sBD>waR?7IDx~f zk_04NZKbCC8ZoQA^L<>yP0v2#I6w}$QQ8w39&8!NY0Mg$^m87@qHSM34;eFVxxu_F zKB7};nQ;7 zPOTI}j3=z=M}iEmM*^mN@9s-Y?_=UgHb}J{!C%>>WC@om1A|c^WrHoOs*`HJVupg# z2$*C`xSU#k1c0W|zn)^;oRm-bFS-tMF$PVi@E0DS)TEGukzvA=V+dAF!aBW}Jln~z z(yllED3uG^Qro)OQfN^Q9;v$eN0M*^Zr98PdyXiVmRs2bJ5s2IgY0kz9@@I0M%nKd zdYy)donDfkG4>a4#TN;?r8@B?1IsUz<20BHpMM$7t!|6^pZ7$xPY}DPSt|ZlBK5lq zCX9-dZ*yn`(R8tnv27Q*rLf&DUg9R90c8zH;Y&})364txfduj;S2AEbW5>Clw;(BL zPLGKHdhH~SKcU3Fp36ReOS_%Iq4eB4`BupoJH1kr7(sP*rUrX z*^B8V-Jwj73&Qk>I}rt4d9cF>;`B-0_Is9{K9~bkfA7U0K5J1lUPD9FE|Yti*H{5b zd0YE0_}XmRLKJN{RI99$kO%7PFR}%G>3XEiZI#u2KW&?L4}-Mc#o+Vj6<@A4=vi!zqk2yRff>9$HG~UT zV<#Yd4wRU zs8n#wPMMTg-cL1b3>L|kbU$C_de%>R5|a2Z&x&TXd*!q`bR-URg6+J7UOkZQ-WE}p z_hatDrQ^+%Evglz9aA5IE{%n^O&6>Cp0yv2wZyhg@w`ZgHD(d-J4w=r(ZB&n;y=%N zkb;mAwtC$~*ry(Ep9B%#u(!{(Yvl7_qg2?oD~#iR%3oXjw0?!2L_anEQ5$c}i!fRY zr;JDvBEv)sBD$8{?k&L#i;UPyhA2YE?hPKpUkKdWAZyKzC>IO=C){o%nPhjn!Nezj zbc&1rI}CdcAES8=c!+h3X&?zm?eqoRi&-{lGEgkAX(Nx)pwS=-wdrRM8*$hINJDPkevJ+z;Y5ph1-{glrG zgNe6ssa2LO`Z>4 zEqW6!L~Jx7P9Bmn>b2oqq5pOHZZ4RPA zH8_9CoXM3sei(f`P5NhWsvIZsFL>D%l;y?>*$(4cr0e+nh>HXeqk)HBuU}CRR`ML}^Q|zB zT#ki*@v%GHtz{vM+rwflh3H@Kw*S#a(y6mg%(A)laD>;%`B2i zVv6b9W%<4)9P;af0Vl0&F5MWU z5i~4$zsLTg2%VF7{&K=f)m*%VoK~gu=dkAvB2<_cody}T;Egt>qy1(|8$g8I#WIQ* zGnsUMrafln&yyDj4SN&-3s(r2rFa2ZB4PH0->sav#Y(K7v_lMpi0C!W2a1KE40FZ( z0rMO!Ek)%5X2QneB0l&?m1b{LM!e;vprl<1?fYtla}$U0n?fBIHu*9Ck|(p+llOJE zZ&31VjY0^S$fcm#q5fJ8l-$+1d>u$#k?y=@s()O(Vz?^IC<}z_Yi$}I)W+V9YBXTz zoGyvZqkO8%e~`{pN+=T)ENX(oYi! zjPLFmX8mQk$DuC7bomK#m*S*<)D5!2clTs|xxSu-OVBM{<^FuRas+*+PwZ(DVf=1) z?NIWEncYz;L2(TRbIlC;cxzRwak)prY+jabPmQ#Rnqph3LLG%&ZXSP8mKZRw!FP|P zYwl;0&+m1c5QwV&hl#NH!O6%7FmO@SiDk;CgHVb4d!~T;;Dx@<;8hqs2NLC{P{iNweNe+ zu7-a!^+?GX=bd+hzh2QCrd>98h#w%*lT7@|mFSOkwLPf6W%gc&zUSO&WHR$~NfsXd zS~sCstX?hB%;T|p*gF&affyLy7b1xl{OO&1oYIdTQ?pPfd-|k@Q8Uc-`%o zIzk5w@Cul~DNez(;De4xktE9<44d=9mc4;!9ix3iT_*z$bLr>$zZo@V5dLh|{_>oV3 zihK59muCZ)SnVHNvg>EcXROwD2jl5}mJS@iqN((TM@7;jJcIfR9)t!Zm5YgA@J3F!b|N(l2P6zdstBthMv8@sEk`t( zHlIixJlSE88Cz4$tor8qbCBF1n$O)0GJ#SnM}Nir`*6BIk7~PrPrT@{+l|61hvvjw z(wa294Ci*3{Nz#OpyeiL0x6P?LfzU64JvaBSgNCn*}mr-YN15+%IKFM+zIH)^3HG9 zm!rBa3MiSx6)7KC8Ywf07ru*FpAXiwm>cw=XQ`4syjL}v#AnQ7dO7LY+*(UIa(n8m z9K=-lw!(gkaBdf;d!Oyk#BVR%OlU+FMu;wUdfvNirNF&BAWR?}{J`!%2rH@1q5K=> zMqZx47gm=(d$yutth&Ut7_Yi8FCn{US9f7?69u>KJhhEWd6RY+`G)F@+4*jTFUD(b zi;APGQRd$n57nrdX*$l)L0k3xj-b%((XP|?a0v42LJdzSGgrzNnDS8KB})2Jtm6v7KG{9LA|!jw?@#-) zXG^m3)7Jy2w>~=x80}`uJ8XRlt__;RU;IB{6+L%!AC@Yi!gP|yp0hHt8wnn_|Z-Y$}<6s zqVm%T zK^f~JMgE+=L&(gyINi8mMD%LO`g6ggo1(Ea8hOJ?|4l=VW+Kuds{PTHh@kTLrI-9g zqCTnj`WKU8zb{W$|3~xw-$tDEi7BP3&=dr)f$$>>=T4Mqh8$H`&ia$UiskO$M7icM zD_QGa(YjCP%hPwm4DH!NNl&bwvBPNCKT|&7AT1@WezBgd{%^RyB;@c2P(DifcO6|p*Vu(n7V{&J{iXA4BLn_6S!w@uF2x&z+?Nl< z5BowwhGpw3G|N7zBB=RU1ByP8Ly>j^-fukfA-oF4o+7l~Q8to;*`El59u8(-pI6n^ zeA7kn_l0yt&)*k*64kDOIkK1f(}9lvEB_STVSvTQ<`*+aM<%zjUbQGMh2g0MC* z0cLJ*))LB~sppd%Fv8_Ld0B{qPGqBJA z1Jb%f`&YozIJO1KG9}>jds=3MTQLe28{Kyn}m5Zi)#zbEq4CPmvo(kufK?y;ZS-={$3e7OU% z{ZV+u7Ed60)+yHb_va1(fy97?<^EL);tR0J7WJQ8_Wj<|$ZE(A4DGv1w*v(lSkmDE z5QQnG?x{`#e2HorE+`P#Gi}qpvmC}izAo$LO^|Y31}ZxR(2`P1)$lYVojO3wk;Jze zE)-Qx#|QQr@b<+vMUWX_@#M@Fw19`lCf0nmw*vzIhz+2j_;ct2+KBUeqB(D1gM9vh zn+JJgay*GA9cZ%c;HJnVZFZ9^P!p^Wlv0C7>T7~Zl&)|5{_Z>g2+KieM5#$y76Cvo z27P>&N)G5Z<~jynwq5tRL%>J~b|2VqyDga=iqN@XAcdc2exdy(kU9iLBwvgs=!w&zp^VU$R%KK$nnd8bM+M4~xEOgz;*_R-@ z*)22aTCo9s9(}H_9562&fYFkiR&GPYqQW+H{L(9!AN`0Q@hDmGOn>!!@+FA9aybZp zsl4yd6M=;FGyeyF}=)0||`LNXnmieEVM!wI*R+c^(L`N4;pz5~0(TqU7hf zWKikV%LD7n#Z|=^(fQzuBCd16fSp#-{inO%Gf_$M4Orm*m_i;k-bdW=)Gk@1CXcjE_x2bH;M($9aae@_Q|3e4HJP+^BabxWNy7R4pqx35pC7PFV1jrDr^C?QJ@mPq0cW2N%?&1F+eW zhd+T*#ptk3d1eOp+A_b%^Bf>7@|U*z<$=o+m|NgQHDwU~9KfTk22k18^}I%*cLpRiB9~bt z^Ts*1u?!R$BT^n3N~nu-SR)g{u{baIWCP!l!DXM$fGN|Se$PAs?>})uV(j9@Z+~dR z{`&9ZSAX^XFtVggQy0rUWk*=CG?#4d%s>=<=+dpxLOYD@vzHgXdNDPb;05bEyP9C< zj=!I!pDsNj=U*UrD)`f*H76EX;vp(+nVJ^>NA&>fzFH+z-w?F4WtSkDn(<2Xa#yjq zV?S`G?JVojE3NFB%ZtP2Jhg~C&{sG+797|Hmt6lacy&;DPkI&2sWh=)kTDkvvOViH zLL*9f)stinfzHdD(Tk1RWQrnr_h{@%oYS7Ye4?}ZS_v#iUqm!JL`d?eM$j35Cu`b|gv00b<~$LHLe3+Z7D>04Qs3 zEeW`YDW1?Y5VZ*`!>`w-nTFSS=SCoZ!rsE1Q)X9JVX}gYSXBFW!sc#iZ4rH9+w5nN z$kti{c$P)hGTJ(g3@3P6*;I6uzGcIZxq$#ry|PC6*-`2tI~iEk@ACooPig8-czK7S z&ExnXvAY7$r%9VoGF)fCT_JpvEr1Et)j;eLUyu^|m0006NS?~@NjNuLZOZ*`hI&5Ya?S$D8)7*)bm!dkOo z45uUUt*adRz`M0YH_DT|UaM_Yt0RDcK~aS50Ia}{-XR^nP0DBCRv%F1PTw5xya^P^ zzOxni8yS())z0I|XE>#;L}%}`hZbhU)!j#Md|vJigGWdeap&|!dLAg(pmN{Sqbi@V zYTsl>3z0Kh`Pt?c(_4(8>!?3}sm^@$(^G`R_2qykep^OCWw`?yjxXmN-3S$9BA9SQ zFZ(4&*#)%!$rPpM_lv~OuCL0^HgVR~ zaC_>3*(4b}Wa%0$2F)_OB*0QXnbCGV-L`wwG*=zoPWBhkT%yh1NUO2T(Vld8+9Z5Hp=#&6(!td5eji;c=>*ES+{QQ|v%z~P1CA&q3GtY$ zf8iT?o{24j({7C!CO*|^xo9^gIIR=NbSkW0O2AQ*ygnk`z&W}W#@-Bzg=n!uMs7!v ztdJjHS;Iv;4^LSI>0IMb%Qlhto1ye~hr;gZ56MG=E@Jf^kgTAU{k`o~VR2f)D7@C# zvFh-HT5uT4*ZO7`KXfwhs-o%tpI%#{%!J^wX}7+0euhI;$>$ha;wPxDZO{CxEjzd4 zb|5=g`~~^=s*gEE(C7)%A>IMNfXCAPi{Z;Rjl5;Z@M!wjK4(3x#OEll3Z8CTf zCOI#TCnH`R4K=M*;-|XHn-Y9K)c|&r!G*~WgW$ChDSV{vsoB7~)Ufoahw^=q+vU#r z&PEQYN%Fgmc<>(+h0lUFqCz7w@euJm!4t3|g(P}QVg16;mos;p$ z$%vm1!7=mG+5F3z96tbrASN|D~ z4njLd8^)=@_^jY2psuGa)2$?Wr#rzPD|($29r4+)dsExCTRgE$7eZwk1TqrXM%VQw z2TPD9gp#}5*OOU8`M1)%BnnQx7fyddX z)8OJ4OiA>Bpf97g8Jl5(NZhaAwb+-;E&AK+8vHYaQ1A*ZL(8{>ZwWT`$b6CZ{ntpd zN)P&$T?q=SJ2yPbRC{c-G+~w?z!9W-Z!mF^lX@9i$Oh(m&D#$Y(eEV8D6EbrUxhZ-Lb-v3P7~VW2oOQAox|6Cww*BvdrZU9j zX>5-<6tL@YuRDo-MVMCoE@bv^g%VVrXK?yIaNGatr-$e_X}j_ZWdj<=&uob?Y*D1@ z#0DL^R|pRUvuT;iwC8g|+h|msolk!Qz}-9f>JOu{*WP)PlYr*$pXBQVZzxKT_WPux z?kQtf$zWHa*3Tu3kT0TU%XKt31W8Fdh=`ztNo-VYmkMM}=Jk1bxViJ~L|-K+-6e*w zs(08%TJR=O%+b+0l^*ZstsD4i6N$T<Ect#M2^^d-_QPB3B57xI7O! ze@00_Z-?pi=D&;?ieANBVKSfd6E9SH{CPOp9!;VBsNqex^5ekuvDI@7J zqq)_}6TAHW=h(wO1;(1*+Nk7FW5PF!Cbx08GvnMMZdHTW-wGtkjJ;=5;MS#)YeCJ? zAY5%2QOg)MKzTpf1g@bMDWUlBLjRxjz>6fyXo9RjKzsUC6tU*?da~55VE@AayH-Wi z8J(if|78J8^Mz-o%1O$mVJrJM<;VCnbgn)#FWJ+}9EWo4>1FLYlLWlEFqO=Ty%4(c zHHHvv$`(IaeV$uwjvWv zKe6cnm#dNFKei>F z`-U+CS-UO*@S8vTC#jCCs<{K+dKV7uEBD!%Oz^LsFi__0@;p__Qe8v&31FWM#4VKnjSd~HM*>aNrmld zar9)q*s?#)X2xYJQur<9UGTPBG&W`{3qjq&n;7dwp$XvH$Sisn6l~Q1M+Bg(t>w4#I10IFQ1c zA+&g=c+tV}w>~QjIiLt3E%8J%kK7?>uu~LInQ_xJJUJ4ml~RdI5gQErlPTR!SbM!U z8O^-Y_5QWC?ZR?=hb{r;y0r&EGJnbm{92;_kB97YG_Ech4n1!(eOepIK4h>EDCX#K z?8zG~QB-v^X6WkXF)ofssbn^4}vh-#5c(R5t)@*tWT0`9Hc88$}nbb!@)8_&*kep>ML!)j9R+!UU&(Jl0!vN~Ucn zyliN+Ylu!4(at}Vgyt^_SumS5Sp@gUQ+Y8;Efy^bo!Kw>%_mI%F-zn@O{U-i5Hk-E zeUrx?^6i;dMa522z@X%6JvhPr?ox1>^`j|=`J-+ecd*B4wn5o;+-dFd`Ax^Mhhn}DOB@JGUh`qwM&d#j zvzj__Z1p`CwiuCA{UsGu8&yon2+30Tzgcjg&w6K!)@>zA6}8YRKlxMNccBw1st>*2 zrrw?zCmnxLF`(d6^H$_ECSx*!c#yp0XUXs&J26v7VFEK{SiUyo*#MhG#caT~Qb_RB z*F>I!uF%`a)F17cq&Woe-dfxB#(=`}*1p%LL!4hn|B?neB^lBT&^mz;9^n5siCZ3g zY-eAkv3c+=kIMw1bQ1Rv5~|q)VB7QOk(h5vI;dB5pPLYAyK~q75wElUjcc4Aw6a(q zw{~fJS(E%-fs-1kO5x$T=pSzdK`J>m=z~x(vql58U29iP^CSU#hQz=!Ax^dB=uyt~ zCYnXx-j`LJ6f(w67`F|caM}2V2PU(->O)m0G)nf`5~*am=(Ma6-oh%$OBUQtMu{4s zpPyaMTx&!cNkagoBK~;igffOTL!M=f^a{a>NK>-)rxUe3s@P zpOy?MWzL<1`sfvkHg(vjH|}4~T~B(Xr+kQ6k6I3OcUF8Ab4Xc^G^5&K8~kydsPf^= zopw4JtSE+eKfbQmv+d;p{fX|*h=kL1G&89p)r;Hho}9}FWA+2#R0B(;$kFo7wI9f2 znhZpL1)@$Z9}ZQrzLETZ4wLn#lDy5Y;(|E}Olg0YE**~CHExK}Wx|kBaOH@hX-GIp z%;8*U$H%^GI6idEDT{ef^CuWCamR$ww!z?1D;a#;V!gaxo1g4qc}>$bTg6)5O7p1Q zCo*i1a--6xSH8V@?=3|D8w>3bOfK3>xt+mzntwlfDfXX-An|U&>a%*6|01!s=-cIg zL?l5h8S4GVOvc=e__vJ8(NHfA+_zQyNW=gBJAV?n6LR{q)l*%vdc$+%$!}5ejg+)W z1^bj)z7Epf_3{)Ky@Uy^t~EQ=fZWgVVN%Tb6gtl$-oRN4-@I9IU3=7~N>BN=?u8TY zy4~+Cwcn>Sad+gL)CGl8q^G)CRdY)V5J{?iG>2YLj~fRr?+)L-O!nBy!1eeY=bl_O zLz`R=Xj&Ue>O)+56Xu=4?+7UPimX;p^!KT-*j zY#Af(s|XsAJ(qW$EvKalN{^;NqavReY-nG7F;Kbs`r(7CaUFlvw9Fq|yztf4SI4Nm z0i_S?gJ&|9$Y)Eox&F#Nk_j0>o()-(F|Y4|3z z>=P~&;{KpZjeO2H(P^#E$&-AJ$wCW!YPt)-q4rDG5xLlAqd`~Qw8g|UYbS#bVpd*! zWPA0_<=VSui$9V7Hf#N7MHI$Jbj&Mft`5zQfSnFmy>t4c(;z1}Rd4q?B|>gG1K6A41MV77*P(A{DG4 zQ$t{+G1pbDc}%h5U@|=gzhbRtupO^ zTVV_OWZ+vxNt3?-zGJ)NETUZiWLHZE_&@TR)1p%rKA<17_pIZry$XzI4NhNBA3kjh z0s=-a=n|nqJM7W5<85h7uEu^KgWhA}F+z=|bNeey$yZDHHJmL6NurIaKX-p%nK*2% zfw|_S1FdQT^X^({W`pg4GrFPXU|~NA(A#04wisO6 z$k7>(l8PV}z$!(X_|b^(y|J;t85yOPNtf?=OGtnA)G;2f59cY33pLJgX3a zg4~_J7eEwBVFU*F(gWa6TX(9F^a1mR;p2g`U!VesWL#=<10ZA#K@mMpL^OOcdL;td)1oSFTdt(!bfu z-pFkqQa&++Kyb!DU2j(GmQWqTtoRUr?T@-rLZ2j{lvUf9@>DXZ`Q);9VfN?pL=2#9 zyEoFYYteG%;Q1NN3|68c zppPfF<(hKnCjWF_=bHv#h#sa{)?aF=xB*F<0>Sb*3g?zBuGnc>5lXolmg{BQbn-WE z{{7iNS9N83?S6w&SOX=mbFG`EDA4A#ury0x$E_y8Ww95n642e>{2S*s>}dAfbPt3!PCe&xfBi;QS2!pN$whIa?hsiz zl)DV31+okv?OpvqwbRr>aoxCemn!zskAB4VDA64jon^S#hshN zgpp;CMf$3)eN=sk-03^u(s5C; zkxBM@Z6^6~4#^FMy40D&0mj0I_}##hHlWp@D#dB-L?eKbcBf-!LV8=~Oj{9r@vFse z{P{Y6U^<9FwaeXL<|+T!@V#(Dhe3REgwKMU)SEknj#e*T-3ys`^4)6rxzE}c@xbuT z5G@%rt#c%q#Z6pM(%SUJ^G42jkSSy-&k_I!D4WF4IHd;6H=B6iMVkpT;y+22^V*#!9x($ExF=6 z&JNh?Zf_buBZ7Uu+((bQH+pI7Db*8a!O3FCUpX{VH0|lP-}I<0;LXkbPp?2rTeaYL zB`J#S**j4ALcG8dcowJzjfP>#MYUg803O^l=>&*Kf)fwo!rky!4im%ec*5MGD25~K zagTGkHnrP!?&7V1)RS5RSPnKghU?POY49mZS&^Au;>LFQ;WcRRylC93ctXv=Ft^&O zAIU3F3_lP&8k^9V*d^=*?Qp3d+-g8K+2v|aQ#`G4n(X(!U&09%>b?@e_P<{!7dz1W zB@}E@N)?dx%76!6qku@fw@{AW;e2S>M#fOkF;P z4QrP@k0+#K9_Um#;UV#7FwyeQ9$=03H>#Kd;UI%Dp0Tpl8Bn*hlZw|L%U=^!6A+Ns zhHLJ+*48#YopejEW>b9}RImvFVxJtX-+)9aOJ4oq`~tvJwlQOyukV9Gn6@2I?Y2*V zPm%NH*4IFSH_5vdl<1uoCzIeZx+*QcAEZuDyj~%#1^U}`(v+bUu?x$69D+FZC{5al z*5CANxX=|)$?><{wA%S!_bW|m|LF;+C}Vdz<299jt`bYD^Q%7r!R0QcGay)q?Ql_h-^r+`r#Yc^IO7mfl z&wJwVfXQ5MIkNwR5LKAd&Lq_S6tVZ`anS&pJ@7)7$2#^&R~#qKAZpi@coUZDG$1_| z!WU02{coiuG&W11V()Y!-uC0HylZ;Tu9nivFRISkcPE_GObpT)nt0+#r$flqgQ?Lv zdRq%`N)Ndj<4Q%+U>Hv1O+nhN!G2lweE4Z-|qFuIU!p(OoG zWx0K&h4=tzlBv>a$e+fV-D=4YN~Qne_0Kk>aG5lz(gRQ3=?&jVW^kAm zy)|EV@UDEBVTo*PtOEC+Ou`W`3pC#lUON-qAGJ|P?la^E*3 zj(tHhW9g?JeF7iS^UxJ&$u*J9@X_v_5+bizYl7YR-9;+-J$DiftJWw;R_$w)oJ7hq zZz_^CBHf1OVMsR5P{L5jaab^LziQRqW%kV4&QKW?Q}6H&_n?tZJ7YiQUCG8Rtf;{C zVB6FBz)Kh!oYzBIfXN0zp@o-o>UWpah_ZnG+mSk2m#CmQ%v585Do)VwR<8~YdcO*g zOTgJsb??QSnZ_{p`{w#AOKK5$ql+r8OGN5PJN|rtcgrlKdI8)kY^)~vQt+vAhiT}NU}8R=`+>sjKVNkEMW}cJLWaU7)V`@=Fv=>5u7^jr*!M_ zbi<(>Y2k}oNMF(Bki3sk_w&Cj9s_x}r?lpM&pg3qECltUN75e8l%A#S4a{=&c~vT7 zi#Qp))N7C@$@tfB5ETlJ%e=+9qtu ziru-%S$7TOG7LfpPgVnqSb5)<4vNPxLKKJ~33$I?4?jbZDyOew1s_gx=G>#32St<$ zqv@%A0z6k@aO+{eT?e9S^*fsr%#Z!3^8I(J)#5B!m_q_5*2^ih?;Ja?9?EIo7MBTO zJ`yeM9GHVQy1SqnhJCUKC-Y(2qsoLuFYhEsk?}0V5JWcR_=-u#YYWEMRJ)jXND5|- z{uhwQ`T1Fy&pK4oo<2+c)m$p5ZnZH-Jy2h@`J~45liQ^%P)>02)T8bnaILg2Nlw0R zyisnsjv#XniBmqH!-ZGyIQPN4e9v%;{js?2ilD@X?@$=8)JBP0-IZyFmCqaa~Z1{lW$CC1D5(7Ut>;BSUGRb<(AJdn=IKpV@9{wSrfme#(u1Z+t z8*O2|yze?tK>S69xpJ<7lLHM@B9-x(u}<}6)7U7yjC55!DmZy9lTOO2m1sn(&3WTq?$6 zIMweiKzpJmlh7&a$M~v!Iep4v)_dqq*{R7SCzUpJKy-xQSZFA?Xz9C5ph&zDePi(4 zp0g&B8e}SSvO#~S^djtuTUE<>aQ+)%rgcV6w(Y9jsf5_|jpZo6167q7PN8H?uqDRF z)CfPU@$UI4`MH*@J$aVJWE#y{wb+nucczF_i)b=ZZHR9%|l7e&n$e-a(b;z5obmF60zFt5je5!<{QdgKUmpPzGW z?B9izVn1$BjnyxdXq9IQ$9Db-Nz}8j3%aP z%xam_(Tlz%|3<5%lw2xCWVwSQ@PIY10Qq1#l!n=@j~pYoj#}vo@SW4_OVVGx;|blM z*p}3{VEBX`Xqf*Ip=#mQ&_4eX zo89&pvkR9Tc?jPsg~w}ygngq=;M|A(L5!Scyy~|Fa>)=p6k-?Ko3H>o_irI~D8V%( z`4x=OG1tFBs-a1$qZ~IlPZ6RSy~Cg1srb6JzKp65FX-uyyt=N^(z}py1ou6uNxu=3 zy9|xXSX#s#`ec>+j@aK!@`#K@r!OH|4sOKru`1Au2nOfP$L53mkc2M3ep@8!!FawAuUpL?xk!?r~jR^><##z=^C_M&3^#h^+kAT_l zMJ0ks`Wb;y`2KKL>DYShPN~l~PFE5f^B7b#<&4e@;8(Hc6RSd&z+0JIoJ#K4 zm3fNRI1JP9D}*Kx%Q@K}kG84#9t#k%;!It4Sk{%w9!4L3_qDZvNLsV%`{kEeJh{iA zq>VFO`gPt3+x6e{Z|W&mNQ49qmeHhrF~>^|)_$nqJ!yhF_@!=vFkgfKJzj&b9g_0w z-U-*}1|vPkN?DqLS6mI5%m66{i;bL@i|Q8~KgzwoTZPlD56>`hg@w=+uDEg-X=8rg zcjtDZln`f6N*CQ~{Yf|Ec*D-c1g%K(8MR34?DP;$^apCIiS>b4*t+D?H2o%)3J!sh zm8%|p!gl=VLwUuo?U4z@5|GsZxbua$oBLZGn{lyoRcb_yZ$SCNII z_8*Mq4g;URj`x>GpvpdqJN%R{ofeG6MG_J*D!(RE8eg@<{zS1XLPCkF8=-=1e~9N~ z9gF3Ip-4a#G6y4)rC|zNL*t&$cr3&3F_iVg9LV=_4sQj+d}w&Ed}lGHYsa9(g-(eN zv%BwPUv)cD`osiUVclmt$O^oS+`%Hpsj_4BRFbW8A?2hbKu*t&$lh!2ZdKLpZp8@3 zUC9!z-pKJ+E%(~vz3Fy(>xRSXvn&w>i7+7Y=b%<6o7)EYK9YHNeIRr7^qx1*?^r!?6#COnbxGro6 zgM4DS=jK0VLWgqvSQfHFd+!e~n8K>@@9 zNg;_@h#jMngDuAmZhSnPjOVEIWcoB~Nw$P8GCOfLEPfQc*j@5zb`z6^CzGBHsH22K z?ujwx*z&lJ$NP(Dl3f~_v%Q3Wdhi=rh~Eej)0fOAnLM|{bXO+{q7im|v0a9JDe2(} zfpgc-NN9CTxXJ%?^Ad5YXF)N#wFg32ooc&!0<6eG>1@nI>0JQVnk{X|N4R<{T&nhQ z9xWEnsZ=iy=f{4?y*tD5!^HcP-QoT1czB{UkV9u}uX(RIC&4b(yy=aXF?upb^y^s4 zS%*Ug;@YEw?6D4lJ$aC}{NzGL0v7y(!Tle=RHt4F&0s4ksKelfFVx6*^g;XIQ>=4% zwCM@ck@=(zjN`!^`0d^8!!0=RsF0E&yn~qWJNc?c1GhHVMWLg4>RrWhIAOkv+!fnA zC3wzUXC9aMf;+OMqvQ7mUMkz(vfe2y>*A!%5PSP^l}C~+VvBGandY8DT`KKd&ciVy z(Ivr%;y%yQk`pDs3}dVCwSoDh`P&KZleXm*EeE=@*j0tOOiH2Prsha{DvHCjb<;9m zm2HMY&gJYbhPBYY!Cs|Mq%VKv_`^lIZQ5;ev6{PG8NqL(!?O%2kjki7lSwN%?UE*% zwHalmN$&&HbE>rjNLgJ!Om!u4JdQPvo1n>d=U%JMcO6xP2t?V`)Qx@ushcCsy!3hE z563aCX@px(ZEeIs(i9zzM8nm%8CBeJgnL12L9cLj@KlXf_j-&-$5Ah1iN@uq)}d0K z&bW*nu_xIjwvz@3XK53i510?p^S+9H77;y!SU1EfP61JXKdvKTzDLo*7N3e!b=>C? z{3aWgq*~azrTW@bzNW~8e~aa~)&G1vX(YC$lxTF^7jqqqzn!pcD_MZeW#4C*dgi=i zW_F2{G&Nk`D&*wpM@MA|U(~}%v+zB7MontSHe^Zi44VaO>HZ@M!f3s%*2`!Jk9F(! z&t83RzuA!n>bV9}KzbjiVEp#FwnnT(5L$jPN2&&?mQXIN;w6loW{M=xUVi%_QW5`I zxk6fqpvvT!vhR0_zSoXJb4^QViUebhMb+iI*+>7QNB`mf{%Vs5ZR_In90+M>DHco7 zX^9`)Xfafsa-;kC1Q<&GZyx~d0E{O32QYk!qLlZ>??)_0n=95lb^~>C%#4kSOUpgW z1aZV9KF46J-}||7|L1^`-aybFZ}ga38t1bnr4eOmeCSbP;!{eT&ym3^nuIt<0mNrW zN^9~???%&1!pqJD>YJtaT&X8+8_8dJ9ISd1lFuBTR3HD_*nRux#m}q8gd)&1B=1;v zh)SV;;Ny$cr2}vNqfwc|Oq(L7*MC3dDjTKLPOC#bfa#$2lUf%a*Ip2QMyXN8j$O9v zL66z}JGzdm=(QV&LSSj$LGX;tEXl7CD>_BI{kT~{7Wz;0y+Rb+70K2SKgN*4mhIp6 z?-rN&tC*lcy$7^u%lL!dcI&0_Ux+hLXPP7s5yrez#RWfmsbkECsBM+Y$p80=s3ykz zQ%ECKmjJfw6ZB8qDlc26@iFF6skTmkN)|tUE2w(WR$}_i#Ef6J&DpauIR_5%FGUyH z;f-0B|7S)9PJ-D^u!e_UZO)WCp)UN!WMXZUK83eIyh2sxe{vH3zt{I6Y}1rT%u_d^ zmC<OyrJ8r|VD3gIzsWx+&WPf~K2p(xA6|W4D)6oqo;H zTp1rr6g-ZBzv#%T^qSas#e-F?1CvN$hL5U~wEk-&XScZTY=}}e%m<)E={LM*n=j{6 zrAHfo^G<2R7)`dIJ-?b8Y5s8t=^@77QZp};#P3eN_eAlm!7jU77Vw_M9}b^A!}z0| zUTk;({q4cAi5IM(ng}Ayn#l_D3*>B!7zD8O*DG9AuaHW|;|4|Q(b8o`OOadz2 zfD{Ra4C93Hp9!tY2TUXOuKK^;!1m=>oDPVf#oH}+)edoxpH!DtcD+pCG=>bDirbGw z&E#4>7ry;SrWs!$zCx>T9b%NuAqab{zyN? z2e|8vO>?9rL0jp@R8|0( zkz0UrA5t`)_Ja`UhCw5;|B9vcpev{*DqH^CbxElC&u5mCb9=&q2?jhlLMUBz;qbL1 zG-lD^CHM|WlDf#FCLp}XliEaKXL*;NwSs1-$)DRlu+m`AGr0hI=y#N^leq8z z>PV|=zHJ-W$o+X-NM-1^ReaoWP=N;Vwz!XL=b*do%f7BHY~7%xA>T!Ghu^*k%ceu(sE|8W$!Dl${U zQ=tRk1$&b79({_930A;gtDZz2qw`K#ZYa9{@ChTVYPz1FPdx%nqR0aOvtXGSC9bAKO1-(Fv1usxZg264frl@KY-%gzpX)I$&h-@j+hr*LHCH z=>=s}&!$vdvF?AFz5r!o0VE{-QcVD@V8Rw@9`{ymOzt=g)bv;H`ECsWtP3;nlyEj) zx`1GfMg33xV|M_J_F!Gk3Sw}q3hp#co1xT{VuMe*7Yd zi@HG6;AZqmS(S+lqDCHBqQGT(mMuZ1yQ?Zs;v!aITj~F>wJsxxd z(8cW3TToUy=Mu|W(M&iJJP_6(0IL0RDlZ1HYhn<$c1}2vS)rIKc3`%8TrjRgML*s# zU8u5KWYyELX_5v}p{}Lrrjlt?5Z z-Wv4#3?_30NoV$GG`o6cy4hUFyIk+>Xd}Zm2UL-DNqPAemq#p1*F4k=-KAodNwznI zt`#$zV}D17x%OMG`!-E`(;7)PtO+6y!~ENWg9#1is|_GUpMi1^}$MZ zfD#>=$~SsrcJs%ef0fB&q%9Dg%-Rs&k4E2HLzS=ZN$WOjiHL%=w@morFCe3&UvP;GU@fGdz@t-*Q}sOf>^bvcjU8UT@>y`SLjx*ASi^wk{~s9nFP=j9Z& z$~l(P9eoJ|);B>;(ECA)sYz%AORkRf7G|Ju{=G-VYR4o;?pzQ26+B@rU#^5L$aF@)VIK)u{{U-7nV1`6OUBr7;bNXjBb9f8o;>1%Nd~grGn27PY zn0ELShz}*}rW?gL)M$L#pVHM3*Yg6-gvnp^m(ayxA|K6foRd_SuLvSC3YMcie^DOl ze-SLQzs-nr98F4R>pkvE=#T4866Vry%Sf*gM$10DAD;&$tOQ}|8j@_QiMha20~3As zI{)1cCtKf!ayNmsMf7mdI@`{UuCd3teVL~#qg$NjaQbt3jjEU&OKc=ROViioh$0uP z&yMpIvo0It28<95)=A#eL~~v(_&Lm64pRMu1z2toxc_W=n^fw4D47i?Ja?$81*#Xq z`0eGT5n)|l6Je;g*nnLN2EQHzARw+feo1_;^W0&;8PB^fi*BxK+@#aZHs}+7dl=WR zc0MM$iv`Jpr&43IO=_19*XR)gaeS4G9^W1EytDkS-~LCAIaBt-#g$P~Sg0QRswk=zTaEu`q^ z$GP*wpb#w+%fp&bT9Js(5+YhPX5XUJ=-gv;$`;)Z;;(2=^iyx=JC;+fNOj)_z(`KS`A^q&Wv6Kj)ap;5lNpFEEF={>W>upm1dTscarM>`R`rQ;t1EdE zHh(|l>Mo4jrE{zdQRrXm93Fb`I&$?3jqEu?o90`|D#V(p;G*eRSR<+bay}_^9li*6 ztarj%j?CqaJZ5(!eNbXifj<6&fC|wvmqlhFjk$B#$vNA@(6`I4aH2lCj&|vFVO2P6 zzv+F7!oT{}NH~ov0sJtyCZnu2CyCLidE&4xKsZS;@KOy^i4fLVCz;7;^|mRcSoHM^ zNm?GAN!{PeD4C{P1rbx8D)U+)+U~dEF)V_~{Mt=f>{9*5t)jx>Vp=0o5f?O7xG)6C zDm`9METVJ?grjz@!Y!DmKQw%Q%okqMUf$ob<>zCi^jMIW#rOH7VzPt^d?>dycF}V} zqvPf!4^_D!yk6@HMs%6G;<;WEEH1SZfakt6X+&=l-&f)z_tpbrB}+-p}hXc=aFM9N1OoF z4xd_n#Q37!zouE1&m4pDRAvQ@!-bYr5;??e1;3(ylhyk9Gtwqg@k|UMUZ=N=^EJHf zbJsAsNPZ88lM#tgp%}ymU&cj83?`0Z;TSH9yQV`P8_c+=VYy))onp=kk}F3k#FK6h=V`lZpdan0`@vSCpY|S>O_)TPK7ZM8XMv6W zR7U2oG)$eJh<~2v-mnv@z84vorg5s#LpGqF5kZP3JZTZ1YrC@o*9$M2#u=h|aI&6*lu-W&9}f zINZl_+;q0q4kRJv&3XP=*z&m5Z1hH(uPgJVC_FH&=&K{K4EuB*Q(?4V3dV>L`(YBZ zHDC^~DAleJv%bHKzAYC9 zaz4aXqj8@z{;vIGa&%)G#5DWc`$o&}i{g)>wW`yt7`tW2Q4JsodTNmKMu_=0>5D!YGTk=by3mi5p+f zo5dpZbI&r-fN_j0b6aRKoTq&d;lz!Xi06!Fj)`xoKN;j=51)rGIi`^1Rbgt=Q)4Jo zczaB0PHI$G(LXTfY2fX;Lr6wup4N>qNH8b60hQ8M3{f`)`@lt#dzjtNsuc#>LS}ho zEp;MOmj|vx{zVDQy1y30u`LwXWP3cQAu-dpUwWFJ;Mh1mAC6;1%+13El{Jp63gXM7 z+}kpo#EW_4%8kX7%!jvS_@`(yPivV*^6w(VCFU~%MfaF+k>fG*y^pOz|K3er zt9n%XMJ@F@I9U(|&~f23%ykW|1yhDzR^~;!F~<;u?bTE&q^tloJz58)##Dto>844L z^I_PKfFI`y_%Pq;W|y-?IogyEkE*w3&pi0zSouh`Mc_d?h%h(5`-QQ97m&xoFptkF zPK7bQ87oX-M^ghBXx}jL$zMi0gpAZPw8$eE&f9=*K&1BbOB?Gi{PeaqM0Ug(vC3Jm zL|T7^EK_1pio`y(A-r$nzbR@p+2)Np`HAgX`*5Dwyf00eC39Gy%jEgZY?>wMu;p;4 z86Rs-vw^QR>nwK^*4k{ET5f0ZZ)vKczGRNYb=Pwa6QW4lts&7gF9i-(%KabwHu1K0 z7UaW6iRo3pzhZfY3OkE4?=mjHDNHSQLFP7uFK0_(TJ!d~~tPwxQjn8*$P~jF;DVz#t5oY5OwN77~ z!CFKvzqVl-b98Z3J>ahWGPy9&wl0Fb$Zz8=v@UG^SZkklEh8uc7tyKvQ|E2ds*EjE z%jUgWW$$#p1|`X}5#P_(1%z6|mRrhShCTQ=9!{;$oR1|x7)|>2;#_52Qxfx9Y(H>J z{>+oHiYs$o1)#*N>}a-qs_LIw$g3ri7BJ!C~lL z0CpP;C3Mz&)KDE$D?}l!G3R&`iwSAp@Tcz2M~E|$_VT`~^g6LeDvKBv zf}4G5_33%->?y3XLFl`Wf>m_Ddb^S}9u97lq-7vYd>#wLgR&#W8`~+5$<9hv$-!QB zPuyf5;|0qo{4K=Uj^ha%4a!P6EBZ;%lZm|FitHanEyyd#zi9O4rZd#2sfJ6zgYSfG zOC|S6G1-v6e2P-UThLab4s-K3_Asd(f8LcNBSxE^+yZ^^77}Xn{*J9g7v@I8n{j^{ z!nHeHS*1kZo>0Hgw}TI9+R(sUdihJ!12grEIv!T1O(?9*DYUNn&fkA+_;Tbi7*UgO zXLBJ7uOXewbjk(lWVn@WgtcTcG0{6Q>~CeRwcquPf9;Wi5?kpjUaBo&bbKbCkUl7J zXKbeNtbuE?@aut!6kp6imsy%2nEZO&WfQt>NwiCWYUWN1Chy6|7cNZ5 z)1-G0N9LjUL-=EoVNt4O-b^2Q)mY6Zw1Q|#d*%v>dL(*U4$Pe!-SoyPA8qzx4~zCF zp524dJ`9dt#?-QW-10!1z^OqvBPr&SU(a@){%p<9dM$p z^bI{Xq}(m$_khk8332p0S&5k=p~-sf>?85pb*m;lQf6{W(X@)V8{^~{AtL9?zK?|H zrynL@+o51h8$+}Zf`+ER!DDQOE`^_lk)4L=d*RPdxbfH0`HYOi7M1P2SbNSTeV`1E zug!-;KTy{;H(5gAo7hjSKi59T&MgDW zLJdoti;K7H^63O#XVdZ5k=nUK?MX#fOtBstp8gtWy}(zI)PLKzZ7rP8J`>|;I_&UM z+@T3STq9F5+`mJs-oE>uO>KunhGLU%Cc@0_lS}G6>21Nncv)^-j!K*Ej1SxUIOwAI z=OuwHYY!CGYZjOGxFKg0hVk9$5FKmQ2GzEkVxcA;2CcwPk|slB+uS6>k|w#eDPt;G zq#ef!Cc#b=j^q|hN@x+`i;OK!bcPh4n_`Bu{>wy&9gjjPqC6t`gM&a=zx&{n4(aD@ zFP0hFULj?F__&#Jt-RLH8E^XtUF<&I(<&XmYLk{d2AqucP*s5Lu!8s zsvgTjy4CHDvH=1Z_0;x|Z!H+5UvKT^jO)R4`l7B;&j>6TZUUne4X^nXsDCGauyV0pmFchf-+@hsMl=v?ulJ>@7h|}h1@iH zoF*mAacicRaX-wz8oa8Xs&-%B(!9tKVg0+LU-Chqf`9zM0{2sp)Lx#n={CK-D%acc zFjAyr>D{HIw;oIX{yY)`rS!9N_bUxcEG)yHzMf>Rx6vAf;a^fpRMrkM4ufAo$l!3y zqG7jzI?~47TSGf^A52YF%-dQ9>N4v}+K^}B#Hj5wU} zm~M!4JdFFSfTQFB(hS!OlX@Q_?~`|x_fNDgjga0!7`;`3+0edBLQoY3+yg*3ZK9_xEZU*jxDXZ04!cXE&8KaML2nde~zF zd`$Gm&mP2N_^ZEuCN5i@=lyP9_x>@h^BjJS$oy*I5_2Y7>ai?lR#y< zAmMCn0-q&`;_YDqz%S!-XKAOJg@*wZOB`TN z03Hu~)cLuXCUk1?h^!h(iHFzu=)r#nFfm}io zus1GlPu-ct_OJnH0Alb8*h5Isq>1W>ofS(yYs4SC$K@}LXb$i~d%&S=t?o65QxF1? z!1WviM6MN1jz1{g*e@Dv?t^h`u41p^zl*UdFo<8j`Nf1%x|y-fl}E^)`eQPJXYV&0 zGzmolBNZ1TuvX=a=AygFI%$217XgkhbHiXIEN}%lqq6p6Oa1}Jr5bh1iwU(!mr38% z^{Uejpn!;9^b=0LIwhqYAh60j9BSfZQ3!5FK~ZcMJFUMZE&HOB93x=MwCE}>DPBc% z15W#*(uVz_xuVwXRp-CC4Z@oVmx|_fccTXy09kDjf8UP47nj*5ujU$WA2WXK^#+*F z|Mk_t_(l8Yn}U?(4VPJ0$1>WVycO{s9X&!pj>?ICKDG^vjhlHqRlSwtcK30H0f&hq zniY+%{Q?8G6d|#@y@@AajD9!ZYHo=HU7mKMV7>cRBKgWn@oGoZ49~~}8$dS*(1uOH ziRxU~Ihdg{ejtNGb@~wp7a-h%8+8HNL3W0@kq?JA`+m0`GUAY7V5#01FJ0>Q3W`XY z-z9HBrvhxXCBZd;5U~ou=fdOfgHIf`Stha*oT1SYpnZrm4CF85Ou+bn`O`m;zo}P> z-Vf(3N$UysJo1S+XX;j`#C8X5=Okbl?j?2DN16TT7PMupcr>r{>PxKw3F5b9X8Hzxg_Q$SWeyK~%^W0vg#ASQyZ17oj7M2o6J39}>|HSPJ1!1e@=m zN%5oSwK%9Q9~IVV5bx;$k`5(_^sl#Q0?Y-imN`GT-LhT5NmVwfyD5B>&|I?}Y(m1ih65u7df7x&*G1iGfF2SgP%7?k&Tf7h%go2Z6Ov@iMRTvls9QH4` zk~QMTwShYA9%lcY6;HB$j5Qki!K?=eT&-c_bfA9a3w&6XNAkh4D%-5dS&F^9QaF45r#k)Qn|r zcunAR}!y=n!^U)JpxAfUDXc-C;Stkf2>oC^8S=5nUs-C=F`;2Tt!4XVwy0Tg+q zA76UiA8Q3SsA%SLy3x7_!*#j<|HT;doi$scPb^>kf2~A5-e3CjfD&sZL)7@0s1;Pi zibzzKtM0O)c$We5S;nG$G|Kg*>ZS;XW&GUvMfYEjaY*A90A~JlBa35)*pInr(Lp$J zQQR0$w08D~r>;lrgLTq#Kk#PI4$?>t6&e$n=?#-ZpU5f0+K>Ww)A7Hj3sen$mIlM` zoFJzjE1UNcY)dc_&Y;EeLTIzOoe+8aTD%8F8 zrU}L0ngNNA)bv#jSpHFni0R&41>3YkChOruu;*ZQH>9R@A?TCCOK-OY?7mjM` z zpD3q^jVXOPXzRWxd2r;go(5!zqvwGZI(1K6EP5IfXi?Gl6N?7A5tGT-TFVfVsK$^; zc47rwc(LzjQXIN#ZE%yWZXvmht`3!q6hE{78%}5UJTTT`se>*n;;(2;gi>$X(6ymZ zVxhGA0y0O^Q@4?M&anQQ%;}eA{^h2sK6=NLl_*Zu2&n|m3VXFJw;8YO!Zw+?Ijk2)Pv3$HvG|5v$aL@}q@_4uK|9W*4ZKlXb;E)4T)F z=l*%E^<)fh`%zfS}dSHr5JfyD4;uR7<_U z7|cHeJM2v68BN6MF%e39Es5o%Ua|`sC8;VIJV|AujNQZ>d&{daAjLEbl#{2!PV)oU zhMzE+^RB{g$QLHBLYbGl3(JL)dyO|lj)P*$|A386y>V0Z?dof*o{t%xrBeDHR@z5m z+2+2Mi_3{#^KJvpl5dYt8xIv{a5&-EVY#QOz3Sv!zo(tqyJ8|H#Nz@Gsvd?@>iGG~n-yK>@v+a4HG2R7^W@_X zoU|RLk2B_RrzB7+aAyA1kwnC?ubCArUtIf03x)# zV=>zBqr-y@ZPh$H)N4j;FTMeYLq^&$Y^c9kfQ_jia>YO5|8+oQjjo^7`E!$XFNEV{ zP@L*gQwDigFlQ${((5lyvdTy61b7ec>zFH9e+Q0HHG6F?JF2TsGUK`?x^5Tk;JrnT zPA*^FB9rVfE|y;dnfCj$*ea;J%FLrTIzG^G=)9Ru$D>axbf>u1ea{`re_#2}R3Kvg z6W?cw%N_9TVdyg~_$5Q{(gaLPGVvi=>i7T9&KX(eBzvOV3f+ci-sRrx*mj&&DbkOdQEYj4=rljLT4{$sAqYePlK}!Z=y3 z`VcoGB3AL()T+vm^!gx_i}e}cE!lD6pxhQYy)C+V1nH^xN~kO8x`f}FsWYUS8GD)d zZIAlUoMuC0cd9~h8xr*j9fe&MlAaY>?>?f4-xBYGpH_Ut;kul90#jKhA!HvWFvSg7 z&Ehldh14_>29pv#6CQs%`z1P38+_>m?4s#D9 zggK6q%i+N=cY}RHBFZ z?gi7{FGPhjLF!v+2m7>%-7t?aq1^4RvDbr#HVTIf0CVf#l+*+s~WBC`9Zl9Jk5yZ86sG#NXv)rsH8avu2^7mF+& zjpb|k82-;{zO=*j!Ha`55VB8!*~#?4`h@MeXeNdRKb9S>I*i&Ea+lw{cgu->SfySA zQfprpMjxEJ-hTpbg1y~l?RLOwveC2e*6Y0Tcv%g)7#pT!6A@R0Ga5MD+DxEtkn3gTp1Z2IUZ+&-9X8Td>>(_BAd?W~*+sob)c4XK60|t4&x`~eIf>+ge z*ZS456?<{t6K^RWP+3Tq6ocJ8s~iOtFM~0`%p#6?_k(Jr9?O(L*>auMf$SzmAbS+m zSS&PR7vr#1)n1uZF}Xw!lU)z91{&(HSu98L89^HIsRqX`>#Lnk!zpk{OXbu0=qx+O ziKmsb3&T@kkv^7G?E-_73}wBJbO_BZhbsL;6P}V2Ik&6(zN6>ng!psDmI$uI$PiH+ z-}Wyd%p28A*!>)VLf;|n2~7bqS};3mH0`406V9jj=kV8eUVLLLUf@n(p^^U?JC~&7 zthx8t`HH-peUcx--j`E}g*kvgDa}*7r);*g6h`}2IRp=Jj=e(V#$jw_5Nz0 zDLlIU!(;tpnpv7$SqD#_;lAq@rs;&(Jw%JBRDj zbv}hyiret7Enw`z&}sK;JS?rW*LHY|)&VORXGRbu)~fhSUXwd3$Z ziqCUX9Ou>!@d|PM4dgkAH(z*YFMd#-yuHfz?E2f$Bt**=nF|TW&v_v?0aW?jy{)E7 zOgx$Khjv28+5QN%hCC%R9lvFH%7Og+F(1w493iEuF4=;ZYutMr`^tyU$ZpAKqWzyz zo6Fm(Kg?VANJB=7^pb63&ppgz;c=CN!5dKMJA?#Mw98Tp6)T&82$8 zXk|VM@W83|Kcxd-?pgk{$$Ut(9Nw$|(&n-XUwTWiK`rL{8nKGddnBX`RMsjj6J-g% z`mc58ZNQ5U6C#>k7Q{BLI^uCHVLP&OWz?9mhlCJyjru%(rjfK;`m#P6GnbX?vf4qLyy!W1`O$&Vc5f}Z{jW>(Fa5s%Zq{7JV zD4;+GrH%Z^xbb?ZS%AX#UpULep5IxT!8O+4lv}Jo!$EUlKtV2FLZN_^Lhcs>G5_BT z6Pq6Ca<%S1e-t7Gre9h=c&*1|RU!}S{pz+7?Ca+|KXf+}>(qn`#W&=oN;vA*4nsG5 znaS(cWCHY9_ay6Tbd|s5t=)d}?t*b9jF)!wTYFZtX~vg~P7$eJyz8{;aD-GzhD_oo|e7Gp*zzr2 z*~}8|U~?OFfaRA^R_Yf-DRSib+XGA8XJlAFb}Z5iF+f&jb3!|+`0u(+elc{Na;!H{ zgLj48Y0dUqv+y4CU(nY%(vp3siCtzq$erPC6lO(v(2gwllu77s8X0x5UR<<({m{Rp z>(iqN?DK6e_-~bX7D`vS%Z^K;PCHYamYvx`-ePygw0rF~$h2a~eMzhSWXX$q&4-fV z?P~7pa?Fy$db;O+I>+l@_U}sv4U3*b=M*c}j|zNCsU=9>Ly zQ_a2wz8!R2*S;yE-x`W0<(TXrn9@e6#xY)nV~#8}5$l@!x#<@CTu{8d`xYQDs*#g* zs|vl%BLGa|jDl?pt?WuCY*>?z-3kaXc)reSFVxQ$to*3_6rP4YR%GYFUD`D)wwiI4fww>%G*vQ8rNqu0 zRVY&wNi1hOXt(LQH*~IGJY&+;TR`VRKURF$?&9)y)-Azi3}LIaW3Q{kvq*#IRrfLqM{&SY<2&8Y7GfB1UKpeWzK-y2xEyHk*EP-^K^ zL=dH<8zfhxySsiO-6AO6C9$*uk_t$}N_RIr*Pdt2%z1JCXLiQ%1>(B9-rUzWKHqf5 z-jCA*`-wi^f`7h(x1eK9#8~U2$J)d0nsYjuw@Yu$nEocdo_7~zgX$g&jA&2`;^6Kej};M1?gTc?i}hF`q_f4VS03tqr4n z0r8_oQ5)Jd?Omm<_L<<#3A9|8YiBt2!PS>syJzS)`jva|a8$8Sio4M~ zQH_;nSFeMyDD8VVqiCQrX7p_vy4+r8njpk%^ajQ|7AW)U(X8PUdck||2fu~FQUnV9 z;eA;fdv$pHojdRe5GX!!MoFb;H4(IZoTa!gm*expb&ScpMjhiTu3NDgOWXKs+2x2L zZZZXB=2*R&2*Qu_IWPOg_~JS#BAC(HFbgpUn%v7w@5~wB_#0c%gI~f_ z=|>#UP{jtQXmJsuQD(~uAvi186WQweNr(BL*RDlG1twoVw;p@{HCOLtAXqlzcJTM! zl6EV282|m<9{$E3|B!!ReA3yc?wbJM^bg2o;uTCxX{p5VB37ktWMd>dRWh;cjdyQf zLB*y251&AiM1cW8$E~r}l5p~gkx8exq|$K>7X2ajfBuBDQv;9~>l<}fN?Z&1tahk1 zzmlIWIGJ9bVlPPZ^`8B)0YhDE|LgIA3X`jc)2Qw`^+ zXknu(K5am0>_&!&FTCQy0gXroaCZpZy>*^l0?H62w!Rk#hCbOlcK*Ic**N>ItQySC zMj{;w!76lQfEkHdaoUJV=8-E%SMzYmA}4;$ z!43nS*usa`AW}XkbO>%Ku5Jv>f-$;ZO6`#&Hz)p3AanHHK)~EPP|Rr4y8~^&SXTfU z;VI)uNHco>44{Juj`=j=CC|WSMkF$Hj@-G3kNIGA4FF(FNPtB3Q9oTIQspye(wF6G z0z=bS{m*z-Kx`cw={X=bdV2sGV_cAvTK+#m$<2J^WQBN+%|if*S10n!?gdmLX*|7E zq;`c|vo-Id(8C8Ced-z%m3oFw4b{K3)x&{`%R1@{s_;EvzTx92hTVc(umrZ#mppp9 zy%k^ZoFHzA?~ys#ghVh+EaM2Muva3{n2M&TmzbMkml7*sWYA5vE%d*VH@kH`$bsl) zKq^7| zSkH1{1Y7FzqX?q2<)3gDFzeaX4a!>dkD^f+AoefR(ls#!V`(W}2Wt*l97!~sL3IKf zd|N}a;{k={S#AeI?+Pd>?>-ROVPGmliPGk#0mPG+6i1EO#(2GEuIaQ zMOFafUe8^&Pzj7lY#DX+x4j&rhhQ^tJ_4&8qqhtc4#>rp%9Jp9l>B7D`QeX9iz~1# z(HUiPi|ykJ(ngS&rY$HdcLBJK5RoPD-@{YSU)daZc6fp=*tujc1cUKx6Q$4f8E}bZ zv~nxjjt6D*^bD*&9fD85)F-+)bPFNk+o-eaAP6BgNH5j!Y{fW{wP#-ueI^hI0Q0Lp z%U{J)A)>a($!-wO_PzX56|kmZ1nLeW%@elA(*O~LbOn4D!>LR*r^`#Q4IRpBR4VgP z1OQdLWKwAz?erZpyxktcigNdl2FW{XW#8gZ5W&P)7mRyyN?{hi+P*d5r`!@(9WPAN z5!^EDD+5dszixGefujghmmL-$vZUwZ-AqiH%fK!AF)Zvl6dQ za>4bNR2Fc#=Dk8udehMcl;SIKgCPBwJ7@}z+Q`JC!}}ibr++TL$a1WGra`$Qd*YjE zUyOsKlh0VE8D~?K5MM|Dwb{?Fd!yTMSa^tc1xY}m7t4scrU z+if(eTYO|FsB+mg)Wa0r8Qf&S-wv(;=AYxA9k zR*!wP+iNM>&;nc_v9&Xci1ZZZe%>F?EiPkkm^GtOoF(2RN5%5;;k|fm(rF#FLfCor z%O!*|n%Uu<;zf4jk1!AF5{r=v!sZntN=m7;b*NoUqfcr<;9ItGfNN?aOOQUF$^V*V zVs(~pZHBxazI6;K7nIjMsU^hWvygw06c0S1rOtwKI*yl#3(eE6^NMkrf8(gX6$=TJ z*(Sj$ioyR=X7(T3&+RAPR5>c)2pt~TYksi~u9h%Oy>Ill@{4_jZ_!p^^8DuC1$Wdd zJd4x8fwVCyw!=>wxk0&_z!H)rh~;m!O9!9hAvZ38q0=z-A}>5rlp&jb4oYe)Wa-C4=JM;?>Y-9{w# z-o)H6lRpku%@nQLxvegBtlfV)wMd!Yn4nSa{yf|eema4L~;2xR+*!&rjJt3|oTnwWXd8LV>2)71-nxmIb{ zGwV$_M!uMBD%DB=M(o>2ko;~=X18~qnwB;Ys zfuUDNh0aAEEn+Q&j!dU>hG|hnC-lQ6I_>>ZS>i?V1|6S6 zMi0H)u=&s58lR3-m+09}^+`30$ibY0;0eFQeGvl=n>EEnZVy3D&8`ET?gx}IRyi3H z){6ztJg3mQ;Z3GF{pzP71FgXbnX?zm##0#8tE&v*eH4d6w}8K=Q;0IOhol>x+?&Pe zIJv#2J+Da&pDy?#egocMJeCbZRj}_) zpQ(rI)V@32D3W+JGm2H>_avfHs~ip`I#D;DNirW2i?O;t3parK69*GCnNYgV6NsG3 zU|Jb8zU;;2OIJD%Ee_&YE1o_0(c#@#wM;w9CC6p*<&s%O37;SOD5x;~aI{mSHWUdrBy>XMZWjv25Z!sW;Rq-{fZ+>C~AecQVj|4#3rY4~Z( zjyA_hAJrcJ4OkG*t9PkUOveB5e2%%-u=svumJU)0=Pb&ehWAlOs*(h2hj}k}bE0FV z%=8kvGIBYWElu`rqFSIPS7276Y+u|@b|TxWm%sGkmbdk^O=HyEPoUg2)}>)bAgoDJ?Qc}H-d&^b{RZsNHJ_f)_s=KnX$#TBI2pEls1 zpDm%W7#NYIUqfxWBfcuma-uzN^U@Z-zFW@FJUiAe*h~&Bp#G!g!aQ+WL|fcR!Z&QH2xB&#%#!pZZygCgrZO zwE&|py$HSlX0?y-h5b(OFLy7znq{(G49wWOYeGSZ-{D-$YExM*9rkgA@?KG$$psfe z%ekaAhrebc(bzG{C(uzti%A9>D%dK79XICl?nbzZVji8}$TDL{`s(3ut7<)6rzOYL z|4&PMKsRtbE&W;Fv693h^FC_W69UE{Z|rr6eGb$lViYZ(9(qd_rDkegSApC_CLwIE zklZuK7f%T%!VW{_aupn{ISwBO=chwDuK!fM)gdQa)T9pN^%;YX z4(9r_)MXL(-V!53+BIc!zl$l%yYy37R`3U*Mc<#?Gl*+$O%7oXs<`T&N0N1-nw9sv zg0oPXrC71V_Htie`{hdeTF{>~l(=E4ed*AqO*M2U|C$*BSiVv}>Ebi4F-#rfi|ttI}`O#}ZB>n>fEiB3)DOm0|gVsz4v|k|vf<{$q8A z^(Hb;-An{)gr-i)eK zTAMUo4CX0k{hyp*?JH`mycP_euIghT^tEfSmRzBv@8iuMvcp1NEgfNI_ivKYGV=;+ z+UHR+t|kcUExu#CysMnNawkd9YdPjF1^Vy*6}wNk@yU897>E! zFG80Rk=Z0^u|Y38G0YUww(t7X^2wCGLs#wdpM&<4&>fX#kf_ypqYRZXa~V};4xgt% zY3P<=5}9%?vuUPN2Nz*3?eEJTgW~eU$xZviX`*{b&GsTGeHUbEkG#HVv7Z^2sXy*y z^_wk0w`Je{te4rPgmA(V~eTV0U3;*KyF7Nl+4o!5%gLM|ysdna$Y`!{=x^)jd|Ii%TsxFv3QS%5P z{7aeL zMpL@OeAvyv^5WnOf%_W=*)5GF4MdpV1r69hi{Pm^DPnQ29%=|#iU#Cpf;{oY@BR`Z zv>L227OCDIJ(VbA4%V|A_VKOnx+#6vGk0)Gk|;{<$d$9g2X8AvNnYC!&cMs(g1VKG zLpd>FL#j1YCyJ*m(up^pu4bs|B&2z%iIa6gsMTZHH&yMU2cx!?R6qHCQO0Gz=CI%M z#aEJjtihNZcINczhD$9{IsN0)g~G2lukbAOK7UhJq^=i;Hy8}CU=BeO*H4kMr{U8? z^D^Mqn|MBt?`hMi^qNXUXLSU|8$2=gxc~Dv-URwAl{bve^oe2TRub>JyB?<*StPRC zjCUw3k8WL_e5TAJMyT!E6F5D~=V3)xr?%tFG9d|)elL91rXlO|@2zZN;$ETbbsgb! zvRz3#I_Vqyw72PdU-QL2B@z)3hf^^B$9H*l74c(oHqX#x!02xoGs|at$7d2&3&~%` zI#8DVV+Ybp+RM|xb5E+p9$4g@B53%-$lyj<9ZFT=DT9?*N<{`9%v|fjiZf^6^wY)Yjd|i!4?-Ht&f=y(v_zL-~v_ z6shO-E6N^WdDPrqDOT6d=I-NUo?bn|aHF-}($uy8o)bpJgV}GI4|(Uu&C!2 zG9_tJXF1i(z4$1=`zE+NT^=_nqR@GylR#{LHChJ8_A+_dc0fEvtgSGG!`Lq~+Kp$5 zus;f2PO5)=Fq(89o<6zZefK-zkkDud*fET$37wQE2h537Wjpl@iLbna!T^GRLyc=} zjK59xBD5p;l2%j9XsnAYv6wJ%`63|^$^nP6V;CqhtTV5hVpV=T9@ZS<+&#PxYQ%VI zr0L&rkII>=@;U?EhiB(hmP=XEKbB;v0~(`pD)LfI^lWrYgrJe#mCswJ#;_j|`!&+~ z>+`ICZ$0ZBVZPb2*FSpt{!`~;5c^XjI&0SyaHCP*oEb}(ip!f|*N%f0%uW*TD;DJP zUw`J1^SoQpLTJ8h#kpF1z3pD_NwfMJio5#nOumV#s#96b{HR~pqAub%(58YtZln+$ z@hPIZ^z+R9ZSb+je@RGd*XXyX>!Luu)oh0=*=iPu@Y%5e?nIoErI%yQ}B7{4M!7N9b2~ znuzTOIzM{Pn~nfks0rpVvwB|5JE*sByI1c*$DhzN&HKbP!4L7 zFI#?n5{Qp`#ue))qfNeoO!M>%YTuXTa;J|(Lz*_O+ynNVycV1_xtkyA(TLF@VG0G$ z|Bh|9X6FeB3JHxpC*H`27`)UN4mjOzhy7$MWqxUj&{RBsw-kBPGKt~XJa=H@3&B~1 zs(*5w-Lj=uBi^|0VTqbd=p6M>5UQ-Xji8%da1*>Zwsq0*6buoc_K_MU^OkWA|5bAp zT99$hcN$>N9aSQ|{d9Eq;sUn2!FrS~W67w=dc?P8`z}1VvD-_s*|<4@?nKfgmGPT8 z!{|o#2QaRw7Q`Es7}k`O$70F+e|hA03XM%I^gm5XX4-yiS!oPd8;tz+hjM)pZKqyx+QBL89Whm-ni0Vy`JBYarn4vc3uN32|zy| z3N9(Y+~4Lff`2$H6Cup5+>V1VLEI_(3mni%@)U2PMAC19&8Br$+2ApNmr6#HgvSU);fly%GQF_CSN-o=4P$YMDQRfZrUPJQDv#cX@MRxp2*N(X=lfM7aF| z5BYLnvj1DCUl4gYfarh5s&?WQHPjx!9o1ASqMPJNvS2to5EuMEJ?{I#?LCyTwQOuz zp^>SbaO0j;fN})!RQ5^OmG%GYQ-O!?w{Iq|qiGzJ5N^BOvK+qz=3!(Ume#>+^41W$ zYg0QYI>rnz`VNP=c4Yl{vY4xP>aiHGQ(_Q=0QJFeHwVU%6s5S0K8%gke=r$&U{xY zoYxDEk~+})OGF=_M(tR{a20cQoHtZGNxAt6VEG2OKn~zt&kGC~twjKUyURsnaoPTY zmNzyB)J-5E7;s5yyg+9n23+$?cKHrY4tt0Mz>>ALTiG?BMQNpyq-=qw%?~`0?A3$7 z2VW50cT2Gbf0HR*h~&9&8?XlYKsw);7mO!6eLoskWuicK-)lAtV<}B9yQv0Skx$y- z^gVqtQau%4Pq&N#_C#g6b*e$kGxm(4UBhfIpd`iu7*S<2Nc_hD+(EVZt|DS=-4(Uo z2iz=^kMWOA?n_-jiB3*I!pCqJ*d`i@hoGlG4rCyK7$Cs5*vHaLoA{so@mT1*o9q1B zupAnoz%l%IEBhS8;Hi*Pr8P)ZZ+-_^o^ZN<_k(^pETB8kRd)ZO{lLF!je;ZFRRIRn zZOT9pwx_jA!rSk-arTWIgFy#iFCX%kkS}f@V8INY=Yf}M6%@Dmz`C+21xPCBPv$-V zE2F2KO20q+bfC>Tk z_n)~(t-EO*;5Bg^9^dd9_P;$Ez*zd0xRUp9YYPL}Ksr7Rz&wGyYUv1l-M=Z;aTH&h zEwK!yytxPH{7`l@p%22I$Ov(NU<#EA&f=tA=k*_pe3wGiv=^?&0)bbtXOL?dP)>>K z&$bco7JDJFmg2!=N6xsD^7|pTy zlSgNmGV$GW1)dPr;Azr1Sr5bIv&-7soBj5ZPgY5T2e|hYRC3H^U{#eN{gZd!C zPbfFFbGx(*6GuK(m$(aQ6QrH>hGF55=$->wTgh;wiC2@wS0v8Mb_?_k>Ui_U!YJo) zoC?dPkvrws$azl!qG1|B;6voD0XB^+F3|6zzaR}go+$;FdKMcVdSFUDCF(n^5>WRN zk@mDQF*OgTDDULDE6I^q4uX_3BA$iVD%PZU6Ku49=x$ZbOW$BKGrR^H_D-*<^drAE zfhCm4PXGu#0fsDW3=Y6=xh8v(!2%2o+DR{%z91_)!~@tjpVxK6vcp5#Vdz_%q0~{# z=8fNS(ILJjLTv=rV-Ww<3*e``{RSDPj2h1Fm=MeL77c1S3wyGSDY10I1>e32jwE2Wl1gltPBtum{znEMg0 z9b(;be$F!@f=juMWb>|YL|qXfJ1!OY9XQa5bzpijz{688bo)ir(s7ZYu{$J6e&`}l zTg|K1B@r+zQdgXThk;)%M(Xo?G0wBkXXXG!7M}gH+2Zy+;Q;~Mr3Besp&p@rEhP6k zt_SRk^9iP^3Dl1%=wd*HpBBKp+zwy1d)x+AjNC!Z@JUY@zbupxgqi7J;+IX4vd zmS|dC?qcZs`xLYSo(r0vVn+>@MKY{V;rGPCF1MER?~y`qakHlHPbIC#QFYaDrRPHo z{H>dX)qqbmXZ16lxEg`+=IuuHxC-49?3EXl_ctY#Tg8G2t8kp;&ms?}TS$7`r>-D5 zD}HKs#Fv3#FR}gUZ@y4qUKhu~B1Ah9%Q4r!m2*cpgi%IHVk0JcG3_1VU)d@o1|O|k zj)Wf}R|YCciT|T%8q>kYzO?rR?zsQ&G>@k85i2=H(aoT-ABFoDwx}UAk&Onw>GO|} zFfUCA8oQIw6+V`@G@+{Df*nL2jolC6YzQX4rZu56bpqz#kXt$$I%GN1p;9Q@dj(v` ziHo?-CdY=ln|Y)*ktn_p>pC6!AU~>|Zq0y@?pUqr5n`9mA0zVD=r`WtcQ4{yB+>p3h=On~R z=6aYz+s8q(&iT%=G9<8|YWXpy-gCjm?56+3pQkbiwC>dV(%PZbEnn z5|h?XaT|Ni3vQej8N}v(aA`#P^c8BrJeVZMwV&b>xR2z)uH>OTJokTLfBmZgGHuwI zdc8eAGjvNWHqmvOcYn&^wx{9Jb+TLl`6{p70a z?VW9+gPCHvc7nt}D6L(ppV427CLPbY7-RTXJ*u%n;~$D&zkSzs6m3RDbZk3!HS<9L zSJ8ka;^+L`<6hB*@mLyCUR-bebO)>N8@AFxl-FODV5YD=$~s+}8Xb;e4O}+-w^yL} zWjOUwXKY?|D9-%F@;xo$t*)5^gWeFes|JRv6Gr*~%}{w3%8tZAnnZ359mMFbz%h2eHv3SiZ_!Iu0l{$7E`q=ob9H#}zp?xvvj^|WLpa4&Tq&GuuMn&4X-f^@^DFEE(FoP{C(qvanmZ^9tx znCG&!E}#0ioI`!GZ`>DOmLv+2PTW3OP|4Jv>*4XtEw0TLYNK9m7m*>}&R(Helsa{B z;Ec`giu2{tvp3X-Cf=p>!pvM^cnul{28Z4<*nj@BYU)ma|M*4|c>X)Z?a4Z4JE;R5 z&_z_YY~FiHLkK-H@4RadLHPW(V`pADOEG#mUBGosCldbV9(%D5U-V4xr`9s*@^b+J zfJVYvnOfDB*Kle#71@r+`9Z|w`@GU}jnqWfk-Dxh2qzJ+SegbKtw;oroH%XbFEV#* zCK!V_>;AKkFqKP!{Lgi87whxp^V;*l`cuw0N60V37-L9vCqpoC@ItVtQ$G9yMo}7! z4f8qvu0hE`ZN0%$p*L0xP5Q*kkS?`cB3%_}r!|p+=vxR8RM5HfV6yUSj5n$s<`-RK z_yE0SSFq?{6?agg^3Q~ckTYrBAaDQU=stNzM(<+L-2;_xqpiJ~bI{Pa_|9HVlhXRfW~eRzjmMPubbPMC+Vd*V@g3}<9{vfx z>*^q8G%MfIq?pV;|2QX?h;AVTxTn9gHS(L%6JZ^Zt*3wH)CfpYeB~G`S?nmi;69i# zs3|nqO7Bg@`r=mI^<5Qnb>?(m7+^Wqv@wA?F6G!S{_-u^{uo3(Kd0GlJ*^uTA$8p> zq1E3wsuZP4xs%qh%0yXmYuMZv?jZ9zbBS%GqT0ny{iohc3mNKYIYBkv74(dFmi>~A zk60B2ZBeMSk4m^D6Kw4TR30tYV$K$At15>K~rZ zxyZV8b_~wn3_akj)QGP*x7=EN*x$Xi|pf(2tM_r6Z|I? z`L@NEs#jJ11;xt>-_jLkH3z*ppaLNxy0CSPzD+^ACxgHAzp5t7({WPMa~w&}E9VHi zhEB(#Ii>2rQ3u70R$e*g`$5vM&;N<&nZfh~xxdSz`5U8%IiLtU$65@Z{BPszB)KAI zE8Wtum*h|TgTCi0*P7gc9VwC#%Nd(2r`;Wl=C(S_SJS~Qk&Um^xXf~`6-OO&EYwx! z`Ee1+*qkUwyfLuebo1RJ6yuOl?lOrOg7vBoa|BL7OaVvI6OF*WfV(0ucqZ;-lsdNX zJM5$XY({ZDa@z;!_oL1$HID>eAGK_F-u!UWK^={3c+_)go{w9lZ$r^Fd5+!h`*`4h zu-%_xinV`6E@_p7M~uI!qbX|#22(sVvHqk}F0m?6?InIPl&pD~zYyQWN7P(xffH)} z@2+=Qw^E!)1L`|&jy<7S+IzO0VpAEr#DONyYa|tlGEx)NUs*3C@>@W>EK}+)T`4n^ z!1%+?Hzqn<-@~u~);C}%8OtcuzeCY`&636A;f?F#SO!yGXwr5%8$G zE->?oGoti}G_C3RXJ{D9#y}mj5f5DRo0nX3(9^%9$`5UMr+*hF?B_0eS@SJd2A=O7 z{FIJ?7j!V2KUW(db7Sd#GKibvfSt<8;`%Hx_=0GkUhDa1X7hPB0j%}+VHGRdx?bN| zuf#z*EKBND7|L?c6GEeD46h|GjZ1O1en?O)7e<(6V@ltS)S{lBiV)_-vR06m;f*vS zx_jwnJZ$8eylF_kh@mmJU$ExN62nf!AasvG2tI(4@|}bDx!NXCxWOl_cq{?Y;rXm% zLmjW$7#IKL}uZUjiYqyJ5KWBe*p8vwzg2*-ZS3mU!~5iU<{ACX9!V zO_wNJ;=bPNZRTjUgxZj^!XzuuTkXwww>6QO?CJO3jM0w>7RN@-l2VB|8CuY2A`c9iP_ z#4F$EMibCz5Leq;x?%77#vJ4mh6vWgPSH*&IPb0N` zqiGVNi^>1PQu<$=U6J&)r2S$%uWKsPMPBTUbf%<#O0|{$#)-?a;*uH19EwTuS@lw| z=JB{ElO9aT)xcwDUnGxsTne+qkjon_Z={GJ5zu3~pu1$o%gI7NW=AvEb|_8xmS2|~ zZAi2b<}xsbjvk>ZF-5AhFlJgW?o)b+x*zcP#{~|54r=sCfyRInpK5pGICO2qkV_Y} z1XF3Vm~Wjss0s}>a!ZhqjuqWVNNk?#4Vf(_yd1mt1MWxXWf^5o$F!PLXWr*;ftW=O zT2F#8E7o)<5FQB>*}^2n_BpVo?$uCh`ZD57u1EAfDcV(ZO#=;yGRLkp|FqS`7COmj z>}X$$na*#I4aRKJ8cjCKPN5hbNfIcr1Ol~5(myMqDY5LeBWyWB-)!u8VTQX?g)DZk z5OkKqa&RCf?P89k>9?0GSACE>%`9xb`6(rj#S0$0ipMiF&&TpD&6Rgz|KRR$Q!)qr zSg=r{E3f)z`E#n(I;nzR zANG6}gAM6gxV*YCv|hv-cvW)>CO&7eM)kby>eWjBL=An-Zu4zEF!n6z#3YRS+SbTi z2wgAE-*c-kJxE?kcskX?NjnN0V6$wEYvCcLVU}|8wTlgULK1Wl&0&O+{?6!k9EJ0SIbT2rW?!= zX~=qaaxn-FG(Smt`V~^?mkUYUm-uh-^B;*+uj?Ps$I4pPvKc%zeu!^ykxdcR^V~KK zJ4&OY4$jy-R3BSDgwHjivP%EMYbx*k9%__oVT*RFfS%ed2ZlSUk50}20$>-Pmd@`b zGZh(tHKo!|etCYOnU^85{Hu;syy}0m04%akS@~zjEy5l)u_L)ekW<+Jc35BHmf^69Xnmu*<-DAdQ2idA@so}>K;u)v*QyX}Eo z;P$+sk@D|s#YR*d>QkAw={)=d3)~)O*Db^0M*;f?Isc(p}=Fbq*;e4fMsMo{Q_K%>yKJg$pQjT8U13mDb)a6r18dEB zq(}a%NDuRP*?}e+Aj#i9RRF)=^@;hhVWGao^o72EUzJ0@8}NAE8d|UhQQ{H$7VqHV zn}sa(8q#e?;9V1H5UUnc%DJ))C>q1yerm+Sl9Ol$xtFMo&c9um1(_x;B&%@Bqj#w) zMF^>{(Qi?S+%YTwqxU8D$GM&6P%$(t_Z%Ycz_?KGWik;vP$pq4V%HCBh#;6`M^~I7 zF5<&Hha5X<4sD!ThdY&@ ze@`p?<{6?J-T$n2PZE+`x+6mv)nUAGm2@91risoXdq+X4|GbX)}h8G z@Nybf{Jnk=$=+6bfzC%P)BR!O7vDdjL^AsOIJPe0r^vW{XVFIDn5;k2@4(s}0y4AZ zNiS8$VL0l}`SWn3HPZ+F+Bbf{p5RLb%izTgqc>e9%Rs?wVAkzcp>z88mqF?{XBMD= z+CYFe?iW{u^S?72utyLf^h@e&PxKJuwWhRt%lRbL;$vS!G@L2#703Wc%7{61T zUV}b?C^hva&*@Ox;P)?ia9{@;)lT>E8nD5R1L9i_Rq72@|wi ztiV&{@3`A@Noxx03?8*GemOvPWyExG0Q|I?gO*Y7f~z1Bp~q@}Dc!x9maeCo2BB6= z>on^Z_%x875LANt=fpKw0dM{20^Y`jpzpbMVNjvt7@7ky4ENDyzVg@G@nt}rrmxoz z2fF(Baf3b<4*r^Ew;J<7hws6+w!jkMhRX;56?+mTSHUzNxzV{A!_y5uP*nBA5kSnB zfFcn~K4HZkkKa52Idx3L8qy`a^rOutFdi$SAZKEZI;wduv`w&P5kfn1bEFj9(v6(V z*m(d6+wn2w&6qsM<>V@9W7hngT4uzht>gS^OFt034q?rbI8!X0$g*7|R+sy2D867oL z`B(JTSeS}70MwZq9lxgd3Odguqn1=2ScnLvyb$aoe?4<^inj#VV4COiB-gUw%PInq zCI^Y4b@S&%5ZD^i;*F?TX-j)qR}adb)bIn6{^ zeuMOUkI`ae&kMlbo-_~yR8Zdc_A3SWH;W`@ro40OYh+HoqmKP~5WY6$CkGZNE24HO7&a*Gc5erqMa~;O zW#!iwz;UE06L{>em_hDqegEdQhV>SM=lu9~kZM2l1GZ^bq9iFV-R!c&@*nNXg@XX9 zWg1S|wUpNrs|mSoE=F`{W> z1~?fh>4hf!-Co=&0Ku{nyacKuOdjA$m?gTJrOv|u>_j?C;V)NBkx>{hO*aj(@FS!Z z`j|z*apX3LdBplBHWC(RQ1Xs6PD|ABX8=jR^@1SgdK7DdAbmgfe^cL~(!f^C8r)%y z6KVO39kP-GHhR_llA-`_QKSE}h|fs#(4fll2>en z@$^d-75vt@?WjM1HsUpPn$GOuu7co>*`FKpfEE8AlRdeR;7m7abE^I!tT@tI(TwVC zgYwVdnU&@AKX*zGn2pVN9)@L*9SZ%>4N7yX8Z)r3-OVE7f=Vc-19#eHmCE+J@az}u z`ZU|t*c+VG)OFbZu;mE_?+ztU+Cs`>SAetZ*vhe!Q|=mIFbPnsH+Af0@TdZY6UynG zKlLG}G>erT*Y9@FVtCNs8+h)u5q4jy3$$AuJOH=4Ugk#J!>3|Z@l}|-NF1G>A57?y zji?pvCG<#1Dzb5fN(+<0|8!he_bgH3Z}-#WREd{-`FQ?{G=E; z;i0gIu^wThyNf_K)Qk#C$a4DL!XRecpB6US(G!8*sDSVEw+cyaGwK<_f9!genxunl zfm%1FcdY^!m47r+geAB(Nx5uUBr~Xd;5;DL@AzlLT=fFlAs<;S^zZabR}mMiW{=fI z+`~oKXquVBM)SPnrJqVmD0FA{?V)G^ypev2aee{S8|5!a+8K2^(~2g&-w^r1V~k7s zMu?EjmgVm3VD{Es%0%C$Uxsz+v#jb9k5l*!yuozpdeGrU;^P$>z2u_4n-wt^sP1(H z?0YCKQRgW|d3d^+MjEaJ@i|YM_&Rl^3RkuO;33^CqSred+)9lOvdyHqTN&|8!a{C= ziPV@R{HM`CkfRUo55Rnv;tqu+8Pn-fML+8JWDljaUy4H0$nE;^gv6wlBlzVzlH|wh zG81%8P@B7?83IZfG{l~yiU?z3!r}QvAzow2HsLqAoCZ7q)4O-E4ai=AesO}x(GM#Y%!cg0!G?{3=7DgQQ&qOFbX)0pA@W3{SUN`M zq}QyH;hVdWUHpY_ZB?e`hdwwhq!Q3W(}lC7V{_2@soa7?tG<7$&6puadBGi&)GHOU zK{Tc0eL0gpol0Fs^?;ZZ>8(S~T=8Y?SZi?qi?)QK;&OX$=+nI5!+mdI+?>zY^yGIv zZ`2p&k%o%vjK)~_ua1ci&S2s0hL17qfF!YMGWBza!~}--KE(+k%s7nx{9A}r7^Zi^ zr#@`$UaXZFms2f|S`9ReC(8&jXyJ_O+jnmEOXTBvUSla$FSjP8{Ql_Z(In_AMqxn+ zzQBFZ^TG?`q*r<$!^Rqk=XQo?*)$198xOoh^t!%({;_&r%a*pr<)4B<#>H|#H#e6+ zN+_4XITZNp;$AHP~$>D*soc@2G;XW zXYDmsFdiOg93B{%bfZHMLZtbBENEos!0nJ@2{Jg94qug&kp6%#m?7k>^;_^;9d`Z1 z7-9R_eOm}Kx4t^ILWr&&i~#e`tIc@0lAym}iX99mSBw~ruTX`qz;ZYT8(`2=$AmFM zy(KO!Ui3iUTkSJz?nm@9lhotp57Y3Khv-8&Crz{`SHC~*o%=Pg*el2VVG?gDo0|o1 z2w(K)%yQ(Hve(PHwe|kCg3_k@+5KLF#+i}Hv2ln04nM{odH?E3zwQz7t+tdl z)s9d|1=hjmgWL2WVwEHEU>TIYQNaV0b@6rHLqYOogZjIk0Q9vz+sn73NNE*Ox~}V+8fL(a?hv!9?A?}TEI1)7@I$az z!}UtHRXL7J?IMm+6Mns%_bsZA?vua>>(E7<7sm1nvt&Df@8v*HTXf3So-Ds`zM}gW|K)(Ls?+J0*?tDT!DNM7sJmeg!FVa*5Iz zgZ(LTT&M}@M3ItWeS7~t^ux^r53jo3#O%oZ-h%(5e-z{@@hItIqys+xBfH|LZE8*a zlmRj&zr^TI{o1I(-SpLCw$w8C@F-(&*qLH}L5DyOz6DKO>W-{a19knBd^!~M9ZWh$ zv()$LpMHlA+T#_BZjp(J1n^cj_gVzoV<7`oT}0xb(T#_}##24=-Phr}!;XGLc+wRb z{85xHV+37rsArfk#2kO9@LVZVS?lICUZWd|KA)M&&A9QLq<&rCeoM$Fx(G@*H^X;p zspn=9(S-@h=`|tYD!!uaUiyjUopGb&^Q8M%!wk(GXo9Q5Lu_&B%pNP&WFnxtX@V{vBpTo$)a_cp?twSpo2T*-Ec9dIBi)t z(5Jpy_jzPoXHAF!adTk^YQPDi^vjW#vv97!%SX4oQ;|D`5#8zdZ!Y=6%R_VTAHB=37W7waJ=gj+jzllH)xRm zx`G|={hucRcWUC@Z+HY#_dY6TiBt1jt9k94_+bw4y|9buGDl(m6|79FH%2|L!_%;; zg|+^d>gqDn!`^5a#WZE^&o66buIeDXa?{;#cZ_I6$u`5`l`8KJjSmw<&~w;czmmQ> zsD#o=0HNlOE=&Hg=H|VTt-|DP+3DSKeV=V_ke6(ewbBD|cgAb2>y@`TXnE(bm1tp^ zweTl|Yl=|4FVh9o`ShqXv`6jb2$9ih6Itf2Fs5b%S(z8Q#9=f$oFXoFl!QmtFi1;s zbvrAhe5R_28rJ#6{H3~d!R^H%LrAr zF92M@BKc1tjRuF$hSt=-W*&X)pV7Df^65oObPxl?jqId+pdo4~UzS{6|8I^!JhBUw z??9cDWQ1eE#uxIHNqOF*5{GqDDwA?MFY23Lh&(#ec?KUMB+ z=`m-S9I{<8WUL}Z5faK?BS)_JNW*O;aWwO1jGb&@s3+w5ab_#~-r;AaJI){N{~upx z85LFB_<3gNZWtQGpcz8C5l|5U=`Jae?(UFQDG}*Vy1QE%L0Y=IJN7rv?w+$R_W6r1 zJO|Hkn7K3e-fw)qJ$A3g?Yhy^KXHK1%^4m|pSK|w2kA1cU%fq7`;lMtKgkqS7H^A} ziwZVNv8f!PykC7pT50?1)`@Io(qAzytgNbc*O;%UImw*W3@74u8TTG}1-HA0CIxRl z&!Hu+FIuxt>obf`LM%I;1YbWKL|pV%IAMFRCkv&$flMB2moilmarX@mcL^{C6wP6> z%d5AxZVaU(&$By5^PZSG?@630*} z6U*wpAu!RFwK2cXi2T{<<)IAClzEdtI(K{*0eN9Kseeh&`dubsgR)zc{(z#OpPV+y z_R?OoRiw-FS*D1!qaO9=IhHLtUU71>o+OfS9`$(C}W znUiufR@o3yJhxawqCbkluZ@hYBPa3(|M+mbmej2$PuT8DS6cZX4Y$EU*RNK81X)MC zwGAE>-}Eoh?HoA(kIi|N{UfedQu1tK4* z3MWk9Wu2M(y)y;#)7_Lh2(|s{*B?kCFo9TTmmP8wH>VSFBR*)Vzig5dms5F2A!`eK zF7RD~v!l?M8Wi>KfB^K(Ec#_MN{EE?fEWpzh<=)f#qFryN-pWfSgK{a+QweZeY&BF ziC+Bjjnktd%)GV_{!i2BNq23f12GmoWEWX{UYN?vPFS|G3|E{9r5lZ36tla*2rbIk z42?)vj6DxV>X#Fq$qqj9SixKKVpS$wuO4^Gf!zy$YDT;M=Ssix>hW-9xTe;uj09bq29(!nY zneGyqFA#)W{&GjlWG8kbCA+ZsYdW?H+61W0IA3=)+pWt7cq-E+>gr;Yg>_fP1ZVd( zv@P7c6f<6XFJ?L*c*j%y%Eb8_2n|~gjH2sCV%o@3B+yP^;D-d8cI#!yIrtW&M)`T2 zVr%F;vNdp-Hk}~1(1wPLGVL#Y3~q;_HC5c9BwFeai(ALpKi8!t9ub~Zg}HwG*7{`Z z;uSYK;WUk_;%2Hnb8xK86LW=AH?&5TZZ2BEfmgMzJHXedT)mkxdvk-|Ppbnj?eoW< z7q`Bi_zv@R`#i$2zm6x8C?|W-=pttk zF8*4RoxydGC#QhDUs~H=()tUr_6zty`vO6Blvg+JMHYKsE&kocy{1>0>atV{bmC26 zb{T4nHO>)F_T=fcpb2fF*F23t`&rUn^gc~%t>J!{W!B_PikSGF$#;5P9p5*tGvE~&FMY8JwSa3`ic4!?|ilgYQYM#II=OR02G&{PO zyU!um6BymmW5wcWX*@kO$-{dlr9P5g?^}^MUU*V$@KSH|ShhSZTDh_pCYZ>I5z%F< z8=vYe&{wZvY|n2P|66o0Z;u$XpmG0~uWQ`@ zI4l8qKV-vPmg?1LI5%c0qZ6;Vti{vJ|BEa09_N$?ZRWbOeocrhS+CT^e{ScJ@VzoR zxl@ac?zA}*d%qYkSg*ZXe)!_Rh`ds3^O@CCsGxS6!~V$sdS z^%niLuYV~@Z$)4)6H5(9*Dbs()IoSY487!S=G!>C#MY#%*&J@a1$rx6HAB%0DkO&L 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 literal 0 HcmV?d00001 diff --git a/docs/source/getting_started/formats/xlsx.rst b/docs/source/getting_started/formats/xlsx.rst index b1df0555..4db880a0 100644 --- a/docs/source/getting_started/formats/xlsx.rst +++ b/docs/source/getting_started/formats/xlsx.rst @@ -3,14 +3,23 @@ AMS xlsx ---------- -The AMS xlsx format allows one to use Excel for convenient viewing and -editing. If you do not use Excel, there are alternatives such as the free and -open-source `LibreOffice `_. +AMS sticks to the same XLSX format as ANDES, where each workbook represents a +model and each row represents a device instance. Format definition ................. -The AMS xlsx format contains multiple workbooks (also known as "sheets") shown -as tabs at the bottom. The name of a workbook is a *model* name, and each +As indicated in the image below, the AMS xlsx format contains multiple workbooks +(also known as "sheets") shown as tabs at the bottom. +The name of a workbook is a *model* name, and each workbook contains the parameters of all *devices* that are *instances* of the model. + +.. image:: xlsx.png + :width: 600 + :alt: Example workbook for Bus + +.. note:: Power Flow Data are the bridge between AMS and ANDES cases. + More discussion can be found in the Examples - Interoperation with ANDES. + +For more XLSX format details, please refer to the `ANDES XLSX format `_. diff --git a/docs/source/index.rst b/docs/source/index.rst index 34a33ced..e490f68a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -9,9 +9,9 @@ AMS documentation **Useful Links**: `Source Repository`_ | `Report Issues`_ | `Q&A`_ | `LTB Repository`_ | `ANDES Repository`_ -.. _`Source Repository`: https://github.com/jinningwang/ams -.. _`Report Issues`: https://github.com/jinningwang/ams/issues -.. _`Q&A`: https://github.com/jinningwang/ams/discussions +.. _`Source Repository`: https://github.com/CURENT/ams +.. _`Report Issues`: https://github.com/CURENT/ams/issues +.. _`Q&A`: https://github.com/CURENT/ams/discussions .. _`ANDES Repository`: https://github.com/CURENT/andes .. _`LTB Repository`: https://github.com/CURENT/ diff --git a/docs/source/modeling/routine.rst b/docs/source/modeling/routine.rst index cfa14569..26ec9234 100644 --- a/docs/source/modeling/routine.rst +++ b/docs/source/modeling/routine.rst @@ -15,13 +15,8 @@ Further, to facilitate the routine definition, AMS developed a class .. autoclass:: ams.core.param.RParam :noindex: -.. currentmodule:: ams.routines -.. autosummary:: - :recursive: - :toctree: _generated - - RoutineData - RoutineModel +.. autoclass:: ams.routines.RoutineModel + :noindex: Optimization model ------------------ From 45611454b8ef86da431eb03ab1004547a96bfca7 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Tue, 20 Feb 2024 10:38:33 -0500 Subject: [PATCH 42/46] Fix bug in addService --- ams/routines/routine.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ams/routines/routine.py b/ams/routines/routine.py index bd79c851..adbfe8e2 100644 --- a/ams/routines/routine.py +++ b/ams/routines/routine.py @@ -693,9 +693,14 @@ def _post_add_check(self): """ Post-addition check. """ + # --- reset routine status --- self.initialized = False self.exec_time = 0.0 self.exit_code = 0 + # --- reset symprocessor status --- + self._syms = False + # --- reset optimization model status --- + self.om.initialized = False def addRParam(self, name: str, @@ -786,8 +791,9 @@ def addService(self, model : str, optional Model name. """ - item = ValueService(name=name, value=value, tex_name=tex_name, unit=unit, - info=info, vtype=vtype, model=model) + item = ValueService(name=name, tex_name=tex_name, + unit=unit, info=info, + vtype=vtype, value=value) # add the service as an routine attribute setattr(self, name, item) From f8df7b68b3c55e953c1fa839e0f09ba819dde069 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Tue, 20 Feb 2024 10:46:57 -0500 Subject: [PATCH 43/46] Add ex8 to show customize formulation through API --- docs/source/examples/index.rst | 1 + examples/ex8.ipynb | 586 +++++++++++++++++++++++++++++++++ 2 files changed, 587 insertions(+) create mode 100644 examples/ex8.ipynb diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst index 336babfe..32c9230c 100644 --- a/docs/source/examples/index.rst +++ b/docs/source/examples/index.rst @@ -23,3 +23,4 @@ folder of the repository ../_examples/ex5.ipynb ../_examples/ex6.ipynb ../_examples/ex7.ipynb + ../_examples/ex8.ipynb diff --git a/examples/ex8.ipynb b/examples/ex8.ipynb new file mode 100644 index 00000000..f8918059 --- /dev/null +++ b/examples/ex8.ipynb @@ -0,0 +1,586 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Customzie Formulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Encapsuled the optimization problem calss, AMS provides direct access to the optimization formulation, where users have the option to customize the formulation without playing with the source code.\n", + "\n", + "In this example, we will walk through the optimization problem structure and show how to customize the formulation." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "import ams\n", + "\n", + "import datetime" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Last run time: 2024-02-20 10:45:23\n", + "ams:0.8.5.post43+g4561145\n" + ] + } + ], + "source": [ + "print(\"Last run time:\", datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\"))\n", + "\n", + "print(f'ams:{ams.__version__}')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "ams.config_logger(stream_level=20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspect the Optimization Problem Structure" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\"...\n", + "Input file parsed in 0.1369 seconds.\n", + "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", + "If expect a line outage, please set 'u' to 0.\n", + "System set up in 0.0018 seconds.\n" + ] + } + ], + "source": [ + "sp = ams.load(ams.get_case('5bus/pjm5bus_demo.xlsx'),\n", + " setup=True,\n", + " no_output=True,)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In AMS, a `RoutineModel` collects the descriptive dispatch formulations.\n", + "`DCOPF`, `RTED`, etc, are the subclasses of `RoutineModel`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Routine initialized in 0.0070 seconds.\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.init()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After successful initialization, the attribute `om` is populated with CVXPY-based optimization problem.\n", + "\n", + "The user can even hack to the source `prob` attribute to customize it if necessary." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "cvxpy.problems.problem.Problem" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(sp.DCOPF.om.prob)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Customize Built-in Formulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To maintain the consistency, AMS provides a set of built-in formulation customization methods to streamline the customization process.\n", + "\n", + "Here we extend DCOPF with consideration of CO2 emission.\n", + "To simplify the demonstration, following assumptions are made:\n", + "1. Variable `eg` is the CO2 emission of each generator. It is proportional to the generation, described by a parameter `ke` in the unit t/p.u..\n", + "1. Total CO2 emmission is limited by a constant cap `te`, in the unit $t$.\n", + "1. A tax `ce` is imposed on each unit of CO2 emission in the unit of $/p.u., and the tax is included in the objective function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add services\n", + "\n", + "Services are used to store values or build matrix for easier formulation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.addService(name='te', tex_name='t_e',\n", + " unit='t', info='emission cap',\n", + " value=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ValueService: DCOPF.te" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.te" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add parameters\n", + "\n", + "We need the following parameters to be defined as `RParam`: `ke` and `ce`. They should be 1D array in the same length as the number of generators and `te` is a scalar.\n", + "\n", + "For a general `RParam`, it has attributes `model`, `indexer`, and `imodel` to describe its source model and index model. The definition of `c2` in DCOPF source code is a good example.\n", + "However, for ones defined through API, since there is no model containing it, all above attributes are not applicable, and the user should be aware of the sequence of the parameters.\n", + "\n", + "Considering the sequence can be indexed by the generator index, it is used to reference the variables order.\n", + "Assuming `ke` is reciprocal to the generator capacity, and `ce` is the same for each generator, we can define the parameters as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# get the generator indices\n", + "stg_idx = sp.DCOPF.pg.get_idx()\n", + "\n", + "# get the value of pmax\n", + "pmax = sp.DCOPF.get(src='pmax', attr='v', idx=stg_idx)\n", + "\n", + "# assume the emission factor is 1 for all generators\n", + "ke = np.ones_like(pmax)\n", + "\n", + "# assume tax is reciprocal of pmax\n", + "ce = np.reciprocal(pmax)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.addRParam(name='ke', tex_name='k_e',\n", + " info='gen emission factor',\n", + " model=None, src=None, unit=None,\n", + " v=ke)\n", + "\n", + "sp.DCOPF.addRParam(name='ce', tex_name='c_e',\n", + " info='gen emission tax',\n", + " model=None, src=None, unit=None,\n", + " v=ce)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add constraints\n", + "\n", + "The CO2 emission cap is a simple linear inequality constraint.\n", + "\n", + "If wish to revise an existing built-in constraint, you can redefine the constraint `e_str` attribute." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.addConstrs(name='eub', info='emission upper bound',\n", + " e_str='sum(mul(ke, pg)) - te', type='uq',)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Revise the objective function\n", + "\n", + "The `e_str` can be revised to include the CO2 emission tax.\n", + "Here we only need to append the tax term to the original objective function." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "sp.DCOPF.obj.e_str += '+ sum(mul(ce, pg))'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Finalize the Customization\n", + "\n", + "After revising the problem, remember to initialize it before solving." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Routine initialized in 0.0056 seconds.\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.init()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DCOPF solved as optimal in 0.0106 seconds, converged after 9 iterations using solver ECOS.\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.run(solver='ECOS')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Inspect the results." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.2, 5.2, 4.4, 0.2])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.pg.v" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.297571428627165" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp.DCOPF.obj.v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load the original problem as a baseline for comparison." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\"...\n", + "Input file parsed in 0.0355 seconds.\n", + "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", + "If expect a line outage, please set 'u' to 0.\n", + "System set up in 0.0020 seconds.\n" + ] + } + ], + "source": [ + "sp0 = ams.load(ams.get_case('5bus/pjm5bus_demo.xlsx'),\n", + " setup=True,\n", + " no_output=True,)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Routine initialized in 0.0060 seconds.\n", + "DCOPF solved as optimal in 0.0088 seconds, converged after 9 iterations using solver ECOS.\n" + ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp0.DCOPF.run(solver='ECOS')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the comparasion, we can see that the generation schedule changes." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2.1, 5.2, 0.7, 2. ])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp0.DCOPF.pg.v" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.3445000004668826" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sp0.DCOPF.obj.v" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ams", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "d2b3bf80176349caa68dc4a3c77bd06eaade8abc678330f7d1c813c53380e5d2" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From dfc5921ec654b9f0e50120b63c6c1dd26c486ff7 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Tue, 20 Feb 2024 10:50:13 -0500 Subject: [PATCH 44/46] Rerun ex8 --- examples/ex8.ipynb | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/examples/ex8.ipynb b/examples/ex8.ipynb index f8918059..5c518e00 100644 --- a/examples/ex8.ipynb +++ b/examples/ex8.ipynb @@ -23,10 +23,7 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", - "\n", "import numpy as np\n", - "import pandas as pd\n", "\n", "import ams\n", "\n", @@ -42,8 +39,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Last run time: 2024-02-20 10:45:23\n", - "ams:0.8.5.post43+g4561145\n" + "Last run time: 2024-02-20 10:49:56\n", + "ams:0.8.5.post44.dev0+gf8df7b6\n" ] } ], @@ -79,10 +76,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\"...\n", - "Input file parsed in 0.1369 seconds.\n", + "Input file parsed in 0.1247 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0018 seconds.\n" + "System set up in 0.0020 seconds.\n" ] } ], @@ -109,7 +106,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0070 seconds.\n" + "Routine initialized in 0.0088 seconds.\n" ] }, { @@ -358,7 +355,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0056 seconds.\n" + "Routine initialized in 0.0057 seconds.\n" ] }, { @@ -376,6 +373,13 @@ "sp.DCOPF.init()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Solve it and Check the Results" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -385,7 +389,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "DCOPF solved as optimal in 0.0106 seconds, converged after 9 iterations using solver ECOS.\n" + "DCOPF solved as optimal in 0.0110 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { @@ -467,10 +471,10 @@ "output_type": "stream", "text": [ "Parsing input file \"/Users/jinningwang/Documents/work/ams/ams/cases/5bus/pjm5bus_demo.xlsx\"...\n", - "Input file parsed in 0.0355 seconds.\n", + "Input file parsed in 0.0367 seconds.\n", "Zero line rates detacted in rate_a, rate_b, rate_c, adjusted to 999.\n", "If expect a line outage, please set 'u' to 0.\n", - "System set up in 0.0020 seconds.\n" + "System set up in 0.0021 seconds.\n" ] } ], @@ -489,8 +493,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Routine initialized in 0.0060 seconds.\n", - "DCOPF solved as optimal in 0.0088 seconds, converged after 9 iterations using solver ECOS.\n" + "Routine initialized in 0.0066 seconds.\n", + "DCOPF solved as optimal in 0.0098 seconds, converged after 9 iterations using solver ECOS.\n" ] }, { From a67376711b87e807f9f4c8b5fd1573aeca5c55a3 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Tue, 20 Feb 2024 10:51:29 -0500 Subject: [PATCH 45/46] Update release notes --- docs/source/release-notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/release-notes.rst b/docs/source/release-notes.rst index 470138a7..1bc45377 100644 --- a/docs/source/release-notes.rst +++ b/docs/source/release-notes.rst @@ -11,6 +11,8 @@ Pre-v1.0.0 v0.8.6 (2024-02-xx) +- Add ex8 to demonstrate how to customize existing formulations +- Fix ``addService`` - Fix ANDES file converter issue v0.8.5 (2024-01-31) From 79459147ba873980191307c8adf6fc1a9ac08a22 Mon Sep 17 00:00:00 2001 From: jinningwang Date: Tue, 20 Feb 2024 11:07:49 -0500 Subject: [PATCH 46/46] Refactor codecov actions --- .../workflows/codacy-coverage-reporter.yml | 24 ------------------- .github/workflows/codecov.yml | 23 +++++++++++++++--- 2 files changed, 20 insertions(+), 27 deletions(-) delete mode 100644 .github/workflows/codacy-coverage-reporter.yml diff --git a/.github/workflows/codacy-coverage-reporter.yml b/.github/workflows/codacy-coverage-reporter.yml deleted file mode 100644 index 3a0f43d1..00000000 --- a/.github/workflows/codacy-coverage-reporter.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Codacy Coverage Reporter - -on: [push, pull_request] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Check secret presence - id: check_secret - run: | - echo "is_set=false" >> $GITHUB_OUTPUT - if [ ! -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then - echo "is_set=true" >> $GITHUB_OUTPUT - fi - - - name: Conditional run codacy-coverage-reporter - if: steps.check_secret.outputs.is_set == 'true' - uses: codacy/codacy-coverage-reporter-action@v1.3.0 - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage.xml - env: - CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 7e83f406..1dacf30f 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -1,10 +1,10 @@ -name: Python application +name: Code coverage on: [push, pull_request] jobs: build: - name: Codecov + name: Report coverage runs-on: ubuntu-latest steps: @@ -30,4 +30,21 @@ jobs: - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + - name: Check secret presence + id: check_secret + run: | + echo "is_set=false" >> $GITHUB_OUTPUT + if [ ! -z "${{ secrets.CODACY_PROJECT_TOKEN }}" ]; then + echo "is_set=true" >> $GITHUB_OUTPUT + fi + + - name: Upload coverage to Codacy + if: steps.check_secret.outputs.is_set == 'true' + uses: codacy/codacy-coverage-reporter-action@v1.3.0 + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.xml + env: + CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} \ No newline at end of file