From 00a692c82d0d2054a7db11af9ff221b1b2156f26 Mon Sep 17 00:00:00 2001 From: Junzi Sun Date: Wed, 8 May 2024 11:57:28 +0200 Subject: [PATCH] refactoring codebase --- .gitignore | 2 + acropole/__init__.py | 1 + acropole/columns.py | 129 ----------- acropole/data/__init__.py | 0 acropole/data/acft_params.csv | 30 --- acropole/data/aircraft_params.csv | 30 +++ acropole/estimator.py | 141 ++++++++++++ .../__init__.py | 0 .../assets/__init__.py | 0 .../saved_model.pb | Bin 120841 -> 0 bytes .../variables/__init__.py | 0 .../variables/variables.data-00000-of-00001 | Bin 106724 -> 0 bytes .../variables/variables.index | Bin 2488 -> 0 bytes acropole/models/__init__.py | 0 acropole/models/acropole.keras | Bin 0 -> 130389 bytes acropole/predictor.py | 68 ------ acropole/trajectory.py | 207 ------------------ acropole/utils.py | 45 ---- pyproject.toml | 6 +- 19 files changed, 177 insertions(+), 482 deletions(-) delete mode 100644 acropole/columns.py delete mode 100755 acropole/data/__init__.py delete mode 100644 acropole/data/acft_params.csv create mode 100644 acropole/data/aircraft_params.csv create mode 100644 acropole/estimator.py delete mode 100755 acropole/models/Dense_Acropole_FuelFlow_Scaling/__init__.py delete mode 100755 acropole/models/Dense_Acropole_FuelFlow_Scaling/assets/__init__.py delete mode 100644 acropole/models/Dense_Acropole_FuelFlow_Scaling/saved_model.pb delete mode 100755 acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/__init__.py delete mode 100644 acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/variables.data-00000-of-00001 delete mode 100644 acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/variables.index delete mode 100755 acropole/models/__init__.py create mode 100644 acropole/models/acropole.keras delete mode 100755 acropole/predictor.py delete mode 100644 acropole/trajectory.py delete mode 100644 acropole/utils.py diff --git a/.gitignore b/.gitignore index 453dfd0..95082ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +tmp/ + .DS_Store # Byte-compiled / optimized / DLL files diff --git a/acropole/__init__.py b/acropole/__init__.py index e69de29..80c7abf 100755 --- a/acropole/__init__.py +++ b/acropole/__init__.py @@ -0,0 +1 @@ +from .estimator import FuelEstimator diff --git a/acropole/columns.py b/acropole/columns.py deleted file mode 100644 index f444e80..0000000 --- a/acropole/columns.py +++ /dev/null @@ -1,129 +0,0 @@ -# @internal -# @author: Gabriel JARRY -# @endinternal - -DERIV = "DERIV" -SEP = "_" - -COL_SYST_TRAJ_ID = "SYST_TRAJ_ID" -COL_SYST_POINT_ID = "SYST_POINT_ID" -COL_PLOT_DATE = "PLOT_DATE" -COL_TIME_LAST_PLOT = "TIME_LAST_PLOT" -COL_LONGITUDE = "LONGITUDE" -COL_LATITUDE = "LATITUDE" -COL_ALTI_STD_FT = "ALTI_STD_FT" -COL_GRND_SPD_KT = "GRND_SPD_KT" -COL_VERT_SPD_FTMN = "VERT_SPD_FTMN" -COL_FLPL_CALL_SIGN = "FLPL_CALL_SIGN" -COL_FLPL_AIRC_TYPE = "FLPL_AIRC_TYPE" -COL_FLPL_DEPR_AIRP = "FLPL_DEPR_AIRP" -COL_FLPL_ARRV_AIRP = "FLPL_ARRV_AIRP" -COL_ESTIM_FUEL_FLOW_ACRPL = "ESTIM_FUEL_FLOW_ACRPL" -COL_ESTIM_FUEL_FLOW_KGH = "ESTIM_FUEL_FLOW_KGH" -COL_CONF_IND = "CONF_IND" -COL_ESTIM_CONSO_KG = "ESTIM_CONSO_KG" -COL_FLIGHT_TIME = "FLIGHT_TIME" -COL_TIME = "TIME" -COL_MASS = "MASS" -COL_MASS_KG = "MASS_KG" -COL_TRUE_AIR_SPD_KT = "TRUE_AIR_SPD_KT" -COL_ACFT_ICAO_TYPE = "ACFT_ICAO_TYPE" -COL_FUEL_FLOW_TO = "FUEL_FLOW_TO" -COL_MAX_OPE_MACH_NUM = "MAX_OPE_MACH_NUM" -COL_MAX_TO_WEIGHT = "MAX_TO_WEIGHT" -COL_OPE_EMPTY_WEIGHT = "OPE_EMPTY_WEIGHT" -COL_ACFT_SPAN = "ACFT_SPAN" -COL_ACFT_LENGTH = "ACFT_LENGTH" -COL_ENGINE_NUM = "ENGINE_NUM" -COL_MAX_OPE_SPEED = "MAX_OPE_SPEED" -COL_MAX_OPE_ALTI = "MAX_OPE_ALTI" -COL_SURFACE = "SURFACE" -COL_ENGINE_TYPE = "ENGINE_TYPE" - -COL_DERIV_ALTI_STD_FT = DERIV + SEP + COL_ALTI_STD_FT -COL_DERIV_GRND_SPD_KT = DERIV + SEP + COL_GRND_SPD_KT -COL_DERIV_TRUE_AIR_SPD_KT = DERIV + SEP + COL_TRUE_AIR_SPD_KT - -COLS_SMOOTH = [ - COL_ALTI_STD_FT, - COL_GRND_SPD_KT, - COL_VERT_SPD_FTMN -] - -COLS_KEEP = [ - COL_SYST_TRAJ_ID, - COL_FLPL_AIRC_TYPE, - COL_FLPL_CALL_SIGN, - COL_FLPL_DEPR_AIRP, - COL_FLPL_ARRV_AIRP -] - - -COLS_RESAMPLE = [ - COL_LONGITUDE, - COL_LATITUDE, - COL_ALTI_STD_FT, - COL_GRND_SPD_KT, - COL_VERT_SPD_FTMN -] - -COLS_ACFT_PARAMS = [ - COL_ACFT_ICAO_TYPE, - COL_FUEL_FLOW_TO, - COL_SURFACE, - COL_MAX_OPE_ALTI, - COL_MAX_OPE_MACH_NUM, - COL_MAX_TO_WEIGHT, - COL_OPE_EMPTY_WEIGHT, - COL_ACFT_SPAN, - COL_ACFT_LENGTH, - COL_ENGINE_NUM, - COL_MAX_OPE_SPEED, - COL_CONF_IND, - COL_ENGINE_TYPE -] - -COLS_INPUT_FUEL = [ - COL_ENGINE_TYPE, - COL_DERIV_ALTI_STD_FT, - COL_DERIV_GRND_SPD_KT, - COL_DERIV_TRUE_AIR_SPD_KT, - COL_SURFACE, - COL_MAX_OPE_ALTI, - COL_MAX_OPE_SPEED, - COL_ALTI_STD_FT, - COL_GRND_SPD_KT, - COL_TRUE_AIR_SPD_KT, - COL_VERT_SPD_FTMN, - COL_MASS -] - -COLS_PROCESS = [ - COL_SYST_POINT_ID, - COL_TIME, - COL_TIME_LAST_PLOT, - COL_FLIGHT_TIME, - COL_PLOT_DATE -] - -COLS_FUEL = [ - COL_ESTIM_FUEL_FLOW_ACRPL, - COL_ESTIM_CONSO_KG, - COL_ESTIM_FUEL_FLOW_KGH, - COL_GRND_SPD_KT, - COL_TRUE_AIR_SPD_KT, - COL_MASS, - COL_FLPL_AIRC_TYPE, - COL_ENGINE_NUM, - COL_FUEL_FLOW_TO, - COL_CONF_IND, - COL_DERIV_TRUE_AIR_SPD_KT, - COL_DERIV_GRND_SPD_KT, - COL_TIME_LAST_PLOT, - COL_ALTI_STD_FT, - COL_OPE_EMPTY_WEIGHT, - COL_MAX_TO_WEIGHT -] - - - diff --git a/acropole/data/__init__.py b/acropole/data/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/acropole/data/acft_params.csv b/acropole/data/acft_params.csv deleted file mode 100644 index 00a1c00..0000000 --- a/acropole/data/acft_params.csv +++ /dev/null @@ -1,30 +0,0 @@ -ACFT_ICAO_TYPE;ENGINE_ICAO;PERCENTAGE;FUEL_FLOW_TO;TYPE;WTC;SURFACE;MAX_OPE_ALTI;MAX_OPE_MACH_NUM;MAX_TO_WEIGHT;OPE_EMPTY_WEIGHT;ACFT_SPAN;ACFT_LENGTH;ENGINE_NUM;TRAIN_ON;MAX_OPE_SPEED;CONF_IND;ENGINE_TYPE -A318;CFM56-5B9/3;52.46;0.956;JET;M;122.6;39800.0;0.82;68000.0;40900.0;34.1;31.45;2.0;0;471.51923854894073;0.88;0.0 -A319;V2524-A5;20.42;1.042;JET;M;122.6;39800.0;0.82;70000.0;39000.0;34.1;33.84;2.0;0;471.51923854894073;0.875;0.0 -A320;CFM56-5B4/P;41.98;1.1320000000000001;JET;M;122.6;41100.0;0.82;78000.0;43700.0;34.1;37.57;2.0;1;471.51923854894073;1.0;0.0 -A321;V2533-A5;57.58;1.426;JET;M;122.6;39800.0;0.82;83000.0;47000.0;34.15;44.5;2.0;0;471.51923854894073;0.884;0.0 -A332;Trent 772;77.59;3.15;JET;H;361.6;41500.0;0.86;230000.0;125964.0;60.304;58.372;2.0;1;494.5201770147428;1.0;0.0 -A333;Trent 772;79.19;3.15;JET;H;361.6;41100.0;0.86;212000.0;126000.0;60.304;63.689;2.0;0;494.5201770147428;0.891;0.0 -A337;Trent 772;100.0;3.15;JET;H;361.6;41100.0;0.86;227000.0;125000.0;60.3;63.1;2.0;0;494.5201770147428;0.89;0.0 -A338;Trent7000-72;100.0;2.478;JET;H;361.6;41100.0;0.86;242000.0;129000.0;64.0;58.81;2.0;0;494.5201770147428;0.849;0.0 -A339;Trent7000-72;100.0;2.478;JET;H;361.6;41100.0;0.86;251000.0;129000.0;64.0;63.66;2.0;0;494.5201770147428;0.854;0.0 -AT72;PW124B-HS14SF;100.0;0.1807;TURBOPROP;M;61.0;25000.0;0.55;21500.0;12300.0;27.05;27.166;2.0;0;331.6003035355095;0.899;1.0 -AT73;PW127-HS247F;100.0;0.18774166665999997;TURBOPROP;M;61.0;25000.0;0.55;21500.0;12300.0;27.05;27.166;2.0;0;331.6003035355095;0.899;1.0 -AT75;PW127F-HS568F;100.0;0.18969166;TURBOPROP;M;61.0;25000.0;0.55;22000.0;12850.0;27.05;27.166;2.0;0;331.6003035355095;0.9;1.0 -AT76;PW127M-HS568F;100.0;0.18969166;TURBOPROP;M;61.0;25000.0;0.55;22800.0;13200.0;27.05;27.166;2.0;1;331.6003035355095;1.0;1.0 -B732;JT8D-15A;34.31;1.115;JET;M;91.0449792;37000.0;0.84;52390.0;27125.0;28.35;30.53;2.0;0;483.01970778184176;0.885;0.0 -B733;CFM56-3C-1;63.28;1.1540000000000001;JET;M;91.0449792;37000.0;0.82;61236.0;32904.0;28.88;33.4;2.0;0;471.51923854894073;0.876;0.0 -B734;CFM56-3C-1;96.83;1.1540000000000001;JET;M;91.0449792;37000.0;0.82;68040.0;33190.0;28.88;36.4;2.0;0;471.51923854894073;0.876;0.0 -B735;CFM56-3C-1;86.09;1.1540000000000001;JET;M;91.0449792;37000.0;0.82;60555.0;31312.0;28.88;31.01;2.0;0;471.51923854894073;0.882;0.0 -B736;CFM56-7B22;26.92;1.021;JET;M;124.58297664;41000.0;0.82;65544.0;36378.0;34.32;31.24;2.0;0;471.51923854894073;0.879;0.0 -B737;CFM56-7B26;19.21;1.2209999999999999;JET;M;124.58297664;41000.0;0.82;70080.0;37648.0;35.79;33.63;2.0;0;471.51923854894073;0.891;0.0 -B738;CFM56-7B26E;38.29;1.213;JET;M;124.58297664;41000.0;0.82;79016.0;41413.0;35.79;39.47;2.0;1;471.51923854894073;1.0;0.0 -B739;CFM56-7B27E;38.55;1.2930000000000001;JET;M;124.58297664;41000.0;0.82;85139.0;44676.0;35.79;42.11;2.0;0;471.51923854894073;0.886;0.0 -CRJ7;CF34-8C5B1;94.29;0.606;JET;M;70.6;41000.0;0.78;34019.4;20069.0;23.24;32.51;2.0;1;448.5183000831388;1.0;0.0 -CRJ9;CF34-8C5;73.63;0.6481;JET;M;71.1;41000.0;0.78;36514.0;21845.0;24.9;36.19;2.0;0;448.5183000831388;0.886;0.0 -CRJX;CF34-8C5A1;100.0;0.665;JET;M;77.4;41000.0;0.78;41640.0;23188.0;26.2;39.1;2.0;1;448.5183000831388;1.0;0.0 -E170;CF34-8E5;79.86;0.6518;JET;M;72.72;41000.0;0.82;35990.0;21121.0;26.0;29.9;2.0;1;471.51923854894073;1.0;0.0 -E190;CF34-10E5;54.31;0.789;JET;M;92.53;41000.0;0.82;47790.0;27737.0;28.72;36.24;2.0;1;471.51923854894073;1.0;0.0 -E195;CF34-10E5A1;41.18;0.866;JET;M;92.53;41000.0;0.82;48790.0;28567.0;28.72;38.67;2.0;0;471.51923854894073;0.888;0.0 -E75L;CF34-8E5;100.0;0.6518;JET;M;72.72;41000.0;0.82;38790.0;21870.0;26.0;31.68;2.0;0;471.51923854894073;0.894;0.0 -E75S;CF34-8E5;100.0;0.6518;JET;M;72.72;41000.0;0.82;37500.0;21870.0;26.0;31.68;2.0;0;471.51923854894073;0.894;0.0 \ No newline at end of file diff --git a/acropole/data/aircraft_params.csv b/acropole/data/aircraft_params.csv new file mode 100644 index 0000000..a20232c --- /dev/null +++ b/acropole/data/aircraft_params.csv @@ -0,0 +1,30 @@ +ACFT_ICAO_TYPE,ENGINE_ICAO,PERCENTAGE,FUEL_FLOW_TO,TYPE,WTC,SURFACE,MAX_OPE_ALTI,MAX_OPE_MACH_NUM,MAX_TO_WEIGHT,OPE_EMPTY_WEIGHT,ACFT_SPAN,ACFT_LENGTH,ENGINE_NUM,TRAIN_ON,MAX_OPE_SPEED,CONF_IND,ENGINE_TYPE +A318,CFM56-5B9/3,52.46,0.956,JET,M,122.6,39800.0,0.82,68000.0,40900.0,34.1,31.45,2.0,0,471.51923854894073,0.88,0.0 +A319,V2524-A5,20.42,1.042,JET,M,122.6,39800.0,0.82,70000.0,39000.0,34.1,33.84,2.0,0,471.51923854894073,0.875,0.0 +A320,CFM56-5B4/P,41.98,1.132,JET,M,122.6,41100.0,0.82,78000.0,43700.0,34.1,37.57,2.0,1,471.51923854894073,1.0,0.0 +A321,V2533-A5,57.58,1.426,JET,M,122.6,39800.0,0.82,83000.0,47000.0,34.15,44.5,2.0,0,471.51923854894073,0.884,0.0 +A332,Trent 772,77.59,3.15,JET,H,361.6,41500.0,0.86,230000.0,125964.0,60.304,58.372,2.0,1,494.5201770147428,1.0,0.0 +A333,Trent 772,79.19,3.15,JET,H,361.6,41100.0,0.86,212000.0,126000.0,60.304,63.689,2.0,0,494.5201770147428,0.891,0.0 +A337,Trent 772,100.0,3.15,JET,H,361.6,41100.0,0.86,227000.0,125000.0,60.3,63.1,2.0,0,494.5201770147428,0.89,0.0 +A338,Trent7000-72,100.0,2.478,JET,H,361.6,41100.0,0.86,242000.0,129000.0,64.0,58.81,2.0,0,494.5201770147428,0.849,0.0 +A339,Trent7000-72,100.0,2.478,JET,H,361.6,41100.0,0.86,251000.0,129000.0,64.0,63.66,2.0,0,494.5201770147428,0.854,0.0 +AT72,PW124B-HS14SF,100.0,0.1807,TURBOPROP,M,61.0,25000.0,0.55,21500.0,12300.0,27.05,27.166,2.0,0,331.6003035355095,0.899,1.0 +AT73,PW127-HS247F,100.0,0.1877416666599999,TURBOPROP,M,61.0,25000.0,0.55,21500.0,12300.0,27.05,27.166,2.0,0,331.6003035355095,0.899,1.0 +AT75,PW127F-HS568F,100.0,0.18969166,TURBOPROP,M,61.0,25000.0,0.55,22000.0,12850.0,27.05,27.166,2.0,0,331.6003035355095,0.9,1.0 +AT76,PW127M-HS568F,100.0,0.18969166,TURBOPROP,M,61.0,25000.0,0.55,22800.0,13200.0,27.05,27.166,2.0,1,331.6003035355095,1.0,1.0 +B732,JT8D-15A,34.31,1.115,JET,M,91.0449792,37000.0,0.84,52390.0,27125.0,28.35,30.53,2.0,0,483.01970778184176,0.885,0.0 +B733,CFM56-3C-1,63.28,1.154,JET,M,91.0449792,37000.0,0.82,61236.0,32904.0,28.88,33.4,2.0,0,471.51923854894073,0.876,0.0 +B734,CFM56-3C-1,96.83,1.154,JET,M,91.0449792,37000.0,0.82,68040.0,33190.0,28.88,36.4,2.0,0,471.51923854894073,0.876,0.0 +B735,CFM56-3C-1,86.09,1.154,JET,M,91.0449792,37000.0,0.82,60555.0,31312.0,28.88,31.01,2.0,0,471.51923854894073,0.882,0.0 +B736,CFM56-7B22,26.92,1.021,JET,M,124.58297664,41000.0,0.82,65544.0,36378.0,34.32,31.24,2.0,0,471.51923854894073,0.879,0.0 +B737,CFM56-7B26,19.21,1.221,JET,M,124.58297664,41000.0,0.82,70080.0,37648.0,35.79,33.63,2.0,0,471.51923854894073,0.891,0.0 +B738,CFM56-7B26E,38.29,1.213,JET,M,124.58297664,41000.0,0.82,79016.0,41413.0,35.79,39.47,2.0,1,471.51923854894073,1.0,0.0 +B739,CFM56-7B27E,38.55,1.293,JET,M,124.58297664,41000.0,0.82,85139.0,44676.0,35.79,42.11,2.0,0,471.51923854894073,0.886,0.0 +CRJ7,CF34-8C5B1,94.29,0.606,JET,M,70.6,41000.0,0.78,34019.4,20069.0,23.24,32.51,2.0,1,448.5183000831388,1.0,0.0 +CRJ9,CF34-8C5,73.63,0.6481,JET,M,71.1,41000.0,0.78,36514.0,21845.0,24.9,36.19,2.0,0,448.5183000831388,0.886,0.0 +CRJX,CF34-8C5A1,100.0,0.665,JET,M,77.4,41000.0,0.78,41640.0,23188.0,26.2,39.1,2.0,1,448.5183000831388,1.0,0.0 +E170,CF34-8E5,79.86,0.6518,JET,M,72.72,41000.0,0.82,35990.0,21121.0,26.0,29.9,2.0,1,471.51923854894073,1.0,0.0 +E190,CF34-10E5,54.31,0.789,JET,M,92.53,41000.0,0.82,47790.0,27737.0,28.72,36.24,2.0,1,471.51923854894073,1.0,0.0 +E195,CF34-10E5A1,41.18,0.866,JET,M,92.53,41000.0,0.82,48790.0,28567.0,28.72,38.67,2.0,0,471.51923854894073,0.888,0.0 +E75L,CF34-8E5,100.0,0.6518,JET,M,72.72,41000.0,0.82,38790.0,21870.0,26.0,31.68,2.0,0,471.51923854894073,0.894,0.0 +E75S,CF34-8E5,100.0,0.6518,JET,M,72.72,41000.0,0.82,37500.0,21870.0,26.0,31.68,2.0,0,471.51923854894073,0.894,0.0 diff --git a/acropole/estimator.py b/acropole/estimator.py new file mode 100644 index 0000000..8332731 --- /dev/null +++ b/acropole/estimator.py @@ -0,0 +1,141 @@ +import warnings + +import numpy as np +import pandas as pd +import pkg_resources +import tensorflow as tf + + +class FuelEstimator: + """ + Class that contains data pipelines for trajectory enhancement + """ + + DEFAULT_MASS = -1.0 + MAXIMUMS = np.array([1, 5000, 50, 50, 600, 50000, 800, 50000, 800, 800, 5000, 1]) + MINIMUMS = np.array([0, -5000, -50, -50, 0, 0, 200, 0, 200, 200, -5000, 0]) + + def __init__(self, aircraft_params_path: str = None, model_path: str = None): + """ + Initializes the Trajectory class. + + Args: + aircraft_table_path (str): The path to the aircraft table. Default is None (use package data). + model_path (str): The path to the prediction model. Default is None (use package data). + + """ + + if aircraft_params_path is None: + aircraft_params_path = pkg_resources.resource_filename( + "acropole", "data/aircraft_params.csv" + ) + + self.aircraft_params = pd.read_csv(aircraft_params_path) + + if model_path is None: + model_path = pkg_resources.resource_filename( + "acropole", "models/acropole.keras" + ) + + self.model = tf.keras.models.load_model(model_path) + + def estimate(self, flight: pd.DataFrame, **kwargs) -> pd.DataFrame: + """ + Estimates fuel flow and consumption based on the flight trajectory. + + Args: + flight (pd.DataFrame): The flight data as a pandas DataFrame. + **kwargs: Additional keyword arguments for customization. + + Keyword Args: + typecode (str): The column name for the aircraft type code. Default is "typecode". + timestamp (str): The column name for the timestamp. Default is "timestamp". + groundspeed (str): The column name for the groundspeed. Default is "groundspeed". + altitude (str): The column name for the altitude. Default is "altitude". + vertical_rate (str): The column name for the vertical rate. Default is "vertical_rate". + airspeed (str): The column name for the airspeed. Default is "airspeed". + mass (str): The column name for the mass. Default is "mass". + + Returns: + pd.DataFrame: The flight data with additional estimated fuel parameters. + + Raises: + AssertionError: If the 'timestamp' column is not of type float. + + Warnings: + If the aircraft type code is not supported. + + """ + + col_typecode = kwargs.get("typecode", "typecode") + col_timestamp = kwargs.get("timestamp", "timestamp") + col_groundspeed = kwargs.get("groundspeed", "groundspeed") + col_altitude = kwargs.get("altitude", "altitude") + col_vertical_rate = kwargs.get("vertical_rate", "vertical_rate") + col_airspeed = kwargs.get("airspeed", "airspeed") + col_mass = kwargs.get("mass", "mass") + + assert ( + flight[col_timestamp].dtype == float + ), "'timestamp' must be a series of float" + + flight_typecode = flight[col_typecode].iloc[0] + if flight_typecode not in self.aircraft_params.ACFT_ICAO_TYPE.unique(): + warnings.warn( + f"Aircraft type {flight_typecode} flight_typecode not supported" + ) + + flight = flight.merge( + self.aircraft_params, + how="left", + left_on=col_typecode, + right_on="ACFT_ICAO_TYPE", + ) + + if col_airspeed not in flight.columns: + flight = flight.assign(airspeed=lambda d: d[col_groundspeed]) + + if col_mass not in flight.columns: + flight = flight.assign(mass_norm=self.DEFAULT_MASS) + else: + flight = flight.assign( + mass_norm=lambda d: (d[col_mass] - d.OPE_EMPTY_WEIGHT) + / (d.MAX_TO_WEIGHT - d.OPE_EMPTY_WEIGHT) + ) + + # compute devrivatives of altitude and speeds + flight = flight.assign(dt=lambda d: d[col_timestamp].diff().bfill()).assign( + d_altitude=lambda d: (d[col_altitude].diff().bfill() / d.dt), + d_groundspeed=lambda d: (d[col_groundspeed].diff().bfill() / d.dt), + d_airspeed=lambda d: (d[col_airspeed].diff().bfill() / d.dt), + ) + + inputs = flight[ + [ + "ENGINE_TYPE", + "d_altitude", + "d_groundspeed", + "d_airspeed", + "SURFACE", + "MAX_OPE_ALTI", + "MAX_OPE_SPEED", + col_altitude, + col_groundspeed, + col_airspeed, + col_vertical_rate, + "mass_norm", + ] + ] + + inputs_normalized = (inputs - self.MINIMUMS) / (self.MAXIMUMS - self.MINIMUMS) + data = tf.convert_to_tensor(inputs_normalized) + + single_engine_fuelflow = self.model.predict(data).squeeze() + + flight = flight.assign( + fuel_flow=lambda d: single_engine_fuelflow * d.ENGINE_NUM, + fuel_flow_kgh=lambda d: d.fuel_flow * d.FUEL_FLOW_TO * 3600, + fuel_cumsum=lambda d: (d.fuel_flow * d.dt).cumsum(), + ) + + return flight diff --git a/acropole/models/Dense_Acropole_FuelFlow_Scaling/__init__.py b/acropole/models/Dense_Acropole_FuelFlow_Scaling/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/acropole/models/Dense_Acropole_FuelFlow_Scaling/assets/__init__.py b/acropole/models/Dense_Acropole_FuelFlow_Scaling/assets/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/acropole/models/Dense_Acropole_FuelFlow_Scaling/saved_model.pb b/acropole/models/Dense_Acropole_FuelFlow_Scaling/saved_model.pb deleted file mode 100644 index 0c607fb2c2dca40197aa6ab560abe598ee708112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120841 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 z 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 diff --git a/acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/__init__.py b/acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/variables.data-00000-of-00001 b/acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/variables.data-00000-of-00001 deleted file mode 100644 index cfadbed567db4fdd4824144359bd82d07bf4d2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106724 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≺2j_Z)F=te%S(%FPpFg==+`$7 z{Bws2t+!l-Zunh<1}tOXnV_TG>-E(F9o&N+Z)-=xruLZILBmF;qcC|WnJcPJq?gK> z;-UlbP(w=&mi}YHB4XXCMD5dPW^s*Zp=dm1v3oqdYxzWI@=^m9hChJSgJY@31q~dx zq>sA`hGAmhI%QGn`n@m1&tVhc>!o&rl}k6Gb=TGDW6`$IdUTjt+1d_mZ3d~N zDQn-X#gFM@9-H3fQh{k&J(V~*hfeVRbW%&BI=OGZJ}0sGsj8Jq}byhxp*HZ$hSNe z70^`RN zO@Q;zYN*9|!Pnj%Fn+ZFYUapL4u+-h$MSBfwA2{V-B+lVIk`gRwRNyBB z@JSZ;*n|xw@bkYvzu~hQ5I(pQPydz)_&O)7Veo@Q%~b&V9?b$4a#z_Bqjg|RJtiKL zqPc4k_rYv!fAZcSlWcby;r6;2lR^0?;vG~$9K4%IrC|^mckc^WGdGec3lPyKI`6{v zQX7z!?SP^t`SF^ThJ12q6nPMIhOD0Af#%0tCRgtr0`lh4e9ILpP}&#?68?38&Y|Cd zhKUY${^<*#dSfXdmOTs^)6Ur1Sy$)n{e;F_n-i(}?_}BaCj2^l9K1cmK?_$|dqc#cNm?$D6N#~h@!n?F@r5(QCB*r}sA84<;#<1BW8N2-QBR5I`J$UU*B{TLp ztpzjj?y;GejFDvz{^P3j#VODy0D@oRRYBmDP&n(P2Zkd_@b}7a`qxuqykzZKy!w9c zzfr*xaGc{6de?}WW*UKhy&N_U&_$>VK+k>_)*QS#`bi;Da71jyP z3Z*QszyxI_*wQBrI(;IBB9`3^}n_6RO7ZAv~B)Y(V^nm^zq0Zf!C2sG&SKd+UZwCT~tb> z%Ro5V@Jk7rNG%o=chtk3qOG(GyaMay{^dSf-{VZaxxhykj489zSB0;FrVH?lhg_S| zVroJ|4|VV7OyM<;@l?@=3*4XUs<7~NEgC`d@L(diSspzrN@Z7w`T&k}z zx4}2l&J|}u%X=ZBHGNvB(p8sJiKd|wejqp;s4FC{S#Z?j9}C##1)cK$3dS~9P;2g5 zA8c!ROps|D7%mf+3BQrOa4 z8_Abxf>jryK#;D8p)Vz1nV3*=@m;vM_w*JLW$6KL%=Bd{Zsp>UH^wB)E&{Bn`H!4j ztwpHsEGa1zM~X;|t1?QtC&4~n{FJ%$CxMmWHnv?_0#Y3+7{`;6Kxf7WMpkqQGwRP7 ziLzn3|79yT?$%aD-La1;w0I62|JnnCpvz=9#vS)27$B{8U+DY=DkQCJ5a(B2C&8l{ zlsV^~S--K78N|0;1nkqMr9sho5MT_j5-ZPXl=uCpb&DC)&IwDjmC<>j?7N-_*)D4<`f5AGfViD|0&RR z##y{sm^@NC+rsA`SEY1pCh-xNQR2qz7lqn<3|;7WfytwTn*fIS_pR;7mEvw$JvVBn|zG(SiqPcfd{3;Yogn4yyk5ii$a7r zY5Nm2e)JOfERq*_t@i{+er2KL{6uC|aV}ansDuW7*#X%DUU>8A4Pf)!Amk$X25lSm zA*`4jzLXUuOrGpUe!Aq~CVQ6mjnfgXe{YE7mA`^##xKyp;-lQ-Msr{>AwZNhycN_& zOCW_qAw*wFl8Li60X4}BiEgB!sQB@Dp^ild(9OKVEi;RQUsC4MZ=WW3+!=79cV_*h zx>t^aHi-y6-Bi@HtoB+%eDi$x&rFT^Pu89uUbdDNco)Mjj-M&&V;=oT9EA_C{RBgI z)>HGROrX_Z5pCob%*pMz3{|YNnkw!~q1S=R^sx3@YGb@4EZVaI#*s>HgZWWv*Ed~M zec=`TDMFU%xVaF{e0hN0e#jku8`Ok}gVSK&%w}r#r{h$is|lU;`Y{*lT0rN|5T6Gd zG(E!k45-$zpOP}%&sqB~p?%xGHw~OkruK{)(%sYBxD$#h9;M|6(Ygnk$Utw1aI2m;40VidPe7Sz_|z_Z#~00 z7bwW53i7|t5a`(X3yuZWlQf48R(~-ELgOLtJ;@u<-7CP#?lHX8lVQGI{ycvnP@e?% zO9`Fl-Dn#9JC473Pfgh1IE|N|TOgYHPf}Q&7)7iH_XtKDj>5On>VmWCR?Mu3WNsjR z1nS(*hwB`5p=91wxN!Pf`eo*QxS@PC+@ZXX9&bO7zLeHLYphFUjG;DtY0@v+v{IJd zZ*_%Q8>>f$D#ZcN}!_)K2zs^ZH8KA^|Xe5J#3EJL+#hv&1j~arqh3Rd8j-u;$9@4qc_wp zg_9MF;Arquc*ozG)>eH^ZC`)M<2T$*f4#DT`o6h^eG{;OEv}3Jm4}ZKjgCWD?~6aU zc%hb`VBN>m*LQMuCVfPBc`AiF`mp}1*G$voMh^X_3=Z$hL6dxcu`%hI{EezWRYUAaEh&D*hPK55Am?Bw1c2KpNz-Qfp-JqoEbZ zYt2d^8C=6SD%An%?jt5Xa5-r*;_$M{HE4FhM)Jh#1L-K5=djaZ+7OFVrw6y}mP%u%nV#@!R;kA4Y;1WjUz3 z+gjk8as#}ab`4u>%OH7+#|mbxDQ7zGN|SQ6M{HYkH2md04jeml3!l%NLN;l)fj?>z zL|NenHVqe|hudg=b%GL!?kghoElp(WEJCU+T!hYpsldN~3W}2QBi}#$sM(OPH%pFtEuG8Av*R( zKm9L1hdw_mn{MjWVCd^VxGxRT%)W^$J$hVZ=#Gf<(EMdP9jA1zY{qW2N_ z@ymJqPjZHLj~|AOo@+tH*p2+Tq8_~H!vP-WKS1YCIU=R&uDs&5>FkdgX1qcqVeE_z z1@nGBSAb8^MuX3rBAEs9pLD%ENq^=VHtCv5hiQ)16i?>8K$EV=_5Z-*^_?c@?HyuOH@{c$Fp zPjx7{YBHBxXE-@ z@cpK5QD3=zcjr@?hgiD4p_P*jQh|f%Q(^SB6fQ6I45S7n=%-(DIlo9J_%Cpo>!V~B zx^+SYH8ZAws+(;qq_zYvjd-HO+ z(WcTTrIf#e8al3W%%lJB&nEqs*SLcUv!TLeU%2jXDz)CXhI=Qt;vto?8(IcWrWd~O zg7QB!o5p`>ptuN4y7Ax>TKCfr@w1B=YvvjE*-e}|ZKs(jni@@)dUY5b=eJGVx?I}w zJ)&J?r_y>sG>rX0(MVx6ou8TkcmJNiJVQt5==hs-d>iXNH~w3b_MZ=2?C%eB>-X2R z*W2sVE>QtjkQnA+?TMNKhP3IP;s7eLND2n{e4`HbI5HV`hPfrd*Qw__wBe@pp3IBz z2b}XorN-tZa!j_09o;rVL_f|+gGqVQxb9dL=BZ->UHvc*I#H|WYafj1#(T_jwGTgb^c#d3#TzC&ZAg|5^Cl>y(tO8BF>TLmiV@&&j^p zL&=>P51%efgI^LR(v#1X(rSiW+g zJwtrCPisP`$d+qdgXss_{!A;?dg&6E6CMYVf)=dzkECKtzEZVS4b;nrl8oGALzuR8 zQq#Y^JIjz0AaL-s}IEn5>EA+3! zEy6;Nvey$CWyObZ_meNQY}7|OPca96-=&JpV$V>zE~(5rT*{eBe}v~!?=wbm`B0+0 zj0qenp}N0ZrC;6@?^ov@Q&LMR8Rd!wMl0el`qdqX-maJC#)x@l8_E+NcbW+c7cC`w zrk3#oZZvsUpN8X;=a4(c@6x{JWqjuv3*1n#h;yIWguSab^KWO1ne%z7e4k4L`g86E z8SlQD&wtp36(S^rpK?vGK;uLd4Wkc9Vb90dDx)`T!cO+)qWpKD#1MIw9PcDCdhJ`18 zV(E&t@Ss%+Y3iE>ENTt-l4wWtpUoSL3U2am%=N(bZ1J8t;UM_!> zK5pe#fm(}J)@>8Rub3XmUvnHw_S{-dUPo_3CVDNvsyU4Gggz%xNveXz3zgvP2@jH% zCdI>VRZu_p3TAH}LEZ~3my*Z&7JjFcoj%|~I_ z1!G_!)y^i18TUtBSHN%oFuqkK9WPDDB<7jon($0tA};T7<>60+3l;@{7|lF9rY{7^ z1W1#s8$U5UW3x!{y#wS_=|v`?(30OdWKN319E1zv6wtBDQvCSpDMY$+iombw0nj5x zLY6S&$w{2zRhf7G>l!@T| zvX8iBWh-8dR{+x&N~FngKmY64T(UW{6iVs05LKgWA|_DaRcSMRn)76=uAN3=t@6mv zoIK{s1CF(DTt}qdrhvCm!%f!9p5PTN``BFDN-+P;8nk@T2b|pP2<+Eh+d_$2G&8I9I8_~3-(d7$os zK9Kpwl2q?_a=xL4H(qmuHJYxAHfrw%&QKBDJ@EntmwaO#KB%*u&xgcT2B5<&ynAETO19o0~E!->&B7>v> z%4XG~7pcuKczqCLeK2*)-xtUI^`ewX=0ONK3Bio2FDfxCiVqim{S>M?b-Dn#LTM3N^3FP!3&F znc7Wt+~b`S(dmv{rm;DYJLqPBmQ0!e4<~P+{b&Vvq%p(&hH*s zow1(JYd-6ydvBpTzLytHW@?ISJQYEtUL%!+l}3@xE33eGpL%%f zrwKpXErmF~+)O5)c;O!0I>NfejpgZA4p`Ls2dfR_EY#Q6chxUJ@1Hbq+keWlYkP$B;|*7E zM4kwyu~X3Fln|CV{146tAE8b&%S1hKV|Q$nM#Fb8+-*_?y|z@LNH-~DAYq26LVtRM zH-)tsa?Dj_J)kVApSJrvZJx_Q#qW%R=RxL%r>Jql<8j=<)hfzm2O$WQq@zcxi)|9ahDOqg{}Cpu_l*^{^=A7Izfp($6i`ap7NI>d?+i zZb_IK&N#IbTAbFTiln5Wg|!8iD~aL$x<+v+kBxATIL5pD#YAjwcl7GgR0~{m?Hql3 zp%UjcH46F;xxnLJ6{s!YE1`Xl9e>PfGiU=w#Iw#&D4&0e^oL55?<@1Mit1TDqj0PSgQOgzrnaDD}PtA+R74m2ceE@56gZPztKkKa|$^IUz z2Jb9>fb7;C!CHF{k{zCvtU}HK(3HK4ZQXAR^O`5|V}yrr@9R0Zr8o}#+>*n--gb}Z zed>abV+x6KSUg#nG>@_7vS7;drHU6K;Gu6X5=tmT2JmOS(;N0%No*3O+0RM>noffH8Z7e@c|~VhrvY-HG$SZM5KP4CA!)4YU|N z2`VxvWOHr;R^Q;urb!vV#nCdvHR>(XoVy0kWhB_#?o`HAxte*U>jfiT+(ox%%w@H1 z)F5ZD2YPI@VR=OZUS2knv~66)7gpu5A6u~ojj@YX!bY6Oz%<>t9`q8s-^wc!` zOX36pAv^i2S=FMC>ed3e)w{r}=NtG{gG!z@yDq>zi)27&XF2gw$Rl~7s-!5C!P>oN zf!Q%R(Io|W!K;<_;8gD_vN>7>KdJBLqL%W4{GBN{4BY{e7IV>DB@tuWo(;B-Z{*z! zqlAeE4cXlMi&%f;4WI7upOF5h;&IC73ZLQFOy)Y~V7|Hz&tjqGS~GNF_5$D?`cd%b-dn+~#lF1LZv#PYe7<1* z%DtfOKOd2qt2QqYs)J8>FBAx$MDVK|W(hX_I7y<|r}*_@D0nn4jNEP(r>17@5&F-} z7Hk{+!~SrXgcsj^14Q=E!2H#2ynUNFc2;M3HbD|M7@fdsw3A@gGYAIvNpND&+lrUk|3qwEvAdxCL~C!_r#?||DD8M47iBrsLg5NJGk zM@(wk1uB8_$PRN)9KURl;L?FS;5tzX>$$4)Yv%7_n_OoDE3zhizjflG0QYGKVz=`DYB-^9`x&n{DgapGH#XsTP8MN2=N0GY82%bs>-+o+$8= z))0176@vyRFWkt+i2Iyr*uwh+o5k7lZ}-RnW2a+yg=`ZWU8@SvjXV$AktSwV;x_cA zJ)JC-orm(fQiZZ`2^eski~I`RP-|};)NKT~QPYz=G#hd6zs??9_`COK^_C9ZAd389p+=$r7WFvByI z+n%QqAJ0ibrH#t)U!{;4>upJv9(e*5Jvl<6n~gEw7f-JEZXoL8>PX$rnQVNU zFYkU{iv*`xK)>5w>UL)H{cnPtTLJikO@6(hLt zs4jTz+gUF9NCy6=+eUVhUxXTz6aJbPfW6+2BRjVoDX(_zY}2==c0!eA2I`&269(D;WOu|B z^V>fyVr60}FuyRLPVgubD)>o){x4=AdZiE6tGWzZ4(~&+j~283MKAclslntwJuhPP zUow3u<1LBJx=cPkmlGVmJO@~K8t~oPZomueW1w|CKBFnlI9d0>6L})yx=#G<#+YNH zA3IQ%OgZ|sU_P1m_b+@G^a;w>SVE<+TVj6gCOO$MjeLpPf*UMuGS>HZkZ-E}>|_H4 za4pUjw3nS?vt~4j``>pcS?Mgc{?AnOYQ}2tTkwGXhK>r|>}-P>Y{>ebVlN&;{u!v@t4kz!EHBOd~+*rqU z|JX;$(iDmL)Dp&^KZ|`^^aFP_1#`LirsRc5A|Bk4%)B!#;WAfhuoJx1L3~sw($l{L z=cowb^8s_bKG=x_1I+v}_)YxX2AOCRXCUw&U`D>jk!>-?qD-ocEICi$}F6;ytIm|4}kgFQG+4`v^5WxGfF z(cJ28e$vIGyqbX*qmg-;cQ%?VxY*B-pps9#vKa@$N3zJrY9-Gg!iYyzmu}M`;4b)C>HU z2xC4!ae#f}{g2#C>E-n@q4dz_A1Knds{S;zOaHGuZHM)ZYW6n?We3pm^#;VgdCONZTdU>}@0B6!&f~YyGr7xj(Z@)XxmklfnJpVVHyX##*A5!Y!PWbJE;qFtKMx1S% zayuQFx2bM0{l`&w`XmjXJxXhu>l@az*lPq%t*L^yv>Uncp2kQwr4rf|b#kGPN9p-( zSKY^d8|NW0?GR_&U%*W~oI`adsl)3pj?oL{bhtHB)L|x4LsoMb*#0q_t6|J(C1rIe zePRJuaiWrwtktKb&Lj~>^-M8@y^&mQQDuXcJi@b>I@Yn(TYS);{wl=T=WzSyi~|e1Pv9~4`cS(?Jpb@j z8oJHOf;vYI@6L%}n`0J$!I%%=rmG~FXZZo{y!rs8c|V4YGxG%}dX|G@Yxd&$vY%|W z{a*4sPMx?t%wboJQv&B45q^A73kwz0P#JuQqV3wT(z->0h6fLsjsYcd{B}Vs_T3SE1(%#GV)n?v6v8hoqud{b3Ob1R0uQa?`|d`I$wB0PlJh_R)!B4 z>|^I{?WV`?bwaOV_Osvh_rfcMuN$Q|u4arcvS_netZ+!0$C?gZWU6+9aQ-Gh;=A_X zYpI^>3KL6Il@i0j)jv?x?<-_9*NFeVr;uc1`0&?nWRL~hvv9$0P4)=NAc-H#N#J!F zyjr3G60naDJPE+7$UWFQYaYMhNCg^9H3q$^lfC55s- zUKgY^+yX6jGgztVPl5O1Y`nTe4e&Elh^TlAi1-`9dfHSItEb9n(w=1~@`QvS@a7-E zy#^^$*H{#XGkDhwNsV`g1E2@2CH~Wb>Nt;>loFU-?o#Q}AOcHqOr${EuwIVeg6Rjl5?X)ronBBwH^?hO#k{+Y*RDJlwM4df9UYWMN4w)S55o&n)1h%%# zjnyjt+hnL-epTBll~yrvW{>?EVjc!hVKnAcp~K;G**$iP*!vXE^dC({>&5$W-{3Qk zh)QeRuD^jQ(lcjM74qp>PCqE)hJI${hAecqrVeeFNQW=}IJ4`wP|Vx!rzrJTUQ9>Y z4W@M71?u?~WA=LFMoOAH%U-;ohW(AimH;E==3nw7K;mW$I%^Mj zvTX@iE;*aG%Gkt&*-IcjT}$3KTl_nQ0eE!veTZmFuuSaD>YG|dX&*QYbv5MSf`=p6 zW!4e0KW`)VepVO1bl-IH=}Y0 zyjv(RHRj-9{mDqZvjQ@+e6WL2BT(3@0-jrM<>}25fH^+}f12g$|Y$y_IPA)Q0? z{~TwTyK|8>P!}G)V8P9~P)FR39wh(9m9a-9HnFe1hlBqP+JnICA2_8$i!KkyM0&#n z&k20PmH&2Q^?w}YgVkwbHKkR^nz-R@S$=}{_xr(e>&v8MjtqG3qCk8`7JH<6N z9ZtU=il(|{G9`|;VSMI9;`uKOg{{}bqM$M;t-2a#mKcLS6$hY})Nb@cFQ0437T3;) zRLT0=3T%YSV&Zh^ny@O&LU{kO9${PFFdzQC!-w{00{?S$_)zf>wNG{@)}5#gKRy%N zp*CjX3mK|F_pGa^)=NvMp((>$EKwI(%sfNRQh)K<{wgNn(G*0xx+0G>XI!ghjW6m= z1Z2kyQe--Vzq>UWgmoE$ZDuF2<X!haQ5)~*XT>LftY@3kY6U0dm*ME#1d(0x z7=dltVKQ!Vg;3V<1aQ`x%&$>nX@3hX*24N;Q)ojz=KoWGMu!Z^ahDr#T2clx^`JGc zHFpe^TkQ&ctq!|C^0f~923lTyC#%oE&dD0Y`DN33EU$I>lR_%zovvJ9;v zhvOxn%&Hf}smp`~9 ze72M0L=PUZo0B1!#s6h@a#oJ ztbF}B{7&p}scHQ|#;@{X=D(C6M@c_wZ?=OQ1>3>$Uq4Nd$jph1svOM2P}yrsGsnyssHd%p7A{cij!MVm1!j_`eOxj!}TybM-rqx(Fayf zufs=?Ck0ef7i^ze$16V4A&c(L#!9zj@%q&pf$>*yFRP=OJzIGOEojffE&Bb~f2JFE z^sEToxIUkBSSyOCt<7vAyBo{o*b&2L`b5qBCi=4I0Z}3YeD922=AvgI^?IxY>CD{A ze6JXf`h#9WUnUMHTJJ|*apv%mdnWpnI>^W8(~R|)auj^~8H`*~2}d3-C6|hVS?5*@ zHh3arrs(ORlW~D0=(`e5-XtIe*#ffRwYISE=4UK@O&%?}Wq{@M-@v4=(qO|-wit%} zLJFML8E{XvEBbZu5DFj7qjB0k`guSPlur7|-8_|x zrUVGk=^Z3LfX)dTG&Pl%CL?EAFCh-($?|CPP&9vWf|?y2E%ZaYNP9 zO(0*Y1&71m(u31m;Oi4BxmQaZJf3Fnr+ZW%cs!FYMIjzyj%Q;$b5uQ!Q$9M4`@16# zhG{*4HM%M2;?HW@&r$*&yJyPqVo1|3b_$(hsD+vpX`*N%A=FmX0a87O`O5D1yxEm) zB+1|;7%jd_9G)tHHjBf|<k5 zlY!1|P=YN{)&OR%1jZjO!_TcDQhakoAU;YGLrlfLx15LkWT(gt!F#BtwGeQlgxwf2ZcRCN9@=a z$v#ls1rrjQ$azC|I)r;dKVINXYraSq0`XaFW!6c~wmya0MdxuJ&7#=?y(d`mlR3`0 zRwu9wyCT}J`X77wL@8FBf3RV`qzo@=oh!0?kO8XSKjHQ<$s|Wi+Q;Aa6&#!-Bi#Dc z3M4zt~gZIKN?1qP6z#U!m!+rw)Cp<|I_H~yaN;iu&-!H{7 z>|VC_@EC!R)`7tv?}MaN4?$+iCEoecagv+-1Wz;0V1@Hf;2j?T6bsgbYgWE)?9tX> zKh%7N=VTs{ll3XUm-Xdj2PtHlaSv{{nn{wnrhqx+Q6zin2tQBj8410$4JWUbqHpKq zvxzoWz-m2DFd)hSTavq}12Z$olt4EazGgfrRFiEPI3MKi1U${l`l*@?vhEi}rdLbJGE+x#Y*U$#e%U0}QJN3czRb@rc}}7ahp{4^A`)F%LlnNe!sAw{ zl4(IA*mrj-3jVf{f7We?^JQMp^)_Qr;<1nHI_|dz2+l%9i;tqFfgCP;M2l=YjE=13f(ex&E6{RBhUQtSR>Fp8DuG9mU z72kp$y;d?1t0|DHx<;NX4@Q5kiNNVi+t8IcFVL*%1LWM(X{=o4KfHDCQNq62$!{I9fzW%-|j9efIV>L~Mfv(EnkA4GR6;O@^ z-%W^bdAZmTxexq4-i4JFO7N5>Hx`|F2!Zr$qSAjH1(ijy5?4+k#~N8OSYOG$ym*sJ zuWNyE-@a3>u!^|44&WJ~$(Zh14a|?*03#C}Uf+8*|L55WX8OAeq-W_fwt#9RuEk+6 z#p?!87?+`{vZ5Q;YW}eB=!Hnm8}fH_2E0yI&%(RpJA>Qy>J7|4s&(izw80 zH<$eoQ^PH^+(OO@I$(j9Gb`C|248PF3jA)b!;WAQ`gc498cW;4i?U8&(V!+7xUNEG zX7sZc=hu;0mHj01z#2iD!%X<*$!_v<>jGT&Z2;RJl0^DyU3gZ`E9kRRj`=v}AbYvY zSETE*oviAX@;q|8ja~U9O7v~ac){KCCqQGf5;%~XN=fvs0Ky4bpqrmh&hgj9uJ>}7 z9`4*qq(@_};#EjO!956d0m|H8xw5i%#$0smgBp zhk7FGZ+j4|(BA?sC5qj1qru={x}{(wauYb6atusHb>ztUO#+A0UILZTeb|DQ0yp0r z!=H{iBA*Em?75JMP9_H6ew$Eazw9$>CnX>extQzou7I&38+d>@N%D5>XPuIRfp-QY zIJ3c=MD!(-UlJ9-s=^eT|2LC={q+d>q7uW#k<-xFB~{=ob~FtzsnmztjjXb?DKB;1 zO!&%QQn=FXDCkRAAX?Esjeq}rkoC`-2y{=Mu*S?!T*dCyal#`R(4`^Sh%T?-1>Yr_Sd1^9+$I{GPgeI3~N z5eh4fd4K9KF4*UcDk@D;Pqr%znY z#qQ1Rjb!NPEj+PCA3Z!ahL^N*L~E%nc-NBUjI)d(yW-S%@>9gH%c9d50|gs0f0a7m zZ@pm3y_4C6rj{tzVjk+Q7{{tiOCv`kQ;CjG1wlbARK5KWj&{o3q8)kD}eL&`EYUtnQRiq{#BDa0NnB4~o&@CE*{g;*5WK((OL(&8kJVV7} zW>6?lUscKq9F~IB@&kO}+(ztXq%K&nYb_YQZXt-!b0*{e6cZ=6d+e@`NpxKMC(vT* zj~dUf=ap>=(3hq!s2D>^2imoL%p*6=c@p>o)%I6(oSFO!PVCiMtqj-q*{xBZ? z923ju$8g-uqrD{K1mZFyba5ImW0yYc12gPhJR;+!}#N zmjo}Sut;#PJP3WZ8yLP+A;-*qV#|w0z-9Fao-LIG4HI0z*ZfInq$Cu_Z+i}JX^5?= zi=5c^ehgZ&H4RZGk~r&2R;*EiEVJO1Hj(=+J`ewpV=g^1!$+jFfzsQR?1q{wq7-5x znB-;xG@~7mceD~I9ehk3FN+fh>kolce_Qe`{U_0zyp)8++krV2#lYj;FWhq>7Z;s4 zi_QPIASrg3x)p3f=xvms&1W_vtuTRdS~UcpKN$xf*G_>|f6eJ|wams%C&csHR;t4k z89OwiyPvvRFHKvhjD-qP7L5D&RL)RK6}6s~gEwV5q3-xPX!h?gvtWi@(^U;AC{Ap^ zyOD)V^~|iMXla^r_+|wc*(x)y?@VMu|0Q||ZiaH_QdJo$SDRk5YZa`t$b#FBucq2F zj&WmdyF=Ub_fYj&Ej7FO8g+eX0StNnmrLBW5ITIm%6-+p2p`yJc-)n{2wmK&ASbbc zQJnS>f|)&RR$2iXoU#Xqyyx3GD$-9}pIcUd`Wvgs?bn<)NY@ebjUbxfa6#L*o4_f0O!%kbDg$}I^;Gd;yq2|^h4?-PBBUGf+1`3# z;;xM(f43G8^wr{)cLVtA&{K3-&H?;*W{=Z0U4?&#*WgOcLUiN!PVyq)B$65%gQw2e z1m`WB;vwu#fv#3zaJym|BRm~Nf=2Q|(C@q059ZVVPMV8nQM|!hljq`<_at~{@yy{^ zW-+t1V>0~sSQpzo*aj<%ocPO2Uf>ZmMlbaf&5)_^TDT zY5WzA8c*Uv-pJBcD^HREiCU7>*v2mRw-Ly#9|Mk;ufPporwS&Wn@ZH>AXd#ffd97I zVI%V#kUpajzXv*~uSi4iR+NnD?N_09x&3gD<`QDNQ;}5mJE2)(_x__(w_xcY#MVnC zfm4+S7+Cj(D9C-qXClPjf^n0;k|}QdsY#Lih+!bJE>D-7P;jI#e%VM{b*a)D>+b;5 zb5Ge<(m})~OHJfe?|}~Ud+~Ms5Ppx7HtEla1H;M3m_=709J_BZ+i>2P{CS@R(tP%^ z{R-#N<)HxZ{H%;%t^Nr@$rCv2E#Eq;pa=B{km>o>RTZNp;wQA()E)oX+FV`5S>-PtK5lTl%EY{u2N3 z>vmu|<3BJjIECM_D4hHlP#|xnRG?bmiuCQ?z`qXH$k9GEyvJKsSP(f0<#-FhhuYbo z@bnV+^qL)tUbzpBnPEYipG%6`3WnH+<~wljbU*y>{#lU8+whL|7DVKD4)>f5Ljm!F zY>etQm=&@T%vnuy{t?pTQo&o2uKpeO7chdYQkkOK*XxN$K-Qi<>mwq%ghmO3!Nggv3cB70>sZ4+7CONhWYLD zmmtxw4KOyk!0Vc-5TmmF!ijAr!r=N&T2{qY6k)L&+zgaJ#dhELkwYp1t;9b5&TK=W zjPDb6Qfx12KYp4I1LOG#+h+*o%+(X<$QI*>4Q{-VNx1Oz0cBzuC1i{E)39uHH@o&f zY5Z3;m3S-Xp>K-jduvnk(X7=;4M_qW8 z!bALbZlb{Y;{=@kevD{YgEhNtR|qF{;t;QY^C9(WxLH(Hok$8R4zl;`)I}ZlfXJ>~ zPE__GgtfRG%{#Yd@GwA{RXJJ;P4gh?+VBbcF64v<=S%U2oj=o~7PIN)!yGKPONN07 z$6!;pK6WKlpW>Phm`Yn-unRwp=-Bdv9CtRWJj#w~J&)X@J&KGod>~#2k{Sduli#WGmw~xMK zGpBJv$7$}%I6rv$rw28p&_I{lY+!cJuczxbHdu^o4DtV0JA#W{VE1aLk_{ zXupQlRQ9qawk@nhQUat}lfhu41H7hO0asjHh%~Co7m|?hWq`EQf1S^U;;~!}#Z9cfP`V zI-j-Qj=$RUgRh{+0FRL%5+}PGs3k7v2O2ig$XL)=3fXEf57Rt|5DO8}Zs3<#5R167<|RAJs%7z+JrmKla``DvD=o6eS};Q31&U z5>$eq5@x!q2NXpRM8Jdy<^bj#5y>i9GLltHprWLi?&<*nMNt72OemnJsDO%MLeV!} zvzVXyzO&Z7>wRn8d%kz-kE!aao%gQl>ZMT+S=5v6~hmd-?P-?aODY zZ7;vLf2lG|G3_#&uD5qwahdLTCw=+MlTY-Pr}|Z8sY!N~t*7ima%NP1&?D@11`IBD z$Q`#=Q9M(5)Yi-{qG`6hyWo5cqaccN{pb41$QP1T$))0#FKefR6HgZq87PYkp;akqDKUcZ#1)2w*l*~~YPI@b#Qn$N*kA61F#HV?oaYB=3?uMZZC5d6=s z_6VZG?-pTLTMN3+`to&FEad2sAHgRzKVm@epPhLYx^&JZ1;M*on#64S19)*qo!+&- z8FZCSq3f?qroUS?18Lqm{=_-b^pP#ED&UIo5@Le1di83%UHk)fOnKADP>ji${FwO*+}rfzTheUvk0CUIp|=$C$yB}{qPhjfa`H#!6ZCTEgrv`+<-r+xVb z_IKwIO!@D$P?LvvGxc94Cm{MjAyY&nhpwi^Pb{Vf@!qr#AQ;!_o`~MX`doUPt)^fW z@R02H+CWT_+brUvx8xlCVU`^oF>Mb0+F!n6^4%1UR^xSO*1!Qr!cuK|0*rCfn428c z4LO8y-D{$EPCTzwU72Hix0J6+_rR4;y0G!-w)pLy(28dVGGXl7EPBmqX*z6K2Bq}8 zg_st62xy&Xsqo*tpVh)yNPtVKI0S|Jh+rce_J1Y*XOnqEo8x}}}bt>D> z#B3`1m37Kf&Un!39ekoP`8(||w}O(Z*}#9ex0+lf`0p#@O>!04ds3hreH%(loKbEO z_LvBi)qqv1iF~ov*M#7WT-sQ*6?9t-;kWg%kRFGh*wT0O0PQ|>4xQ_&Sm9`%$^ly* zz?>cSAdA&yGZ3PUkL6wG908tf?MVMr#iiG(WGu{S`iCZ%!?4b zTbT`Q`*Y|Uh68YpY!216u7x0D`lE# z+jz8shNvO@gbf(d8_7$HujS@BeG87fzUjSr_t% zhuvbt;un6z+?~(M2ab;=ls0(K_i`1eW2=<$W&Nx1UyhM{EMWtzH#-M8+Y-T#njeBQ z?j8XrhgQ7S){1X=;~ci-)HP04=LLSooWo_dM=!uvZ)6GOUNQPb%VkR6?KUk3KjTtg zq+qU?B%f`g4jogoDEA9VWxK1`MCD0GYFJG;9qnHXtc;B5kU2B)g%84MUv*oY=}&vF zYr&Z{`)Sp-G8)#*uBh_)!g&%qhW_UH08C-=Z354R;acJbcD4G$IK@RQ4)D0kJz^sG z*WGve6|AIXw0InW=RHrx#^xcz8m^w3+UxxL z$x)o68?M00&=@eKewod|FZ%dizY30oSSIl;@EYO#Z5?;bNkz_#`5AnVj1MsCsTh9k z!6bZS|D=lcTTw8VPNkiTX46G=$EeFzwM6}gRp7V;T>;)sC0=Ddw)-AwRB?r?UOvCs zhCa2tfM_%SK<|9Bhte7`pKmKxLq-YC0`0in%b!7QfmiOOL$iDA@;P}q#AwYnYSH+` z{P?mKVo7@iUC-45KW9twmpsx$dPK=)L+zGYa`DLJ^nTr`71*9v9HZ#B++#XJh)kE0 z){5Onc#%%$IsB1%MEH@L1YS9v=Q{8Lzdx&i@4fgL)M71XJB3!`9IJ2qM1xwG>50=f zcl@N6hiO9RgF(a?`LW=Xv_$2`zLij4_mSO2!QO08k%5)G#uF<2*LSc~Jc^F37)qKH zQ8YX385y+RpUPXo=ZC1Q0zCZ$pc`3Qnvh(A=N;%F#Z5{6@Q?`p!qjB?l4%H)IJyjT z*GonB0Lz`~RD`Jl(RODHomMPU5vy^SV`rlXsxSKk`IGV152}*|Ct8i++*Pz94o$s8 zh=~K%4zW0TWhdl6&8&yFM#*6A%|>`eV>myl<~Yom83a{LN6?*DE>J7GhZBCTnXqW+ z_lno-B>Gy-dAl&z3;fXy@;0X*KEzY3onTuWMt7JW#7q>U1ZS7&Q(sLV1LJCU+Oi^! zC^5?e(@LYQCeB|(uU|mm2HNrbr_zah)c}9`bM7Um>vV!hRi1(L$jom95?%5H$H#`g z{cu=C`_v$g#C|nEa9Ci+$|P&Ox2MS0QO2C5qZNqF@h1qm4mRsdm0;b3dsA>;TqATj zuZB762<|cOPV(LEN5Q)D@2HY{g>+}fLdtTZG0`<830iKFtyHm#q1R<{?I`UMe(p0B z8>jC#sjqfM&?!r>o>G>LecBXDD@jV?Y7_2)7PB?9{*PE9W=#$#vN4&wLTNR<{)s+b zqLaqAE#AYA%Un)x%PN7A_Jzbl!W8MzR(TubR7|G}Wk=Hu!&~_69SNL!cs+F3ScZq3 zd}*7bYl6S9AvtVkV?u1pBjR{(Fz7&BcSzPxRqr%Ifr z#%`I-59mvvN@L9FA6^O-bB@~3Q74*VSjsf^mxbSn`{h@tvYkGBD(od8cPXBZ;tJNw z-Q@YtFyVbr`3*tu_gzYuHHpz%{eIce;T*p2_(=Swv<&UOo^1m&_TzP3$M~bo5(zP- zaeQ{D6kGC_;QzInWbO46<^kh#In?SCv*C$m3Hvz@mJ&}Z?$9m9)^@kQDHE%kx9}x5 zeWvsJq^5lQ$R}E1WTpN|HM`w~k>#)yw@YuG%D=U=h>%fPN|`II;IA^s;7i@|reE%s zw7dCqBFC1#M}Ua^ig_+C=p{Fo6Z7m9?B;%&i{>Uo@FJLF zUqQ!uHqk#HM^IydRJQ8Sjd`f9!X8Sm=D7esTM7#g0A+`e2SH?Ku8g z`LgRioMXN*(7QvqqGeey=U~Kq{%ohk#OtI8{;=*6G+s@U;L<-EtFe#$SMVlig7;rk zA({J1dctW_CLc^y-aRM|54?FscDH4U=9r_m+2U26-niv*;rx=XlZFrCbQ_x>9#ZQ< zv3i#jM0d;uGcd6GId>4|@4R3u0rz_Spw4v1*~D%t!CzVp@EDlyH{arBQBQ8} zYtpBKoMnlzk)Kfe%kiTiQ_rMDa3rD;o@NMoD)LbMXiv(9=R+VKLa0A~y;#!-LiQTS z^_$AYeoZG;KBpkO4I8}#!f7EM3`VF0RTB711zpE<_mg^M3D`(vTqXI_`nLqY47h7)s=6R?Xs2onY0(KECj?FxiOAEXcu=DK(5$x`v- zLCDAIb9vNbyDz+GOKT!&`b=V4LI~^DW(y?8xgx>4=)Wb+WFbB8b^64PjrvGFrulB` z9D-jw7K+uKM?AKUJ|@yb_jU$?^U(34COJkTdDq3 zGex#rTzL|EIJQKD&(Qci1I2Tbf<%^@g|Ziy3jW_!qleCL6otz8&d*ZQKZ(-|0sr0%Y%H!P9`8_+*i+ho%e8 z=^kN8HJ5OZA3`nlMQs7|;t?&W^r3X|O*Mo+-_H_@@m_}Nf2TiKp6_lz?3!i>8;^`L zn-(WYr~eY#eBf#jrtLKx(O_UN!-s{ZOW25)Pr_`<=K_wmIw#rO8e)z7Fi7uT<;w_h z*6(eF{@=@)>+HrIf7JgD!<08a@@fTb7MT5qm&M`LYZS}fOlpYnexD}zV17?}IMHQ-iP29&oi`(=Ap=`O-M zJS?PKchX`JZ^yu^>zIHHjVCo5C!9(^8Muh$P($Dt`Gp8?JHH5+xy6cXbl+tU7Ms(C=%}8!Ma?^r#(mvh zLL40zMZ4@9O^_;Q5ngJD8mNmMOwu^g=L89fG=3cekhIE>&kb!GLb zNFS!GUNeAbLFccO+tor;wm&2Xj>vIQnSuE``8*s+zZa|qTx?tm-fam62LNsehuJyh^Qed2c*uTDKY>-0!OS1~Ki z>XeSz;osYTFZ=J9k}~-ab%?2J!%kxx#WzI$-u`>Jn!}=)>*tlKR!kl^>I@+6e}Fkw z!9IHz;;s?3Wm^nDa?y3@@Ol!GbNk!~WIqPye%~8Z zR~ys?r+IHj^_LbLXII`ok9@SqBVa^3p6jz$$ia+eCe()orH^uZIICr{H zbU#vcT?>YO9YM^j?m<4D?Y&1NqhaJ}H1-*Ejv`cdj6rmL?6U>`S(<4T&PO&28Q zBU(+p+o{kG!f|IurYZE<5Gt}Cqf1P^GJ?x!l!LG9vvB*EnJ~0ef>2G$0dU9KkZze<8RTGijq-;IF-?+8cW2||v`;Z>*LN8*;H;;E=o;6% zl6Q@>ku3%>KJMs7vMwzsrpDuLEXw3MaX{OHewCm|jM|)yYX)P^!TN3hjw?rl2WrB2m5#egeHc|B(qFA-Hctu)pS3I39fG<^v#6!JzkvFx z!{o?@&0uVX@OkdCrH&|e7(Pep8<1W-Ki3dh$9{_13X>E7_5BUhimpI)1{eHAZFf$! zBAg-DxR9LVfy(Cn*QlSLg>(GhkSia;gkvzY{G3CiCr&D)>s!;pB zR|Qy2wQx-6+L(uZ*`Ohc0|s_SWIc+r@o06O3f4QgKg+lp<=WDxgQyaiGh)`U0|!7BeKoLCBk(v2B(kQjC6|&ccd_}tBBqM z`%>!2Vq*l$!2F#)WF_K3_wEDfmRDrTRddSGC>Oy#49SFtza2%gF*rMeF)ZwJGom>+ z=Nj2qcT{ByF%<_z9EJ2t8xHDoU2bEk=Pv};L&8u%}~ zb=57zuj2C=5ng@q7zFpVA&5LbM>xk@*QtWXY0W~g4Bfv|*y;?Bd8-jykUJf#H|^v( zCpCF7zo`QjXQq3&OYZAf?!z=0Z?6Lqezc$cTBL4afRr5)^=lR#J!=^ zx*>K%o{kl;vfM-azK=z*5U_5v2#4X7>WdLf&MAY$E4D3yVXl3@jfC{neR$ir)2Ll> z^kR{Ybu~RmhHf7Y=zAo5t_kgugfUZm5iEoMchZ=;7S`x%5|>6)Vmq}o;ia=~h?m6C zcOdGmHW-9=?h3<>O_4=(Y65DgM@fa)DxWf#L(^8MGIVT(wPg&$*gE&mCTFgT9 zWa49p&)@hWSvyu50@)Y4Ah>FZX#Og>E3$R};X6WGHYk!Ew{sEx{KjnF*#_ZQ`aAu> z@^;TmIhSl62x1nmi>nwns+Cl`rNQRIPYGws1Hc2T!nu>tBa44-2xa{?j}AI>A35| z6d^5B3U7EUypNvWSIFMoxg6CG%Km%KI~NZ3B+my*hqcL=fF!b9U)awtY78fpmLCzx zRQ92jy=?PTq{pU(@5yT8d}_v%A!vX9cY6OjpywC{$LQ-L?*9(%{} zw|zns2;8^=3_Yd?iUUoNjxRqS`eUp%GZ*%kwLAMj7oMpM>JhJF&5w%MB1+rDw z6yduEjC}Wx+M!q*Fph*=2~9*-R$>XB*FlN=`L`agpM+o+4yBU^pQ?jPRgbY152qkM z4=uX~yALIZWZJn_3|MV>fM|ZgdE^$syX-aleTjpDeY60+5nLh>DvZZt4I&>hyheJR zM!XlD(WV#c2-gOg`m|y#Txl@{!uEJ0nZsX3BEC$UrjjJ$`{LDpFs>FLy5*@esc?hq z|1z%VhZ}*x2`4DA>mKjYL1n1$Rux1H8QMoHj$me$G`fD2z8_oL(n`5) zSw^h>=}tRoEhqM+FGg+G#kYxY7`&acw^2-9U3!^_8`~zb=fkcnn7wKUE&oUnwa5Ha zLi#YUfy+{m4Cm%*(90ARkbXhr0la0ja8Av@{GEJVchY(1U*Q>v?f97BQPi1t50TE} z8%NLq+=U_=d3;nS?Ywv4MqzAu<7RB5kE|WVJ-9h!HZ>xCOZ?FE#J|t_~h;@`a zAzANoSo<1O&4|chNS^rDKUumCmZG>~Xll)zf#kTakXgiB%Xmp}%Ka5+?tOxOze2cP zcD6I+4|&{YL?b(I%s)+^w^@Pgz~H(CNzl`a))SsP!jbI_(%%2!M+W9)Tn<>Gm5gjT z-gzF#(R4)OJ|#$zXNUl}FD zBh^mYJhLMuW|}#b~?qL zb*d4;;<=|_@QJ%3+14ez#(huuBKrD7#^kOD4SJEfI#IGvhp2TpiE~dC|Cc=a%R7*N z9vrz3lKohDR2hmlAY3kblNdC6Lw7L;_%$BsKTK1V=1j*$zV;uL30$JbAo_MQG}(PY>imnCG2v4G z7(Z_?m%cu97tPSU(IO$jVXh-jj6^u({!F6wx+;QU>d$QdN=-l4j%C&zLhWsZ*&;jW zOVmRKM#EPba0KVvG37f!kEo7;2?&NQt!T7?4Qf+9Fa-OZ$JglXi1+w| z)pW_M`A9yd9sh1YeW@HnIR6}io(H!&WQllXS*%62@S8l69M+_W@K2r%0OhR9BK+TZ zFy;FePDJ-nd#KsW#YY`|LaJE_=}mOOzy|S`)FAwUUt{s0N5P1ugSHc;sJDmyg0+KN zdvHQydn#yK>xlGE{`x>U?FCf7J3yI}pKw9stLdiQ(7dr3zKm!@@@Eb`DUz|y z&qT<#@inzcO*l^)tDi+B%=jk4ACzk_Klg=4Pk%QJ#irLiWpcx)BE&a~Jq~`VsTSGD zsPjq5r%S@;nCcOx5NkM#9cYRF2Fw2{&#jjf!T(nU)(up@4pznsoRNc<*BFphd)A+ zI*@Jse05qJ9OGmTPt5?-rKw#!CqKa$r~SH|foZ>2PU?Y=BAKkrVp(M_!o7OVwRdDzf)iXS zS0^|X(j7be$P~xYeUToy7e@clKjtZxAU%?k8!^iPS~UJ`snNyTcT3_~(tD84bqjk@ z&hSpm^F%SR_re?Qi$$*xj<26DFM9i*dlC%nV0t#ggSt2QSgG~t)%e;K*KzxD;rwd$ ziNjEwyIdqw@X*`%++5+@+VIK?GH!Jt>z!RDr>CTkmb>Ff=$95F-bU7AMe;B_Bzz4} zKX!h)g+mqUAQ-0Jb(RiD?>S5FjVwU=A50jFa;9zW?IMJ;*(!}bo;noa)J)L=j%(+j zdIsk2Bq?1CGMbQ1VpvWBhiNB;vbq zjVWB<7*7ns=I^t?_AT9n=tzq{qY8&$aAt=GwarSG9+_5)dnj6?*mWpA@kf94+4}<3 zj~xE`4?kJtY{2*5(t#$aTMX%0= z4JpHJ;XTaacqn%4Ay?F2f9JuJ6-uJ;j(MNBi5e4mFa2e)>e3+8C*Ip<;L9IniuiW+ zD4esI>VVp?`M1g^u?Bd-wf8`m!)eT~PZj1`0;Dtd@Q zy7g6X8{JJ*Z;>C8|K&^#k?;2|6~2%2q$L-crS~G7SI;-%nT63JT^ZWHCyjUhxG}zt zwCIrmvOc%i<2OA=d|SHv;oPD*BEAPcT)_RNXRsOEU#1CE#VuFbEZu{$Ogw~rtX~2Y zw`3qZPi)j5HY>Q{hOYgRW|5DNEE2UvZ3~6G8VB}li+pbbU$Nsn{&en`OwKh z1tj*RBRezo`!;uDYo6Ys5{{C{M^^)Jk4&lnoN zrw5ZCki6bET=VHvyx93>Har!LY`)If6!*$1Lo^2APwEKQTJm#Kp?5pc$)%cx(x5f|>~ zF>TrBMfRM4fx&kbFkr@nNXgLgS6Wb z3sK)Y@^~F?>S2X!_n|2UuBJPModa+|ARd6Yf+*Knv>Zb|5F?qRR!3q^5y_|y<6 zt*Xc?tBrxzw>rbl1}pX%DNV#{vn-3PpY#i8g&m;J%^O8$A4)=T|FKvZ#oGJVV+gh)uJtUF1_=Jsmo$R0_?BfvQO^Z4)}8gD4HM|B0}hTjjh#qAyak$uiO8-V=hVL<7cCDKDxK9O!4mQK07dISzH7zdW+Bw>Zi6sWl) zYzViqWW?*h{$Ze5tq3=KbDq-Iv!aQfPL{4(8?sB8r!v%-X-cg*_#R%HHCT2o+)5Q=^Xmt zXyKf((ujbWi>Khcvism-AjzHg?FaSLX%||WBQn(o$%d(zx&(2ApbS%RIdkOaP9d+0Or(-r#VkEKlp%2kB zS-HCsd+32zwy!Wngpc1W#$S%v&E1w4L*iSe;+9*km&;yp=WXkJ1jckXq1XuA-H&g) z=E{9KQJXR(!r(m<2P)@Q8p0nnN0W@r7zKSb<)LZfX3ST6Bl+V?PibO+2gca^YAO6< zO#XND!+&J{ztaM{Glx;hGU7mUkps0QA{fg~&LB;A!sqFSi^EXtLR<-S&(a1O{SU}d zb>XP*IDOwk9cfSp{_ZX?_w7wmO8v(jd&B5A7Q07+~RFq8-nl?oTHK7uBlj1#3WzbC&!U`xLF#>=JR|x?|J_? zim)cIqw!1e$Qvv0Eg5r=9=!YnY=-A4o@%dfjYwgx;6J<#ZejVuJb0E?QtaM?Rd`LC zILPXjF4y=Xj19$cZq(ODKGYEF$-GC_PqCzey*!(*!g$%5HG$M9-HxA#or0}hWkQvn zdqM6n*R^i2xQNEvyl?-kH8OhtC;gwdz@@bmoqe$mSbj+Y=RSR=6obP-!H5nNv$vSGB~jxQzVIU55we>Di{oQ~r0q-G-TbsC4sZY=``SZC;yt^ol72Hn|E+u;O@}^qirb!|p zuUi5iSgX)w*lhItGPe#x`jB451m|Z1Fs)fnFP1b%vdMhXCL(TW5}pSfh=z6jKsw?C zZntI}qHFirkcgW&jx)T>1pw@Y$w>E7tL8@P>pz; zpZSbw^R#db*NUyCp@RyX?wO&FZJ#*4cuD$Y|nO!V#qB z&r2E{*|eR+xs@aEB*A}aPc6DZ#eIH5!KEPt6Dj$vG6*i=%VglNK$=*qHW&Q3@mIhj?IbX6X{k--;txy}VtdgtITX_M$Z2^m?`R znC)ZX$sRSrai0$^&JylJ)ODv)x`*OnFYW=>m0!ZQ1`VU82jOU(aW_|o1*SUonHE>aM_A0pcw&fERCipyP)NEdiTQZ)y6(Jy=5kw3!Hy7B9G z0kJ0d47y&ih(kP9|B4l?sVb*t9pP$h&!W2CcoOdW7Gie|cA)3Mv)LS25NQkxHk#8h zQ?p^~1t;!qeFYR(&P{uPRcIig+1XBuwF0_ognsFoQ3>a>uNa`X#g_@==fB4y|Dp2V zVS&p>?ov@Z=VJF;eX*!44;!EQgBXPyp#HgjnD9Q?Sgns^d;Qp#-4|dI>Tzh_d1_%b zelkKCxEZX4L1wb+;7?_;1MDxbY0Y=d6%tdP7nQXxJkDxy1 z&*cq$A&GrfXePgVyhUpUrPtH2*pgM?o@8gans^Mg?}i(U3V4C~@p~s&j^g*f!yf;qY1I9YAY>y<$yr`uc+6HsZfN69Fch1N z#i4&>y}%XQ{ox>Gey5`@E5xIKbXu z3(=g@hWzvX>TWX8F@(CVxCejMb`Y-hU&C6vZ8ov8{vmEEet=?ZfaNCQs#go}xx_ip zmNNo;`MDR@XmCdT*fvfBmR)tl$o0uovv~lRU?dC6otp5UFK(gs*DbTa<>RmMd10$? zr?l~43;l!o`0yN_lzjs*v{x79BbiIa4}jdUjzm2arxz*;-*fA*)B^9Hy##*eO`(PH zbkL(-2S1y6A-t3I#dyjz6XJ-5aP84@e-gH;+8y66D+5|fOlcKGXPSL9i1@CWNSG&V zM`IGZ&6C(LRT4f-@dYzabi?)D0G>}UNBm!Pw!nJ%N+7pKgUkJ)Fj z`WyCO%nw=eZpM84qQhzS*aKs%%$hP0zegHzU>Vj9Y0o|Yt00gPtfwAGQiEX=rI4?? zZWbfIT7Ftgl&j`}nYI$Nw{ivI8~QU09Drv*T+Vv%*5w7RW|Dpan>B9PK+6!g@M)@@Z-&DxXpAWe6V0BvCjN9F~>Fr@v>4FO^iBI4pk*3z!{iB zPpZ2Pr#E&X{28hRFfp9MtE1y-mlu4X>n+@eykqT-^!Tw$_}<9BdrbXD{{L9uKNk4^ zhXs0lATh!U0@wQs@ZK#tv`>d4{WV7Tex9de9~yUWjPoJ(Elnc&lD5E*Z+d8)yx2aS z<|qXKsf90K12+KEjZdS$y-h~ry|d#ma6Lz#hD;ndMjYx+_eBXgD9?`Vt z0&n8QFu{L0B;Cy%=hTPpPpfuaCGrl%6WfxfP&JuZ)CZ$$@EWLw&D-Y@j2B-W@j`NV z?zsgfh^-(t%io1vU%F6T<3nZIrLY7Pvc|wNumnH;q6_Z1_zcYxz9c)~2Yqb`?-{~< zoQtNHuz7~gSlyx%m|V;f-lyB{w1nw$!h|v+79BN0ddT=Z1_rS=s0q>w!M;~^RMWFK z2<6TqUb_$AQ2TBj_?BT0>481Oy`_^7j?&oU=>GAoPmS<>F&ozq{8zey;c|e}*G#sl z#NxKV0^z@N{Dhv>zIk4!jHEQ!pSITFKCXGlMupKsL4;#0d+7YbyeGO#Kz>U*?$#!Y z=*Ip~FFvRpEckC6;dd>sJYQ0>C3@7kiF{0K$u-ss!UBJf2bJ&V%*5r_PDXq9iC;q4 zCgUH1Jc%B>z~7Rd5p|pQCBzuXp}A!ixxKxC`j{aGmrPD0CDVDx?<=G}_GdqQ(srod908$em+G{wpq4vukq z;pk(hZDge65&ick#lc9&S{T1xlkg2RAQr7?h5P*|$hvkL(Kd~DLU77g*AhFf&IH>G z@4%^U=1A5tM&{JB$*gOvHSmo6n^tL7OJQO##C$o-xuoP?jAi9 zRwjn}YqRY}6jwyUe(LRPO*|kd48DlGh~i4z?;Y;y5zEz@U(E~MJQ64?9K}8TCD3!z z_cIA>O-B;My1Ya9MIQ~}hCSj`)QfcdqTd+ysH^wz9H%SzIN6n$)^>a3bFa>MRK$%o zFtaljw^%w2-k4CtOMkNk(FTu_wZ0M2e0^;{(A%ET*5cYS!yvM-1;3M{H*mvluwh+;nwD&DOTz&x=KsyuU zRV~u&j4Y@bUXS?Jk8dKk93M?>YfwV=;8JhE)aeTB4dQWlnhObCy=~x(4sUA9j})S= zQn=UC`(3cR`RN<`o4Y5eId2W!aV#7v?$bhYRBTX#!}46AqSZ1w<$4Smp0Bul-#KEihw58l-whvtvRcmA^B9`+tfZGCxxd*IM@w1(qVoyYc(y^KY#6ZRKg zOgLWfHihym6uzg3AB&_89PlP34mOsBhb>0$K)js3u5b zem!yZCGN4xFnnc{ zyo1EUDsN7YuLA1B3lE0!vqSSBc{Ga?^3{!)EiO+LhR!2KmKtzIuCG8mlxPlNm99># zd+kqmvp4hIPX2<;_K%P~V;(5bDfd%A?~JAVmeB|4ySs}p&KF6}k7`SV``w}Xe@y=X zvjf5Izzvx7`XTJ*F+toT=9$>L8->UY1?g32+%(jDhds({rlu6Bfxa^=RL7G(i0vFd z3QYF&fR$S;uc{tGP!kmZ7n8S@|n$94SL>o|1+yuiQ$W-dI2?7ac}z6W4AaA6$*ZOmKG|Yr+JO zmsvuoN**vudsc{?xXqlF>i<=$n!=G1vSPf7TFmF0RhBy+n#C;prt z47)50=y#pMwXKfMuWX*dg-dngl<7oeZEEL$GF)nxhT{2k|9IT~Vl>%5R~p6DTZ093 z!?jPC$9YL~9##K14eHtaEKIf`t&E9pCXI}bU?t{B;-PC};FA3rux@8f8J#c*$@$E$ z9n;;inBDwh8ePq5BAtxH(0eQ%r7V;`l9~J-$4}b7$Ya&>*$rvUba)W1@+!6mV z7lr!dZu0V$U!aQcL|1oO$yy$W2~MTyN<|ydH%%fnjQHn8$%gERD^f zUz_Da%1Ss-yi#o__>&P6+_ch>?k=(hw|mCHk(#GLeRnIOA0zmm42#nmgvsXv@Y8J- zn0-X>UqZcRU|57Ze9}BqF#j_L=e|Co0t&Zbb)4O3Ph?ZsP=rhPS)*&2k3;B-vxWQE zLdy!yd#O_9EUwQdsOnI9-22{=t2;FbvqzWV415zuTs{~~+H{R2#leXKXLXPc^vWH8 z!F~Cv0asM~fFGDAk2BX6jya&l-k6Hmje*4~{?PYg5MQQF_^sj>d#wu3Cr_~WAGfip z5Lrz1-bR}P%hvP8WoT0D$KH6vw|;!}oNj!H_*1Ul2n(#>q7#U2wFdnggx@a*mfStRlO>-m& z&dODJ2=-In2wwK8?@0fQkZFjvB<~R}u2TWI_r{}sdBE2i+qUo?k~?i=0aoYh&2M)X zKL1qykgAXxbDFnArhqG-)WV)*EPMycAW2yyi|Xz(-0(GD(e-@$eBNf)V(#>?GGxbg z&2;n*{Q3H~sC|vfR@*yAB~ZT*Y9Z*e3$9z0M4!esX$J9X`ra7=)+5wD=Yb(+L_I@& z+j;6&p6`6_|La>IO(!0Dc4KH2|B%O)&5cBSJ}mHL8O9mIo&rncD~E#%;Pjs#FAee> zaxMz5>l34<8mz~cPkB>5bL%cjns`GVQzFQdOP=6S8zZUqDH=qL-4LY5wr4}pJwAVf za1C@?iy56}@<%-37OrQHSkct4SC9YCw7Tp83OXZlo*K|lu4WfMkc-;Bq~cOD^@s`=5KGY)f11^d@m zJ04=Gr8Y#6V>V=PiuZ`4xO%qaB3^P=mtH^l5UTf?ln31QPsC!{j)T6nEc$-vA^sHY z$w>E$IoTFYjX_p(V#839}mN`Z{6_qcsr># zN}K&QsREaH7mf2K#DG)I4VbZv96s&cExco{1;Vo&Xhr?{W6L8lSmzq`{<-j+s#|F% zsP&hmNuR>~yyiJ;v5Zx+^tJJZh_A-uQW&OtkedIi5aAB;{&&xR1-s&Om?{aMY$L;V zePtiNbrVS-Z{)`WAL!Mv19$q6j_h!1?gljWSXj^~PFKri;qi}!>l%Z$ zICnmnjIl4ow`ZS)-X6u=HEyy{%GnC^y1d8VFXZDaZH(I$(Fv}9n2P*yzoie2Q3k!4 zRCwHVywfcNXJ|F;-hfxp>f~*)4tD>y;kb)$Gn{O55%KkTybAPs@yYQe;&}W94_n=P ztD$&t1?4{4m70G1C+l)P&DNPC&yD&utq7lZlL{-}#fu#v@wA_rG(#I(EBvO#B=EjECMhR7+nO89;@zEl7O(IeiA|M}fiV)JO70dUaFeEY;Ww&eK>y~Q zVD2&<6cf0fF_QaB#|yHjxgFaaV~*(E^p9puuzrc;e%tU$woQr^hZeX>zVRSMbUJ+~Lx)IiM(Yh1Dve-*h#G>*%wp;eXc%F-&XK)%w?kf3Cr_s~Oj zdLr05r%e71{HRrig(tgAzLO>4)Qa<(vU#v;@r$GbD+o-##VQKA;li+7V+vczR< z$R!nO`)MKm@I2vnC)dZmL-hJ5J|nGhOUU33rUCyTw)9smaNlb@dydk5>`~B3s&tD1 zulMr=>WGaZ=6S~SOy0z3&@LwY&h6G4;X4fz6tywcwENtP-oo`xhMwW=B*Z5@->Cf8 z&b{nw8;7GfTihN4k8L_c6)q5dH{~0bPpvOBA*cIEB0a{Xdg0^Fo5LjeI%=hzF}6$l z7<{xkA6E-FiSSo1vT9vUAx2jQ6#Gx2kaxwJ^KiHs$a| z{7ceWa`$5iZnyV6xah`A)X(==QE05k!7fDa9kj)~$JhPQ*S`J;r`p_BVv~1=uz&Vh zaX+?eSf{UkSXN-L6G&xcAv?@YiDflBS%>65@hlF}Qru%rjeK*9lsY^F#X6FA<|7nW zAGUFLqhyrvcqdZ?8@ad@-srnenx2odN_}a=Q29n^PAcJ?;msLF0yh*$tT73Q?J9XHsBK3Q@9J6*R6> zgQnxAS=UdGh3O7rc=O&xoa4uxK;j8scKNQgpw_qyGVry1RtWz*cN$p5vZOL zygRd9K?!?Ss}5!l)uh|EIq;?TTt@cX5_6dU&Ow@*7^8q?Dx77L?UJ|w=Zp2B;Wyb0 zx-)I|N?fG6@Cjt4*-1^yk{ubl|L-8e)+Ae!ku6$n2^LIK9zd8uN;jK?e1UeeO$o_z-HZorFX#GOS z{ongH&@>TD>|4%yU|NG>eAeypapw75?K*$d_&TRL!0u<^W1>ebej*gfko4C^i{DbI_x zIq*PuE{f+f0`V?dahP{J?>6PSDjZ#74=LWp8cCbByC({{e&=oDq}lM}3lksT6)!FsMgKlP2+_wg&{v4x*mO1nL|02IFJ%++eo;2~29a z1Ym{PVuy+*;ih8+-#G|UMtdXbAMra^ObW9RysLL@KGMIe#0J;5l*AkSwD2#t4Om5w zuYqTU{eZ!#**SsuYT=BDS6hs694>C#n|Fnx%^P`zeJ)gWn1oTg?<=-tiaIxUF`u$9 zX~svpHsR59Au-aR71`nYvOOpk^V4Ue>(E0dxW!>ENFIhhldM+GBAN~-fvguR$ml~~ zu;%%T@J(?Q&_8%Nkrcm(D%@XEYQMk9>hgX=gjbLtJV#+tu73GEF+IBazVQ9E<*SzC z-vU=~gYqq~Xjgfjv&|6t`g`FVs4Om>Ua-c8#rc_G^M#o5M?46n`1kysosmWLhmU04 zi5gPAf+fMb)W^e=v^&{KRj$yr%?%^?t{_Hpt){8HPy@$@bXjZc~ehbWm&}?DLwYSky160=9x8gp#H_c)=Oz2o5)Bv zB0d*#CXw6b9<@okI1cGGNRP>L%AWEXRo0iMl=dOM8=JndjLuSIS{shyyvt5-KHTmp zxp608gxPMY8#tOWT`orh#vS|Hk@uU^#`p%5_ z(x_#^eZ)b&6GLv0xeu=bS}Towb+@8)=Fe@|Nr!`&kzjxQv{x#UIappB+rJ?J*(S0t z2FX1nu?ov`YsEGQHf9EC^)0-C=A{Y`R&&30H^Cp{DiO}ME_J>~%zCb&%jVJ$l@TWQ z%#2aJS*-#ZPs8WSkx`FRvGxbuh+p=VPIUfE{LvFg?qDm-is9km=76r5a_A#Zk&T(_ zJBn|)U*}c>he8J)bIty-2y2a4PCXbJ%+f1ggZOkFf#v<%8c{js#|oitEo}Dx!`^#_ zMbUJNqD09CBuGX;iIRtz?yBk;vVma0goptXq9~Y91jz^}B8aG%K?DgRl4lSB#e^b? z0YOkvP(U$aL@rZ(m{-4ZzWeO++#h%E{p|iR-BY#lT2)=Sh22VV8Xxb^>+#b=W$6}6 zxt7}TSl+tKE*?MMa(yI@qasTO-jHMq?{vdOOiRmqQN_{u`JkzF12?;-nCvStd!1E0 zDzp*?Eq#P}xt$t~dYa=wqW3fGJGUY>&umN{PftUf4t5@$LC*nR1~4rBqd(@A{(%EfiB$9 zpaeW09V<0ySOdo|7lu7o!$BtNB{_In8uP5Y#=>$7H9J>mD;%nr_Sp#k9}sHh9=kmk z>aP%mfi9nTP}h!Ud|DXuT3Hy&+c>F&74i59j=MUQ8^E(~Tv^7QJH$0tZbj#=K%h{6 zhr8ug94OtlkW3&C^9G9Vz|~y3A2nLR9s4cF>m!beq~em~V-9TUBMT9*^;k9@Ca&2v=UtewZs-RF7>FwCY*8 z_>Xnm_)~Mp+eI!QeE8d0zv6RYn$=R=A6)S2EQ>E|@{kd>OR|0uZ{ewQT<`GH`B$UC z(n{U_DsWJ*iyN%VfYw4M!G*fJ6+bsP!h)<0%qP^t7M#?0hMx=P3u8TmWaqOkKc6A6 zNlHuwOJ&|J{Qp3P6n9{`RF&5ItC(+L)U&FfLlImv&J>o@#ix9d#XK{Bpj3y2XYl7xF4X%l}7Dz9g2Z3QDp}IL9+=&&%e$ZTg z82e@aOmpJ97>9Q>WCHfDj{6HDV{sICfLe*7ydE-x8_%n(r_ZGPX)D6(sM=dGBxguw zt}dx?c}Rc+XJPzyO zwUIspn%!g1oh(l8OBnIs7@-n!N4q8K`#U$T!QfDN-DV4*w^$T*?bd;h7Z7magNYWR zppu`O>OoXQ)!;Ims{IdiaD!{uG2^KkaTW=*F>HGxi~eR zlbMCluA|Oy)y(}>+mD2!tumUpzUy4GlvsQy2+O-+CDs|a)*fwuY8(gXvIagt`?SoBCL|pmc1~#`vT)JYa`UCtv zd9%EiJYwxf9AroXqRA1A%{s&TV6VY*V~@q{#5?C2@VM@quk?C=Lo$Pv_4_Ykz9V{= z7rKDK!}?%a+-dGuuMl$U0&O@zYN6laG34)qt1S6&FULYKcYkIs|JmyheeTZK29pvI zkt1Yayb`Vx4+fnQTdwyN$CX6$tI7!nGQsI=dM-TR#v&-;n^(!x^khUXeaD>8Hxo>* z6lJB1mjWRzYl*A-Oe(1_E`Sr2!u=604T2Y{gC%3;f@=|G*dHG@t;BS9$#Rn;0sR>=}4PThppryj-r zDEsYzV?M{(1UMcN;cfqDi0#rG=?QWYl0e^H2{P;bIH;hyt%?!467!M>KU4MT_Z4zm z@o942zFGfm>RrXcaa>-lEYIY)MaAkh?@HC)>zAv>hjRDK_`;p&9aCYyMS-_kX)1W^ zset2ZrR+OwyW>koVVlMO{KQ+c|L9+Fwckk|=`a02&fgQsOX(?>5Kj<6_j2}DWL7D1 zBYk2C{fKoHo(tumk+wX>%Vyldaa7xtMViHRaLX#VJicEeBh2CAoNQ9GR0>WqU&Vbs z=M8KLrq{r+bUTsojvE!MMr&N}%y|B_Qg2ENOX_DW_$BPl%2po7T`rd_##JaZCoS!J%QpV<;dZmM{hr?h)!c?LjS9>(kFqQ5mTUG6yHXygn+ z-Yo%qye;Rx5}S(Mxhh76xh1hmHtY1yRY{A{d!Bq;lB!yz449_Ep2Wk20cBllfAiRL z4^=&Ao5R(ZBgu@HoKpJu$4>4c`yOI~RtWdwxY)|TBTi_bH4w+u!OC4}4por<$5kywwbA|0i_WY(ccPdb3s!b7~4Z9Vcrw%Mr{8_ zJu0|v*p0ey|0+o53fHvt*k5{dPLwC5^PM^U(<7m zhKg5U(%C9(3*##%@ZF=}6`A)$mUX)%5Bq$2md|KQH4Z z&$d^Hd#z{)+jWoEc$`jKQb?#$Qxuouk^lTVqtT=+a|XTUV8*LcxXp0k_wK*&{)Fd0 zKR88?b?V86msMEU;vLrNs*Rmj`A*_^HWT-h>wZUCRoWQnC%ru(5AFuk`+(ux}n zrTxYC($~{4##5NbKDFF*zQ}>nMkDdEy{d_oD(gO%t(zNzZNGQU55xQN!q{e={`&;| z@q9&@^5WAw1@iHE@-H&9t$6j)yJhD}G%#Oo`$4Yb+-|0-{#k7d@ZaR;%%~+WxW11# z%#en*q3IQCu9cH6Jx40vnH~q9cKjskif)4Tgx%0=>keFBd8swA_^JC4A||z!+Y( z*-XMP^guafyQ4BwwU4_l^>KyBpfzbMdXg-kAXQm?%t{7f^|Bk=nDq(#%T*ht(>b~V%D53}6oI4DJ!(+K2Vd0Q1vKu_v zzLLcn z#=ys_X5OI0Ny2^mN}?>bnt4n1Fr__y!KDlRdoLN3q*PTUX;XK4=c1I=GMBik603MV zC#v2Wk79R^d0)-fBd=jP)~D|LO*a4km_@499+T;DLH>XKHND%kdgz!E`|{vbl+5+4 z(j5w>tc>ETg*INSsvXk3lsKrx+v9{T$!_VuWiH449JYz`H+7zLxoCC7HW|zdR-{$k zTBuj8<$DVS#>!XkauTclaKIeL1(H7i@O*P&CV6-Xs-vsAl?<6}ls1PZDy zP?cL|Z@T%z1M0`5SjsVSA*Q+7KosjIwF;vA7bZp>8!EJVcIpxthNKo1 zJKQheQBNvu9lX1j*eXYjWmGTGVz2VgN6QA-RR8XHvT0p8)weB)Qofsw9>tp4_EZK@ zlgpM;HL0&`ELEMT?j&ne7dg@HTU#PWcEKf-GkFp4^b2N-j2?@1?aNn&+BK=@i%bE^ zy>!BE#@!yu^yGQ!_t|@}D>H-fP)`)>y4}Qq(=Jo@d#%`wHi3*Cjw`9TbF%Hyq?+O6 zqSM4H`!zt>iDMsDRt!~opHkD47jVw)UJuJngD6I91PWeP?7&j3qO#g;9lqT6wiRAP zGR#9X*oC(F=%WXR(j*c{;#WD<5VD{0-kgJ;%bDB0Q3|0BC@iCTi8z}s5eI7b4+dJ1 zIngd#Igt~Vc?mW9EduYPL)p!n7iq*O+^NBy^D__qu;ow_+TuxR zi3&4ypuB4Sw?BIciX5xwx@Il87MA&qFtG5BFCZh6573X5rFL> z?4f$P%^YxA31)6>02h_m@YrM#+f?79D5Zf1le8a#q9++vJKM8~_d;rH9W8IP&H5(# zF?y7Bne+i@vTBsAMO`yE`Kp%~dVX0Ab_-8N9SE?9v#ua?1*TzRNB zP2T=%FG8wUj@zZzo@AHD_FCQDIR_b8eFB?_G+0}CmE_v5K|%Mzhv%DOzzYz@o>+Yb zmhL|U>wlUu(AQ*m=8h|{^xVlg_i=y{ySfv8s8=A%O>z*Uo<2M6ve08<@#7_Pe!_ft^0Pex?~^`#R9kt|OHFZHchsjl)WI z5*vkVM#Cny!sxY>QRx5`dxZ^_p5Dnm<*LBmJlwB1yzQOsmEQ*JJsf3rT#Yp|d6W?Q zXz2hdwQsT8+QzYUtPP_$P9eaxRgdGnpI%DzlaNVWgk6FCWvZ_yg4+4? z06ZSOnGt{W0XZO4z$tDxMoqY*!2bTyo}seLmfA8l!7guAHe9NBjF`(?3)Jn@?L`Js z;jA+ylyAQ&XXXkAc%N{iWDVz{2BB03zpLrgdt*%pWW%!EMrtyAB8Dh!>qNxMSEShe zF=XzTqf}DbB&t8?5ll%LYn$liMj3Py6ld8wo9NAI)P(or(Q-=MPEF5`(|YJAD(_xR z9)4lZmb3eU-gPov=D^bu&fEKg zl&pt4J5774jq@3Qu%DE%-}|5$+Ni9zd87LrguIHe@9X;lyBD-mEu${53;g?F(I;U_ zZ;lf57nO5-IDIRn^k%oi-IEVF>koakG}+ZnUiSz9K(^IuBU^ z&ud}XG#B*sp0nN0loQnYPv4N%@EV4dZ7tT)KGTN3ou$W#EU~4MZsbsbtM^;;ni%N& zi}`jfZXu96b`>j_tqFAJ-LSL%xgDmtvZ(QXo7hR^Ht^SvYp63+4JHULaA;sorf$eR zv~PZOh|_#zv!%^DUFym4cDT>g9ceE9O+5TskB%t5K_^IAq&a&ZN5AekdM|$!DLOo2 zbZFGTnc;5mE9Z`_d#wgXC15tHx=~KDzR#r;l3lSs)Q>C#JCthRC=-G z)A=VloEieBCAM1UNK7Ghnf6rO&vVqVreoHfRi;Smz!JM#7q-K)aqCzEPc4A! zuDf71%L(sl#4(DM~%-sl8KdI%o0P<(AegU20%U zJFM)Oj&?N*lP}RVw6x_lq7tQ%FpKCq2=ufr+R zorCU{m5|9c^Qgwjv>wtw=7NYlStxJMB=l(KF}u0b-%}~4v#5LH>S4^m?W|D&!eIDt zVosaJIqK(VO}2;r9M*-ob10YZr|furO0a8vBavxv7R)jq?OvHMaTus@8? z=)zL(+0;T{O!W_3vhy7s%U*x{FxxCS3XQSfZBzTE282Y;vxVj&Y~}ikY?(k{vwA?4 z9W$!RF3N8|>Z(;E`^HMc^dIZ&O$i6Y+pNiU7!=4_%fxYz6 zY=?6bzS>$pe8@QRq>=sHZXWeKua`2fHvrxXS!~VyE7?}u-4x6%vCa2kvn4hcQ%_%p zGk=|yV=sFB3H>aeZg(}~1E=$g9F@RTgThOh920AL{pdvLH?Sk=05#s^JhklV3Hy8Z zd)N~jGuY2P9w3{;DK-kDMPP)>JzKerm)Un(tvTtE8*PLatz{qd&bHsv(Tu*|J55Tx zSq(48a2(#amLMUwcJ`M=^KGX+T#pRSY-fwH!m0aV#f}%YR>Q7qF16EaKsHec zS{(hddy3bOn*-&w$4Rss_fK6 z`^s;LwyVZhQy0`1!Ti=>PR#Ha6TiLo*jpK0*xLwLN#h`Q(?){%WgPCeN*!K=+h2Sb z{x$b(HSP!R_IXTJoUg>s{PfROXUMO6rV}$)S7ZNG)ui1ZqTYnW^1ZbcOzamvj`HQPxczQuI|aGB zbMW)LMi(&eK^msThxyklWOoOZ4yI9?zUZ<(WT(P+dZRGx&+vW2=P6YRXa}k%nhmu= zoVRmm8@MxHh8*f1N9Bg!L{5Wcr0ddhETi6xgMz+4pI82^K#Zfdok`U#puY#iPoFis zN@eQsc?Ln!udtjGj+6;_J*=nKL^`=MfQOkA&S#Y?qout&|E(T#WC%9r_9mow^(UjZ zZZEoW(HXp0+B3+v~ug`2MICC#LC33rhv#EB;*c-+MF zM!N-H&XLR8)&<9i%Clld$!4`w{D19P<-h<)XC*q+Iz61Yz`!ehD#y}q#`{w{j|L0=$iw&_#| zlqbR&8|eL0S!?MzGCrR6=Ihv&kIy(kyT%qAuc7uL#0i3)>m8x}=Us2T4N@9D`dovX0_gKg=xb$lB9 zE1WovW8~306N)*N9vkMT?+su=eGN4<^t1+-Bu<`5fVOfj9Cb-&3& z7WY`3X)CA!sV8VzyB8(-gnkcnRMP8UM)=5AEW>hInA@;xA_|N~(ye{GQB;5hRo8S4 z*Sn*p&~+_8|BA9H#`#*f47qk^;^&=PhQNCjgr7%f{COYlUa%imby8=Ve8KhKqtFWZ z8Z7H{xv?m+_K`r3n=W2piG&WO^Waw%oN?0ybPCr~o3<~ZuIw9fcCA8@}yKS6VnOLivw|u z7l7XuQ;X`tA=9u0Db{yY`vvhmLYsd_hkS7PIGS|aG^XK+pe%1+E6T`!ZfZH2GYgkv z;;z4-ZXCh?X`f8QjyZa9Fx{h)R9UuACuj(^W8aIkD&dJNOQ(%sKGy6vE#eROpC z*hzoF&hY$=X&UZNv+9lxo%qX)17i~=!G{fU==Q2<*w$(158`q=g4glk8&0oYo`Ist za)GWg4o1+{WG`GENWU9RK6MLhCXR;Njl-9nlQ(qKpvO_~&KSdNpL0jx&k_0~_c3mt zpzkwjDAglFR7Tzs` zpe06a@t=d^?(LOb;J0_$zl|$9^?dfh>z)|)MLZMTc6f|!;UTt;yz@~-P(Jh%bxjTx zt7AH;#XUgi>{lZ5=ZVKEMCc z9|Pe_TXDX``=;Y6 zX-tOPcTBhOa;(*!@74l6Y^&l8=6$8hskkr;%ad_coHc)ZD|7V44=mxnAwlf_$>W-l zjt2j~4CT&R-AV{xwv>A@r|xAlWm?(TM|XYh{%>s#{lt%kiU}Dwe`xS9lPLc1zrl>~ za+Z2;Jvis6c}DIl8@<{(vj|0L47*Keyyd5-;(|D+Xb7=d_tq85Pc(R#w-rj5E6kn+ z^`cWjXCi|P?TW_bb%gH7UHJ#S=I#BQDzGw35syv;E_-uLey#SXu8rGXgeufZOC~SQ~sBy7bJ%c?V1B{>z9SW|>h~&Re-&sC@QJ zL0s8={|R1>k$}b0wm3gwQ8vcs& zE&KIR)0zn4`q)y!dZ#m{ku&8Ex!@MPHjxi+{W_6Zd?yCywOd590+o)lzKc4-jM@qC zRiYbd?RN{yaZTY7ZV!y`@Ux}U?ZwT}r061nJ&hJ!1Y{EnTJ_(?<#9Ge@1No04UL+J z{ZTq$BRKxG9rFxYWk?u@&cx3nwEw(c>r+SX<2})lx_0x}l;H!*bLqX^GOufxuh;+6 zN9%5TZM5q?3)7ioCPzG&tjio#KZ{xwSAsq)Vo?kH>Ar!NExpfsgonXLdY`tnp(cBa zv%5f#RY?GeY@JBWUtNLgm;<7>us(deF)H-CJ+H$a-F63sUX3IRz zkUSMSmdk&;l5^H(SY#fLf;)YpK>Mg<>w^*W-m~k|u896g|LN07mkp@qP0K`}Uu-4TWB!_8f&Ow)4@UE0_IuQWf;o4wJSoK#5xZRC-|7*Xei!=Xy29a$>gP`gWCBhGWJ&a1 zoEPGmN2qWfO$puP3o0xdz^kc}Ftkn-!+u!qEU1(CeAd5l#_6;3W56i60YRQ?yBXLu z&YWE7MPiv(3GWv0D!%v(>nr~4GBfm1JmwkWElWQCcw7MUrw;t*`zNH~EaNcp`n$=j z=a<-o=ecbdR$?HQ===81_=ca%QgY8F1x&M0lfk;W_%;#f{R~XM>j@YoH$mddPZ%#v z$VgywKK)n9k1@{iwo6cWc=(&2#=jVwUz1b6=K_Y73685d*EBF3KksbJJpBCYcPV+u zWCGT+ZD&18*!iLWh7b4W^}vw}^ZeJqb=?bz6FXLuDfvzq_SLR$q<+*sf&TMyXWI0I zT*Y}U3*!k3-dom#7YZotXbSY5QVf4~(DNdDPSSg{MtBTJAH#Bf_EVx%hR<~zNq?8d zfqupP(D`{Pu7k{b)Umw${PVNvbLM92slp(&n;8GSqbNAO-W)%V(D?Hnc0`sEOZtek zVIDK;^+T|1@kdNAn|E~h?2Ui=QC$0CmMU*DrZY=U3c%)e)_O4mYJZmuTI&T+OXVb- zcWLf>fvkK!>Me>`P6grb)bUsJzIT55>f5bw?KBZ;lWZ}rcWVxO6WBU{Y{N2at5874 zc0^(PZe|kL)7|@T^^n}J#Wpm}qO9^0h@q+iDDr+fhOJ@sgG_H-fsLN{%ag42r8rN% zz7C{$%q7kCIKXccY=P7JTA(xFg5}V8#1O;|U*6=q^g5eqU;t+LiVE_c=oFDw87gqh z&1y{3-D;wM*MSWwm=QX z_rtKK>*kT6PwDdm`0({Hk>s7S>o_k?vY419ahqj)Nx^KF!vXyn@-CX*ZBeFw(j9rG z%JY=@&rbu}_4~4NHAd3;cP=?!&~Ch97$bN`j=%)$k~9r5J}Kx6kEH**`;|0F++P}N zu~^|xnCOMkfAO_{eO|zq54ZHE9r8S_fP$4{;m3G-A41afcEMO1AEvDJG}b-dF%T_Y z_Rn`OAGOO8!qWp`(ZLSvj|*Su@ligGcKJ`7R+ljYwtdLQKGeBBb$A`DhM>OV!~Jk&|Lgnf<&3LH%lwVN=CI5bEKbrxkGVp)d{}g4V%hn!jaq*a z>)x@_876mD;PhLb?&McJNde5CI`E%s?d7Pn`=y9?(2hkEl>ooh^f>kD@K$1?x}G4O zO+;!yBhLWqVK0$NZdtp4NLe3-Hh0fLOXfLHN1W(2z!u_bunZ%7ekIZMSnmAAl&!=r zfnC%;uYv3r?nwJAU7wZunPGkScxH1h;j*1_^CM(<(Cxj?GTVt4YybUPI^h#3Xu9G! zC}mm)o;@f7$v?!g&fCw$!!>j1c?dr3`rqnkp0x$elZ|yJPr9E4dr6Xz@=GJ0-?S!- zJ2P?rqy50U$$a>cD|FBi`=_bNmb{T_Ef_O3A>tVqgZ!D7gO#w}g;(h@*AYDaUE}2! zv&SpxeW05=%UIP5%>R#l96oH*O?^UaCy%*2J&+-BA=PZLV*~bm+Zi>R!{a0b_T$5L zJM>_g;%1%4?dn`FGiqOW3EH6(geG@S#5!hqME})pUte zeL~~5_Mbdtdg-x+r14xb>~5N1taZvqUFNDBaq|649_BG{J_g4UA9rIi-Sfl)44y~ z=co6-EYv@05nk6$J~`n-U3#iVUDy`^w8EwcU`J^4?>kq}`xQpp_#?|{|G@Yso@A;0 zUI@j@Ww1ZaEjh#)!IKH2_l9l!uo!NcR)=F^-PS$CntSwjPDkMWyzjVs(eygdv?eS= zz?+n>%=3@vceYJ|GyLAyBZ#Y1s|0Gn0DVs6!M##8x8WdMPrigg2NuJx8M|Rs4!y5K zeyNTChtDTKm7d4hx~3a-*>4i$EfgLLzwEAntJnKtKV&VI75F|asR6^GoF1^$n?4^% zC7MfW1&RIJxcYJb2@0FdMG2=8nA=vI08XtXm|jx-as?4!^}l}!SAO$p24_3V7mt4!~6 zu~u9o&|`37G}fbPz7Zi=I0dI~s*-|xX6p-J{`3X^x$vPZYUY&!*}7-syU}srnfO!8 ztAKEWz5)NVOWs+OkaBJ}F&zbl1F>D{0XV+q9kP~!C@M(|z1XXUZ52E_N?>z7{o?21 z*xnB02g>zSj396Eas~A8&O0Q#Hyy{7;qGw)8NcY?$Mwlu_!x2(f-t_~8zHdT?%%hs zc65HDF1U|k=U6wHvwtmxqTA^Gf&*($k}u5V{_$gP$CR+&^!K3(FD(U{j*`RyrTJDe zle|niPABMBZL9fzZ9k-ZP5UcER_Af4x8XHsD{^%X;wKMa_;m zQ?^o~f_V%&_wQexfwZ)|NTP*}^D1eFO=ARO!9TS(2;PH8_n!H(LbbnQ#-K12BwJkr zIV2l44c)`AVc{_X96pzP>GjwLqtu##!L{pxyp0zRk|IHeNmXxS30=pQi&GN2?LPYCePL^#d68vF5D5?7DoiE0*Kb-Ez`i-&TJ=B$)M$+r)VmYCq;MSMO}$~GwJa9nNGeXYQP9a0;Qy;GW0N>A?ZFyI3Yiki|N;!Pi>po)^3Pnl8KGs3~Wi z$p4y$*-E!FM)+7&7~=R(I=hhbX50cnoN7(Uqc}S>*@FQMIN!U&n=^v*{Eahy&c8p7 zDtD>G`iW_#!3EU{7+=(xxzqCB?lPvf z$*;n6COL0FFV~MkoN^KB>uv|CXQwP%=Rqu%Q9d|BP+s|b#wMu^ss7 z--{tw%Y|{kYvnhvnspYZpHHXjXMWycB=ba@_D8VqXPUkU8zdwV%4K8k)<1-!mY zrtMuuYWJ#=#g79?Td}LeidQT_8;~!{$aN-jG>+-H!|PGx+Zcj+LP6M&SZS5ZYAKV& zJieLC6~unRL3*A&?7RT3{ z3|rbt5-tOM0>1K3qb)xdxnNs69=gPAF%e0HwUK6E{5-ntb0+PbKzBZ#-XOj2d~%F8*)qCSV9(OHB_O(J0x?dm8_OA? z^G`gcN@n0TXJxFtjjb*{|J#4SnHW%@$NKnm|Me5@lXGf1K%kX$hu# zanl;6+VjWwnU8bvpfGcl41HGLzT!iyq66Z8^k1OUbx@87>3x9x z@cPK)zx*-vqY}2ovU^=%W$kZ4-b*h(qI&dYvNNOw`^YvWSde#P_*-FoJA{-}k)8+W zvl!}9RavY-de7Vc$woPG$4J#jRV*qd(r7L>g%EY7=f91GBniLdT>_gcDE>5Uu(HE4 zt=K-6P_n(nbTYJH7rpnPsw~ynzpV^$Oy5#Ifn^xsh5D>G_6$l#OWAhFn2i8Qql&&nbvvIv+G^;P;jsFn-oFw(hq#a7t4)!isfcjU)Qby0VA?;jx&YH1t1?oLA z9yTTKL&<@wkg3;f82EbyZP&*NsC-Nito_JBy}tHTt4ch1o4ek^N{>F9J<{ems$2Y& z+UxTMm=}(Nl;;nt_4|9#j)d3Lr~*~X=4}SJp0cU`1)jGlAue|iM*X;hWm~wY-by(@ zo#8#n76oipBCDlmQ|rZC==jr_4IYa=Mj{Hf7n8MhH4cPHlgv85MDm*MuHkjG-WIcjnsFVS>#77h zzaIw9ENR#!BtfTL-3X$_Eoa>wa3hQLZV_V@a=`= z+ez~M@V*n_Nf*J(3qGXr!igmJsx`bJZiQ{7bKxXVZPSLUmuitBC*OnbENy~1TZHM& zUCROwk3~aO^Fu&-jw#{GEg@}rVXWvbDNNt_WG+zYHm4p%C4q49AJAjoK{&_F1wGZD zMd<(~09qGlpkw2QtT(f|!D!vZ9^@tr2BOq-S6RwA_+3m zsDrp_c^Rz_D}cHC#^AW(%u_=(1&d%ujyUx?> z+={M>T`_EQrrW8dW6qNynUWy;o-8N}q~DF>Obo$<4U5Spa}8_sBs2KE`3o)& zyKkQ*m4o9z*Of3_U!`n~22q3Jtn-~h#Kv9e#DO_#VD@+x%nVe5gXN=e84xx{P%FZL zOy|u59E0(|dC;G+M3`PLzoYshdF|OCF<*}W`+9c5o9D`i=H2Z!Cs*#r^;O}4QcUAN zr-lFTq)IKhLUsDhgw2nO2(p$(w)}XABz%0?cLQcvtz|N?o_^FZ7|InwleThDa?w=$ zjtw@x0)0^p9O#Wh0lkf+OSU-W?nG*_(O|*L77nQmpsAro_D}6H+7e0_$qYdqOqU75jPNz7MQcb%NDs zybj}MKg(s!9)FtnI5Uv7z2XdW#)4$>+2&cKU56cE9PkOlm{>t#LdnGeD}2G)%5l$Mutw-ff^`zl@Y(Kg0j0+dl%GHdW+?%X-j_TL{PY4$l{v z$fD0^4>D~k$1vL0FTx%3+Tn%;w}^td*|6n_1z6j>7MC5>Oi?)X=4zNY+-_uO$H9=A z1Tc57(QK~4G>q%=+=SX)X~=$b*?_t=Ck+kU%z_c(r%~!+dW`F42fh9iW}HArnm59Y zmlsgGO;%#vmduDlU3(vZJIj(0W9RbWbJ>%SjNKf}cj@Gv==>2es_zCp9=7M;S!$XL z1G@H9qmcXoq;^{gjoB6nw=3(veh8l z>MYE<$0m2^WCD3s62`wR;Rr;gd)qZxHn;%(CawK3vX^uJFci|9PYS zKQ5VTpfr2##9Q#ZMGqW|-)p6q^cq!M8{VrtK1b9?GyvN-V?GyN`=*Jk*BVlOf%KX& z*-<)#{=5Wh4U-7e*%1uJdb&`m+vxgSJmoA9w;D&?6Y<4%N{DAtHunIT{HEVJJ?N0t z8VF0ZnO1!RX(;KR0Bg%kU|HS`&%!>&uBR8f}*EygZm+ zuFVCXGHuNtFQUhqrXUw0)Q!n}8+_D8^W_J;KIKU#k9a-jJlQ8Yo!o)+$kNJtgg>c= z>xD$tYVy~bF+k?yGwk;Pr(!Z7d^AvYCx9YH9rT|2Zj=5siMYCF8@XC(Ebf=ZGYW{D z$SI(R{LSj=>?IUg#$<^8a*S`9qR1LFeaGC>eU>PA*JFP7ZH`S%Qx`a$6N&kGk_G>5 z`caBstSS8^2bs;Q-V97`9CPIJ{qGN_N~PNzJ6Yq_w{z z{MCOFO?}=2M4UWuT~gpkLX*Djq*q2ilwWTLzC1htBv((s_}})20ggDy%u_s0PIZhx zi#sC-@M{X`J&m4s+oV1UxX25!ood2C+9wZiKKu&#Q)oODka>hXa8JXk;e0ISVUfEH zuJn>a1{8sc??+?WY5uKn_}qWAX1Y05IG6z97fzvm^b6tl>*881sGVVn&W@qyTB>W! zk?PdhzFkg?>f%?*-Aab~K+g%>^E&hZ$;>RFlrzDLDR+%=nzhy<15#y2HEFaInn;|5KCy-{Z2VV9xF3YO^5}7M|D!(8{6!#Kv{e=* z21KK(hxdT7!DC(5uk?2>9?sSMZxdJlvFQ6BsQ#_#9O5-pUMegRE-dmkAs^2T*sMEw?&wec!!Up<8iUD0Y& zkT1jDb=D8}&t$Bkq5s+W)I1Yq;^2T>x&jl9YX66mox^h{PRz@EqXld6sB~Xgo}Oa12#{(_|lQRfE?D>`lxh z+4%h-TBJZ(Hnvemecg#-iBsf;@D-qGl?-LEcpck$$wb5X`G)xY5u~^YPOF`W9w@(q z-qtagFE#TjJQymD&eoTsf_pM#+*B3HZ8_ckjJn)F24-8LvUBvh%P0qNbn4gxW@pnA z!u7oq3BGU%6D)Y)in!{N%e(M9^w^>x>f(uGz#=~zFmrE_ZR*0Nc7ZWuq#u2@;f`4% zSl{cLev$6sRp7>~sX#}Z-s{qzFA1&;&tvpmnZYbmHUzcuzQgAPzQz9g7&pQ4-J@gh zs#^-?^FHMiT%K@t_{($C2q$Z8<{hEEU>aAEHM=5>{LyQP`vJ$rD8e(d6sEpGWbeE? zAje0WQP`b@+o|`qi$eP`fv~ReJ30H164PkPS)03Z^2XCQ+v76W#KTSmVe+6>mO3+zhZT*RZ>6p&JwsvTzndJ&Rnsl&U56q>(QrS(!nb2`yrn@5u(At5VZYiPQK?<@m z=>1xgqDw*g$tSQ*A&6L~8wq6A2NUhKY^-hG2jhCs|{7R zuzWJBASEsmO@+O^0OidX@K=Z|%uk(x+(qcQ@7+J>`C9d+`*3>KO;99GAoW7}dyRKS zDWDaHe4yO$*)+3E7d+-WzyLl0FBp1zaZj z<-Y;fITtW~V*CIoHZ&ry7bOyHzqvLa#%uz5oJ-{N(C@_cKKh#}oL!y-)uRi&y4Dj> zH%vfCNw-yQ3jJ-bIBGsPdv!TjEUQI!*71n24Kl>@#sGu7J6ue^$Y%^3E!zth7)XM} zdk%w7B~O6f3L&`AUIrBu$XNd#H4evLOL#VrE6gKC-&q57jy%D*>H5*&hjTaK=_Lf; zPMOHE9#csAmR-R*Hl!A^rf^P>3oOrJeBO%X@J!20B5mGNVn}j7fHKV_=#e8vuUAEK zFV5mvydf(DZDVR!TjFJjiSxYR`1adm#CUpKRaT?{ST;`uQ<5rRZtMU^9{q?ITUE`l zn!~{KL%l+9IU4cJ|J?uox4>_YSCB9sUK4R(FL6fO+Ty^bW*dpG)==$QxRux3n|RHz zi{C!5I^3dAb4b+`!x|G)SK5#8Xh1zeZ zgzeTEIuXPD{~s0q-zAtX8VoF5bJoWDI3&C9I|%iNvDiABUI*>8sD&7~ zvzWXke~`Q*L9dmtG^3WatmEg z*Ig!pB8^ydbaTFtuqe9%43N?x&^uFw474UK_8WiPp`QG5%Rk5BGbc$8` zHIj_CSO=$Eyl-VbX)|s=&$_Xnne*j7v+?^}DE}&jU>d37^I598LcEa%MfaA)i62JrYJq?V;4((k7FQ;(M?ht8R(FhjCAU^^G0ypcLKaF~8Xd?%j3+ zHkSLK%WHYEV3ay~wTRv?zQbGzBvAfPY8AbwEQ`#ClV2o|JI$iNxv{ap_!fY9@|x%> zTLSe))BDk(M=pG(pAT}U3c<7QR>L&kDlo~p2$vm;hB|QkVF!2Hmh6Bc*j+WdV4){R``xR15j0QOFo< zWPtf)?^)**l1ZcGa^UB@V6&m&vxo*K3uFCzZ_mK>tK7`3WX^OiFkr9=ml<1U*D14d z3(Tn;Asg$DlSzl@^T6tYG>+>_5APsG%_OpWswSD5qRrrKe@l+rUueS|(?@6rT_C@4 zACX658X51^CIhKh7D#Ik1mCaiVFk~l&)LhD_ryH9hSyQ^9Xs}}sECbIuwuu8mEUI8aBxEI^Sj^u zbHB|WGs(=pH}8Glym`CXd263`uCeRciL1%yk5*z@Q?kRYCFfpmY*3z8w*@4fwCW`J zK5_8}AvrArpWA7|@4&dZ5(aaN@i=$I9E9A*uEf0?P2DP%jZ&#zlZtL??gO25a>!Nl zRR!}iG{9H-S;w8j)yNOG&%r(~uELY6og53b7dT01?=@eJ@tB`wi}kWmX(lz4ju|Cw z(j)cJ3*@j(2L?@#fh&*4z&;{F>dA{Q&~Gk4DbBCJCd*7Raj6;XQdf@WY3?2YKHsTm zK3TYxf*DhM@%L2~y6Ax2DCi^71ckY;Agk+K%8z88?Qy)FFSdM?hZb8f*Q{3_FB2IV z)*!XF@knu$0kzHAm0G2xM=dZjruM8eKzbgEqQVI^)Nksa@H~Gvekta0Z%Y_nL%j~> zh#zjuY%|YUs|PraZf8QH?4y~yvqAuE>LzBq0B2G|-oX zVAiXHut~)iV>-6$mXB8949er%8l#LQ9p4A(Uxxwru2rbeCv*&ez#d0qRm3ijSZTM=cX5ea! zogwlSX$5)#I>%ib-qJDrS4;P?qtKj?H0b633=|D8f}eiqqc?j?pwjR~V0TzDSwAQV z3G5Q6GVV#derRoC_P-Udk78YF_RB}QIm|jH)j^d?Bo+2*K2)d~j|RFN;@{kFLmd@s zqZL0a(5eG2(0Je?hce%EsE383ha~WR83G)%oF(R<5R5T<&)l$7w^YHi++j3 zsp8*IkgJHA5J}>5vM(oz`<&YfTuqk4nLVBp`)|HP+^qrN=(Z-vGLQ!cK9C@4n!Z3` zPles}pfzyE`@_PNyIG=bSLCrArtd}A?>)$~!}CQ$e}Y5x872>?RF2fOYaF~strO~u zdkTZUL-2m8KQh+{6FeHN#@D`d1C{EQ!#<0?p;^An^Iz+hGXHN6JADW~A8Z36(wV$3 zg=qzXKsQr7?j_ELps#8ju_|c=*5AQOJJC2&jB<2zu*`x`OE@4&hp(F21iF@yurN&# zMqbv1ChOh6DLpO}o_YhHWhe=|SlVJa-Zn97p4C+*M@pKlD)tnq>9^>Kr{wA`wIw;J3!>s2^BAi9XUK^ph8$H|bmX6`S zTE>4q0(u-B(zWmC-(jiiA*3~6A4K9*IB}#ZWCwi!W3y_}x$EY{>Lp{aT`iwdfOYlS zT7>acH<<*jZ{KfYR~p_NDxfj~j{L0v?YlL<=ekF;(Hu2Dc-1_aTEH~{p9+VV{@(i{ z+{{~p&wDY3$+xoZ(|NG*`EWEt?;y@8s~MBSyIje_`o31SoDk9b3ii=^RV2C|9irGgj#j<>quW-zI6X3eAicr6;0|MO@P_l8R;OhA(@GYSM zmb$#N8!}`%I(beWk1;UI50{hYd;@mX{RDmMm|U?EdY0xVF`uu`8U)#vWx`t`Chyd} z2_GrT^~Ug>&3NEk#O#*IH$RJkVeM^O!JRqIlXS22F%h?0e zu6c5l&e14f$+{;z<#Q5FoXq5b?&%ePd21Hu6W1gC;Wt($rtP(-7A_PLsQkD*{PFNT zQg12{om;vFx4AyicT6(k2m^I43kwI2k?*`I7k=MZ4?OFu$Y&=MgxBOxkZ-y3gnMlK zK*6RA5Mr+bwu%pSKTR=u-|QmZNOJ&7}iZ{h6=RsQ3sjt%`iSGT{3KI zA}X0JGvq6D@1}wZ z^XlMkmsCCnSEGTvMNSf3kDGZF+tm#o6XUWcCyBn$`AH>h(&PKZLn0Hy z*N~kaie7f>%8$|JQ7TVEsa%1j_!6CK`mvIg@WYE#czZ9iHteY`!DHjrM(YU9FZ1vo_ccS6h1$AsvXwP)8;i8m!sS<#Ndi^ z_&2E>3x*Yt=L?sRUwWv4&Hjt|hxyjPeWxAxWFCUj-WkH&BR9Foyo>OZeJsW!TCNb& z%6a*MwAl2K?CrT8|88n@fGpXQhiQ)(xPY{CTZ$$uV{&5-O(+y8mll$Vs?$jmDyI#9 z={Ww2Wp&?9)V3QgLhS|piCqaMmiq%Xk=JWx^A}z03~kOVx7WMWOt0${+%S~c|D7Jp zJo7%hipeeV`bLPuSHpAIE~N5bkq<(F1v_AYmj-Z(*0ycVn@E%e?}gr@^uZ6_0g|_V zr2q;yaKArYjP*W)&JQU$caCxb$TMF8KGv(??`d+OL~6!uhk@VoZ4AQ#__|}AQO`5B z*oL>;)gkZv9{kbQQ*hrQ#zHC~asaTfg1~e`7EJE$3)04S0;49523}Wrf_tz8=pGqO z#ux3!e%Ig)g?Wc@wXmK2aepsznXHLvN#*cq%%o1$yTD=JF9OG>3+y)Us6~S|SHT5E z2rU`S1q16igl(`2_@lHR_7!_W-eWzCaqhueG2sc|9c1#4dc5vm?^fI=VNWFDf5gVYFAGKs%VTW z=x4qSb#ZAzd)zNjyCbI|*Xsqmidi)dJ)D{UM~s@795)uPk_ZTPBf~ojF}-u$ufa=W zzd9`ImO*@7Y9)*=Zx)@>;9$OwcQuMf_C4Y7q3j-U$eYP?FV*9Jxja|88d_g;71#_5 z5S}qe5_C&{LnKX)B|f|#j(GW{Hq<^G2`hLR+Z5oy;@_5DE^E#@%TfAVYg>ciHT@L5h zDH2WcwQyMIJ0haq-{H*eOMOR9$|Y)gB=gL(xTMkDX+-=&VXyj%ui()}4xS%x)ZgRl zj)fUaZm&3h$|^g#?R~go>yLpn6=isL#1DH3i)VknW ziODu&9Xzl0bZ4H6{_fQY{3zRN|B^Dowky%ek#AKv)>2V)C02bd5gM%8h38cBBQbHu za~g53g30Andto|K_58%&y1^OdC4MB$RyV=4<4*8snj=5o`Izu#zZ_EOxD&V^%f)iM zoiiEdjZ)(=`ETX(Iyq>H{>-T;;q9W`iPTpa0rO|C2RYAwINU0H2EQiE0q1&Fz^%!Z z#QwE6dgq24lJ@U^XU1gIh~-hfZb`WAuLEypCSqObWz150S8^Bgdw!!_NOf9|g1E+b z?%dp>E;=r!$sbX)hUnj{Za3_mGCKKgyxHRw0Yv-|<-UZXDKRZVo>=tbkg&7dnywE$ zPT3w*aI>~3X7VKIm5;}CRawm5i>Te@J&9Y)zA=dmlH+Jf1OG|0vwR(M%C)o|jO zbs!rJf(b+#SsLb#pJ%t)T`lPO@&T?}bS+}!*dHZqj0|qGrad=bgz=ysgC(52E|b%@ zRAb*}pfD7P94>3?z3Y$H(C01#kXjcm+F_bX)^_u@ZoZ@^>^F2bJi0g!oPRJE*45ue znl63BF_x#DBx7t!eS-NsSN6ktIeV##IBPqrjlWWj&lkm9>kk(lpK{XWrs5_<0tHIxk>h`;f>fIf`y&iDm@#fxQCNVa@Ce zxPj$~F5KgC75mtr=u`J0`L>));IKfyC&`#+KU?O0;tO&mIjR2&;z-tQOs{f!0etj) zJ2G392`2_4>gJ(+$c5Vt`vC4IwqxfRbPf|gD?E-FI_}g$zZ1Nmg^K`xNr`Zu3l}a= zoP&T>1T>191FbG@pb`Sj#188pIZ4L2FOK2e_+d7tcWJ4OsF%PM*Cp+eqgG#$dZM@+ zE&S~)8eTsIM%+cBdE{+y=t2gvT44*TOevd*nR#$?>=vxcu3YBbm~o@s!5P+i*c?@k zZKc*kL12(f=UG{}uIDASEo4Ah6?MAq3&!frNs(i6b~Eg=khw>Zdh&PZ7wlo@aP%Iw zmz+5X{FSx($kKEkNX{M(n=`$r0;idx?#G#Taz<<`#ysR-Gx>EpyEaglx+J&3Lu=f6 z_^x3HJRbTMUZBo_gUfT^Hx*yu^CQlvVe|*G|Ci~#7Cxfy^XWNYJnr`cSe|XA!-zAJ zmw_$m)us}Ce5iF6RGqfOZJ%ZhCV%M1P(F>_upBp+3>M!{>H{D79vAi~o`>g|!wr+z2)m&VgH2d_kSN6yfz_ zyzW_SSA+eJVO}0H`vT3^f95Kd$dc@L627`$L1v9u0>_zF5eK7t!PG^Ez~;;2QA49P ze7rt^cVp)?a`Ew*SdOpHn7mu@n+Jj~s&`+)-cmiPJCnVb)YJDi5wlUm$2#FovhftiLd0h7%qC+AKngp3NniB0Hl-#%MbSk zj)(TZMN!p6zelIB9BZ>Z@H}!EWWlUqAy>ddO(iUo6c6hzKs2J$D#&@(4fiR7LFi@S zM(Wb^yVUlW3$WK8qaDg;F6BGgnd5d&swu|f*x0E=vAZw2+%OW$XD>es2Gxaw6ekTR zt}j77uUr;QRTAO0UavF7DLuHL?v)ww=FtIS1y32&PR`|vwseE{_iupNrV8Nep+qu5 z+a0ZY`GIt)PDEZy(?MqW1uREF4YS84RB1Y<7kn*=nEH&#?<19C#r|B;*$?)JBX=IX zO;xh(eSaq^w?v}pn{q^Rw|;?}KRh*F>*Fj`Kahvz2%dQymv^gs6LU=Wpyv1z{GFef z4L7VTC%gOh;wo+_2V_o!IR4XJ+~&W+(@{)4B}`8(B!*8M2ksa|L(}`ag*Ls9V=O0r zGXaCyY2cRAd=L~90p`WdhbciTVCrWkfBd9L$MAn)3T^>dhh1xnq2dy9Cp?wWAq^Mm-AkYvkX(8uc?{!e3~kjY_JyVJ;F^nh-J z*W#CWET%q!UQ1UmBo`#ASia94PWC_V47DqhupI7g=8laj)x<|(IM*S0Hd(s$0i5EH zCIn$Zc+8pv&CavnrB!Ok9Cn5Ge_SKDv+B_xXD{^NkcpFIobnO#@%Ve~Q^I(hZ8(D5 zFEQ^jkjn9}YKG|CElosd1M10yox+CsH>mFWDyg^~CDim=0vNt4h<_n59j&%z_M{#x zwZ#7SgYrl?_b8;w-ZF7#KgAkQ@pKu~5v358cUPfe)0ZNRWz4k>e;CX0%egI}-!mUL z*L2+f8^2pLcO9yoe-S7Vr-*=P`oFUS6$0J5B;eqe2OoyAgm&7)kn$J`4idOxJi>~Y zJdlRQ%v{VeOBB6ZvIS!;#p4)zz37H#4J_Qh0~N_7Se**Ur1JZxQ%e_YN2)7=!KJ{l z#JPk(m|AR!&kHYR{)^vRy@OP%Hi!E}KXbGAKY_pJyo3(}??A-|SJ0rR*&=~uBesL8 z)33#XF{_BV(ac^OtBEV%d@B#&MaaY5*S7M@To!_;jpL!)=!?X?@%HfivL~?n^D&~e zzms_V`1XW}!wwwM!?tk1*$EDK%5ZJN%B6qZsa5i;8l{w#Fx8n`) z!Zr?6xrPMZH|Idz9i>=~ZcRm)mSL4G?5^O0F4QvbgZa2Og%s+~1Yb33q&oeF--H-v-qErHp| z&mbuM2i&>09{Ve!*tvLqq_63M$1s@42Bmw=+xXp;A#OkTM?E(5R}hxgq9^4G7!&a)n39{1B<6J>k4ffq+T z?9a_x2VHFQL_71DcfgIz9wHtyUj+1D9|p(n^b)GRuA;^-*+Auy&tPExgS=J0_jS-x zbBC!vjEFJccY&%8i9}}SqvD(2!twvkcMsHK9&@rtJa+5HyTp-@$@eS8qj&EZaa8mH zfo=I^81*>>E?9Y(8n4krXk{Kjb>TNrmE1}A)l->z!difJ;clUU%Yf)w@Z;c3VuQFZ z{@$o?+y3q5g(6{C46N)zh#G$QqK)$(;Fwg{_q3zD%LZ!kFanQf=#$6Dk-Q;j?p;r~ zXf3x5DRv~Q)|G-2ODcF47RLaUNeM1<%|z=SGw&WlE48psyjt8H`(I;F3sWnZd=yeS z7CS#7H1yV5z0uze4!rdyH6oPITzzf6O1d_<=ynwfhW4}?b>Jr2pmZ0HVU6V%jE5!5 z0}d4);`cS9@LIcj)g9}EoMtT3Cb5v`#N0P3sxrjw(^7Y~*ixg9kDgQp zNx86QZ(r3+CfE5N-J1EIZt=Og={)PJrOdl|qno?iAoh@lQ6H$)k zlJ=97;hbFj%vHCIIhgM@ZAC$W#%$tU>SO~+yV`^#WIU)q7(aR*zFs|oO(w)3y*EP=h!-*n&j!pADE!W55pLxLvG+o)AMzmMIlXAY^I znfG0UEt_f6nM~~^p&4@LBfp6<7nXhY!g56K9*la%{@~ZA4gY_$c1YwL^dOxYdty8c zF*byWS#QC+QeF7omwpqqCjn>HvyfURA==%;#PP_KX-<;VMdr*2I`sn#PTT($Y5cYq>JgX8C zJp`Zst;HHy5yCK=jh#!y8DOwPS`_4Rmu z%oxhVR6AceP=y9eUIs=AIXNgMsWo1yAY_;pESt1lGNo{B@R#(#X6{mM|kx4cwcR3%#}eKxXkLu*{AZ zSmM=}vcRCGc|=Cf<-%!udONe1(eI$Xver@eY?|Zj34uaarVk8T0CyqUmP&BFRy~Btvv`xPkb4%u1JYycshl?O^XxVC%Ew zIogpSGeTp7r$xkt2Tu!)2n&y!V#8&t(=DpFh5n+?QfRlEJ>5+~+RdKsrr2&b9^Fk* z+KoqdQ);)H1KmwY+RcIPrrd5fKHW`O+KtcFV5xA_CQXiuh>DmQ8q3yWsdBo;#fC&g zhm45~4UP|qjgVBPunkx&j!tZ7*wje+r?sjp(IIhDW9i=EY&NSCM}_VX9U94Iu{1bJV6nvlTTXg^<)q(=lR*n7!;Ux^bALmLI*+Z!vf(I?3mqFWgRRA~Q3yLQ{^{A5B+i%JKRkbcLoIuRn&a(3Io#$I=y= za=iXHxG(90*(9{UJplOkG zK~n;3xqpq)4*8DfzZT1mRyuZdQK50M5o4#&euT?Wm44~Yvga5v?d^LB84kpV#pCEj z(+;IQ$HQhha8xkiUp$Q*JAgBktvS@$cYw2thgoR{h`*bkU0W(_e~#}jl-UeriMul7w@X*jB#Wvh4O(l=<=B7y1!K^G zC)8r`f5kx18Ux|qVbGx~HDVF6Fd$oD(8lME-~{}lCrzxUV0&2@NE>BoYbeM67upQE zH0=&iV47snmFS$FYm%8q&oz5`2L1IHj6w&igcb|@iUMqn0{S}?I$UOqSd=UjM6FP0 zvmVJnfhP+EX`?J{$v}bEF$zqREV>e%(>_ju0`23ZD75|sqtL+$s>Krjih^Tn6rBDJ zg$|csBbKu)6kJ-N&}OZcfr5i96r_!^v?T)thmKKTnq<+Hpg^xJ5)|mQMT$b}UoZ+C zL>F2t*I!ZS*BS-4zeAzJ@WhDaE(?YJtx#wa$H+i|FAD`}qbzO7K!M*e3QUtMx)K!V zHC=)Ny{1c1X#ERDp@Yavi}l;DC=6(g!oa^np~KM4h&4zS3LdRcXcObPa-4th-8jNC z?9+0!VJC_BWT~Y;$L$v)KZ8RfqZDL(nWaZeZv;}!e3`vgunA2b68LLu|Sd}t;8HpoIB__gDmPDA6 zj{mz4pAN>oILdL8;zA%M!L-f_NnD6U0rj2udcQ7o#q3iMl%fRib!K+%F<9vCdDwVi#rT+iqOQ1fzDg z-ah^VJO_+$^9}a%@bNM{)O+)C>IBuQHDP4a%G~?f5vk( zqp}r_kRF@ C__C`2 diff --git a/acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/variables.index b/acropole/models/Dense_Acropole_FuelFlow_Scaling/variables/variables.index deleted file mode 100644 index 0c9b256bdc9f54be895f2d58ae856009697910e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2488 zcmZQzVB=tvV&Y(AkP(P?_HcFf4)FK%3vqPvagFzP@^W%v@&V1m@capv=UL^FUc=S%ps&>3S0++iEvJ0Wol7;d1gsQe0geS zdPYgHu7Q41W@0gZQ&@zUIE)k?2x**PG-bC6s*yGo@ec^`^!1E#4T=x;@ek3@FDS{( z&8$i-($6Kvs6W%0KxV~$(h4+@5h)`^%a1uMAT1j$TFgZiMSuaAmrB6z96(p|fLyNe zK*%&VD`S?dsRX&shMT1@2N<3}^DfS`bTyNaAmDU_wi#V4AZ^pu`6vl13L6p~=sS`? zzOLloyO`oYzw#U$=-q2dtB4Ks3va-Iethx9NurA4#0I(%IJvA4(U{<8sER*<%qby_UI(#M3zkY`l*(E_S&R?SREk~S44x9kMf z9*hc8fCV6n={?<#OHE{i2^5fLXD-Q-f>Pf1NqtR$qP2i|PplIPDX0aomIS|*&pmdPJr zQsFS&IrGaJE)D*i)Wo8^%)IpYqQsI^d^$mGnh9X5GEavZF#y2^W(J03>CfzZ<$$O5JY*03!{g1^@s6 diff --git a/acropole/models/__init__.py b/acropole/models/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/acropole/models/acropole.keras b/acropole/models/acropole.keras new file mode 100644 index 0000000000000000000000000000000000000000..843a15ae32cb5bf52ace5c13564b53baa36cccd2 GIT binary patch literal 130389 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 literal 0 HcmV?d00001 diff --git a/acropole/predictor.py b/acropole/predictor.py deleted file mode 100755 index 3fbe72d..0000000 --- a/acropole/predictor.py +++ /dev/null @@ -1,68 +0,0 @@ -# @internal -# @author: Gabriel JARRY -# @endinternal - -import importlib - - -class Predictor: - """ - Class to use fuel flow model - """ - def __init__(self, default_model="models/Dense_Acropole_FuelFlow_Scaling", mock_tensorflow=None, - mock_pkg_resources=None, - mock_utils=None): - """ - Class initilizer that load dependant packages, and inits model cache. - :param default_model: default model name as a String - :param mock_tensorflow: mock for tensorflow package (Default is None) - :param mock_pkg_resources: mock for pkg_resources package (Default is None) - :param mock_utils: mock for acropole.utils package (Default is None) - """ - self.model_name = default_model - - self.np = importlib.import_module("numpy") - - self.fuel_max = self.np.array([1, 5000, 50, 50, 600, 50000, 800, 50000, 800, 800, 5000, 1]) - self.fuel_min = self.np.array([0, -5000, -50, -50, 0, 0, 200, 0, 200, 200, -5000, 0]) - - if mock_tensorflow is None: - self.tf = importlib.import_module("tensorflow") - else: - self.tf = mock_tensorflow - - if mock_pkg_resources is None: - self.pkg_resources = importlib.import_module("pkg_resources") - else: - self.pkg_resources = mock_pkg_resources - - if mock_utils is None: - self.utils = importlib.import_module("acropole.utils") - else: - self.utils = mock_utils - - self.cache = self.utils.compute_once(self.load_generic_model) - - def load_generic_model(self, name): - """ - Function that loads the generic model for fuel scaling: - :return: The tensorflow model - """ - try: - path = self.pkg_resources.resource_filename('acropole', name) - except FileNotFoundError: - path = name - return self.tf.saved_model.load(path) - - def predict_fuel_generic(self, model_input_values): - """ - Function that predicts the generic fuel flow from a list of input values - :param model_input_values: is the array of inputs: - :return: List of predicted generic fuel flow - """ - model = self.cache(self.model_name) - model_input_values = (model_input_values - self.fuel_min) / (self.fuel_max - self.fuel_min) - data = self.tf.constant(model_input_values, dtype=self.tf.float32) - tensorflow_result_dict = model.signatures[self.tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY](data) - key, values = tensorflow_result_dict.popitem() - return list(values.numpy().flatten()) diff --git a/acropole/trajectory.py b/acropole/trajectory.py deleted file mode 100644 index 6e18d54..0000000 --- a/acropole/trajectory.py +++ /dev/null @@ -1,207 +0,0 @@ -# @internal -# @author: Gabriel JARRY -# @endinternal - -from .columns import COLS_SMOOTH, COLS_KEEP, COLS_RESAMPLE, COLS_ACFT_PARAMS, COLS_PROCESS, \ - COLS_INPUT_FUEL, COLS_FUEL, COL_ACFT_ICAO_TYPE - -from datetime import timedelta - -import importlib - - -class Trajectory: - """ - Class that contains data pipelines for trajectory enhancement - """ - - __4SEC = 4 # s - __EARTH_RADIUS = 6371.37706 # km - __NM = 1852 # m - __KM = 1000 # m - __HOUR = 3600 # s - - __ARR = "arr" - __DERIV = "DERIV" - __SEP = "_" - __BFILL = "bfill" - __LEFT = "left" - - __ACFT_DICT_PATH = "data/acft_params.csv" - - __DEFAULT_MASS = -1.0 - - def __init__(self, sample_rate=4.0, min_duration_s=20, min_conf_ind=0.8, - mock_scipy=None, mock_pkg_resources=None, mock_predictor=None, mock_utils=None): - """ - Class initilizer that load dependant packages, and inits model cache. - :param sample_rate: Sample rate for resample methods as a Float (default 20s) - :param min_duration_s: Minimum time duration for segment cco/cdo as a Float (default 20s) - :param min_conf_ind: Minimum confidence index to compute fuel flow using Acropole Lib (Default is 0.8) - :param mock_scipy: mock for scipy package (Default is None) - :param mock_predictor: mock for predictor package (Default is None) - :param mock_utils: mock for acropole.utils package (Default is None) - """ - self.sample_rate = sample_rate - self.min_duration_s = min_duration_s - self.min_conf_ind = min_conf_ind - - self.np = importlib.import_module("numpy") - self.pd = importlib.import_module("pandas") - - if mock_scipy is None: - self.scipy = importlib.import_module("scipy") - else: - self.scipy = mock_scipy - - if mock_pkg_resources is None: - self.pkg_resources = importlib.import_module("pkg_resources") - else: - self.pkg_resources = mock_pkg_resources - - if mock_predictor is None: - self.predictor = importlib.import_module("acropole.predictor").Predictor() - else: - self.predictor = mock_predictor - - if mock_utils is None: - self.utils = importlib.import_module("acropole.utils") - else: - self.utils = mock_utils - - self.acft_dict = self.load_generic_acft_dict(self.__ACFT_DICT_PATH) - - def resample(self, df, cols_keep=COLS_KEEP, cols_resample=COLS_RESAMPLE, cols_process=COLS_PROCESS): - """ - Function that resamples trajectory. - :param df: trajectory as a Pandas Dataframe - :param cols_keep: Names of columns to keep as a List of String (default COLS_KEEP) - :param cols_resample: Names of columns to resample as a List of String (default COLS_RESAMPLE) - :param cols_process: Names of columns for process as a List of String (default COL_PROCESS) - :return: The resampled trajectory as a Pandas Dataframe - """ - col_syst_point_id, col_time, col_time_last_plot, col_flight_time, col_plot_date = cols_process - df[col_time] = self.pd.to_datetime(df[col_plot_date], infer_datetime_format=True) - df = df.sort_values(by=col_time) - df[col_time_last_plot] = df[col_time] - df[col_time].shift(1) - df[col_time_last_plot] = df[col_time_last_plot].apply(lambda dt: dt.seconds + dt.microseconds / 10e5).\ - fillna(0.0) - df[col_flight_time] = df[col_time_last_plot].cumsum() - - start = df[col_flight_time].iloc[0] - end = df[col_flight_time].iloc[-1] - r = self.np.arange(start, end, self.sample_rate) - res_df = self.pd.DataFrame() - - for col in cols_keep: - res_df[col] = [df[col].iloc[0]] * len(r) - - res_df[col_flight_time] = r - res_df[col_time_last_plot] = [0.0] + [4.0] * (len(r)-1) - res_df[col_syst_point_id] = range(1, len(res_df)+1) - res_df[col_plot_date] = df.TIME.iloc[0] + res_df[col_flight_time].apply(lambda el: timedelta(seconds=el)) - res_df[col_plot_date] = res_df[col_plot_date].apply(str) - - for col in cols_resample: - interp = self.scipy.interpolate.interp1d(df[col_flight_time], df[col]) - res_df[col] = interp(r) - - return res_df - - def smooth(self, df, cols_smooth=COLS_SMOOTH, window_width=4): - """ - Function that smooths given columns of a trajectory using moving average smoothing. - :param df: trajectory as a Pandas Dataframe - :param cols_smooth: Names of columns to smooth as a List of String (default COLS_SMOOTH) - :param window_width: window width as an Integer (default 4) - :return: The current trajectory with columns smoothed as a Pandas Dataframe - """ - for col in cols_smooth: - df.loc[:, col] = self.utils.moving_average(df[col], window_width) - return df - - def load_generic_acft_dict(self, name): - """ - Function that loads the aircracft parameters dict - :return: The aircracft parameters dict - """ - try: - path = self.pkg_resources.resource_filename('acropole', name) - except FileNotFoundError: - path = name - acft_df = self.pd.read_csv(path, sep=";") - acft_dict = {row[COL_ACFT_ICAO_TYPE]: row for key, row in acft_df.iterrows()} - return acft_dict - - def fuel_prediction(self, df, acft_dict, cols_fuel=COLS_FUEL, mass_kg=None, tas=None): - """ - Function that computes derivates and predict fuel consumption over trajectory using Acropole Librairy - :param df: trajectory as a Pandas Dataframe - :param acft_dict: Dictionary of acft parameter as a Dict : String -> Pd.Series(params) - :param cols_fuel: Names of columns for fuel process as a List of String (default COLS_FUEL) - :param mass_kg: Mass column name or None if no mass as a String - :param tas: True Air Speed column name or None if no mass as a String - :return: The current trajectory with extra fuel information as a Pandas Dataframe - """ - col_estim_fuel_flow_acrpl, col_estim_conso_kg, col_estim_fuel_flow_kgh, col_grnd_spd_kt, col_true_air_spd_kt, \ - col_mass, col_flpl_airc_type, col_engine_num, col_fuel_flow_to, col_conf_ind, col_deriv_tas_kt, \ - col_deriv_gs_kt, col_time_last_plot, col_alti_std_ft, col_oew, col_mtow = cols_fuel - acft_type = df[col_flpl_airc_type].iloc[0] - if tas: - df.loc[:, col_true_air_spd_kt] = df.loc[:, tas] - else: - df.loc[:, col_true_air_spd_kt] = df[col_grnd_spd_kt] - - for col in [col_alti_std_ft, col_grnd_spd_kt, col_true_air_spd_kt]: - df.loc[:, self.__DERIV + self.__SEP + col] = (df[col] - df[col].shift(1)). \ - fillna(method=self.__BFILL) / df[col_time_last_plot] - - if acft_type in acft_dict.keys(): - params = acft_dict[acft_type] - - for col in COLS_ACFT_PARAMS[1:]: - df.loc[:, col] = params[col] - - if mass_kg: - df.loc[:, col_mass] = (df.loc[:, mass_kg] - df[col_oew]) / (df[col_mtow] - df[col_oew]) - else: - df.loc[:, col_mass] = self.__DEFAULT_MASS - - input_values = df[COLS_INPUT_FUEL] - - if params[col_conf_ind] > self.min_conf_ind: - df.loc[:, col_estim_fuel_flow_acrpl] = self.predictor.predict_fuel_generic(input_values) - else: - df.loc[:, col_estim_fuel_flow_acrpl] = None - - df.loc[:, col_estim_fuel_flow_kgh] = (df[col_estim_fuel_flow_acrpl] * df[col_engine_num] * - df[col_fuel_flow_to] * self.__HOUR) - df.loc[:, col_estim_conso_kg] = df[col_estim_fuel_flow_kgh] * df[col_time_last_plot] / self.__HOUR - else: - for col in COLS_ACFT_PARAMS[1:]: - df.loc[:, col] = None - - df.loc[:, col_estim_fuel_flow_acrpl] = None - df.loc[:, col_estim_fuel_flow_kgh] = None - df.loc[:, col_estim_conso_kg] = None - return df - - def trajectory_process(self, df, cols_keep=COLS_KEEP, cols_resample=COLS_RESAMPLE, cols_smooth=COLS_SMOOTH, - mass_kg=None, tas=None, apply_smoothing=False): - """ - Function that preprocess trajectory Dataframe with resampling, moving average smoothing, adding distance and - fuel along trajectory. - :param df: Trajectory as a Pandas Dataframe - :param cols_keep: Names of columns to keep as a List of String (default COLS_KEEP) - :param cols_resample: Names of columns to resample as a List of String (default COLS_RESAMPLE) - :param cols_smooth: Names of columns to smooth as a List of String (default COLS_SMOOTH) - :param mass_kg: Mass column name or None if no mass as a String (default None) - :param tas: True Air Speed column name or None if no mass as a String (default None) - :param apply_smoothing: Boolean if true smoothing is applied (default False) - :return: The preprocessed trajectory as a Pandas Dataframe - """ - df = self.resample(df, cols_keep=cols_keep, cols_resample=cols_resample) - if apply_smoothing: - df = self.smooth(df, cols_smooth=cols_smooth) - df = self.fuel_prediction(df, self.acft_dict, mass_kg=mass_kg, tas=tas) - return df diff --git a/acropole/utils.py b/acropole/utils.py deleted file mode 100644 index a0a5bc2..0000000 --- a/acropole/utils.py +++ /dev/null @@ -1,45 +0,0 @@ -# @internal -# @author: Gabriel JARRY -# @endinternal - -import numpy as np - - -def moving_average(values_list, window_width): - """ - Function that smooths given values using moving average. - :param values_list: Values to smooth as a List of (float or int) - :param window_width: window width as an Integer - :return: The smoothed values as a List of (float or int) - """ - result_list = [] - for i, t in enumerate(values_list): - if i < window_width // 2 or i > len(values_list) - 1 - window_width // 2: - result_list.append(values_list[i]) - else: - sub_list = np.array([values_list[j] - for j in range(max(0, i - window_width // 2), - min(i + window_width // 2 + 1, len(values_list)))]) - result_list.append((sum(sub_list) / (len(sub_list))).tolist()) - return result_list - - -def compute_once(function_to_memoize): - """ - Return a memoïzation of a function that store the result at first apply and the use the stored value - :param function_to_memoize: is a function to memoïze - :return: he memoïzed function - """ - cache = {} - - def wrapper(param): - if param not in cache: - cache[param] = function_to_memoize(param) - return cache[param] - - return wrapper - - - - - diff --git a/pyproject.toml b/pyproject.toml index 081efe4..1fc880c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,14 +12,14 @@ packages = [{ include = "acropole", from = "." }] include = ["LICENSE"] [tool.poetry.dependencies] -python = ">=3.8, <3.12" +python = ">=3.9" scipy = ">=1.13" joblib = ">=1.4" pandas = ">=2.2" scikit-learn = ">=1.4" numpy = ">=1.26" -keras = "^2.15" -tensorflow = "^2.15" +keras = ">3.0" +tensorflow = ">=2.16" [build-system]