diff --git a/README.md b/README.md index 5947f39b2..af6647ceb 100644 --- a/README.md +++ b/README.md @@ -159,9 +159,9 @@ import pandas as pd from IPython.display import display # Load real-world data: -df_reference, df_analysis, _ = nml.load_us_census_ma_employment_data() -display(df_reference.head()) -display(df_analysis.head()) +reference_df, analysis_df, _ = nml.load_us_census_ma_employment_data() +display(reference_df.head()) +display(analysis_df.head()) # Choose a chunker or set a chunk size: chunk_size = 5000 @@ -175,8 +175,8 @@ estimator = nml.CBPE( metrics=['roc_auc'], chunk_size=chunk_size, ) -estimator = estimator.fit(df_reference) -estimated_performance = estimator.estimate(df_analysis) +estimator = estimator.fit(reference_df) +estimated_performance = estimator.estimate(analysis_df) # Show results: figure = estimated_performance.plot() @@ -192,8 +192,8 @@ univariate_calculator = nml.UnivariateDriftCalculator( chunk_size=chunk_size ) -univariate_calculator.fit(df_reference) -univariate_drift = univariate_calculator.calculate(df_analysis) +univariate_calculator.fit(reference_df) +univariate_drift = univariate_calculator.calculate(analysis_df) # Get features that drift the most with count-based ranker: alert_count_ranker = nml.AlertCountRanker() @@ -214,10 +214,10 @@ figure = univariate_drift.filter(period='analysis', column_names=['RELP','AGEP', figure.show() # Get target data, calculate, plot and compare realized performance with estimated performance: -_, _, analysis_targets = nml.load_us_census_ma_employment_data() +_, _, analysis_targets_df = nml.load_us_census_ma_employment_data() -df_analysis_with_targets = pd.concat([df_analysis, analysis_targets], axis=1) -display(df_analysis_with_targets.head()) +analysis_with_targets_df = pd.concat([analysis_df, analysis_targets_df], axis=1) +display(analysis_with_targets_df.head()) performance_calculator = nml.PerformanceCalculator( problem_type='classification_binary', @@ -227,8 +227,8 @@ performance_calculator = nml.PerformanceCalculator( metrics=['roc_auc'], chunk_size=chunk_size) -performance_calculator.fit(df_reference) -calculated_performance = performance_calculator.calculate(df_analysis_with_targets) +performance_calculator.fit(reference_df) +calculated_performance = performance_calculator.calculate(analysis_with_targets_df) figure = estimated_performance.filter(period='analysis').compare(calculated_performance).plot() figure.show() diff --git a/docs/_static/butterfly-multivariate-drift.svg b/docs/_static/butterfly-multivariate-drift.svg index 95da1c94d..a178f9ea5 100644 --- a/docs/_static/butterfly-multivariate-drift.svg +++ b/docs/_static/butterfly-multivariate-drift.svg @@ -1 +1 @@ -Jan 2020Feb 2020Mar 2020Apr 2020May 20200.811.21.41.6MetricAlertConfidence bandMultivariate Drift (PCA Reconstruction Error)TimeReconstruction ErrorReferenceAnalysis \ No newline at end of file +Jan 2020Feb 2020Mar 2020Apr 2020May 20200.811.21.41.6MetricAlertConfidence bandMultivariate Drift (PCA Reconstruction Error)TimeReconstruction ErrorReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/butterfly-scatterplot.svg b/docs/_static/butterfly-scatterplot.svg index 38073e51e..d8a465809 100644 --- a/docs/_static/butterfly-scatterplot.svg +++ b/docs/_static/butterfly-scatterplot.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:38:14.707755 + 2023-11-16T09:35:53.995514 image/svg+xml @@ -39,7 +39,7 @@ z - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -9058,12 +9058,12 @@ z - - + @@ -9105,7 +9105,7 @@ z - + @@ -9153,7 +9153,7 @@ z - + @@ -9193,7 +9193,7 @@ z - + @@ -9223,7 +9223,7 @@ z - + @@ -9259,7 +9259,7 @@ z - + @@ -9272,7 +9272,7 @@ z - + @@ -9285,7 +9285,7 @@ z - + @@ -9298,7 +9298,7 @@ z - + @@ -9467,12 +9467,12 @@ z - - + @@ -9486,7 +9486,7 @@ L -3.5 0 - + @@ -9500,7 +9500,7 @@ L -3.5 0 - + @@ -9514,7 +9514,7 @@ L -3.5 0 - + @@ -9528,7 +9528,7 @@ L -3.5 0 - + @@ -9541,7 +9541,7 @@ L -3.5 0 - + @@ -9554,7 +9554,7 @@ L -3.5 0 - + @@ -9567,7 +9567,7 @@ L -3.5 0 - + @@ -9580,7 +9580,7 @@ L -3.5 0 - + @@ -9671,7 +9671,7 @@ z - - + @@ -9696,7 +9696,7 @@ z - - + @@ -9764,7 +9764,7 @@ z - - - + + - - - + + - + - + - + - + - + - + - + - + - + @@ -10670,7 +10670,7 @@ z - - - + + - - - + + @@ -11498,63 +11498,63 @@ z - + - + - + - + - + - + - + - + - + @@ -11780,13 +11780,13 @@ z - + - + - + diff --git a/docs/_static/butterfly-univariate-drift-distributions.svg b/docs/_static/butterfly-univariate-drift-distributions.svg index c7fd91bf0..329aff0a5 100644 --- a/docs/_static/butterfly-univariate-drift-distributions.svg +++ b/docs/_static/butterfly-univariate-drift-distributions.svg @@ -1 +1 @@ -Jan 2020Feb 2020Mar 2020Apr 2020May 2020−4−2024Jan 2020Feb 2020Mar 2020Apr 2020May 2020−4−2024Jan 2020Feb 2020Mar 2020Apr 2020May 2020−0.6−0.4−0.200.20.40.6Column distributionsTimeTimeTimeValuesValuesValuesfeature1 distribution (alerts for Kolmogorov-Smirnov statistic)feature2 distribution (alerts for Kolmogorov-Smirnov statistic)feature3 distribution (alerts for Kolmogorov-Smirnov statistic) \ No newline at end of file +Jan 2020Feb 2020Mar 2020Apr 2020May 2020−4−2024Jan 2020Feb 2020Mar 2020Apr 2020May 2020−4−2024Jan 2020Feb 2020Mar 2020Apr 2020May 2020−0.6−0.4−0.200.20.40.6Column distributionsTimeTimeTimeValuesValuesValuesfeature1 distribution (alerts for Kolmogorov-Smirnov statistic)feature2 distribution (alerts for Kolmogorov-Smirnov statistic)feature3 distribution (alerts for Kolmogorov-Smirnov statistic) \ No newline at end of file diff --git a/docs/_static/example_california_latitude_longitude_scatter.svg b/docs/_static/example_california_latitude_longitude_scatter.svg index cdaaac514..dee114ea6 100644 --- a/docs/_static/example_california_latitude_longitude_scatter.svg +++ b/docs/_static/example_california_latitude_longitude_scatter.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:32:53.955373 + 2023-11-16T09:36:06.283723 image/svg+xml @@ -39,7 +39,7 @@ z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + @@ -7579,7 +7579,7 @@ z - + @@ -7625,7 +7625,7 @@ z - + @@ -7680,7 +7680,7 @@ z - + @@ -7717,7 +7717,7 @@ z - + @@ -7923,12 +7923,12 @@ z - - + @@ -7967,7 +7967,7 @@ z - + @@ -7983,7 +7983,7 @@ z - + @@ -7999,7 +7999,7 @@ z - + @@ -8015,7 +8015,7 @@ z - + @@ -8155,7 +8155,7 @@ z - + @@ -8229,7 +8229,7 @@ z - + @@ -8246,7 +8246,7 @@ z - + @@ -8263,7 +8263,7 @@ z - + @@ -8280,7 +8280,7 @@ z - + @@ -8297,7 +8297,7 @@ z - + @@ -8341,7 +8341,7 @@ z - + @@ -8358,7 +8358,7 @@ z - + @@ -8387,7 +8387,7 @@ z - + @@ -8404,7 +8404,7 @@ z - + @@ -8455,7 +8455,7 @@ z - + diff --git a/docs/_static/example_california_performance.svg b/docs/_static/example_california_performance.svg index 682436e1b..3bf4db457 100644 --- a/docs/_static/example_california_performance.svg +++ b/docs/_static/example_california_performance.svg @@ -1 +1 @@ -Jul 2021Sep 2021Nov 2021Jan 2022Mar 2022May 20220.650.70.750.80.850.90.951MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUC \ No newline at end of file +Jul 2021Sep 2021Nov 2021Jan 2022Mar 2022May 20220.650.70.750.80.850.90.951MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUC \ No newline at end of file diff --git a/docs/_static/example_california_performance_distribution.svg b/docs/_static/example_california_performance_distribution.svg index 284c8df57..5dbb007f1 100644 --- a/docs/_static/example_california_performance_distribution.svg +++ b/docs/_static/example_california_performance_distribution.svg @@ -1 +1 @@ -Jul 2021Sep 2021Nov 2021Jan 2022Mar 2022May 2022323436384042Jul 2021Sep 2021Nov 2021Jan 2022Mar 2022May 2022−124−122−120−118−116−114Column distributionsTimeTimeValuesValuesLatitude distribution (alerts for Kolmogorov-Smirnov statistic)Longitude distribution (alerts for Kolmogorov-Smirnov statistic) \ No newline at end of file +Jul 2021Sep 2021Nov 2021Jan 2022Mar 2022May 2022323436384042Jul 2021Sep 2021Nov 2021Jan 2022Mar 2022May 2022−124−122−120−118−116−114Column distributionsTimeTimeValuesValuesLatitude distribution (alerts for Kolmogorov-Smirnov statistic)Longitude distribution (alerts for Kolmogorov-Smirnov statistic) \ No newline at end of file diff --git a/docs/_static/example_california_performance_estimation_tmp.svg b/docs/_static/example_california_performance_estimation_tmp.svg index 43e702ec9..416046ad5 100644 --- a/docs/_static/example_california_performance_estimation_tmp.svg +++ b/docs/_static/example_california_performance_estimation_tmp.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:32:37.801167 + 2023-11-16T09:36:03.209920 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -133,7 +133,7 @@ z - + @@ -152,7 +152,7 @@ z - + @@ -171,7 +171,7 @@ z - + @@ -190,7 +190,7 @@ z - + @@ -209,7 +209,7 @@ z - + @@ -262,7 +262,7 @@ z - + @@ -302,7 +302,7 @@ z - + @@ -348,7 +348,7 @@ z - + @@ -399,7 +399,7 @@ z - + @@ -430,7 +430,7 @@ z - + @@ -490,7 +490,7 @@ z - + @@ -541,7 +541,7 @@ z - + @@ -560,7 +560,7 @@ z - + @@ -579,7 +579,7 @@ z - + @@ -598,7 +598,7 @@ z - + @@ -617,7 +617,7 @@ z - + @@ -636,7 +636,7 @@ z - + @@ -655,7 +655,7 @@ z - + @@ -674,7 +674,7 @@ z - + @@ -695,12 +695,12 @@ z - - + @@ -725,7 +725,7 @@ z - + @@ -741,7 +741,7 @@ z - + @@ -757,7 +757,7 @@ z - + @@ -773,7 +773,7 @@ z - + @@ -789,7 +789,7 @@ z - + @@ -942,7 +942,7 @@ L 542.54067 107.975915 L 569.239234 174.400538 L 595.937799 108.184075 L 622.636364 84.211417 -" clip-path="url(#pa6ed52ecd2)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pf0a3233bed)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pf0a3233bed)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pf0a3233bed)" style="fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #808080; stroke-width: 1.5"/> + diff --git a/docs/_static/example_green_taxi_all_udc.svg b/docs/_static/example_green_taxi_all_udc.svg index a1bbf3c08..e1baa008d 100644 --- a/docs/_static/example_green_taxi_all_udc.svg +++ b/docs/_static/example_green_taxi_all_udc.svg @@ -1 +1 @@ -Dec 112016Dec 18Dec 25Jan 120170100200300400500600700Dec 112016Dec 18Dec 25Jan 12017−50510152025Dec 112016Dec 18Dec 25Jan 12017050100150Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81DOLocationIDOther1817441427PULocationIDOther255754174166VendorID21Column distributionsTimeTimeTimeTimeTimeTimeValuesValuesValuesValuesValuesValuesfare_amount distribution (alerts for Jensen-Shannon distance)pickup_time distribution (alerts for Jensen-Shannon distance)trip_distance distribution (alerts for Jensen-Shannon distance)DOLocationID distribution (alerts for Jensen-Shannon distance)PULocationID distribution (alerts for Jensen-Shannon distance)VendorID distribution (alerts for Jensen-Shannon distance)ReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Dec 112016Dec 18Dec 25Jan 120170100200300400500600700Dec 112016Dec 18Dec 25Jan 12017−50510152025Dec 112016Dec 18Dec 25Jan 12017050100150Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81DOLocationIDOther1817441427PULocationIDOther255754174166VendorID21Column distributionsTimeTimeTimeTimeTimeTimeValuesValuesValuesValuesValuesValuesfare_amount distribution (alerts for Jensen-Shannon distance)pickup_time distribution (alerts for Jensen-Shannon distance)trip_distance distribution (alerts for Jensen-Shannon distance)DOLocationID distribution (alerts for Jensen-Shannon distance)PULocationID distribution (alerts for Jensen-Shannon distance)VendorID distribution (alerts for Jensen-Shannon distance)ReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/example_green_taxi_dle.svg b/docs/_static/example_green_taxi_dle.svg index 76f84f526..5a1a7404e 100644 --- a/docs/_static/example_green_taxi_dle.svg +++ b/docs/_static/example_green_taxi_dle.svg @@ -1 +1 @@ -Dec 112016Dec 18Dec 25Jan 120170.9511.051.11.151.2MetricAlertThresholdConfidence bandEstimated performance (DLE)TimeMAEEstimated MAEReferenceAnalysis \ No newline at end of file +Dec 112016Dec 18Dec 25Jan 120170.9511.051.11.151.2MetricAlertThresholdConfidence bandEstimated performance (DLE)TimeMAEEstimated MAEReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/example_green_taxi_dle_vs_realized.svg b/docs/_static/example_green_taxi_dle_vs_realized.svg index f03daa867..6224dc7c8 100644 --- a/docs/_static/example_green_taxi_dle_vs_realized.svg +++ b/docs/_static/example_green_taxi_dle_vs_realized.svg @@ -1 +1 @@ -Dec 182016Dec 21Dec 24Dec 27Dec 300.9511.051.11.151.21.25MAE (estimated MAE)Confidence bandMAE (realized MAE)AlertEstimated performance (DLE) vs. Realized performanceChunkMAEMAE (estimated MAE) vs. MAE (realized MAE) \ No newline at end of file +Dec 182016Dec 21Dec 24Dec 27Dec 300.9511.051.11.151.21.25MAE (estimated MAE)Confidence bandMAE (realized MAE)AlertEstimated performance (DLE) vs. Realized performanceChunkMAEMAE (estimated MAE) vs. MAE (realized MAE) \ No newline at end of file diff --git a/docs/_static/example_green_taxi_feature_importance.svg b/docs/_static/example_green_taxi_feature_importance.svg index 72dc74eaf..226851471 100644 --- a/docs/_static/example_green_taxi_feature_importance.svg +++ b/docs/_static/example_green_taxi_feature_importance.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:35:04.095067 + 2023-11-16T09:37:41.841287 image/svg+xml @@ -43,7 +43,7 @@ L 69.184197 273.3696 L 69.184197 265.7664 L 57.6 265.7664 z -" clip-path="url(#p9ee8dd8e48)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: #1f77b4"/> +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -136,11 +136,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -182,11 +182,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -223,11 +223,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -275,11 +275,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -336,11 +336,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -373,11 +373,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -683,16 +683,16 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -777,11 +777,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -828,11 +828,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -906,11 +906,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -969,11 +969,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -1021,11 +1021,11 @@ z +" clip-path="url(#pbca7787710)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -1279,7 +1279,7 @@ z - + diff --git a/docs/_static/example_green_taxi_location_udc.svg b/docs/_static/example_green_taxi_location_udc.svg index 1dd49bbbd..3d9d32825 100644 --- a/docs/_static/example_green_taxi_location_udc.svg +++ b/docs/_static/example_green_taxi_location_udc.svg @@ -1 +1 @@ -Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81DOLocationIDOther1817441427Column distributionsTimeValuesDOLocationID distribution (alerts for Jensen-Shannon distance)ReferenceAnalysis \ No newline at end of file +Dec 112016Dec 18Dec 25Jan 1201700.20.40.60.81DOLocationIDOther1817441427Column distributionsTimeValuesDOLocationID distribution (alerts for Jensen-Shannon distance)ReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/example_green_taxi_pca_error.svg b/docs/_static/example_green_taxi_pca_error.svg index 93e49a704..692919b16 100644 --- a/docs/_static/example_green_taxi_pca_error.svg +++ b/docs/_static/example_green_taxi_pca_error.svg @@ -1 +1 @@ -Dec 112016Dec 18Dec 25Jan 1201711.11.21.31.4MetricConfidence bandMultivariate Drift (PCA Reconstruction Error)TimeReconstruction ErrorReferenceAnalysis \ No newline at end of file +Dec 112016Dec 18Dec 25Jan 1201711.11.21.31.4MetricConfidence bandMultivariate Drift (PCA Reconstruction Error)TimeReconstruction ErrorReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/example_green_taxi_pickup_udc.svg b/docs/_static/example_green_taxi_pickup_udc.svg index 56285a634..f32e03929 100644 --- a/docs/_static/example_green_taxi_pickup_udc.svg +++ b/docs/_static/example_green_taxi_pickup_udc.svg @@ -1 +1 @@ -Dec 112016Dec 18Dec 25−50510152025Column distributionsTimeValuespickup_time distribution (alerts for Jensen-Shannon distance) \ No newline at end of file +Dec 112016Dec 18Dec 25−50510152025Column distributionsTimeValuespickup_time distribution (alerts for Jensen-Shannon distance) \ No newline at end of file diff --git a/docs/_static/example_green_taxi_tip_amount_boxplot.svg b/docs/_static/example_green_taxi_tip_amount_boxplot.svg index f06e8141c..56f897994 100644 --- a/docs/_static/example_green_taxi_tip_amount_boxplot.svg +++ b/docs/_static/example_green_taxi_tip_amount_boxplot.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:33:11.638985 + 2023-11-16T09:37:40.103528 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -264,12 +264,12 @@ z - - + @@ -305,7 +305,7 @@ z - + @@ -346,7 +346,7 @@ z - + @@ -377,7 +377,7 @@ z - + @@ -392,7 +392,7 @@ z - + @@ -433,7 +433,7 @@ z - + @@ -452,31 +452,31 @@ L 262.944 294.465123 L 262.944 292.593066 L 209.376 292.593066 L 209.376 294.465123 -" clip-path="url(#pa8ee02d641)" style="fill: none; stroke: #1f77b4; stroke-linecap: square"/> +" clip-path="url(#p1f862f5ae8)" style="fill: none; stroke: #1f77b4; stroke-linecap: square"/> +" clip-path="url(#p1f862f5ae8)" style="fill: none; stroke: #1f77b4; stroke-linecap: square"/> +" clip-path="url(#p1f862f5ae8)" style="fill: none; stroke: #1f77b4; stroke-linecap: square"/> +" clip-path="url(#p1f862f5ae8)" style="fill: none; stroke: #1f77b4; stroke-linecap: square"/> +" clip-path="url(#p1f862f5ae8)" style="fill: none; stroke: #1f77b4; stroke-linecap: square"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +" clip-path="url(#p1f862f5ae8)" style="fill: none; stroke: #2ca02c; stroke-linecap: square"/> + diff --git a/docs/_static/example_green_taxi_tip_amount_distribution.svg b/docs/_static/example_green_taxi_tip_amount_distribution.svg index 4323dd7bc..2d6a0ecdf 100644 --- a/docs/_static/example_green_taxi_tip_amount_distribution.svg +++ b/docs/_static/example_green_taxi_tip_amount_distribution.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:33:12.306234 + 2023-11-16T09:37:40.297385 image/svg+xml @@ -43,7 +43,7 @@ L 106.298182 307.584 L 106.298182 146.322251 L 73.832727 146.322251 z -" clip-path="url(#p6ce3b3abe9)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: #1f77b4"/> +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -177,11 +177,11 @@ z +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -224,11 +224,11 @@ z +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -260,11 +260,11 @@ z +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -280,11 +280,11 @@ L 218.767792 41.472 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -326,11 +326,11 @@ z +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -346,11 +346,11 @@ L 315.391169 41.472 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -400,11 +400,11 @@ z +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -422,16 +422,16 @@ L 412.014545 41.472 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - - + @@ -445,11 +445,11 @@ L -3.5 0 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -466,11 +466,11 @@ L 414.72 270.406356 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -488,11 +488,11 @@ L 414.72 233.228712 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -510,11 +510,11 @@ L 414.72 196.051068 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -532,11 +532,11 @@ L 414.72 158.873424 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -554,11 +554,11 @@ L 414.72 121.695779 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -576,11 +576,11 @@ L 414.72 84.518135 +" clip-path="url(#pd6e9b64230)" style="fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square"/> - + @@ -827,7 +827,7 @@ z - + diff --git a/docs/_static/how-it-works-dle-data.svg b/docs/_static/how-it-works-dle-data.svg index 3b45ab750..98e24b07d 100644 --- a/docs/_static/how-it-works-dle-data.svg +++ b/docs/_static/how-it-works-dle-data.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:38:56.938726 + 2023-11-16T09:34:18.989626 image/svg+xml @@ -39,7 +39,7 @@ z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + @@ -10108,7 +10108,7 @@ z - + @@ -10149,7 +10149,7 @@ z - + @@ -10185,7 +10185,7 @@ z - + @@ -10232,7 +10232,7 @@ z - + @@ -10288,7 +10288,7 @@ z - + @@ -10345,12 +10345,12 @@ z - - + @@ -10373,7 +10373,7 @@ z - + @@ -10386,7 +10386,7 @@ z - + @@ -10399,7 +10399,7 @@ z - + @@ -10412,7 +10412,7 @@ z - + @@ -10459,7 +10459,7 @@ z - + @@ -10472,7 +10472,7 @@ z - + @@ -10838,7 +10838,7 @@ z - + diff --git a/docs/_static/how-it-works-dle-regression-PI.svg b/docs/_static/how-it-works-dle-regression-PI.svg index 44ed029cf..e21115e0f 100644 --- a/docs/_static/how-it-works-dle-regression-PI.svg +++ b/docs/_static/how-it-works-dle-regression-PI.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:39:01.816192 + 2023-11-16T09:34:20.348161 image/svg+xml @@ -39,7 +39,7 @@ z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + @@ -40146,7 +40146,7 @@ z - + @@ -40187,7 +40187,7 @@ z - + @@ -40223,7 +40223,7 @@ z - + @@ -40270,7 +40270,7 @@ z - + @@ -40326,7 +40326,7 @@ z - + @@ -40383,12 +40383,12 @@ z - - + @@ -40411,7 +40411,7 @@ z - + @@ -40424,7 +40424,7 @@ z - + @@ -40437,7 +40437,7 @@ z - + @@ -40450,7 +40450,7 @@ z - + @@ -40497,7 +40497,7 @@ z - + @@ -40510,7 +40510,7 @@ z - + @@ -41004,7 +41004,7 @@ z - + @@ -41104,7 +41104,7 @@ z - + @@ -41240,7 +41240,7 @@ z - + diff --git a/docs/_static/how-it-works-dle-regression-abs-errors-hist.svg b/docs/_static/how-it-works-dle-regression-abs-errors-hist.svg index fef2428b8..2d4787883 100644 --- a/docs/_static/how-it-works-dle-regression-abs-errors-hist.svg +++ b/docs/_static/how-it-works-dle-regression-abs-errors-hist.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:39:01.058122 + 2023-11-16T09:34:20.143641 image/svg+xml @@ -43,7 +43,7 @@ L 77.079273 307.584 L 77.079273 54.144 L 73.832727 54.144 z -" clip-path="url(#p6b4d47d4e7)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> +" clip-path="url(#p2b8ff994ff)" style="fill: #1f77b4"/> - - + @@ -891,7 +891,7 @@ z - + @@ -933,7 +933,7 @@ z - + @@ -964,7 +964,7 @@ z - + @@ -979,7 +979,7 @@ z - + @@ -1020,7 +1020,7 @@ z - + @@ -1035,7 +1035,7 @@ z - + @@ -1086,12 +1086,12 @@ z - - + @@ -1106,7 +1106,7 @@ L -3.5 0 - + @@ -1121,7 +1121,7 @@ L -3.5 0 - + @@ -1136,7 +1136,7 @@ L -3.5 0 - + @@ -1151,7 +1151,7 @@ L -3.5 0 - + @@ -1166,7 +1166,7 @@ L -3.5 0 - + @@ -1181,7 +1181,7 @@ L -3.5 0 - + @@ -1196,7 +1196,7 @@ L -3.5 0 - + @@ -1593,7 +1593,7 @@ z - + diff --git a/docs/_static/how-it-works-dle-regression-errors-hist.svg b/docs/_static/how-it-works-dle-regression-errors-hist.svg index 679d52f77..d793bf44a 100644 --- a/docs/_static/how-it-works-dle-regression-errors-hist.svg +++ b/docs/_static/how-it-works-dle-regression-errors-hist.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:39:00.203831 + 2023-11-16T09:34:19.924163 image/svg+xml @@ -43,7 +43,7 @@ L 77.079273 307.584 L 77.079273 307.344906 L 73.832727 307.344906 z -" clip-path="url(#p151a6e0d82)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> +" clip-path="url(#pecd5621e83)" style="fill: #1f77b4"/> - - + @@ -901,7 +901,7 @@ z - + @@ -941,7 +941,7 @@ z - + @@ -971,7 +971,7 @@ z - + @@ -1007,7 +1007,7 @@ z - + @@ -1020,7 +1020,7 @@ z - + @@ -1033,7 +1033,7 @@ z - + @@ -1048,12 +1048,12 @@ z - - + @@ -1078,7 +1078,7 @@ z - + @@ -1121,7 +1121,7 @@ z - + @@ -1137,7 +1137,7 @@ z - + @@ -1165,7 +1165,7 @@ z - + @@ -1181,7 +1181,7 @@ z - + @@ -1197,7 +1197,7 @@ z - + @@ -1213,7 +1213,7 @@ z - + @@ -1489,7 +1489,7 @@ z - + diff --git a/docs/_static/how-it-works-dle-regression.svg b/docs/_static/how-it-works-dle-regression.svg index 1667bdc13..5df9c0b34 100644 --- a/docs/_static/how-it-works-dle-regression.svg +++ b/docs/_static/how-it-works-dle-regression.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:38:57.918103 + 2023-11-16T09:34:19.307730 image/svg+xml @@ -39,7 +39,7 @@ z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + @@ -20125,7 +20125,7 @@ z - + @@ -20166,7 +20166,7 @@ z - + @@ -20202,7 +20202,7 @@ z - + @@ -20249,7 +20249,7 @@ z - + @@ -20305,7 +20305,7 @@ z - + @@ -20362,12 +20362,12 @@ z - - + @@ -20390,7 +20390,7 @@ z - + @@ -20403,7 +20403,7 @@ z - + @@ -20416,7 +20416,7 @@ z - + @@ -20429,7 +20429,7 @@ z - + @@ -20476,7 +20476,7 @@ z - + @@ -20489,7 +20489,7 @@ z - + @@ -21007,7 +21007,7 @@ z - + @@ -21036,7 +21036,7 @@ z - + diff --git a/docs/_static/how-it-works/chunks_stability_of_accuracy.svg b/docs/_static/how-it-works/chunks_stability_of_accuracy.svg index a78df4ebb..a636355d5 100644 --- a/docs/_static/how-it-works/chunks_stability_of_accuracy.svg +++ b/docs/_static/how-it-works/chunks_stability_of_accuracy.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:38:51.654362 + 2023-11-16T09:39:35.515426 image/svg+xml @@ -43,7 +43,7 @@ L 90.065455 307.584 L 90.065455 306.640089 L 73.832727 306.640089 z -" clip-path="url(#pe323e8b104)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> +" clip-path="url(#p4a51748c8e)" style="fill: #1f77b4"/> - - + @@ -283,7 +283,7 @@ z - + @@ -319,7 +319,7 @@ z - + @@ -361,7 +361,7 @@ z - + @@ -408,7 +408,7 @@ z - + @@ -437,12 +437,12 @@ z - - + @@ -455,7 +455,7 @@ L -3.5 0 - + @@ -484,7 +484,7 @@ z - + @@ -523,7 +523,7 @@ z - + @@ -536,7 +536,7 @@ z - + @@ -549,7 +549,7 @@ z - + @@ -562,7 +562,7 @@ z - + @@ -575,7 +575,7 @@ z - + @@ -588,7 +588,7 @@ z - + @@ -1158,7 +1158,7 @@ z - + diff --git a/docs/_static/how-it-works/ranking-abs-perf-features-compare.svg b/docs/_static/how-it-works/ranking-abs-perf-features-compare.svg index de4153e7a..35ce0be0e 100644 --- a/docs/_static/how-it-works/ranking-abs-perf-features-compare.svg +++ b/docs/_static/how-it-works/ranking-abs-perf-features-compare.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:39:16.702610 + 2023-11-16T09:39:44.931173 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -91,7 +91,7 @@ z - + @@ -157,7 +157,7 @@ z - + @@ -172,7 +172,7 @@ z - + @@ -199,7 +199,7 @@ z - + @@ -231,7 +231,7 @@ z - + @@ -247,7 +247,7 @@ z - + @@ -263,7 +263,7 @@ z - + @@ -388,12 +388,12 @@ z - - + @@ -409,7 +409,7 @@ L -3.5 0 - + @@ -425,7 +425,7 @@ L -3.5 0 - + @@ -441,7 +441,7 @@ L -3.5 0 - + @@ -457,7 +457,7 @@ L -3.5 0 - + @@ -674,7 +674,7 @@ L 339.769779 41.679107 L 356.85686 40.828459 L 373.943941 57.855051 L 391.031023 34.414125 -" clip-path="url(#p09367ad3d5)" style="fill: none; stroke: #008000; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#p3c4459eb09)" style="fill: none; stroke: #008000; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#p3c4459eb09)" style="fill: none; stroke: #bf00bf; stroke-width: 1.5; stroke-linecap: square"/> - - + @@ -747,7 +747,7 @@ L 3.5 0 - + @@ -764,7 +764,7 @@ L 3.5 0 - + @@ -802,7 +802,7 @@ z - + @@ -851,7 +851,7 @@ z - + @@ -909,7 +909,7 @@ z - + @@ -926,7 +926,7 @@ z - + @@ -943,7 +943,7 @@ z - + @@ -1174,7 +1174,7 @@ L 339.769779 51.985138 L 356.85686 61.207004 L 373.943941 134.348218 L 391.031023 34.414125 -" clip-path="url(#p09367ad3d5)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#p3c4459eb09)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> + diff --git a/docs/_static/how-it-works/ranking-abs-perf.svg b/docs/_static/how-it-works/ranking-abs-perf.svg index 2f36b1dac..b55d96e9c 100644 --- a/docs/_static/how-it-works/ranking-abs-perf.svg +++ b/docs/_static/how-it-works/ranking-abs-perf.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:39:15.546803 + 2023-11-16T09:39:44.585037 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -91,7 +91,7 @@ z - + @@ -157,7 +157,7 @@ z - + @@ -172,7 +172,7 @@ z - + @@ -199,7 +199,7 @@ z - + @@ -231,7 +231,7 @@ z - + @@ -247,7 +247,7 @@ z - + @@ -263,7 +263,7 @@ z - + @@ -388,12 +388,12 @@ z - - + @@ -443,7 +443,7 @@ z - + @@ -493,7 +493,7 @@ z - + @@ -511,7 +511,7 @@ z - + @@ -529,7 +529,7 @@ z - + @@ -547,7 +547,7 @@ z - + @@ -565,7 +565,7 @@ z - + @@ -583,7 +583,7 @@ z - + @@ -901,7 +901,7 @@ L 352.494779 263.754556 L 369.58186 257.152369 L 386.668941 204.78857 L 403.756023 276.334125 -" clip-path="url(#pf21f195b5d)" style="fill: none; stroke: #008000; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pa8e965e434)" style="fill: none; stroke: #008000; stroke-width: 1.5; stroke-linecap: square"/> - - + @@ -951,7 +951,7 @@ L 3.5 0 - + @@ -968,7 +968,7 @@ L 3.5 0 - + @@ -1006,7 +1006,7 @@ z - + @@ -1023,7 +1023,7 @@ z - + @@ -1081,7 +1081,7 @@ z - + @@ -1098,7 +1098,7 @@ z - + @@ -1115,7 +1115,7 @@ z - + @@ -1267,7 +1267,7 @@ L 352.494779 51.985138 L 369.58186 61.207004 L 386.668941 134.348218 L 403.756023 34.414125 -" clip-path="url(#pf21f195b5d)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pa8e965e434)" style="fill: none; stroke: #0000ff; stroke-width: 1.5; stroke-linecap: square"/> + diff --git a/docs/_static/quickstart/quick-start-drift-n-performance.svg b/docs/_static/quickstart/quick-start-drift-n-performance.svg index 6921315ea..df66db23f 100644 --- a/docs/_static/quickstart/quick-start-drift-n-performance.svg +++ b/docs/_static/quickstart/quick-start-drift-n-performance.svg @@ -1 +1 @@ -0102030400.840.860.880.900.10.20.30.40.5ROC AUC (estimated ROC AUC)Confidence bandJensen-Shannon distance (AGEP)AlertEstimated performance (CBPE) vs. Univariate driftChunkROC AUCJensen-Shannon distanceROC AUC (estimated ROC AUC) vs. Jensen-Shannon distance (AGEP) \ No newline at end of file +0102030400.840.860.880.900.10.20.30.40.5ROC AUC (estimated ROC AUC)Confidence bandJensen-Shannon distance (AGEP)AlertEstimated performance (CBPE) vs. Univariate driftChunkROC AUCJensen-Shannon distanceROC AUC (estimated ROC AUC) vs. Jensen-Shannon distance (AGEP) \ No newline at end of file diff --git a/docs/_static/quickstart/quick-start-drift.svg b/docs/_static/quickstart/quick-start-drift.svg index de9d68b50..9aac2ac99 100644 --- a/docs/_static/quickstart/quick-start-drift.svg +++ b/docs/_static/quickstart/quick-start-drift.svg @@ -1 +1 @@ -0102030405000.10.20.30.40.50102030405000.20.40.60.80102030405000.10.20.30.4MethodAlertThresholdUnivariate drift metricsChunkChunkChunkJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distance for AGEPJensen-Shannon distance for RELPJensen-Shannon distance for SCHLReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +0102030405000.10.20.30.40.50102030405000.20.40.60.80102030405000.10.20.30.4MethodAlertThresholdUnivariate drift metricsChunkChunkChunkJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distance for AGEPJensen-Shannon distance for RELPJensen-Shannon distance for SCHLReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/quickstart/quick-start-estimated-and-realized.svg b/docs/_static/quickstart/quick-start-estimated-and-realized.svg index e2d57f464..7a5738e0e 100644 --- a/docs/_static/quickstart/quick-start-estimated-and-realized.svg +++ b/docs/_static/quickstart/quick-start-estimated-and-realized.svg @@ -1 +1 @@ -0102030400.80.820.840.860.880.90.92ROC AUC (estimated ROC AUC)Confidence bandROC AUC (realized ROC AUC)AlertEstimated performance (CBPE) vs. Realized performanceChunkROC AUCROC AUC (estimated ROC AUC) vs. ROC AUC (realized ROC AUC) \ No newline at end of file +0102030400.80.820.840.860.880.90.92ROC AUC (estimated ROC AUC)Confidence bandROC AUC (realized ROC AUC)AlertEstimated performance (CBPE) vs. Realized performanceChunkROC AUCROC AUC (estimated ROC AUC) vs. ROC AUC (realized ROC AUC) \ No newline at end of file diff --git a/docs/_static/quickstart/quick-start-perf-est.svg b/docs/_static/quickstart/quick-start-perf-est.svg index f7dc7c03e..7ef3f2167 100644 --- a/docs/_static/quickstart/quick-start-perf-est.svg +++ b/docs/_static/quickstart/quick-start-perf-est.svg @@ -1 +1 @@ -010203040500.840.860.880.9MetricAlertThresholdConfidence bandEstimated performance (CBPE)ChunkROC AUCEstimated ROC AUCReferenceAnalysis \ No newline at end of file +010203040500.840.860.880.9MetricAlertThresholdConfidence bandEstimated performance (CBPE)ChunkROC AUCEstimated ROC AUCReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/quickstart/quick-start-univariate-distribution.svg b/docs/_static/quickstart/quick-start-univariate-distribution.svg index 1898b7860..7465c9d1e 100644 --- a/docs/_static/quickstart/quick-start-univariate-distribution.svg +++ b/docs/_static/quickstart/quick-start-univariate-distribution.svg @@ -1 +1 @@ -0510152025303540−20020406080100051015202530354000.20.40.60.81051015202530354000.20.40.60.81Column distributionsChunkChunkChunkValuesValuesValuesAGEP distribution (alerts for Jensen-Shannon distance)RELP distribution (alerts for Jensen-Shannon distance)SCHL distribution (alerts for Jensen-Shannon distance)AnalysisAnalysis \ No newline at end of file +0510152025303540−20020406080100051015202530354000.20.40.60.81051015202530354000.20.40.60.81Column distributionsChunkChunkChunkValuesValuesValuesAGEP distribution (alerts for Jensen-Shannon distance)RELP distribution (alerts for Jensen-Shannon distance)SCHL distribution (alerts for Jensen-Shannon distance)AnalysisAnalysis \ No newline at end of file diff --git a/docs/_static/tutorial-perf-est-regression.svg b/docs/_static/tutorial-perf-est-regression.svg index 65d3425da..4ffd668d7 100644 --- a/docs/_static/tutorial-perf-est-regression.svg +++ b/docs/_static/tutorial-perf-est-regression.svg @@ -1 +1 @@ -Feb 52017Feb 19Mar 5900950100010501100Feb 52017Feb 19Mar 50.260.270.280.290.30.310.32MetricAlertThresholdConfidence bandEstimated performance (DLE)TimeTimeRMSERMSLEEstimated RMSEEstimated RMSLEReferenceAnalysisReferenceAnalysis \ No newline at end of file +Feb 52017Feb 19Mar 5900950100010501100Feb 52017Feb 19Mar 50.260.270.280.290.30.310.32MetricAlertThresholdConfidence bandEstimated performance (DLE)TimeTimeRMSERMSLEEstimated RMSEEstimated RMSLEReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/adjust_plots/adjusting_plots_time_periods_indication.svg b/docs/_static/tutorials/adjust_plots/adjusting_plots_time_periods_indication.svg index 5b23ee6b3..c5b78924f 100644 --- a/docs/_static/tutorials/adjust_plots/adjusting_plots_time_periods_indication.svg +++ b/docs/_static/tutorials/adjust_plots/adjusting_plots_time_periods_indication.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20190.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUCReferenceAnalysisStrategy change \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20190.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUCReferenceAnalysisStrategy change \ No newline at end of file diff --git a/docs/_static/tutorials/chunking/chunk-size.svg b/docs/_static/tutorials/chunking/chunk-size.svg index 512681fc6..028d88496 100644 --- a/docs/_static/tutorials/chunking/chunk-size.svg +++ b/docs/_static/tutorials/chunking/chunk-size.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20190.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUCReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20190.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUCReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Age.svg b/docs/_static/tutorials/data_quality/missing-titanic-Age.svg index 7ea84fbb0..eb6ebdc54 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Age.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Age.svg @@ -1 +1 @@ -0510152000.10.20.30.40.5MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for AgeReferenceAnalysis \ No newline at end of file +0510152000.10.20.30.40.5MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for AgeReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Cabin.svg b/docs/_static/tutorials/data_quality/missing-titanic-Cabin.svg index 4d3b241bf..26f13b12a 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Cabin.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Cabin.svg @@ -1 +1 @@ -051015200.40.50.60.70.80.911.1MetricAlertThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for CabinReferenceAnalysis \ No newline at end of file +051015200.40.50.60.70.80.911.1MetricAlertThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for CabinReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Embarked.svg b/docs/_static/tutorials/data_quality/missing-titanic-Embarked.svg index 11f87f321..857c533be 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Embarked.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Embarked.svg @@ -1 +1 @@ -05101520−0.02−0.0100.010.02MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for EmbarkedReferenceAnalysis \ No newline at end of file +05101520−0.02−0.0100.010.02MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for EmbarkedReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Fare.svg b/docs/_static/tutorials/data_quality/missing-titanic-Fare.svg index 0b8d14ba1..4a384fac3 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Fare.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Fare.svg @@ -1 +1 @@ -0510152000.0050.010.0150.020.025MetricAlertThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for FareReferenceAnalysis \ No newline at end of file +0510152000.0050.010.0150.020.025MetricAlertThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for FareReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Name.svg b/docs/_static/tutorials/data_quality/missing-titanic-Name.svg index 1060811c3..ad05666b3 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Name.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Name.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for NameReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for NameReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Parch.svg b/docs/_static/tutorials/data_quality/missing-titanic-Parch.svg index b49ba749e..febdf7369 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Parch.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Parch.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for ParchReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for ParchReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Pclass.svg b/docs/_static/tutorials/data_quality/missing-titanic-Pclass.svg index 251249c66..d46c7fed6 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Pclass.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Pclass.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for PclassReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for PclassReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Sex.svg b/docs/_static/tutorials/data_quality/missing-titanic-Sex.svg index 2ed5d1b59..a350972ee 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Sex.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Sex.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for SexReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for SexReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-SibSp.svg b/docs/_static/tutorials/data_quality/missing-titanic-SibSp.svg index ac49045d0..110cbc145 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-SibSp.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-SibSp.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for SibSpReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for SibSpReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/missing-titanic-Ticket.svg b/docs/_static/tutorials/data_quality/missing-titanic-Ticket.svg index 7f5107468..c1d0faa69 100644 --- a/docs/_static/tutorials/data_quality/missing-titanic-Ticket.svg +++ b/docs/_static/tutorials/data_quality/missing-titanic-Ticket.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for TicketReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdConfidence bandData QualityChunkMissing Values RateMissing Values Rate for TicketReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/unseen-titanic-Cabin.svg b/docs/_static/tutorials/data_quality/unseen-titanic-Cabin.svg index c604cbb25..17ff02499 100644 --- a/docs/_static/tutorials/data_quality/unseen-titanic-Cabin.svg +++ b/docs/_static/tutorials/data_quality/unseen-titanic-Cabin.svg @@ -1 +1 @@ -0510152000.050.10.150.2MetricAlertThresholdData QualityChunkUnseen Values RateUnseen Values Rate for CabinReferenceAnalysis \ No newline at end of file +0510152000.050.10.150.2MetricAlertThresholdData QualityChunkUnseen Values RateUnseen Values Rate for CabinReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/unseen-titanic-Embarked.svg b/docs/_static/tutorials/data_quality/unseen-titanic-Embarked.svg index d4be22294..dd6262756 100644 --- a/docs/_static/tutorials/data_quality/unseen-titanic-Embarked.svg +++ b/docs/_static/tutorials/data_quality/unseen-titanic-Embarked.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdData QualityChunkUnseen Values RateUnseen Values Rate for EmbarkedReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdData QualityChunkUnseen Values RateUnseen Values Rate for EmbarkedReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/unseen-titanic-Sex.svg b/docs/_static/tutorials/data_quality/unseen-titanic-Sex.svg index 06f7fc1ea..1c0bd079c 100644 --- a/docs/_static/tutorials/data_quality/unseen-titanic-Sex.svg +++ b/docs/_static/tutorials/data_quality/unseen-titanic-Sex.svg @@ -1 +1 @@ -05101520−1−0.500.51MetricThresholdData QualityChunkUnseen Values RateUnseen Values Rate for SexReferenceAnalysis \ No newline at end of file +05101520−1−0.500.51MetricThresholdData QualityChunkUnseen Values RateUnseen Values Rate for SexReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_quality/unseen-titanic-Ticket.svg b/docs/_static/tutorials/data_quality/unseen-titanic-Ticket.svg index 386e59348..c718e29ea 100644 --- a/docs/_static/tutorials/data_quality/unseen-titanic-Ticket.svg +++ b/docs/_static/tutorials/data_quality/unseen-titanic-Ticket.svg @@ -1 +1 @@ -0510152000.10.20.30.40.50.60.70.8MetricAlertThresholdData QualityChunkUnseen Values RateUnseen Values Rate for TicketReferenceAnalysis \ No newline at end of file +0510152000.10.20.30.40.50.60.70.8MetricAlertThresholdData QualityChunkUnseen Values RateUnseen Values Rate for TicketReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/data_requirements/data-requirements-index-based-x-axis.svg b/docs/_static/tutorials/data_requirements/data-requirements-index-based-x-axis.svg index f1178b431..17d44dfb7 100644 --- a/docs/_static/tutorials/data_requirements/data-requirements-index-based-x-axis.svg +++ b/docs/_static/tutorials/data_requirements/data-requirements-index-based-x-axis.svg @@ -1 +1 @@ -02468100.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)ChunkROC AUCEstimated ROC AUC \ No newline at end of file +02468100.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)ChunkROC AUCEstimated ROC AUC \ No newline at end of file diff --git a/docs/_static/tutorials/data_requirements/data-requirements-time-based-x-axis.svg b/docs/_static/tutorials/data_requirements/data-requirements-time-based-x-axis.svg index 614333c23..2747fdd88 100644 --- a/docs/_static/tutorials/data_requirements/data-requirements-time-based-x-axis.svg +++ b/docs/_static/tutorials/data_requirements/data-requirements-time-based-x-axis.svg @@ -1 +1 @@ -Nov 2018Jan 2019Mar 2019May 2019Jul 2019Sep 20190.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUC \ No newline at end of file +Nov 2018Jan 2019Mar 2019May 2019Jul 2019Sep 20190.9550.960.9650.970.975MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeROC AUCEstimated ROC AUC \ No newline at end of file diff --git a/docs/_static/tutorials/detecting_data_drift/multivariate_drift_detection/pca-reconstruction-error.svg b/docs/_static/tutorials/detecting_data_drift/multivariate_drift_detection/pca-reconstruction-error.svg index 8204de66b..1209e2368 100644 --- a/docs/_static/tutorials/detecting_data_drift/multivariate_drift_detection/pca-reconstruction-error.svg +++ b/docs/_static/tutorials/detecting_data_drift/multivariate_drift_detection/pca-reconstruction-error.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20191.11.151.21.25MetricAlertConfidence bandMultivariate Drift (PCA Reconstruction Error)TimeReconstruction ErrorReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20191.11.151.21.25MetricAlertConfidence bandMultivariate Drift (PCA Reconstruction Error)TimeReconstruction ErrorReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/jensen-shannon-continuous.svg b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/jensen-shannon-continuous.svg index 5932514c5..c7b504aa5 100644 --- a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/jensen-shannon-continuous.svg +++ b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/jensen-shannon-continuous.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.10.20.30.40.5Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.050.10.150.20.25Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2MethodAlertThresholdUnivariate drift metricsTimeTimeTimeTimeTimeJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distance for car_valueJensen-Shannon distance for debt_to_income_ratioJensen-Shannon distance for driver_tenureJensen-Shannon distance for loan_lengthJensen-Shannon distance for y_pred_probaReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.10.20.30.40.5Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.050.10.150.20.25Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2MethodAlertThresholdUnivariate drift metricsTimeTimeTimeTimeTimeJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distanceJensen-Shannon distance for car_valueJensen-Shannon distance for debt_to_income_ratioJensen-Shannon distance for driver_tenureJensen-Shannon distance for loan_lengthJensen-Shannon distance for y_pred_probaReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/joyplot-continuous.svg b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/joyplot-continuous.svg index 58a1ded28..3092a688c 100644 --- a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/joyplot-continuous.svg +++ b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/joyplot-continuous.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019020k40k60k80k100k120kJan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.20.30.40.50.60.70.8Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201902468Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019510152025Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.51Column distributionsTimeTimeTimeTimeTimeValuesValuesValuesValuesValuescar_value distribution (alerts for Jensen-Shannon distance)debt_to_income_ratio distribution (alerts for Jensen-Shannon distance)driver_tenure distribution (alerts for Jensen-Shannon distance)loan_length distribution (alerts for Jensen-Shannon distance)y_pred_proba distribution (alerts for Jensen-Shannon distance) \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019020k40k60k80k100k120kJan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.20.30.40.50.60.70.8Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201902468Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019510152025Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.51Column distributionsTimeTimeTimeTimeTimeValuesValuesValuesValuesValuescar_value distribution (alerts for Jensen-Shannon distance)debt_to_income_ratio distribution (alerts for Jensen-Shannon distance)driver_tenure distribution (alerts for Jensen-Shannon distance)loan_length distribution (alerts for Jensen-Shannon distance)y_pred_proba distribution (alerts for Jensen-Shannon distance) \ No newline at end of file diff --git a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/shi-2-categorical.svg b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/shi-2-categorical.svg index 4ad8ee853..a77c38beb 100644 --- a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/shi-2-categorical.svg +++ b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/shi-2-categorical.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019020040060080010001200Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190100200300400500Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201901234567Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190123456MethodAlertThresholdUnivariate drift metricsTimeTimeTimeTimeChi2 statisticChi2 statisticChi2 statisticChi2 statisticChi2 statistic for repaid_loan_on_prev_carChi2 statistic for salary_rangeChi2 statistic for size_of_downpaymentChi2 statistic for y_predReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019020040060080010001200Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190100200300400500Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201901234567Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190123456MethodAlertThresholdUnivariate drift metricsTimeTimeTimeTimeChi2 statisticChi2 statisticChi2 statisticChi2 statisticChi2 statistic for repaid_loan_on_prev_carChi2 statistic for salary_rangeChi2 statistic for size_of_downpaymentChi2 statistic for y_predReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/stacked-categorical.svg b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/stacked-categorical.svg index a7fb1796b..0e1ffc878 100644 --- a/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/stacked-categorical.svg +++ b/docs/_static/tutorials/detecting_data_drift/univariate_drift_detection/stacked-categorical.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81repaid_loan_on_prev_carTrueFalsesalary_range0 - 20K €20K - 20K €40K - 60K €60K+ €size_of_downpayment20%0%40%10%30%y_pred01Column distributionsTimeTimeTimeTimeValuesValuesValuesValuesrepaid_loan_on_prev_car distribution (alerts for Chi2 statistic)salary_range distribution (alerts for Chi2 statistic)size_of_downpayment distribution (alerts for Chi2 statistic)y_pred distribution (alerts for Chi2 statistic)ReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81Jan 2018Jul 2018Jan 2019Jul 201900.20.40.60.81repaid_loan_on_prev_carTrueFalsesalary_range0 - 20K €20K - 20K €40K - 60K €60K+ €size_of_downpayment20%0%40%10%30%y_pred01Column distributionsTimeTimeTimeTimeValuesValuesValuesValuesrepaid_loan_on_prev_car distribution (alerts for Chi2 statistic)salary_range distribution (alerts for Chi2 statistic)size_of_downpayment distribution (alerts for Chi2 statistic)y_pred distribution (alerts for Chi2 statistic)ReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/estimated_and_realized_performance/comparison_plot.svg b/docs/_static/tutorials/estimated_and_realized_performance/comparison_plot.svg index 95fe44503..7055f67dc 100644 --- a/docs/_static/tutorials/estimated_and_realized_performance/comparison_plot.svg +++ b/docs/_static/tutorials/estimated_and_realized_performance/comparison_plot.svg @@ -1 +1 @@ -Nov 2018Jan 2019Mar 2019May 2019Jul 20190.9550.960.9650.970.975ROC AUC (estimated ROC AUC)Confidence bandROC AUC (realized ROC AUC)AlertEstimated performance (CBPE) vs. Realized performanceChunkROC AUCROC AUC (estimated ROC AUC) vs. ROC AUC (realized ROC AUC) \ No newline at end of file +Nov 2018Jan 2019Mar 2019May 2019Jul 20190.9550.960.9650.970.975ROC AUC (estimated ROC AUC)Confidence bandROC AUC (realized ROC AUC)AlertEstimated performance (CBPE) vs. Realized performanceChunkROC AUCROC AUC (estimated ROC AUC) vs. ROC AUC (realized ROC AUC) \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/binary/tutorial-business-value-calculation-binary-car-loan-analysis.svg b/docs/_static/tutorials/performance_calculation/binary/tutorial-business-value-calculation-binary-car-loan-analysis.svg index 12733e760..0adcc125e 100644 --- a/docs/_static/tutorials/performance_calculation/binary/tutorial-business-value-calculation-binary-car-loan-analysis.svg +++ b/docs/_static/tutorials/performance_calculation/binary/tutorial-business-value-calculation-binary-car-loan-analysis.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20194546474849MetricAlertThresholdRealized performanceTimeBusiness ValueRealized Business ValueReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20194546474849MetricAlertThresholdRealized performanceTimeBusiness ValueRealized Business ValueReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/binary/tutorial-confusion-matrix-calculation-binary-car-loan-analysis.svg b/docs/_static/tutorials/performance_calculation/binary/tutorial-confusion-matrix-calculation-binary-car-loan-analysis.svg index 19376fc40..68f955edb 100644 --- a/docs/_static/tutorials/performance_calculation/binary/tutorial-confusion-matrix-calculation-binary-car-loan-analysis.svg +++ b/docs/_static/tutorials/performance_calculation/binary/tutorial-confusion-matrix-calculation-binary-car-loan-analysis.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.450.4550.460.4650.470.4750.48Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.450.460.470.480.49Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.0150.020.0250.030.0350.04Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.030.0350.040.0450.05MetricAlertThresholdRealized performanceTimeTimeTimeTimeTrue PositiveTrue NegativeFalse PositiveFalse NegativeRealized True PositiveRealized True NegativeRealized False PositiveRealized False NegativeReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.450.4550.460.4650.470.4750.48Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.450.460.470.480.49Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.0150.020.0250.030.0350.04Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.030.0350.040.0450.05MetricAlertThresholdRealized performanceTimeTimeTimeTimeTrue PositiveTrue NegativeFalse PositiveFalse NegativeRealized True PositiveRealized True NegativeRealized False PositiveRealized False NegativeReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/binary/tutorial-performance-calculation-binary-car-loan-analysis.svg b/docs/_static/tutorials/performance_calculation/binary/tutorial-performance-calculation-binary-car-loan-analysis.svg index 069633d04..9f1b20a8e 100644 --- a/docs/_static/tutorials/performance_calculation/binary/tutorial-performance-calculation-binary-car-loan-analysis.svg +++ b/docs/_static/tutorials/performance_calculation/binary/tutorial-performance-calculation-binary-car-loan-analysis.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.960.9650.970.975Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.95Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.96Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.90.910.920.930.94Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.960.97Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.910.920.930.940.95MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeROC AUCF1PrecisionRecallSpecificityAccuracyRealized ROC AUCRealized F1Realized PrecisionRealized RecallRealized SpecificityRealized AccuracyReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.960.9650.970.975Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.95Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.96Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.90.910.920.930.94Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.960.97Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.910.920.930.940.95MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeROC AUCF1PrecisionRecallSpecificityAccuracyRealized ROC AUCRealized F1Realized PrecisionRealized RecallRealized SpecificityRealized AccuracyReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/binary/tutorial-standard-metrics-calculation-binary-car-loan-analysis.svg b/docs/_static/tutorials/performance_calculation/binary/tutorial-standard-metrics-calculation-binary-car-loan-analysis.svg index b66d2fb99..ab5338a6d 100644 --- a/docs/_static/tutorials/performance_calculation/binary/tutorial-standard-metrics-calculation-binary-car-loan-analysis.svg +++ b/docs/_static/tutorials/performance_calculation/binary/tutorial-standard-metrics-calculation-binary-car-loan-analysis.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.960.9650.970.975Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.95Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.96Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.90.910.920.930.94Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.960.97Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.910.920.930.940.95MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeROC AUCF1PrecisionRecallSpecificityAccuracyRealized ROC AUCRealized F1Realized PrecisionRealized RecallRealized SpecificityRealized AccuracyReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.960.9650.970.975Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.95Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.96Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.90.910.920.930.94Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.920.930.940.950.960.97Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.910.920.930.940.95MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeROC AUCF1PrecisionRecallSpecificityAccuracyRealized ROC AUCRealized F1Realized PrecisionRealized RecallRealized SpecificityRealized AccuracyReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/multiclass/tutorial-confusion-matrix-calculation-multiclass.svg b/docs/_static/tutorials/performance_calculation/multiclass/tutorial-confusion-matrix-calculation-multiclass.svg index c341ac784..122e310fd 100644 --- a/docs/_static/tutorials/performance_calculation/multiclass/tutorial-confusion-matrix-calculation-multiclass.svg +++ b/docs/_static/tutorials/performance_calculation/multiclass/tutorial-confusion-matrix-calculation-multiclass.svg @@ -1 +1 @@ -May 2020Jul 2020Sep 2020Nov 2020Jan 20210.220.230.240.250.26May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.0450.050.0550.060.0650.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.0450.050.055May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.050.060.070.080.090.1May 2020Jul 2020Sep 2020Nov 2020Jan 20210.140.160.180.20.220.240.26May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.050.060.070.080.09May 2020Jul 2020Sep 2020Nov 2020Jan 20210.0350.040.0450.050.0550.060.065May 2020Jul 2020Sep 2020Nov 2020Jan 20210.20.220.240.26MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeTimeTimeTimetrue class: 'highstreet_card', predicted class: 'highstreet_card'true class: 'highstreet_card', predicted class: 'prepaid_card'true class: 'highstreet_card', predicted class: 'upmarket_card'true class: 'prepaid_card', predicted class: 'highstreet_card'true class: 'prepaid_card', predicted class: 'prepaid_card'true class: 'prepaid_card', predicted class: 'upmarket_card'true class: 'upmarket_card', predicted class: 'highstreet_card'true class: 'upmarket_card', predicted class: 'prepaid_card'true class: 'upmarket_card', predicted class: 'upmarket_card'Realized true class: 'highstreet_card', predicted class: 'highstreet_card'Realized true class: 'highstreet_card', predicted class: 'prepaid_card'Realized true class: 'highstreet_card', predicted class: 'upmarket_card'Realized true class: 'prepaid_card', predicted class: 'highstreet_card'Realized true class: 'prepaid_card', predicted class: 'prepaid_card'Realized true class: 'prepaid_card', predicted class: 'upmarket_card'Realized true class: 'upmarket_card', predicted class: 'highstreet_card'Realized true class: 'upmarket_card', predicted class: 'prepaid_card'Realized true class: 'upmarket_card', predicted class: 'upmarket_card'ReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +May 2020Jul 2020Sep 2020Nov 2020Jan 20210.220.230.240.250.26May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.0450.050.0550.060.0650.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.0450.050.055May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.050.060.070.080.090.1May 2020Jul 2020Sep 2020Nov 2020Jan 20210.140.160.180.20.220.240.26May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.050.060.070.080.09May 2020Jul 2020Sep 2020Nov 2020Jan 20210.0350.040.0450.050.0550.060.065May 2020Jul 2020Sep 2020Nov 2020Jan 20210.20.220.240.26MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeTimeTimeTimetrue class: 'highstreet_card', predicted class: 'highstreet_card'true class: 'highstreet_card', predicted class: 'prepaid_card'true class: 'highstreet_card', predicted class: 'upmarket_card'true class: 'prepaid_card', predicted class: 'highstreet_card'true class: 'prepaid_card', predicted class: 'prepaid_card'true class: 'prepaid_card', predicted class: 'upmarket_card'true class: 'upmarket_card', predicted class: 'highstreet_card'true class: 'upmarket_card', predicted class: 'prepaid_card'true class: 'upmarket_card', predicted class: 'upmarket_card'Realized true class: 'highstreet_card', predicted class: 'highstreet_card'Realized true class: 'highstreet_card', predicted class: 'prepaid_card'Realized true class: 'highstreet_card', predicted class: 'upmarket_card'Realized true class: 'prepaid_card', predicted class: 'highstreet_card'Realized true class: 'prepaid_card', predicted class: 'prepaid_card'Realized true class: 'prepaid_card', predicted class: 'upmarket_card'Realized true class: 'upmarket_card', predicted class: 'highstreet_card'Realized true class: 'upmarket_card', predicted class: 'prepaid_card'Realized true class: 'upmarket_card', predicted class: 'upmarket_card'ReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/multiclass/tutorial-performance-calculation-multiclass.svg b/docs/_static/tutorials/performance_calculation/multiclass/tutorial-performance-calculation-multiclass.svg index 979f2aa68..c33928a70 100644 --- a/docs/_static/tutorials/performance_calculation/multiclass/tutorial-performance-calculation-multiclass.svg +++ b/docs/_static/tutorials/performance_calculation/multiclass/tutorial-performance-calculation-multiclass.svg @@ -1 +1 @@ -May 2020Jul 2020Sep 2020Nov 2020Jan 20210.750.80.850.9May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75May 2020Jul 2020Sep 2020Nov 2020Jan 20210.780.80.820.840.860.88May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeROC AUCF1PrecisionRecallSpecificityAccuracyRealized ROC AUCRealized F1Realized PrecisionRealized RecallRealized SpecificityRealized AccuracyReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +May 2020Jul 2020Sep 2020Nov 2020Jan 20210.750.80.850.9May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75May 2020Jul 2020Sep 2020Nov 2020Jan 20210.780.80.820.840.860.88May 2020Jul 2020Sep 2020Nov 2020Jan 20210.550.60.650.70.75MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeROC AUCF1PrecisionRecallSpecificityAccuracyRealized ROC AUCRealized F1Realized PrecisionRealized RecallRealized SpecificityRealized AccuracyReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression-RMSE.svg b/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression-RMSE.svg index 53fcfe142..dd7e55b31 100644 --- a/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression-RMSE.svg +++ b/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression-RMSE.svg @@ -1 +1 @@ -Feb 52017Feb 19Mar 5900950100010501100MetricAlertThresholdRealized performanceTimeRMSERealized RMSEReferenceAnalysis \ No newline at end of file +Jan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 12900950100010501100MetricAlertThresholdRealized performanceTimeRMSERealized RMSEReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression.svg b/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression.svg index 710beddab..2dc83055d 100644 --- a/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression.svg +++ b/docs/_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression.svg @@ -1 +1 @@ -Feb 52017Feb 19Mar 5700750800850Feb 52017Feb 19Mar 50.230.240.250.26Feb 52017Feb 19Mar 50.8M0.9M1M1.1M1.2MFeb 52017Feb 19Mar 50.070.080.090.1Feb 52017Feb 19Mar 5900950100010501100Feb 52017Feb 19Mar 50.260.270.280.290.30.310.320.33MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeMAEMAPEMSEMSLERMSERMSLERealized MAERealized MAPERealized MSERealized MSLERealized RMSERealized RMSLEReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 12700750800850Jan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 120.230.240.250.26Jan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 120.8M0.9M1M1.1M1.2MJan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 120.070.080.090.1Jan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 12900950100010501100Jan 292017Feb 5Feb 12Feb 19Feb 26Mar 5Mar 120.260.270.280.290.30.310.320.33MetricAlertThresholdRealized performanceTimeTimeTimeTimeTimeTimeMAEMAPEMSEMSLERMSERMSLERealized MAERealized MAPERealized MSERealized MSLERealized RMSERealized RMSLEReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_estimation/binary/tutorial-business-value-estimation-binary-car-loan-analysis-with-ref.svg b/docs/_static/tutorials/performance_estimation/binary/tutorial-business-value-estimation-binary-car-loan-analysis-with-ref.svg index feb3df4dd..bb673f349 100644 --- a/docs/_static/tutorials/performance_estimation/binary/tutorial-business-value-estimation-binary-car-loan-analysis-with-ref.svg +++ b/docs/_static/tutorials/performance_estimation/binary/tutorial-business-value-estimation-binary-car-loan-analysis-with-ref.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 201944454647484950MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeBusiness ValueEstimated Business ValueReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 201944454647484950MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeBusiness ValueEstimated Business ValueReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_estimation/binary/tutorial-confusion-matrix-estimation-binary-car-loan-analysis-with-ref.svg b/docs/_static/tutorials/performance_estimation/binary/tutorial-confusion-matrix-estimation-binary-car-loan-analysis-with-ref.svg index 5a688ad62..417e3e45f 100644 --- a/docs/_static/tutorials/performance_estimation/binary/tutorial-confusion-matrix-estimation-binary-car-loan-analysis-with-ref.svg +++ b/docs/_static/tutorials/performance_estimation/binary/tutorial-confusion-matrix-estimation-binary-car-loan-analysis-with-ref.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20190.430.440.450.460.470.480.490.5Jan 2018Jul 2018Jan 2019Jul 20190.420.440.460.480.5Jan 2018Jul 2018Jan 2019Jul 20190.0150.020.0250.030.035Jan 2018Jul 2018Jan 2019Jul 20190.030.040.050.060.07MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeTimeTimeTrue PositiveTrue NegativeFalse PositiveFalse NegativeEstimated True PositiveEstimated True NegativeEstimated False PositiveEstimated False NegativeReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20190.430.440.450.460.470.480.490.5Jan 2018Jul 2018Jan 2019Jul 20190.420.440.460.480.5Jan 2018Jul 2018Jan 2019Jul 20190.0150.020.0250.030.035Jan 2018Jul 2018Jan 2019Jul 20190.030.040.050.060.07MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeTimeTimeTrue PositiveTrue NegativeFalse PositiveFalse NegativeEstimated True PositiveEstimated True NegativeEstimated False PositiveEstimated False NegativeReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_estimation/binary/tutorial-custom-metric-estimation-binary-car-loan-analysis-with-ref.svg b/docs/_static/tutorials/performance_estimation/binary/tutorial-custom-metric-estimation-binary-car-loan-analysis-with-ref.svg index c0a7e958e..25789d355 100644 --- a/docs/_static/tutorials/performance_estimation/binary/tutorial-custom-metric-estimation-binary-car-loan-analysis-with-ref.svg +++ b/docs/_static/tutorials/performance_estimation/binary/tutorial-custom-metric-estimation-binary-car-loan-analysis-with-ref.svg @@ -6,7 +6,7 @@ - 2023-11-13T16:41:52.310731 + 2023-11-16T09:38:48.813602 image/svg+xml @@ -41,12 +41,12 @@ z - - + @@ -91,7 +91,7 @@ z - + @@ -157,7 +157,7 @@ z - + @@ -172,7 +172,7 @@ z - + @@ -199,7 +199,7 @@ z - + @@ -231,7 +231,7 @@ z - + @@ -247,7 +247,7 @@ z - + @@ -263,7 +263,7 @@ z - + @@ -507,12 +507,12 @@ z - - + @@ -561,7 +561,7 @@ z - + @@ -578,7 +578,7 @@ z - + @@ -595,7 +595,7 @@ z - + @@ -646,7 +646,7 @@ z - + @@ -663,7 +663,7 @@ z - + @@ -701,7 +701,7 @@ z - + @@ -993,9 +993,9 @@ L 176.355215 80.009026 L 193.442297 55.619807 L 210.529378 53.568 L 227.616459 55.049441 -" clip-path="url(#p9d2a81dc7a)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pb71e90046c)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> - - - - - - - - - - - - + + + + + + + + + + + @@ -1031,9 +1031,9 @@ L 347.226029 292.990431 L 364.31311 294.085316 L 381.400191 272.617637 L 398.487273 285.982147 -" clip-path="url(#p9d2a81dc7a)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> +" clip-path="url(#pb71e90046c)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> - - - - - - - - - - - - + + + + + + + + + + + +" clip-path="url(#pb71e90046c)" style="fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square"/> - + @@ -1209,7 +1209,7 @@ L 337.366875 69.248562 L 347.366875 69.248562 " style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> - + @@ -1229,7 +1229,7 @@ L 347.366875 69.248562 - + diff --git a/docs/_static/tutorials/performance_estimation/binary/tutorial-performance-estimation-binary-car-loan-analysis-with-ref.svg b/docs/_static/tutorials/performance_estimation/binary/tutorial-performance-estimation-binary-car-loan-analysis-with-ref.svg index d151166c6..8a63a7125 100644 --- a/docs/_static/tutorials/performance_estimation/binary/tutorial-performance-estimation-binary-car-loan-analysis-with-ref.svg +++ b/docs/_static/tutorials/performance_estimation/binary/tutorial-performance-estimation-binary-car-loan-analysis-with-ref.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20190.9550.960.9650.970.975Jan 2018Jul 2018Jan 2019Jul 20190.90.910.920.930.940.95Jan 2018Jul 2018Jan 2019Jul 20190.890.90.910.920.930.940.950.96MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeTimeROC AUCAccuracyF1Estimated ROC AUCEstimated AccuracyEstimated F1ReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20190.9550.960.9650.970.975Jan 2018Jul 2018Jan 2019Jul 20190.90.910.920.930.940.95Jan 2018Jul 2018Jan 2019Jul 20190.890.90.910.920.930.940.950.96MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeTimeROC AUCAccuracyF1Estimated ROC AUCEstimated AccuracyEstimated F1ReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_estimation/multiclass/tutorial-confusion-matrix-estimation-multiclass-analysis-with-ref.svg b/docs/_static/tutorials/performance_estimation/multiclass/tutorial-confusion-matrix-estimation-multiclass-analysis-with-ref.svg index 0c9811d3a..601382cae 100644 --- a/docs/_static/tutorials/performance_estimation/multiclass/tutorial-confusion-matrix-estimation-multiclass-analysis-with-ref.svg +++ b/docs/_static/tutorials/performance_estimation/multiclass/tutorial-confusion-matrix-estimation-multiclass-analysis-with-ref.svg @@ -1 +1 @@ -May 2020Jul 2020Sep 2020Nov 2020Jan 20210.140.160.180.20.220.240.260.28May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.070.08May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.220.240.260.28May 2020Jul 2020Sep 2020Nov 2020Jan 20210.0350.040.0450.050.0550.060.065May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.0350.040.0450.050.055May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.180.20.220.240.26MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeTimeTimeTimeTimeTimeTimeTimetrue class: 'prepaid_card', predicted class: 'prepaid_card'true class: 'prepaid_card', predicted class: 'highstreet_card'true class: 'prepaid_card', predicted class: 'upmarket_card'true class: 'highstreet_card', predicted class: 'prepaid_card'true class: 'highstreet_card', predicted class: 'highstreet_card'true class: 'highstreet_card', predicted class: 'upmarket_card'true class: 'upmarket_card', predicted class: 'prepaid_card'true class: 'upmarket_card', predicted class: 'highstreet_card'true class: 'upmarket_card', predicted class: 'upmarket_card'Estimated true class: 'prepaid_card', predicted class: 'prepaid_card'Estimated true class: 'prepaid_card', predicted class: 'highstreet_card'Estimated true class: 'prepaid_card', predicted class: 'upmarket_card'Estimated true class: 'highstreet_card', predicted class: 'prepaid_card'Estimated true class: 'highstreet_card', predicted class: 'highstreet_card'Estimated true class: 'highstreet_card', predicted class: 'upmarket_card'Estimated true class: 'upmarket_card', predicted class: 'prepaid_card'Estimated true class: 'upmarket_card', predicted class: 'highstreet_card'Estimated true class: 'upmarket_card', predicted class: 'upmarket_card'ReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +May 2020Jul 2020Sep 2020Nov 2020Jan 20210.140.160.180.20.220.240.260.28May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.070.08May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.220.240.260.28May 2020Jul 2020Sep 2020Nov 2020Jan 20210.0350.040.0450.050.0550.060.065May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.0350.040.0450.050.055May 2020Jul 2020Sep 2020Nov 2020Jan 20210.030.040.050.060.07May 2020Jul 2020Sep 2020Nov 2020Jan 20210.180.20.220.240.26MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeTimeTimeTimeTimeTimeTimeTimetrue class: 'prepaid_card', predicted class: 'prepaid_card'true class: 'prepaid_card', predicted class: 'highstreet_card'true class: 'prepaid_card', predicted class: 'upmarket_card'true class: 'highstreet_card', predicted class: 'prepaid_card'true class: 'highstreet_card', predicted class: 'highstreet_card'true class: 'highstreet_card', predicted class: 'upmarket_card'true class: 'upmarket_card', predicted class: 'prepaid_card'true class: 'upmarket_card', predicted class: 'highstreet_card'true class: 'upmarket_card', predicted class: 'upmarket_card'Estimated true class: 'prepaid_card', predicted class: 'prepaid_card'Estimated true class: 'prepaid_card', predicted class: 'highstreet_card'Estimated true class: 'prepaid_card', predicted class: 'upmarket_card'Estimated true class: 'highstreet_card', predicted class: 'prepaid_card'Estimated true class: 'highstreet_card', predicted class: 'highstreet_card'Estimated true class: 'highstreet_card', predicted class: 'upmarket_card'Estimated true class: 'upmarket_card', predicted class: 'prepaid_card'Estimated true class: 'upmarket_card', predicted class: 'highstreet_card'Estimated true class: 'upmarket_card', predicted class: 'upmarket_card'ReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/performance_estimation/multiclass_synthetic.svg b/docs/_static/tutorials/performance_estimation/multiclass_synthetic.svg index 90d5532f3..4e7ebd7dd 100644 --- a/docs/_static/tutorials/performance_estimation/multiclass_synthetic.svg +++ b/docs/_static/tutorials/performance_estimation/multiclass_synthetic.svg @@ -1 +1 @@ -May 2020Jul 2020Sep 2020Nov 2020Jan 20210.820.840.860.880.90.92May 2020Jul 2020Sep 2020Nov 2020Jan 20210.650.70.75MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeROC AUCF1Estimated ROC AUCEstimated F1ReferenceAnalysisReferenceAnalysis \ No newline at end of file +May 2020Jul 2020Sep 2020Nov 2020Jan 20210.820.840.860.880.90.92May 2020Jul 2020Sep 2020Nov 2020Jan 20210.650.70.75MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeTimeROC AUCF1Estimated ROC AUCEstimated F1ReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/avg-car_value.svg b/docs/_static/tutorials/stats/avg-car_value.svg index 3671ff582..16d4da440 100644 --- a/docs/_static/tutorials/stats/avg-car_value.svg +++ b/docs/_static/tutorials/stats/avg-car_value.svg @@ -1 +1 @@ -0510152030k35k40k45k50kMetricAlertThresholdConfidence bandAveraged ValuesChunkValues AvgValues Avg for car_valueReferenceAnalysis \ No newline at end of file +0510152030k35k40k45k50kMetricAlertThresholdConfidence bandAveraged ValuesChunkValues AvgValues Avg for car_valueReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/avg-debt_to_income_ratio.svg b/docs/_static/tutorials/stats/avg-debt_to_income_ratio.svg index e0aa9b86b..2502aa42e 100644 --- a/docs/_static/tutorials/stats/avg-debt_to_income_ratio.svg +++ b/docs/_static/tutorials/stats/avg-debt_to_income_ratio.svg @@ -1 +1 @@ -051015200.580.5850.590.595MetricThresholdConfidence bandAveraged ValuesChunkValues AvgValues Avg for debt_to_income_ratioReferenceAnalysis \ No newline at end of file +051015200.580.5850.590.595MetricThresholdConfidence bandAveraged ValuesChunkValues AvgValues Avg for debt_to_income_ratioReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/avg-driver_tenure.svg b/docs/_static/tutorials/stats/avg-driver_tenure.svg index 255b246e5..a6103d59d 100644 --- a/docs/_static/tutorials/stats/avg-driver_tenure.svg +++ b/docs/_static/tutorials/stats/avg-driver_tenure.svg @@ -1 +1 @@ -051015204.44.454.54.554.64.654.74.75MetricAlertThresholdConfidence bandAveraged ValuesChunkValues AvgValues Avg for driver_tenureReferenceAnalysis \ No newline at end of file +051015204.44.454.54.554.64.654.74.75MetricAlertThresholdConfidence bandAveraged ValuesChunkValues AvgValues Avg for driver_tenureReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/count.svg b/docs/_static/tutorials/stats/count.svg index bb9b76fa0..0fd632a69 100644 --- a/docs/_static/tutorials/stats/count.svg +++ b/docs/_static/tutorials/stats/count.svg @@ -1 +1 @@ -Nov 2018Jan 2019Mar 2019May 2019Jul 2019Sep 2019010002000300040005000MetricAlertThresholdRows CountTimeRows CountRows Count for rows_count \ No newline at end of file +Nov 2018Jan 2019Mar 2019May 2019Jul 2019Sep 2019010002000300040005000MetricAlertThresholdRows CountTimeRows CountRows Count for rows_count \ No newline at end of file diff --git a/docs/_static/tutorials/stats/median-car_value.svg b/docs/_static/tutorials/stats/median-car_value.svg index 26292f176..07222b86b 100644 --- a/docs/_static/tutorials/stats/median-car_value.svg +++ b/docs/_static/tutorials/stats/median-car_value.svg @@ -1 +1 @@ -0510152020k25k30k35k40k45kMetricAlertThresholdConfidence bandValues MedianChunkValues MedianValues Median for car_valueReferenceAnalysis \ No newline at end of file +0510152020k25k30k35k40k45kMetricAlertThresholdConfidence bandValues MedianChunkValues MedianValues Median for car_valueReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/median-debt_to_income_ratio.svg b/docs/_static/tutorials/stats/median-debt_to_income_ratio.svg index 107f175f8..6b83fc75d 100644 --- a/docs/_static/tutorials/stats/median-debt_to_income_ratio.svg +++ b/docs/_static/tutorials/stats/median-debt_to_income_ratio.svg @@ -1 +1 @@ -051015200.650.6550.660.6650.67MetricThresholdConfidence bandValues MedianChunkValues MedianValues Median for debt_to_income_ratioReferenceAnalysis \ No newline at end of file +051015200.650.6550.660.6650.67MetricThresholdConfidence bandValues MedianChunkValues MedianValues Median for debt_to_income_ratioReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/median-driver_tenure.svg b/docs/_static/tutorials/stats/median-driver_tenure.svg index 0872d4c58..5a949f858 100644 --- a/docs/_static/tutorials/stats/median-driver_tenure.svg +++ b/docs/_static/tutorials/stats/median-driver_tenure.svg @@ -1 +1 @@ -051015205.45.55.65.75.8MetricThresholdConfidence bandValues MedianChunkValues MedianValues Median for driver_tenureReferenceAnalysis \ No newline at end of file +051015205.45.55.65.75.8MetricThresholdConfidence bandValues MedianChunkValues MedianValues Median for driver_tenureReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/std-car_value.svg b/docs/_static/tutorials/stats/std-car_value.svg index 373e4e288..abda55f07 100644 --- a/docs/_static/tutorials/stats/std-car_value.svg +++ b/docs/_static/tutorials/stats/std-car_value.svg @@ -1 +1 @@ -0510152019k19.5k20k20.5k21k21.5k22k22.5k23kMetricAlertThresholdConfidence bandValues Standard DeviationChunkValues StdValues Std for car_valueReferenceAnalysis \ No newline at end of file +0510152019k19.5k20k20.5k21k21.5k22k22.5k23kMetricAlertThresholdConfidence bandValues Standard DeviationChunkValues StdValues Std for car_valueReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/std-debt_to_income_ratio.svg b/docs/_static/tutorials/stats/std-debt_to_income_ratio.svg index 99212628f..ad1bf1566 100644 --- a/docs/_static/tutorials/stats/std-debt_to_income_ratio.svg +++ b/docs/_static/tutorials/stats/std-debt_to_income_ratio.svg @@ -1 +1 @@ -051015200.1480.150.1520.1540.1560.1580.160.162MetricThresholdConfidence bandValues Standard DeviationChunkValues StdValues Std for debt_to_income_ratioReferenceAnalysis \ No newline at end of file +051015200.1480.150.1520.1540.1560.1580.160.162MetricThresholdConfidence bandValues Standard DeviationChunkValues StdValues Std for debt_to_income_ratioReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/std-driver_tenure.svg b/docs/_static/tutorials/stats/std-driver_tenure.svg index 11a1435d8..eef40b0fb 100644 --- a/docs/_static/tutorials/stats/std-driver_tenure.svg +++ b/docs/_static/tutorials/stats/std-driver_tenure.svg @@ -1 +1 @@ -051015202.242.262.282.32.322.342.362.382.4MetricAlertThresholdConfidence bandValues Standard DeviationChunkValues StdValues Std for driver_tenureReferenceAnalysis \ No newline at end of file +051015202.242.262.282.32.322.342.362.382.4MetricAlertThresholdConfidence bandValues Standard DeviationChunkValues StdValues Std for driver_tenureReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/sum-car_value.svg b/docs/_static/tutorials/stats/sum-car_value.svg index 2fee7d600..2d0e1e12d 100644 --- a/docs/_static/tutorials/stats/sum-car_value.svg +++ b/docs/_static/tutorials/stats/sum-car_value.svg @@ -1 +1 @@ -05101520140M160M180M200M220M240MMetricAlertThresholdConfidence bandSummed ValuesChunkValues SumValues Sum for car_valueReferenceAnalysis \ No newline at end of file +05101520140M160M180M200M220M240MMetricAlertThresholdConfidence bandSummed ValuesChunkValues SumValues Sum for car_valueReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/sum-debt_to_income_ratio.svg b/docs/_static/tutorials/stats/sum-debt_to_income_ratio.svg index 48540f84e..40433ff62 100644 --- a/docs/_static/tutorials/stats/sum-debt_to_income_ratio.svg +++ b/docs/_static/tutorials/stats/sum-debt_to_income_ratio.svg @@ -1 +1 @@ -05101520288029002920294029602980MetricThresholdConfidence bandSummed ValuesChunkValues SumValues Sum for debt_to_income_ratioReferenceAnalysis \ No newline at end of file +05101520288029002920294029602980MetricThresholdConfidence bandSummed ValuesChunkValues SumValues Sum for debt_to_income_ratioReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/stats/sum-driver_tenure.svg b/docs/_static/tutorials/stats/sum-driver_tenure.svg index 9fd6d181a..5caca7208 100644 --- a/docs/_static/tutorials/stats/sum-driver_tenure.svg +++ b/docs/_static/tutorials/stats/sum-driver_tenure.svg @@ -1 +1 @@ -0510152022k22.5k23k23.5kMetricAlertThresholdConfidence bandSummed ValuesChunkValues SumValues Sum for driver_tenureReferenceAnalysis \ No newline at end of file +0510152022k22.5k23k23.5kMetricAlertThresholdConfidence bandSummed ValuesChunkValues SumValues Sum for driver_tenureReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/thresholds/est_f1_default_thresholds.svg b/docs/_static/tutorials/thresholds/est_f1_default_thresholds.svg index a664328fa..528c65eba 100644 --- a/docs/_static/tutorials/thresholds/est_f1_default_thresholds.svg +++ b/docs/_static/tutorials/thresholds/est_f1_default_thresholds.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20190.890.90.910.920.930.940.950.96MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeF1Estimated F1ReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20190.890.90.910.920.930.940.950.96MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeF1Estimated F1ReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/thresholds/est_f1_inverted_thresholds.svg b/docs/_static/tutorials/thresholds/est_f1_inverted_thresholds.svg index 73945bafe..c7442a1e7 100644 --- a/docs/_static/tutorials/thresholds/est_f1_inverted_thresholds.svg +++ b/docs/_static/tutorials/thresholds/est_f1_inverted_thresholds.svg @@ -1 +1 @@ -Jan 2018Jul 2018Jan 2019Jul 20190.890.90.910.920.930.940.950.96MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeF1Estimated F1ReferenceAnalysis \ No newline at end of file +Jan 2018Jul 2018Jan 2019Jul 20190.890.90.910.920.930.940.950.96MetricAlertThresholdConfidence bandEstimated performance (CBPE)TimeF1Estimated F1ReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/working_with_results/comparison_plot.svg b/docs/_static/tutorials/working_with_results/comparison_plot.svg index e44ef9914..88b79cfcc 100644 --- a/docs/_static/tutorials/working_with_results/comparison_plot.svg +++ b/docs/_static/tutorials/working_with_results/comparison_plot.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.9550.960.9650.970.9750100200300400500ROC AUC (estimated ROC AUC)Confidence bandChi2 statistic (salary_range)AlertEstimated performance (CBPE) vs. Univariate driftTimeROC AUCChi2 statisticROC AUC (estimated ROC AUC) vs. Chi2 statistic (salary_range)ReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.9550.960.9650.970.9750100200300400500ROC AUC (estimated ROC AUC)Confidence bandChi2 statistic (salary_range)AlertEstimated performance (CBPE) vs. Univariate driftTimeROC AUCChi2 statisticROC AUC (estimated ROC AUC) vs. Chi2 statistic (salary_range)ReferenceAnalysis \ No newline at end of file diff --git a/docs/_static/tutorials/working_with_results/distribution_plot.svg b/docs/_static/tutorials/working_with_results/distribution_plot.svg index bd8aa715c..69ce5c942 100644 --- a/docs/_static/tutorials/working_with_results/distribution_plot.svg +++ b/docs/_static/tutorials/working_with_results/distribution_plot.svg @@ -1 +1 @@ -Nov 2018Jan 2019Mar 2019May 2019Jul 201900.20.40.60.81Column distributionsTimeValuessalary_range distribution (alerts for Chi2 statistic)Analysis \ No newline at end of file +Nov 2018Jan 2019Mar 2019May 2019Jul 201900.20.40.60.81Column distributionsTimeValuessalary_range distribution (alerts for Chi2 statistic)Analysis \ No newline at end of file diff --git a/docs/_static/tutorials/working_with_results/filtered_result_plot.svg b/docs/_static/tutorials/working_with_results/filtered_result_plot.svg index 62ddaa161..183d5875e 100644 --- a/docs/_static/tutorials/working_with_results/filtered_result_plot.svg +++ b/docs/_static/tutorials/working_with_results/filtered_result_plot.svg @@ -1 +1 @@ -Nov 2018Jan 2019Mar 2019May 2019Jul 2019Sep 20190100200300400500MethodAlertUnivariate drift metricsTimeChi2 statisticChi2 statistic for salary_range \ No newline at end of file +Nov 2018Jan 2019Mar 2019May 2019Jul 2019Sep 20190100200300400500MethodAlertUnivariate drift metricsTimeChi2 statisticChi2 statistic for salary_range \ No newline at end of file diff --git a/docs/_static/tutorials/working_with_results/result_plot.svg b/docs/_static/tutorials/working_with_results/result_plot.svg index 5d4c3a9f3..2043a8e0a 100644 --- a/docs/_static/tutorials/working_with_results/result_plot.svg +++ b/docs/_static/tutorials/working_with_results/result_plot.svg @@ -1 +1 @@ -Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.10.20.30.40.5Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.10.20.30.4Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.0060.0080.010.0120.0140.0160.0180.02Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.0050.010.0150.020.025Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.050.10.150.20.25Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019020040060080010001200Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.20.25Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190100200300400500Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190246Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190123456Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.020.040.060.080.1MethodAlertThresholdUnivariate drift metricsTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticChi2 statisticJensen-Shannon distanceChi2 statisticJensen-Shannon distanceChi2 statisticJensen-Shannon distanceChi2 statisticJensen-Shannon distanceJensen-Shannon distance for car_valueKolmogorov-Smirnov statistic for car_valueJensen-Shannon distance for debt_to_income_ratioKolmogorov-Smirnov statistic for debt_to_income_ratioJensen-Shannon distance for driver_tenureKolmogorov-Smirnov statistic for driver_tenureJensen-Shannon distance for loan_lengthKolmogorov-Smirnov statistic for loan_lengthJensen-Shannon distance for y_pred_probaKolmogorov-Smirnov statistic for y_pred_probaChi2 statistic for repaid_loan_on_prev_carJensen-Shannon distance for repaid_loan_on_prev_carChi2 statistic for salary_rangeJensen-Shannon distance for salary_rangeChi2 statistic for size_of_downpaymentJensen-Shannon distance for size_of_downpaymentChi2 statistic for y_predJensen-Shannon distance for y_predReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file +Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.10.20.30.40.5Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.10.20.30.4Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.0060.0080.010.0120.0140.0160.0180.02Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.0050.010.0150.020.025Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190.050.10.150.20.25Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 2019020040060080010001200Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.20.25Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190100200300400500Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.050.10.150.2Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190246Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.020.040.060.080.1Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 20190123456Jan 2018Apr 2018Jul 2018Oct 2018Jan 2019Apr 2019Jul 201900.020.040.060.080.1MethodAlertThresholdUnivariate drift metricsTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeTimeJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticJensen-Shannon distanceKolmogorov-Smirnov statisticChi2 statisticJensen-Shannon distanceChi2 statisticJensen-Shannon distanceChi2 statisticJensen-Shannon distanceChi2 statisticJensen-Shannon distanceJensen-Shannon distance for car_valueKolmogorov-Smirnov statistic for car_valueJensen-Shannon distance for debt_to_income_ratioKolmogorov-Smirnov statistic for debt_to_income_ratioJensen-Shannon distance for driver_tenureKolmogorov-Smirnov statistic for driver_tenureJensen-Shannon distance for loan_lengthKolmogorov-Smirnov statistic for loan_lengthJensen-Shannon distance for y_pred_probaKolmogorov-Smirnov statistic for y_pred_probaChi2 statistic for repaid_loan_on_prev_carJensen-Shannon distance for repaid_loan_on_prev_carChi2 statistic for salary_rangeJensen-Shannon distance for salary_rangeChi2 statistic for size_of_downpaymentJensen-Shannon distance for size_of_downpaymentChi2 statistic for y_predJensen-Shannon distance for y_predReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysisReferenceAnalysis \ No newline at end of file diff --git a/docs/datasets/binary_car_loan.rst b/docs/datasets/binary_car_loan.rst index ccb50639d..7ecbfaadf 100644 --- a/docs/datasets/binary_car_loan.rst +++ b/docs/datasets/binary_car_loan.rst @@ -23,8 +23,8 @@ A sample of the dataset can be seen below. .. code-block:: python >>> import nannyml as nml - >>> reference, analysis, analysis_targets = nml.load_synthetic_car_loan_dataset() - >>> display(reference.head(3)) + >>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset() + >>> display(reference_df.head(3)) +----+-------------+----------------+------------------------+---------------+---------------------------+-----------------------+-----------------+----------------+----------+----------+-------------------------+ @@ -79,9 +79,9 @@ same. You can access this dataset with: .. code-block:: python >>> import nannyml as nml - >>> reference, analysis, analysis_targets = nml.load_synthetic_car_loan_data_quality_dataset() + >>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_data_quality_dataset() >>> # let's show an instance where new and missing values are present. - >>> display(analysis.iloc[41515:41520]) + >>> display(analysis_df.iloc[41515:41520]) +-------+-------------+----------------+------------------------+---------------+---------------------------+-----------------------+-----------------+-------------------------+----------------+----------+----------+ | | car_value | salary_range | debt_to_income_ratio | loan_length | repaid_loan_on_prev_car | size_of_downpayment | driver_tenure | timestamp | y_pred_proba | period | y_pred | diff --git a/docs/datasets/california.rst b/docs/datasets/california.rst index 6646288a0..bd2873920 100644 --- a/docs/datasets/california.rst +++ b/docs/datasets/california.rst @@ -108,17 +108,17 @@ The data are now being split to satisfy NannyML format requirements. >>> df_for_nanny = df[df['partition']!='train'].reset_index(drop=True) >>> df_for_nanny['partition'] = df_for_nanny['partition'].map({'test':'reference', 'production':'analysis'}) - >>> reference = df_for_nanny[df_for_nanny['partition']=='reference'].copy() - >>> analysis = df_for_nanny[df_for_nanny['partition']=='analysis'].copy() - >>> analysis_target = analysis[['clf_target']].copy() - >>> analysis = analysis.drop('clf_target', axis=1) + >>> reference_df = df_for_nanny[df_for_nanny['partition']=='reference'].copy() + >>> analysis_df = df_for_nanny[df_for_nanny['partition']=='analysis'].copy() + >>> analysis_targets_df = analysis_df[['clf_target']].copy() + >>> analysis_df = analysis_df.drop('clf_target', axis=1) >>> # dropping partition column that is now removed from requirements. - >>> reference.drop('partition', axis=1, inplace=True) - >>> analysis.drop('partition', axis=1, inplace=True) + >>> reference_df.drop('partition', axis=1, inplace=True) + >>> analysis_df.drop('partition', axis=1, inplace=True) -The ``reference`` dataframe represents the reference :term:`Data Period` and the ``analysis`` -dataframe represents the analysis period. The ``analysis_target`` dataframe contains the targets +The ``reference_df`` dataframe represents the reference :term:`Data Period` and the ``analysis_df`` +dataframe represents the analysis period. The ``analysis_targets_df`` dataframe contains the targets for the analysis period, which is provided separately. diff --git a/docs/datasets/regression.rst b/docs/datasets/regression.rst index 24ed24b60..a9aa834cd 100644 --- a/docs/datasets/regression.rst +++ b/docs/datasets/regression.rst @@ -23,8 +23,8 @@ A sample of the dataset can be seen below. .. code-block:: python >>> import nannyml as nml - >>> reference, analysis, analysis_targets = nml.datasets.load_synthetic_car_price_dataset() - >>> display(reference.head()) + >>> reference_df, analysis_df, analysis_targets_df = nml.datasets.load_synthetic_car_price_dataset() + >>> display(reference_df.head()) +----+-----------+-------------+-------------+------------------+--------------+----------+----------------+----------+----------+-------------------------+ | | car_age | km_driven | price_new | accident_count | door_count | fuel | transmission | y_true | y_pred | timestamp | diff --git a/docs/datasets/titanic.rst b/docs/datasets/titanic.rst index 0d25802c4..46b69f917 100644 --- a/docs/datasets/titanic.rst +++ b/docs/datasets/titanic.rst @@ -27,8 +27,8 @@ A sample of the dataset can be seen below. .. code-block:: python >>> import nannyml as nml - >>> reference, analysis, analysis_targets = nml.load_titanic_dataset() - >>> reference.head() + >>> reference_df, analysis_df, analysis_targets_df = nml.load_titanic_dataset() + >>> reference_df.head() +----+---------------+----------+-----------------------------------------------------+--------+-------+---------+---------+------------------+---------+---------+------------+--------+--------+---------------------------------------------------+------------+ | | PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | boat | body | home.dest | Survived | diff --git a/docs/example_notebooks/California-Housing.ipynb b/docs/example_notebooks/California-Housing.ipynb index 84ed03a43..36c6d40ac 100644 --- a/docs/example_notebooks/California-Housing.ipynb +++ b/docs/example_notebooks/California-Housing.ipynb @@ -798,7 +798,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Datasets - Multiclass.ipynb b/docs/example_notebooks/Datasets - Multiclass.ipynb index c899cf58d..2bfd83917 100644 --- a/docs/example_notebooks/Datasets - Multiclass.ipynb +++ b/docs/example_notebooks/Datasets - Multiclass.ipynb @@ -165,8 +165,8 @@ ], "source": [ "import nannyml as nml\n", - "reference, analysis, analysis_targets = nml.load_synthetic_multiclass_classification_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_multiclass_classification_dataset()\n", + "display(reference_df.head())" ] }, { @@ -199,16 +199,8 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "375d3449-b097-4163-9aed-2cb40870e759", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -227,7 +219,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Examples California Housing.ipynb b/docs/example_notebooks/Examples California Housing.ipynb index d3e5e18b4..983f1ea9f 100644 --- a/docs/example_notebooks/Examples California Housing.ipynb +++ b/docs/example_notebooks/Examples California Housing.ipynb @@ -111,8 +111,8 @@ "source": [ "import pandas as pd\n", "import nannyml as nml\n", - "reference, analysis, analysis_targets = nml.datasets.load_modified_california_housing_dataset()\n", - "reference.head(3)" + "reference_df, analysis_df, analysis_targets_df = nml.datasets.load_modified_california_housing_dataset()\n", + "reference_df.head(3)" ] }, { @@ -138,7 +138,7 @@ } ], "source": [ - "print(reference.head(3).to_markdown(tablefmt=\"grid\"))" + "print(reference_df.head(3).to_markdown(tablefmt=\"grid\"))" ] }, { @@ -151,29 +151,29 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] } @@ -188,8 +188,8 @@ " problem_type='classification_binary',\n", " chunk_period='M',\n", " metrics=['roc_auc'])\n", - "cbpe.fit(reference_data=reference)\n", - "est_perf = cbpe.estimate(analysis)" + "cbpe.fit(reference_data=reference_df)\n", + "est_perf = cbpe.estimate(analysis_df)" ] }, { @@ -395,7 +395,15 @@ "execution_count": null, "id": "89604418", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "fig.write_image(file=f\"../_static/example_california_performance.svg\")" ] @@ -421,8 +429,8 @@ "from sklearn.metrics import roc_auc_score\n", "import matplotlib.pyplot as plt\n", "# add ground truth to analysis\n", - "analysis_full = pd.merge(analysis, analysis_targets, left_index=True, right_index=True)\n", - "df_all = pd.concat([reference, analysis_full]).reset_index(drop=True)\n", + "analysis_full = pd.merge(analysis_df, analysis_targets_df, left_index=True, right_index=True)\n", + "df_all = pd.concat([reference_df, analysis_full]).reset_index(drop=True)\n", "df_all['timestamp'] = pd.to_datetime(df_all['timestamp'])\n", "# calculate actual ROC AUC\n", "target_col = cbpe.y_true\n", @@ -466,8 +474,8 @@ "from sklearn.metrics import roc_auc_score\n", "import matplotlib.pyplot as plt\n", "# add ground truth to analysis\n", - "analysis_full = pd.merge(analysis, analysis_targets, left_index=True, right_index=True)\n", - "df_all = pd.concat([reference, analysis_full]).reset_index(drop=True)\n", + "analysis_full = pd.merge(analysis_df, analysis_targets_df, left_index=True, right_index=True)\n", + "df_all = pd.concat([reference_df, analysis_full]).reset_index(drop=True)\n", "df_all['timestamp'] = pd.to_datetime(df_all['timestamp'])\n", "# calculate actual ROC AUC\n", "target_col = cbpe.y_true\n", @@ -500,7 +508,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/base.py:303: FutureWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/base.py:303: FutureWarning:\n", "\n", "The behavior of indexing on a MultiIndex with a nested sequence of labels is deprecated and will change in a future version. `series.loc[label, sequence]` will raise if any members of 'sequence' or not present in the index's second level. To retain the old behavior, use `series.index.isin(sequence, level=1)`\n", "\n" @@ -604,15 +612,15 @@ ], "source": [ "feature_column_names = [\n", - " col for col in reference\n", + " col for col in reference_df\n", " if col not in ['y_pred', 'y_pred_proba', 'clf_target', 'timestamp']]\n", "\n", "univariate_calculator = nml.UnivariateDriftCalculator(column_names=feature_column_names,\n", " timestamp_column_name='timestamp',\n", " chunk_period='M',\n", " continuous_methods=['kolmogorov_smirnov'],\n", - " categorical_methods=['chi2']).fit(reference_data=reference)\n", - "univariate_results = univariate_calculator.calculate(analysis)\n", + " categorical_methods=['chi2']).fit(reference_data=reference_df)\n", + "univariate_results = univariate_calculator.calculate(analysis_df)\n", "nml.AlertCountRanker().rank(univariate_results)" ] }, @@ -796,6 +804,13 @@ "id": "2d1b6470", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsMAAAINCAYAAADbbnKGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAClrElEQVR4nOzde1xUdf4/8NeZGe7CjCSKJjAgoqYSiErKulJWupaZXVxZ13K1bJO00tzfbrvbat+1bdd1N0uWdVuN9dbWWuGt1VwFIy9gktpFK5WbCiJyB7nMnPP7A2ecOzPDDDDweu6jzXPOZ875IARv3vP+vD+CJEkSiIiIiIh6IVlXT4CIiIiIqKswGCYiIiKiXovBMBERERH1WgyGiYiIiKjXYjBMRERERL0Wg2EiIiIi6rUYDBMRERFRr8VgmIiIiIh6LUVXT8ATiaKIK1euIDAwEIIgdPV0iIiIiMiEJEmoq6vDoEGDIJNZz/8yGHbClStXEBYW1tXTICIiIqJ2lJSUYPDgwVavMxh2QmBgIIC2v9ygoKAung0RERERmaqtrUVYWJg+brOGwbATdKURQUFBDIaJiIiIurH2Slq5gI6IiIiIei0Gw0RERETUazEYJiIiIqJeizXDRERERCYkSYJGo4FWq+3qqZAVcrkcCoWiw21uGQwTERERGWhpaUFpaSkaGxu7eirUDn9/fwwcOBDe3t5O34PBMBEREdFNoiiioKAAcrkcgwYNgre3NzfY6oYkSUJLSwuuXbuGgoICDB061ObGGrYwGCYiIiK6qaWlBaIoIiwsDP7+/l09HbLBz88PXl5eKCoqQktLC3x9fZ26DxfQEREREZlwNstIncsVnyd+pomIiIio12IwTERERES9FoNhIiIiol5EEARkZma6/TnJycl44YUX3P6cjmIwTERERNRDlJWVYcmSJYiKioKPjw/CwsIwY8YMHDx4sKunZpfi4mI88MAD8Pf3R//+/bFixQpoNBq3PpPdJIiIiIh6gMLCQiQlJUGlUmHNmjUYPXo0WltbsX//fqSmpuLcuXNdPUWbtFotHnjgAYSGhuLo0aMoLS3FE088AS8vL7z22mtuey4zw0REREQ9wOLFiyEIAvLy8vDoo48iJiYGI0eOxLJly3D8+HGjsRUVFZg1axb8/f0xdOhQ7Nq1S38tIyMDKpXKaHxmZqZRv+WVK1ciLi4OW7ZsgVqthlKpxJw5c1BXV2d1fnv37oVSqcS2bdssXv/kk0/wzTffYOvWrYiLi8OPfvQj/N///R/S0tLQ0tLixN+IfRgMExEREXm4yspK7Nu3D6mpqQgICDC7bhrcrlq1CrNnz8aZM2cwffp0zJ07F5WVlQ4988KFC8jMzMSePXuwZ88eHD58GK+//rrFsdu3b0dKSgq2bduGuXPnWhxz7NgxjB49GgMGDNCfmzp1Kmpra/H11187NDdHMBgmIiIicgONVsS6/32Pn/4zF+v+9z00WtFtzzp//jwkScLw4cPtGj9//nykpKQgOjoar732Gurr65GXl+fQM0VRREZGBkaNGoVJkyZh3rx5FmuT09LSsHjxYuzevRsPPvig1fuVlZUZBcIA9MdlZWUOzc0RrBkmlxBFDQqL0lFdfQIq1TioI56FTMYvLyIi6r3Ssi7gjf99BwnAkfMVAIDn7x3qlmdJkuTQ+NjYWP2fAwICEBQUhPLycofuoVarERgYqD8eOHCg2T127NiB8vJyHDlyBOPGjXPo/p2FmWFyicKidBQUrENV1REUFKxDYVF6V0+JiIioS50orIQuRJVuHrvL0KFDIQiC3YvkvLy8jI4FQYAotmWuZTKZWXDd2trq0D104uPjERISgk2bNrUbsIeGhuLq1atG53THoaGhNl/bEQyGySWqq08ABv/Jtx0TERH1XuPUwdAtORNuHrtLcHAwpk6dirS0NDQ0NJhdr66utvteISEhqKurM7rPqVOnnJrXkCFDkJWVhZ07d2LJkiU2x06YMAFffvmlUXb5wIEDCAoKwh133OHU8+3B97F7GNNyhfCwp1Fc8rbdx86WN6hU41BVdRRtAbEAlap7vhVCRETUWVLvHgKgLSM8Th2sP3aXtLQ0JCUlYfz48Xj11VcRGxsLjUaDAwcOID09HWfPnrXrPomJifD398fLL7+MpUuXIjc3FxkZGU7PKyYmBllZWUhOToZCocAbb7xhcdz999+PO+64A/PmzcOf/vQnlJWV4Te/+Q1SU1Ph4+Pj9PPbw2C4h9GVKwASqqqOoqrqOKqrc28eH0FBwVsAtACAqqojqKw8hpqaPP14AIiKtP2bmyXqiGcBwCioJiIi6s0UcpnbaoQtiYqKQn5+PlavXo3ly5ejtLQUISEhSEhIQHq6/eWLwcHB2Lp1K1asWIG3334bU6ZMwcqVK7Fo0SKn5zZs2DAcOnQIycnJkMvlWLt2rdkYuVyOPXv24Nlnn8WECRMQEBCAJ598Eq+++qrTz7WHIDlacU2ora2FUqlETU0NgoKCuno6RvK/eAJVVUf0xwqFEhpNjdXxMpkPRLFZf9y3bxLGxG926xyJiIi6q6amJhQUFCAyMhK+vr5dPR1qh63Pl73xGmuGe5i28oRbFUp9+owwODYnk/kYjWd5AxEREfUmLJPoYUzLFXQ1wYblEYZuv30eZDIvljcQERFRr8RguIcwXTgXd+cm/UK4qMglqKw8erM2+BZB8EFU5FKn+wGztzARERF5OkYuPYTpwjnAeCGcIJh/qsPDn+pQ8NreM4mIiIi6O9YM9xDt9fnt23e80bFKdReiIpe69ZlERERE3R0zwz1Ee31+LbU+62hJA3sLExERkadjMNxDtNfnVyZTuLyEgb2FiYiIyNMxGO4h3BHsdsdnEhEREbkSa4aJiIiIehFBEJCZmen25yQnJ+OFF15w+3M6isEwERERUQ9RVlaGJUuWICoqCj4+PggLC8OMGTNw8ODBrp6aXZYuXYqEhAT4+PggLi6uU57JMgkiIiKiHqCwsBBJSUlQqVRYs2YNRo8ejdbWVuzfvx+pqak4d+5cV0/RLgsWLEBubi7OnDnTKc9jZpiIiIioB1i8eDEEQUBeXh4effRRxMTEYOTIkVi2bBmOHz9uNLaiogKzZs2Cv78/hg4dil27dumvZWRkQKVSGY3PzMyEIAj645UrVyIuLg5btmyBWq2GUqnEnDlzUFdXZ3V+e/fuhVKpxLZt26yOefPNN5GamoqoqCgHP3rnMRgmIiIi8nCVlZXYt28fUlNTERAQYHbdNLhdtWoVZs+ejTNnzmD69OmYO3cuKisrHXrmhQsXkJmZiT179mDPnj04fPgwXn/9dYtjt2/fjpSUFGzbtg1z58516DnuxmCYiIiIyMOdP38ekiRh+PDhdo2fP38+UlJSEB0djddeew319fXIy8tz6JmiKCIjIwOjRo3CpEmTMG/ePIu1yWlpaVi8eDF2796NBx980KFndAbWDBMRERG5g1YD5KwFio8B4ROAScsBuXtCL0mS2h9kIDY2Vv/ngIAABAUFoby83KF7qNVqBAYG6o8HDhxodo8dO3agvLwcR44cwbhx3XNzLmaGiYiIiNwhZy2Q/QfgYlbbv3PWuu1RQ4cOhSAIdi+S8/LyMjoWBAGiKAIAZDKZWXDd2trq0D104uPjERISgk2bNjkcsHcWBsNkkyhqcLHgLeR/8QQuFrwFUdR09ZSIiIg8Q/ExALoAULp57B7BwcGYOnUq0tLS0NDQYHa9urra7nuFhISgrq7O6D6nTp1yal5DhgxBVlYWdu7ciSVLuudGXQyGyabConQUFKxDVdURFBSsQ2FReldPiYiIyDOETwCg68Ag3Dx2n7S0NGi1WowfPx4ffPABvv/+e5w9exZvvvkmJkyw/9mJiYnw9/fHyy+/jAsXLmD79u3IyMhwel4xMTHIysrCBx980O4mHOfPn8epU6dQVlaGGzdu4NSpUzh16hRaWlqcfn57WDNMNlVXn4Dhb7Vtx0RERNSuScvb/m1YM+xGUVFRyM/Px+rVq7F8+XKUlpYiJCQECQkJSE+3P5kVHByMrVu3YsWKFXj77bcxZcoUrFy5EosWLXJ6bsOGDcOhQ4eQnJwMuVyOtWstl4w89dRTOHz4sP44Pj4eAFBQUAC1Wu30820RpO5awNGN1dbWQqlUoqamBkFBQV09Hbe6WPAWCgrWoS0gFhAZ+TyiIrvn2xxEREQd1dTUhIKCAkRGRsLX17erp0PtsPX5sjdeY2aYbFJHPAugLUOsUo3THxMRERH1BAyGySaZTMFMMBEREfVYXEBHRERERL0Wg2EiIiIi6rUYDBMRERFRr8VgmIiIiIh6LS6g66FEUYPConSjLhAyGT/dRERERIYYHfVQup3jAAlVVUcBgF0hiIiIiEywTKKH4s5xRERERO1jMNxDqVTjYLgfetsxERER9XaCICAzM9Ptz0lOTsYLL7zg9ud0FIPhHkod8SwiI59H375JiIx8njvHERER9QJlZWVYsmQJoqKi4OPjg7CwMMyYMQMHDx7s6qm16/Tp00hJSUFYWBj8/PwwYsQIrFu3zu3PZc1wD8Wd44iIiHqXwsJCJCUlQaVSYc2aNRg9ejRaW1uxf/9+pKam4ty5c109RZtOnjyJ/v37Y+vWrQgLC8PRo0exaNEiyOVyPPfcc257LjPDRERERD3A4sWLIQgC8vLy8OijjyImJgYjR47EsmXLcPz4caOxFRUVmDVrFvz9/TF06FDs2rVLfy0jIwMqlcpofGZmJgRB0B+vXLkScXFx2LJlC9RqNZRKJebMmYO6ujqr89u7dy+USiW2bdtm8fqCBQuwbt06TJ48GVFRUfjpT3+Kn/3sZ/jwww+d+NuwH4NhIiIiIg9XWVmJffv2ITU1FQEBAWbXTYPbVatWYfbs2Thz5gymT5+OuXPnorKy0qFnXrhwAZmZmdizZw/27NmDw4cP4/XXX7c4dvv27UhJScG2bdswd+5cu59RU1OD4OBgh+blKAbDRERERG6gETVIP52Opz95Gumn06ERNW571vnz5yFJEoYPH27X+Pnz5yMlJQXR0dF47bXXUF9fj7y8PIeeKYoiMjIyMGrUKEyaNAnz5s2zWJuclpaGxYsXY/fu3XjwwQftvv/Ro0fx3nvvYdGiRQ7Ny1GsGSYiIiJyg7e/fBvpp9IhQUJuaS4A4Nk73bOgXZKk9gcZiI2N1f85ICAAQUFBKC8vd+gearUagYGB+uOBAwea3WPHjh0oLy/HkSNHMG6c/Z2tvvrqK8ycORO/+93vcP/99zs0L0cxM0xERETkBvlX8yHd7PkvQUL+1Xy3PWvo0KEQBMHuRXJeXl5Gx4IgQBRFAIBMJjMLrltbWx26h058fDxCQkKwadMmuwP2b775BlOmTMGiRYvwm9/8xq7XdASDYSIiIiI3GDNgDISbPf8FCBgzYIzbnhUcHIypU6ciLS0NDQ0NZterq6vtvldISAjq6uqM7nPq1Cmn5jVkyBBkZWVh586dWLKk/S5XX3/9Ne6++248+eSTWL16tVPPdBTLJIiIiIjc4OnRTwNoyxCPGTBGf+wuaWlpSEpKwvjx4/Hqq68iNjYWGo0GBw4cQHp6Os6ePWvXfRITE+Hv74+XX34ZS5cuRW5uLjIyMpyeV0xMDLKyspCcnAyFQoE33njD4rivvvoK99xzD6ZOnYply5ahrKwMACCXyxESEuL089vDYJiIiIjIDRQyhdtqhC2JiopCfn4+Vq9ejeXLl6O0tBQhISFISEhAenq63fcJDg7G1q1bsWLFCrz99tuYMmUKVq5c2aGFbMOGDcOhQ4eQnJwMuVyOtWvXmo3ZsWMHrl27hq1bt2Lr1q368xERESgsLHT62e0RJEcrrgm1tbVQKpWoqalBUFBQV0+HiIiIXKSpqQkFBQWIjIyEr69vV0+H2mHr82VvvMaaYSIiIiLqtRgMExEREVGvxZphcogoalBYlI7q6hNQqcZBHfEsZDJ+GREREZFnYhRDDiksSkdBwToAEqqqjgIAoiLbb5VCRERE1B2xTIIcUl19AoBuzaV085iIiIjIMzEYJoeoVOOAmw3EAeHmMREREZFnYpkEOUQd0dYv0bBmmIiIiMhTMRgmh8hkCtYIExERUY/BMgkiIiIi6rUYDBMRERH1IoIgIDMz0+3PSU5OxgsvvOD253QUg2EiIiKiHqKsrAxLlixBVFQUfHx8EBYWhhkzZuDgwYNdPbV2Xb9+HdOmTcOgQYP0c3/uuedQW1vr1ueyZpiIiIioBygsLERSUhJUKhXWrFmD0aNHo7W1Ffv370dqairOnTvX1VO0SSaTYebMmfj973+PkJAQnD9/HqmpqaisrMT27dvd91y33ZmIiIiIOs3ixYshCALy8vLw6KOPIiYmBiNHjsSyZctw/Phxo7EVFRWYNWsW/P39MXToUOzatUt/LSMjAyqVymh8ZmYmBEHQH69cuRJxcXHYsmUL1Go1lEol5syZg7q6Oqvz27t3L5RKJbZt22bxet++ffHss89i7NixiIiIwJQpU7B48WLk5OQ48bdhPwbDPYQoanCx4C3kf/EELha8BVHUdPWUiIiIqJNUVlZi3759SE1NRUBAgNl10+B21apVmD17Ns6cOYPp06dj7ty5qKysdOiZFy5cQGZmJvbs2YM9e/bg8OHDeP311y2O3b59O1JSUrBt2zbMnTvXrvtfuXIFH374ISZPnuzQvBzFYLiH0G2TXFV1BAUF61BYlN7VUyIiIurVJI0G19LSULxgIa6lpUHSuC9Rdf78eUiShOHDh9s1fv78+UhJSUF0dDRee+011NfXIy8vz6FniqKIjIwMjBo1CpMmTcK8efMs1ianpaVh8eLF2L17Nx588MF275uSkgJ/f3/cfvvtCAoKwj//+U+H5uUoBsM9BLdJJiIi6l4qNmxAxfo0NBw9ior1aajYsMFtz5Ikqf1BBmJjY/V/DggIQFBQEMrLyx26h1qtRmBgoP544MCBZvfYsWMHXnzxRRw4cMDuDO9f//pX5OfnY+fOnbhw4QKWLVvm0LwcxWC4h+A2yURERN3LjZP5gC5IlaS2YzcZOnQoBEGwe5Gcl5eX0bEgCBBFEUDbQjbT4Lq1tdWhe+jEx8cjJCQEmzZtsjtgDw0NxfDhw/HQQw9hw4YNSE9PR2lpqV2vdQaD4R5CHfEsIiOfR9++SYiMfJ7bJBMREXUxv4QxgG7RmSC0HbtJcHAwpk6dirS0NDQ0NJhdr66utvteISEhqKurM7rPqVOnnJrXkCFDkJWVhZ07d2LJEsd3sNUF183NzU493x4eEwyvXr0aEydOhL+/v1kRuM7SpUuRkJAAHx8fxMXFWRwjSRL+/Oc/IyYmBj4+Prj99tuxevVq9028k+i2SR4TvxlRkUsgk7FrHhERUVfq98wz6PdcKgImTkS/51LR75ln3Pq8tLQ0aLVajB8/Hh988AG+//57nD17Fm+++SYmTJhg930SExPh7++Pl19+GRcuXMD27duRkZHh9LxiYmKQlZWFDz74wOYmHB9//DHeeecdfPXVVygsLMTevXvx85//HElJSVCr1U4/vz0eEzG1tLTg8ccfx4QJE7Bx40ar4xYsWIDc3FycOXPG4vXnn38en3zyCf785z9j9OjRqKysdHj1JBEREVF7BIUCIampnfa8qKgo5OfnY/Xq1Vi+fDlKS0sREhKChIQEpKfbv7A+ODgYW7duxYoVK/D2229jypQpWLlyJRYtWuT03IYNG4ZDhw4hOTkZcrkca9euNRvj5+eHt99+Gy+++CKam5sRFhaGRx55BL/85S+dfq49BMnRiusulpGRgRdeeMFmun/lypXIzMw0S+mfPXsWsbGx+OqrrzBs2DCn51BbWwulUomamhoEBQU5fR8iIiLqXpqamlBQUIDIyEj4+vp29XSoHbY+X/bGax5TJuEKu3fvRlRUFPbs2YPIyEio1Wo89dRT7WaGm5ubUVtba/RPd8V+w0RERET261XB8MWLF1FUVIT//Oc/2Lx5MzIyMnDy5Ek89thjNl/3hz/8AUqlUv9PWFhYJ83Ycew3TERERGS/Lg2Gf/nLX0IQBJv/uHIfbVEU0dzcjM2bN2PSpElITk7Gxo0bkZWVhW+//dbq6371q1+hpqZG/09JSYnL5uRq7DdMREREZL8uXUC3fPlyzJ8/3+aYqKgolz1v4MCBUCgUiImJ0Z8bMWIEAKC4uNhqHbGPjw98fHxcNg93UqnGoarqKNoCYtf2GxZFDQqL0lFdfQIq1TioI55l1woiIiLyaF0ayYSEhCAkJKTTnpeUlASNRoMLFy5gyJAhAIDvvvsOABAREdFp83AnXX9hw4DVUEcCWl0JBiDdDLiBqEjHewYSERERdRcek9YrLi5GZWUliouLodVq9Z0ioqOj0adPHwBt+3LX19ejrKwMN27c0I+544474O3tjXvvvRdjxozBggUL8MYbb0AURaSmpuK+++4zyhZ7MplMAXXEsyhEW0BcCBgFvB0JaFmCQURERD2NxwTDr7zyCv71r3/pj+Pj4wEAWVlZSE5OBgA89dRTOHz4sNmYgoICqNVqyGQy7N69G0uWLMEPf/hDBAQE4Ec/+pHFXneezFbAW1WVB8OAtqoqFxcBuzLF7izBICIiIuoKHhMMZ2RktLv7SXZ2drv3GTRoED744APXTKqbqq42DnjbjnVEk7HHUF19DABQVXUEgPVMcXslGERERESexmOCYbKfJIk2jgWbr62sPG41GNZt+UxERETUU/SqPsO9h+mn1fDY9oaDNTXHcfBQDD7N+SEuXHyDm3YQERH1MIIgIDMz0+3PSU5OxgsvvOD253QUg+EeqG/f8biVARZuHt88Euz5lGvR2noZhYVvoaAgzR1TJCIiIjcoKyvDkiVLEBUVBR8fH4SFhWHGjBk4ePBgV0/NIdevX8fgwYMhCAKqq6vd+iyWSfRAtmp7Varx+kV19igs+gSCTMbewkRERN1cYWEhkpKSoFKpsGbNGowePRqtra3Yv38/UlNTXbqRmbstXLgQsbGxuHz5stufxcxwD6Sr7R0TvxlRkUuMgld1xLNQqe6y6z6SBLS2lnF7ZyIiIg+wePFiCIKAvLw8PProo4iJicHIkSOxbNkyHD9+3GhsRUUFZs2aBX9/fwwdOhS7du3SX8vIyIBKpTIan5mZCUG4te5o5cqViIuLw5YtW6BWq6FUKjFnzhzU1dVZnd/evXuhVCqxbds2mx9Heno6qqur8dJLLznw0TuPwXAvI5MpINj5aRcEwMurBewtTERE1L1VVlZi3759SE1NRUBAgNl10+B21apVmD17Ns6cOYPp06dj7ty5qKysdOiZFy5cQGZmJvbs2YM9e/bg8OHDeP311y2O3b59O1JSUrBt2zbMnTvX6j2/+eYbvPrqq9i8eTNkss4JUxkM90LVNSGQbsa3hv82/Ed3TqkcDcP6Y/YWJiIiso+oFXFibwF2rvsCJ/YWQNSK7b/ISefPn4ckSRg+fLhd4+fPn4+UlBRER0fjtddeQ319PfLy8tp/oQFRFJGRkYFRo0Zh0qRJmDdvnsXa5LS0NCxevBi7d+/Ggw8+aPV+zc3NSElJwZo1axAeHu7QXDqCxZ+90KWSWGg0hQhSXoUACRIE1NYMQHHxKABAePhXCFKWo7amP2TCfERGTmBvYSIiIged3FeEvN0FAIBLZ6sAAOMeiHTLsyTJdrcoU7Gxsfo/BwQEICgoCOXl5Q7dQ61WIzAwUH88cOBAs3vs2LED5eXlOHLkCMaNs51Q+9WvfoURI0bgpz/9qUPz6CgGw71QeLga2dmxVq8XF9+6du3aF5DJEjFp0mLI5XJotVpkZ2ejuLgY4eHhmDRpEuRyeWdMm4iIyKNcOV9t89iVhg4dCkEQ7F4k5+XlZXQsCAJEsS1zLZPJzILr1tZWh+6hEx8fj/z8fGzatAljx441qjs2dejQIXz55ZfYsWMHgFsBfr9+/fDrX/8aq1atsutjcxSD4V5o0qRJ0Gq1OHr0KLRarc2xN27cQHZ2Nk6dOoW4uDhIkqTf8vrixYsAoN8Om4iIiG4ZFK3SZ4R1x+4SHByMqVOnIi0tDUuXLjWrG66urjarG7YmJCQEdXV1aGho0N/n1KlTTs1ryJAhWLt2LZKTkyGXy7F+/XqrYz/44APcuHFDf3zixAksWLAAOTk5GDJkiFPPtweD4R5Gq9UiJyfHZuZWLpdjypQpSE5Oxpo1a9DU1NTufaurq5GdnY2+ffsanS8uLnbp/ImIiHqKhGkRANoywoOiVfpjd0lLS0NSUhLGjx+PV199FbGxsdBoNDhw4ADS09Nx9uxZu+6TmJgIf39/vPzyy1i6dClyc3ORkZHh9LxiYmKQlZWF5ORkKBQKvPHGGxbHmQa8FRUVAIARI0bYHcg7g8FwD5OTk4Ps7GwA7Wduc3Jy7AqEDZm+bRIWFsayCSIiIgtkcpnbaoQtiYqKQn5+PlavXo3ly5ejtLQUISEhSEhIQHq6/a1Rg4ODsXXrVqxYsQJvv/02pkyZgpUrV2LRokVOz23YsGE4dOiQPkO8du1ap+/laoLkaMU1oba2FkqlEjU1NQgKCurq6RjZvHmzPggG2v7DeOKJJ+waa4/w8HBERUXpg19RFPHpp5/qrycnJ7NsgoiIPFZTUxMKCgoQGRkJX1/frp4OtcPW58veeI2t1XoY01YkumPdwrfNmzcjOzsbWq3WqbYlxcXFKCwsREpKCpKTk83KJI4dO6a/PxEREVF3xzKJHmbSpEkAYFS2AFgun5g0aRIkScKZM2cAAH369EFJSUm7zygsLMT69etx2223obS01Ohac3MzsrOzUVBQgCeeeIIlE0RERNStMRjuYeRyucUyBdMMbnFxMeRyOQRBQFVV20rXqqoqRERE4PLly9BoNDafU1NTg5qaGqvXi4qKkJOTw5IJIiIi6tZYJtFLWCufMA2S5XI5fvCDH7jkmew0QURERN0dM8O9hK5coqioCJIkoaioCNnZ2QgLCzNaRBcWFmbWMNtZoihCq9WyVIKIiIi6LWaGewhLC+QM6conIiIiUFhYiIKCAmRnZ0OSJCQnJyMqKgrJycmQJMmoO0R7FArrv08VFhYiJyfH6Y+JiIiIyN2YGe4h7O0vbFq6cOnSJaPWa5s3b3bouQEBATZrh1kqQURERN0ZM8M9hKUFcpZYqx22dmytx6KPj4/ZbnQAzHaIcaZ9GxEREVFnYWa4hwgPDzeq/bUWhFprvdbe9U8//VTfgi0oKAhFRUVobm42u79KpUJcXJzV+xMRERF1JwyGe4hJkyZBFEV8+eWXANq2Tba0eM1S6zWtVoucnBybWyrffffduPvuuwHYLqVQq9Vsp0ZERNSNCYKAjz76CA8//LBbn5OcnIy4uDi88cYbbn1OR7FMooeQy+WQyWSoqqpCVVUVDh8+bPfiNV298cWLF5GdnY0tW7ZYXYgHmGedVSoV/Pz8oFarkZSU5JKPh4iIiBxXVlaGJUuWICoqCj4+PggLC8OMGTNw8ODBrp6aXQRBMPvn3//+t1ufycxwD2JaJ6xrn2Yr42vpdYWFhQCsL8QzLKUQRVE/vrCwEEeOHGFmmIiIqAsUFhYiKSkJKpUKa9aswejRo9Ha2or9+/cjNTUV586d6+op2uWdd97BtGnT9Mem65FcjZnhHsQ0YytJklHG99NPP7XYfs3WIrfi4mKztm1AW4D8xBNPQCaTmY0nIiKizrd48WIIgoC8vDw8+uijiImJwciRI7Fs2TIcP37caGxFRQVmzZoFf39/DB06FLt27dJfy8jIMAtAMzMzIQiC/njlypWIi4vDli1boFaroVQqMWfOHNTV1Vmd3969e6FUKrFt2zabH4dKpUJoaKj+H2uL+V2FwbCHMwxURVHE5MmT9T2DDb9oAeDMmTNGwbGujGLSpEn6XsNqtdroNeHh4WZlFLrXabVasw062D2CiIio81VWVmLfvn1ITU1FQECA2XXT4HbVqlWYPXs2zpw5g+nTp2Pu3LmorKx06JkXLlxAZmYm9uzZgz179uDw4cN4/fXXLY7dvn07UlJSsG3bNsydO9fmfVNTU9GvXz+MHz8emzZtgiRJDs3LUSyT8HCm/YUnT56M8PBwFBcXt/vFo8viGi6qM1xMp9uN7sSJExZfl5OToy+RAKCvGbanNIOIiKinE7Va5H70Pi6d+xqDh49E4qzZkLnpZ+L58+chSRKGDx9u1/j58+cjJSUFAPDaa6/hzTffRF5enlF5QntEUURGRgYCAwMBAPPmzcPBgwexevVqo3FpaWn49a9/jd27d2Py5Mk27/nqq6/innvugb+/Pz755BMsXrwY9fX1WLp0qd3zchSDYQ9nWpZw5swZVFVV6Y/VajVkMhnCw8MhiqLR7nKWsriGgXF2djYOHz5sNiY8PBxarRanT582Oi+TyXDkyBG7Nv8gIiLq6XI/eh9H/7MdgITiL9t+Zk54LMUtz3I0exobG6v/c0BAAIKCglBeXu7QPdRqtT4QBoCBAwea3WPHjh0oLy/HkSNHMG7cuHbv+dvf/lb/5/j4eDQ0NGDNmjUMhsk60/7CpmQymX6HOa1WC5lMZncPYNNA28/PD4mJiZg0aRJycnKMgm7dXOzd/IOIiKinu3TuawC6IFW6eeweQ4cOhSAIdi+S8/LyMjoWBEFf+iiTycyC69bWVofuoRMfH4/8/Hxs2rQJY8eONSvhbE9iYiL+7//+D83NzfDx8XHotfZiMOzhTDfJsJX9tdRjWMdSr2HTQHvAgAEoLi5GTk4OioqKjF6vUqkgiqLFAJmIiKg3Gjx85M2MsARAwODhI932rODgYEydOhVpaWlYunSpWd1wdXW13V0ZQkJCUFdXh4aGBv19Tp065dS8hgwZgrVr1yI5ORlyuRzr16936PWnTp1C37593RYIAwyGPZ4uwNUFsyUlJVCr1RAEAREREXbX8H766af6koiLFy/i008/RZ8+faBSqSAIAoKCgoxarimVSqPXV1dXGwXhffv2xZ133skd6IiIqNdKnDUbAIxqht0pLS0NSUlJGD9+PF599VXExsZCo9HgwIEDSE9Px9mzZ+26T2JiIvz9/fHyyy9j6dKlyM3NRUZGhtPziomJQVZWFpKTk6FQKKxuwrF7925cvXoVd911F3x9fXHgwAG89tpreOmll5x+tj0YDPcQhgvpgLY63eTkZGRnZ5vV8OrKHHQBclJSEnJzc43uJ4oiamtrrT6vpqbG5nzq6urcvvqTiIioO5PJ5W6rEbYkKioK+fn5WL16NZYvX47S0lKEhIQgISEB6enpdt8nODgYW7duxYoVK/D2229jypQpWLlyJRYtWuT03IYNG4ZDhw7pM8Rr1641G+Pl5YW0tDS8+OKLkCQJ0dHR+Mtf/oKnn37a6efaQ5AYsTistrYWSqUSNTU1CAoK6urpAGjbItmwpCEqKgpPPPGE2fnIyEhIkmTWBcLw2JK+ffualUDYQxeUExEReYKmpiYUFBQgMjLS7f1tqeNsfb7sjdfYZ7iHMK3N1R1b2ojDNPC1Z5HbyJEjERER4fC8uICOiIiIujOWSfQQutrcoqIiSJKk34o5KSkJAPR9g03boQEwW/lpSV5eHvz9/Y3OhYeHo6SkxGY5xO1h4VhbUIbcmnokKvvg+YgBUMgcW0lKRERE5C4Mhj2caReIsLAw/UK2goICADDqG1xdXe3Uc1paWtDS0mJ0Ti6X2wyEIyIikB8+FH8pLIMEIKeqHgCwPDLUqTl0NxpRwrqiqwz0iYiIPBiDYQ9nugNd3759ja7ryhQsbZLh6+uLpqYmp59tLRAWIeBkRAy2DQhDU3E5JLQFiBKA3Jp6p5/X3awtKMVfi9uai39aVY/04qs4lTQKfRTccY+IiMhTsGbYw7VXk6urGba0Scb48eORnJxsFkC3R6VSQa1Wo6yszOL1/IgYnIwYjjq/PmiFcaZUK7VlVHuCjZcrjI7rRQljjn3TYz4+IiKi3oDBsIczXSA3evRoqNVq+Pn5Qa1WG9UMG9I13nZ0gZuuf3BhYaHVrPKVoNsAKzvMHKmux7qiqw49s7tq0JrXWtdqtD3m4yMiIuoNWCbh4SztQKfrFlFYWIgjR44gOTnZbDc5lUpltEmGvWJjY1FSUmJ0TqFQQKPR6I8lQQAkyWpA/F5ZZY+or1UIArQWSkV6UikIERFRT8dg2MOZbrG8efNmo+unT59GcXExBg8ejMmTJ6OkpATh4eFm2ynbq7CwEGq12iiw1mWfT58+jerqatT7+lkNhAGguKkF64quumwhXVctZBvg44Xiphaz84nKPm5/NhEREbkGg+EeQtdVorKy0uh8VVUVqqqqcPHiRajVashkbZUxYWFh+m4TjigqKkJERATUajWuXr2KAQMG4Ac/+AG8vLwgCELbYj47Smbf72B22DAA1kpt5RdA20K298sqMTs02O1B8eMD+mKtSUlEkqotGCciIiLPwB3onNCddqDTBcGnT592aIe4yZMnQxAEFBUVoaqqyqGWa6a70emCbF3gnRcxDPkRw21mhwFghTrU6ezw2oIy/PlmyzZrklR98N6dQ9wWEGtECX8tLMOOq21/F48N6IsX1aEeX/5BRNSb9YYd6ARBwEcffYSHH37Yrc9JTk5GXFwc3njjDbc9gzvQkb61mqNbJesWzlVXVzvce9j096fCwkJcvHhRPwd7Q8F/XLqGJguL0OyRW1PfbgL6SHU97sg5g0fyv8fjX5zH2oIyl3Z6UMgErIgaiNwJdyB3wh1YETWQgTAREXWpsrIyLFmyBFFRUfDx8UFYWBhmzJiBgwcPdvXU7JaRkYHY2Fj4+vqif//+SE1NdevzWCbh4Zzd7rikpMSpMgkACAoKshpA9+3bF7UDBrebFQaAGo0WkZ+ewdKwEKyIGuRQIJmo7IOcqraAWAAwUdUHJU0tZjW8taKEozUNAIDPqnvWph9ERESGCgsLkZSUBJVKhTVr1mD06NFobW3F/v37kZqainPnznX1FNv1l7/8BWvXrsWaNWuQmJiIhoYGfWMAd2Fm2MOZtlazl2H3B0eVl5dbfeuooaEBd/rZ/zuWBGBdyTX8tdByz2Jrno8YgJfUofhh3z5YFjEAdykD2jpYtPOs49Xs9EBERD3T4sWLIQgC8vLy8OijjyImJgYjR47EsmXLcPz4caOxFRUVmDVrFvz9/TF06FDs2rVLfy0jI0PfglUnMzMTgkGia+XKlYiLi8OWLVugVquhVCoxZ84c1NXVWZ3f3r17oVQqsW3bNovXq6qq8Jvf/AabN2/GT37yEwwZMgSxsbF46KGHnPjbsB+DYQ83adIkpzbO6IimpiarPYZbWloQfPgT2LWKzsD7VyvbH2RAIROwPDIU78dFQyYI+EvRVRQ3t7b7OueKMoiIiLq3yspK7Nu3D6mpqQgICDC7bhrcrlq1CrNnz8aZM2cwffp0zJ0712wRfnsuXLiAzMxM7NmzB3v27MHhw4fx+uuvWxy7fft2pKSkYNu2bZg7d67FMQcOHIAoirh8+TJGjBiBwYMHY/bs2WYtXV2NwbCH07VW68xguD0ySAhqdmyb55KmVlxqarZ7vEaU8MeLpRiW8yXWtrOQznRuREREnUHSSqj9XxGu/fNL1P6vCJLWfT+Dzp8/D0mSMHz4cLvGz58/HykpKYiOjsZrr72G+vp65OXlOfRMURSRkZGBUaNGYdKkSZg3b57F2uS0tDQsXrwYu3fvxoMPPmj1fhcvXoQoinjttdfwxhtvYMeOHaisrMR9992HlhbzVqauwmC4hzAtlzD9DbCzLTjn2H9QADDu2Fm7x64ruoq/Fl1FjUbrULb3LlWgw/PqCTSihLUFZZh9yvULCYmIyLK6rGLU/q8YzeerUfu/YtRlObfOxx6ONgeLjY3V/zkgIABBQUEoLy936B5qtRqBgbd+rg4cONDsHjt27MCLL76IAwcOYPLkyTbvJ4oiWltb8eabb2Lq1Km466678O677+L7779HVlaWQ3NzBBfQ9RCmO9EVFRVZXOTm6+trtcTBlb4IH+rwayQATVoRvnLLv6MZ9hYuvGH5N0RfQUCTjW8Iz4SFODyvnmBd0VV9K7qcKi4kJCLqDM2FtTaPXWno0KEQBMHuRXJeXl5Gx4IgQBTb0ksymcwsuG5tNS9FtHUPnfj4eOTn52PTpk0YO3asUd2xqYEDBwIA7rjjDv25kJAQ9OvXz+mGAfZgZriH0JVL6OpwTAPhvn37Ijk5Wf+F5m6fBfV36nWT8s5ZzVrqArpPq+ot7vwGAGOC/G3eP9nG/Xsyw1Z0ErhlNBFRZ/BRB9k8dqXg4GBMnToVaWlpaGhoMLvuSBvVkJAQ1NXVGd3n1KlTTs1ryJAhyMrKws6dO7FkyRKbY3U72n777bf6c5WVlaioqEBERIRTz7cHg+EexrTvsC4Ifu6555CcnOx09wlHaWVyp15X0tRitbNEe72F5QASleaLBgxdam7FOpNd43qDRGUfff9nAdwymoioMwTeHY6ge8PhE61C0L3hCLzbvT+D09LSoNVqMX78eHzwwQf4/vvvcfbsWbz55puYMGGC3fdJTEyEv78/Xn75ZVy4cAHbt29HRkaG0/OKiYlBVlYWPvjgA7zwwgs2x82cORPPP/88jh49iq+++gpPPvkkhg8fjrvvvtvp57eHwXAPY/o2gi4YBoDs7GycPn26C2blmLTicot1rYYBnSVegoDPaxvbvf/bl671urpZw1Z0L6lDuWU0EVEnEOQCgu6NQMhToxF0bwQEuXs3ZoqKikJ+fj7uvvtuLF++HKNGjcJ9992HgwcPIj093e77BAcHY+vWrfj4448xevRovPvuu1i5cmWH5jZs2DAcOnQI7777LpYvX2513ObNm5GYmIgHHngAkydPhpeXF/bt22dWkuFK3I7ZCd1pO2ZT2dnZyM7O1h8nJycjOTnZ7Lwtvr6+EAQBPj4+Rm+rqFQqu99meXvidGgVXnZtvmGJAOAlk+2aDWuGxwUF4L2ySlwyaKc2URkAQRBwxM5ewssjBmBFVOeUjRARkWfoDdsx9yTcjpnM6PoOR0VFITk52Whhnb2amppw48YNVFdXQ61WIyoqCmq12qF6o3lHP2nbBMPJ37UkAO+VXjfK3hr2Fl4RNRCfJY5AkqoPVAo5klR9sP3OIQ61Tnu/9LpTcyMiIqKeg90kehjdQjqtVoucnBxs27YN4eHhCAsLw8WLF/XjFAqFxV3oBEEwWkEqCALCw8ORm5vr0Dx8oYG3thUtXj5OfyzFN+t7rXU98JXL8EF8NIBbWePiJuPVrnIBsNbW8UqL87vwERERUc/AzHAPpVtId/HiRWRnZ0OSJKOM8YoVK6BWq6FQGP8+ZLrATpIkZGdn48aNGw7P4bb6Wqczwzr2dj3QdZooutllIsLXGyvUobgwKRYrbtbKmuJudERERMTMcA9lWhZx6dIlPPHEExC1WuR+9D52rfk/DBs+Ej/9f/8Pnx05ou9PnJSUhCMGx0VFRUb3kclkZj0ErQmtqUCpql+747yFtsVxImBW72tv1wPTThMRft76jLLu3+OOfo0SgxrjwT7uK8YnIiIiz8BguIcKDw83KovQZXxzP3ofR/+zHYCE4i/bOkskP5Zi9Fpd9wmgbUFeQUGB/njw4MF21x+fHxBm1wI6UQLuUvVBanh/vFV0FTuutrWFe2xAX5tdDwwX1GmltkV3Eqy3DssaPxx3n/gWpU0tGOjrjaxxw4zukajsg+cjBkAhc+9qXyIiIuo+GAz3UKY70umOL537GjDYfqHk7FfAjndx6dzXGDx8JBJnzYZMfqtHcFJSEgoKCvQBsCML8Rq97VuFqwHw55u9hVdEDdR3eGgvUDXcVQ0AklR9IL+ZZbYURPdRyHFiwh1G59YWlHFnNiIiol6MwXAPoyuD0AW3P5071yi4HTx85M2M8M0cqiQZZYpFSUJryCB9EC2KolmphL0cqRY23BVNFwS/X1aprwG2FKialkaU3GjG46HByK2px7oi6INnW0E1d2YjIiLq3RgM9zCWyiAmPJaiD5JLzn6F20eMREVRAVqamnD5rHGm+NTZs7j29XcAgIsXLzrcY1GEgPyIGFwOuu3mLSW7SiUMSxtMM76A5UA1UdkHn1bdOlfc3Iq1N3eXMwyeDe9nGlQnKvsgp6reZnkFERER9VwMhj2MqNXi2I7t+PzjXdA0tXV4EGQyBPS9DaOT78Wlb7+BYXDbVhYBHP/w3zi2412z+5lmb2ubWgHvW5lkS+3XrM4NAvbETsQVVb+2AFgXCNsREA/29UZqeH8AlrddthSoPh8xwCh7bMgweLaV/dWVUxhmjYmIiKj3YGs1D5P70fs4/uF7+kAYACRRRP31azj2wbuouVpqMFrA4OEjAQDffJpl1/2lmusG7dAk9PG2//el/IiYW4EwYP5vG0qaWpBWXA7AfNvlCF9vvKQORWp4f6wtKMPsU+extqCtxnh2aLDFLZoNg2fD+5kG1YYbeSyPDOXiOSIi6vEEQUBmZqbbn5OcnIwXXnjB7c/pKGaGPYio1eLrwwdtjqm9Vq7/c2C/ECQ88DBErRZNDfbVwnpXtAXTWr8+kN+oR2tFGSIn3YeCikrLc7pZFlEadBtqff2d3n4ZuJWxtZStVcgEo8Vun1bV4/2ySjw2oC8mKANwtKZBf58IX2/MDg3W34fZXyIi6i3KysqwevVq7N27F5cvX0b//v0RFxeHF154AVOmTOnq6dmUkZGBn/3sZxavXb16Ff3793fLcxkMe5Dcj95HTXmZ3ePrKsrx1vzHHXqGAMCnotTonH91OSZPnoLDhw+bjc+PiMHnEcNvlUPYWSNsiS5jq8vWmjItnyhqasFfiq4i3NfbaJxhj2Fb9yMiIupJCgsLkZSUBJVKhTVr1mD06NFobW3F/v37kZqainPnznX1FG368Y9/jGnTphmdmz9/PpqamtwWCAMsk/Aouvpfd1H2D0X46DiEjYw1Ol9ztQzeFaX44Q9/aPaa0qDbjMoh5E4GwnKg3YytafkEcKvm2VoZBBERUW+xePFiCIKAvLw8PProo4iJicHIkSOxbNkyHD9+3GhsRUUFZs2aBX9/fwwdOhS7du3SX8vIyIBKpTIan5mZCcHgZ/zKlSsRFxeHLVu2QK1WQ6lUYs6cOairq7M6v71790KpVGLbtm0Wr/v5+SE0NFT/j1wux6FDh7Bw4UIn/jbsx2DYg+jqf90lsF9I23NGjMSER1Og7N+WTa0pL8PxHe/Cr/Iq1Gq1frwIAT5+fkb30Dr5bC3Qbr3u8xED8JI6FBEGmWABbZtzvHRzy+WX1KEsgyAiol6nsrIS+/btQ2pqKgICAsyumwa3q1atwuzZs3HmzBlMnz4dc+fORWWl5ZJIay5cuIDMzEzs2bMHe/bsweHDh/H6669bHLt9+3akpKRg27ZtmDt3rl3337x5M/z9/fHYY485NC9HMRj2IImzZptlbV3p0jdfovjLUzi2498QZDIoBxiWFrR1ppg7dy7UajX8/Pxw8c7xuOgX6JJn21Ovoyt3OJI4AisMgt8X1aFcBEdERN2OVqtFdnY2Nm/ejOzsbGi1zqaM2nf+/HlIkoThw4fbNX7+/PlISUlBdHQ0XnvtNdTX1yMvL8+hZ4qiiIyMDIwaNQqTJk3CvHnzcPCg+dqmtLQ0LF68GLt378aDDz5o9/03btyIn/zkJ/AzSby5GmuGPYhMLsdjv/4/5H70Pr4+/D/UlF9105MkFH95BqNuS0LkgBhca76Es9XHUPzlKbz501kA2r5wzg+KBlSueeK4IH+7x7qrBljSaFCxYQNunMyHX8IY9HvmGQgK/idCRETOycnJQXZ2NoC23v1AW4cFd5AkR7a6AmJjbyXXAgICEBQUhPLychuvMKdWqxEYeCspNnDgQLN77NixA+Xl5Thy5AjGjRtn972PHTuGs2fPYsuWLQ7NyRnMDHsYmVyOCY+lQDlgoHvuDxmSQ+cg8cZ9UF5RItQ/EqNUP8AdqolmY28vLTRow+YcOYAJQf54Ny66Q/exh6TR4FpaGooXLMS1tDRIJj2UKzZsQMX6NDQcPYqK9Wmo2LDB7XMiIqKeq7i42OaxKw0dOhSCINi9SM7Ly8voWBAEiKIIAJDJZGbBdWtrq0P30ImPj0dISAg2bdrkUMD+z3/+E3FxcUhISLD7Nc5iMOyh2uqHXVsOIIMMD4U/h/6+4VDIbn2BC4KAoUEJmDxgNu5QTYRw87l35R+Gstax+iIA6CMTcO4Ho1B2dxwu3x2HjxJi4Cvv2Jdie4Eu0H6we+Nk/q3gXpLajomIiJwUHh5u89iVgoODMXXqVKSlpaGhocHsenV1td33CgkJQV1dndF9Tp065dS8hgwZgqysLOzcuRNLliyx6zX19fV4//333b5wTofvAXuoxFmzAQBfHz7oULs1a7zhjZkRz0MQBKPVovrrMl+E+kdigJ8aAgR8XX0EMknEqO9O4cjYe2y2U/MWAF9BwOigAGyLjepw4GuJLtCFJKHh2DEAQEhqqtGY9oJdv4Qxba+92R7OL2GMy+dJRES9x6RJkwC0ZYTDw8P1x+6SlpaGpKQkjB8/Hq+++ipiY2Oh0Whw4MABpKen4+zZs3bdJzExEf7+/nj55ZexdOlS5ObmIiMjw+l5xcTEICsrC8nJyVAoFHjjjTdsjn/vvfeg0Wjw05/+1OlnOoLBsIfSlUskzpqN3I/ex6WzX0GSJFw6+zUk0fEC/YcilloNhAHozwuCgDuUE/FddR5a0Yq78g9DgoCTo+9Cs4+fPige7OOFSD9v3KUK1G+a4U72ZHVNg11Jq0HxgoX6+uB+zzyjv5fuHBERkbPkcrnbaoQtiYqKQn5+PlavXo3ly5ejtLQUISEhSEhIQHp6ut33CQ4OxtatW7FixQq8/fbbmDJlClauXIlFixY5Pbdhw4bh0KFDSE5Ohlwux9q1a62O3bhxIx555BGzDhjuIkiOVlwTamtroVQqUVNTg6CgoK6ejpEj723B8Q/fc/h1s9W/sBoIm5IkCVpJgw+K/qI/JwoyHB8zGfV3JuL+mGinA2BnF7FdS0vTZ4YhCOj3XKpZZtjw3pJWg8bcm6tmrYwnIqLep6mpCQUFBYiMjISvr29XT4faYevzZW+8xsxwDzPhsZ9AkMnw9eGDRlszu5IgCJCbfOnIJBETT2YhrKkSs6eudvre9pQ7WGKU1Y2PgySKRllfQaGAoFDo71W8wKAOifXBREREvRYX0PUwMrkcEx+fi1HJ98GRBXZnq4853JbFkrqqvh16vbOL2HSBbvimjYBMhut/S29bKPfWelz40XSzRXV+CWOMds5jfTAREVHvxMxwD9W2dbN9wa1w838dJ0djYxw0WhEKJxfJuWIRm1FADaC1pAQV69PQmJuL1tK2xYaB038Ev3Fj0fztd/AdPgy3ddKKVSIiIupePCYzvHr1akycOBH+/v5WC6qXLl2KhIQE+Pj4IC4uzuKY/fv346677kJgYCBCQkLw6KOPorCw0G3z7iq2Wq8poMDD4UsxW/0LzFb/Ao+rV2C46i67a4atkfmMhSAI+Ok/c6HRiu2/wIJ+zzyDfs+lImDiRPR7LtXhRWySRgNJa95WDZKExrwTaC0pQWtJCSo3/AM38k5ArKlBY94JXN+40a72bERERNSzeExmuKWlBY8//jgmTJiAjRs3Wh23YMEC5Obm4syZM2bXCgoKMHPmTCxbtgzbtm1DTU0NXnzxRTzyyCPIz+9ZNaO61mv5/92Jpvp6CBAwQjUBIT5h6O8bbrNzhC0taMUO7+NoFFqA4QmAKML3u9Pw9RkHhd8EAMDxgkq8dfA8Xrw/xuH7G9b1OqNiwwY05p1w7EU3yzGcrVcmIiIiz+UxwfCqVasAwGafuzfffBMAcO3aNYvB8MmTJ6HVavH73/8eMllbUvyll17CzJkz0draaraTiifTtV4DgKP/2Y4RqgkYpfoBBEGAJEkOB8K1uIH3vY/eSjYLN/9PJkPTsAQElicBAKSbpRk7ThY7FQx3lGmJhF1ulmNw0w0iIqLex2PKJFwhISEBMpkM77zzDrRaLWpqarBlyxbce++9NgPh5uZm1NbWGv3jKRJnzcbEx3+C0MAoo17BjtIHwrp/dAQBEMyDz8s1zU6XSnSE0cI4U4IAyOUQAgPhOzYBisGD4RUWhtsWP4t+zzzDRXVERES9kMdkhl0hMjISn3zyCWbPno1nnnkGWq0WEyZMwMcff2zzdX/4wx/0mWlPo8sQ1ygLUXuw2PmFcqZBsCFdMhUSRINFe9G//i9C+yjw4/GRWDIl2ulFdY4wbLEmaVqNSyYkCdBqIdXVoenzk23nBAGCTAZBoeCmG0RERL1QlwbDv/zlL/HHP/7R5pizZ89i+PDhLnleWVkZnn76aTz55JNISUlBXV0dXnnlFTz22GM4cOCA1Yzpr371Kyxbtkx/XFtbi7CwMJfMqbME3ROBxi+uQVvZ5NobS4DQGgBdKJzufwOAXH+5rF6DdYe+hyiJaNFo8Y/PCo2qGAQAXjJgTEQwMn42Dr7eHfuS1NUcSxoNKtLT0VpaBk15OaTmZivzZzkEERFRb9alwfDy5csxf/58m2OioqJc9ry0tDQolUr86U9/0p/bunUrwsLCkJubi7vuusvi63x8fODj4+OyeXQFQS4gYEx/1P6v2HU3lQAv4QZ+4bMOXqEiRAmAZjrWas33En8r64K1W6BFbFt098SmPLz/84kumVrFhg2o+Fu6XfXDkqYV5W+9herMndBevgwAaDh6FFUffoS+j8yyexc8IiIiTyAIAj766CM8/PDDbn1OcnIy4uLi8MYbb7j1OR3VpT/hQ0JCEBIS0mnPa2xs1C+c05HL27KYotj59a2dLfDucABAw8lyaKscyxD7S15oRGtbKvdmfDlYasaTwj/ghba/O5kAPKf4GHLIsFb7Y2gNMsT2yCusQlOLpsPZYcCxhXSNeScsdqDQXr7c1l0C7CpBRESeoaysDKtXr8bevXtx+fJl9O/fH3FxcXjhhRcwZcqUrp5eu06cOIFf/vKXOHnyJARBwPjx4/GnP/0Jd955p9ue6TEL6IqLi3Hq1CkUFxdDq9Xi1KlTOHXqFOrr6/Vjzp8/j1OnTqGsrAw3btzQj2lpaQEAPPDAAzhx4gReffVVfP/998jPz8fPfvYzREREID4+vqs+tE4jyAUE3RuB0JfGwidK6dBrH2uZgD6SLwQJ6CP54unmKiwU/q4PhPXPEIBnFXvw/+T/dHh+MlGLv8z7BQp/tsChPr+W+gPbXEjnCJZREBGRhygsLERCQgIOHTqENWvW4Msvv8S+fftw9913I9UDkjr19fWYNm0awsPDkZubi88++wyBgYGYOnUqWltb3fZcjwmGX3nlFcTHx+N3v/sd6uvrER8fj/j4eHz++ef6MU899RTi4+OxYcMGfPfdd/oxV65cAQDcc8892L59OzIzMxEfH49p06bBx8cH+/btg5+fX1d9aJ1OkAvot3A0gu4NhzzY167XeMMLP26ZiNktE/BuxPvw8c2AIFjOpgsC8JTiMLzR4tC85nx3EDNP/xc3jh1Dxfo0VGzYYNfrdP2BG44e1b/OcPMOWWCgQ/Mwxa4SRETkCRYvXgxBEJCXl4dHH30UMTExGDlyJJYtW4bjx48bja2oqMCsWbPg7++PoUOHYteuXfprGRkZZhucZWZmGq2tWrlyJeLi4rBlyxao1WoolUrMmTMHdXV1Vue3d+9eKJVKbNu2zeL1c+fOobKyEq+++iqGDRuGkSNH4ne/+x2uXr2KoqIiJ/5G7OMxwXBGRgYkSTL7Jzk5WT8mOzvb4hi1Wq0fM2fOHOTn56O+vh7l5eXYuXOnyxboeRJ9lnj5WJwbdRW1QoO+R7COdPN/IkSUySuwrd9ezBn2C7TIW3B3xGDb9wdw2nsB/HDD7jmNvF5w6wvSgYyspf7AuoV04Zs2wmfkSLvnYMo/cTy7ShARUbdXWVmJffv2ITU1FQEBAWbXTYPbVatWYfbs2Thz5gymT5+OuXPnorKy0qFnXrhwAZmZmdizZw/27NmDw4cP4/XXX7c4dvv27UhJScG2bdswd+5ci2OGDRuG2267DRs3bkRLSwtu3LiBjRs3YsSIEUaxnKt5TDBM7iHIBbzXfz9Shv0/vNf3E2ih1QfAZ7y/w0PDnscDI57Dz2JewbaQjyEK4s3ewrZLEAQB8BVE7Pf+pd1z+fq2SH3RhQQBPnaWrrTXHzhg3Fi752Cq9UopShY9w+2ZiYjIYaKowcWCt5D/xRO4WPAWRNF9P0fOnz8PSZLsTvDNnz8fKSkpiI6OxmuvvYb6+nrk5eU59ExRFJGRkYFRo0Zh0qRJmDdvHg4ePGg2Li0tDYsXL8bu3bvx4IMPWr1fYGAgsrOzsXXrVvj5+aFPnz7Yt28f/vvf/0LhxoXsXCJPGDNgDI6XHse/QnfiX6E7XXZfQQAG4rrd4/8d01bYP/J6Ab6+LRKqiGT8wo7XWesPLGk0bdsznzgBWWAgRBtv3VjTWlKC1pISbs9MREQOKyxKR0HBOgASqqqOAgCiIpe45VmSg7uvxsbG6v8cEBCAoKAglJeXO3QPtVqNQINSxIEDB5rdY8eOHSgvL8eRI0cwbtw4m/e7ceMGFi5ciKSkJLz77rvQarX485//rF/z5a6SVgbDhKdHPw1RErHpq01o0TpW52uLJAGl0m12jxdlcmwffr/+WHasCL94aFS7r9OVRJjS1RKbdZUQBLs6TchCQyGWlbUdcCEdERE5qLr6BPQtmCDdPHaPoUOHQhAEnDt3zq7xpjvvCoKg76wlk8nMgmtLC9hs3UMnPj4e+fn52LRpE8aOHWtzF9zt27ejsLAQx44d03f/2r59O/r27YudO3dizpw5dn1sjmKZBEEhUyA1LhVH5hxBoLcdi80kqd1gUpKAEqkPpraY1w4Z/mcgs1FtITr2S66+q0TRz36GoiefxPV/bbY4T/+7EuE12HbN822pixH8+GPcnpmIiJymUo3DrZ96ws1j9wgODsbUqVORlpaGhoYGs+vV1dV23yskJAR1dXVG9zl16pRT8xoyZAiysrKwc+dOLFliOyuua4FrGDDrjt3ZApeZYdLzVfjijuA7kFuWa3mAwSI1uSBgtDrM7HqoRouHGxqwqKoWP2z5h9FlhQAcf/lu9Av0Nzr/x4+/QfqnBWaPk1sIlHWlD4YlEboNMaxmgg0JAvzHjgXGjkXFW+stDlHcPgghzz4LSaNBY14ems59C9/hw3DbwoXW70tERGRCHfEsgLYMsUo1Tn/sLmlpaUhKSsL48ePx6quvIjY2FhqNBgcOHEB6ejrOnj1r130SExPh7++Pl19+GUuXLkVubi4yMjKcnldMTAyysrKQnJwMhUJhdROO++67DytWrEBqaiqWLFkCURTx+uuvQ6FQ4O6773b6+e1hMEx6TZomXK0oxFt/0yCkBhBlQEUA8Gks8GGSDKLsZnmBIEBr6W0OQUCZtwx/91JCkABcbft9uOD1B2w+d/nU4fD2kuOdI4Wobbq1uGDRDyPNxhoGvKZ1vNY22pApg+A7fDggk8N/bIK+prj6gw+guVJqNt47PByCQtFWb5x3ApAkNOadwPWNG1kzTEREdpPJFG6rEbYkKioK+fn5WL16NZYvX47S0lKEhIQgISEB6enpdt8nODgYW7duxYoVK/D2229jypQpWLlyJRYtWuT03IYNG4ZDhw4hOTkZcrkca9euNRszfPhw7N69G6tWrcKECRMgk8kQHx+Pffv2YeDAgU4/uz2C5GjFNaG2thZKpRI1NTUICgpy67PqW+rx6K5HUdpQCm+5N+bdMQ+pcalQyFz/e8zCj3+Gn//yOAJajEsZRAAfJAH/+WH7z+xTr8E/1gNyCdAKMgTs2o2ooVE2M7o6Gq2ItKwLOFFYiXHqYKTePQQKuXElT/GChWg4elR/HDBxIsI3bQQAXEtLM88MCwL6PZdqFMTq5lK5eTPEmlrjD8BgvK1nERFRz9TU1ISCggJERkbC19e+XvzUdWx9vuyN15gZ7uYe3f0orjS0bRrSrG3GP7/8J7zl3nj2Tte/1TJ05ymzQBhoKyyfdRT4aKIIjcJ2mfk/3gLkaLuHXBLRPHMG8M3XKPnDH9CwbTsAoOHoUVQfPozo7duNAmKFXIbn7x1qdk/DQFrSam4tgDOp49VlfBs//xwQRUiCAEGS0Pj5SVxLS9MH4NbKKbzCwqB8eKb+Pn4JY9qyzxaeRURERD0Dg+Fu7mrDVbNz+Vfd09Xgh19JZoGwjlwCfvVvEf/3U+vBsEyU9IEwdP8WRZy9YyRgUviuOfMlKjZsaLfsQNJoULxwIRpzb/U+9E8cD0Gu0GeYTbPO4W+/DUGhMMoUNx4/3jYHmQyVm7cYBcIypRLBT8wzy1Zba9lGREREPQeD4W5uQMAAXKm/YnRuzADXZih1wWTfeutjBAAx5uW1RmYdtVJxY2UFaOPnJ9udW8WGDUaBMAAIcgXCN23Uz7smcydaS0oAwKiO2HRnuppdu9F66ZJZGUXwE/MQkpqq70ZhGPyyRpiIiKhnY2u1bu6DGR9gUMAgCBDgI/fBU6OfwtOjn3bpM/RlA83NNse1tPOr0/AS0Wpm2SJR2+4QS719deUKunnrAmEARv2ATXem013XkSmV6Pdcqj7jq7tfw9GjqFifhooNGxz5aIiIiMgDMTPczfXx7oP9j+136zOsdWEwJAHY305C+tvBAmILrZdamJG1/7uYUd0u2kokDMsXLM3be/QoXEtLQ+Pnn8N//Dh9FwlJFHH9b+n6GmBdRljHNJPMTTaI2ohaESf3FeHK+WoMilYhYVoEZHLmUoioZ2AwTGYBpzWirR0ynOA/dmy7YyzV7erqen3j44y6PejU79mD1iul+qBX1x1C0mggyGRWa4C5YI7IspP7ipC3u60X+KWzVQCAcQ+Ytz4kIvJEDIY9lEbU4O0v30b+1XyMGTAGT49+2ul2a4YBZ0tREVovXzYbIwAYdsl2sDzskgNZ4QB/uxakWdtqWTcnS1ovG9RYG2R4bd0L4II5ImuunK+2eUxE5MkYDHuot798G+mn0iFBQm5p245xzrZbMwwSxaYmfP/DyRBrjfvvigDOhdl+W/RihA/uLLRddwwAstBQRO/ZbdZn2FE3vjhl17iWkhKj1mrWtBcsE/VWg6JV+oyw7piIqKdwOhrRaDTIzs7GhQsX8JOf/ASBgYG4cuUKgoKC0KdPH1fOkSzIv5oPCW2ZWgmSy9qtyXx9EfzkE0Z9eG/4yfHfsQL+l9wH8X2H4nz1ebSILQj2DUZYnzCMHTgWT49+GvK5wLlRo23e33/CXYh45x2n5ydpNChftw6Vm94BtO0swJPLAa0WrSUlbR8PwGCXyAkJ0yIAwKhmmIiop3AqGC4qKsK0adNQXFyM5uZm3HfffQgMDMQf//hHNDc34+9//7ur50kmxgwYg9zSXEiQIEBwabs1S+UCYxQK/Lq9F9qxnsaeOmFbKjZsQOXb/3T8hVwQR+Q0mVzGGmGiHkQQBHz00Ud4+OGH3fqc5ORkxMXF4Y033nDrczrKqeXAzz//PMaOHYuqqir4+fnpz8+aNQsHDx502eTIuqdHP41n457FXQPvwrNxz7q03ZquXCB800aEpKY6VM7gMybe+kWFAsFPPolraWkoXrAQ19LSIGk0Ds3NkYBWFhBg1FqNC+KIiKinKysrw5IlSxAVFQUfHx+EhYVhxowZHhOfHTx4EBMnTkRgYCBCQ0Px//7f/4PGwVjBUU5lhnNycnD06FF4e3sbnVer1bhsYfEVuZ5CpnDLlswdpd60CRcfeNDiIjxoNPhu7Dj9YcPRo2jMy0P4xo12B9x+CWMsdpCwRJUyBzJvby6IIyKiXqGwsBBJSUlQqVRYs2YNRo8ejdbWVuzfvx+pqak4d+5cV0/RptOnT2P69On49a9/jc2bN+Py5cv4+c9/Dq1Wiz//+c9ue65TmWFRFKG1UK956dIlBAYGdnhS5Llkvr4Ysn9fW39fOzTm5rW7uYVuZ7jiBQshiSKEgAD75mKS4QZgV1ba8HnOZK+JiIi6wuLFiyEIAvLy8vDoo48iJiYGI0eOxLJly3D8+HGjsRUVFZg1axb8/f0xdOhQ7Nq1S38tIyMDKpXKaHxmZiYE4VYfp5UrVyIuLg5btmyBWq2GUqnEnDlzUFdXZ3V+e/fuhVKpxLZt2yxef++99xAbG4tXXnkF0dHRmDx5Mv70pz8hLS3N5n07yqlg+P777zeq/xAEAfX19fjd736H6dOnu2pu5KEEhQKCwsvu8e2VPhjuDHf9b+nwGTHc5IEC4O0NeBk/07TbhL07zHEnOiIi8jSVlZXYt28fUlNTEWAhaWQa3K5atQqzZ8/GmTNnMH36dMydOxeVlZUOPfPChQvIzMzEnj17sGfPHhw+fBivv/66xbHbt29HSkoKtm3bhrlz51oc09zcDF9fX6Nzfn5+aGpqwsmTJx2amyOcCobXrl2LI0eO4I477kBTUxN+8pOf6Esk/vjHP7p6juSBfOPj7B6ra31mLQNrujNcy/fnja7735WIfs8sgldo6K2TFmqE7d1hjjvRERGRK2hECWsLyjD71HmsLSiDRrTdr78jzp8/D0mSMHz48PYHA5g/fz5SUlIQHR2N1157DfX19cjLy3PomaIoIiMjA6NGjcKkSZMwb948i7XJaWlpWLx4MXbv3o0HH3zQ6v2mTp2Ko0eP4t1334VWq8Xly5fx6quvAgBKS0sdmpsjnKoZHjx4ME6fPo1///vfOHPmDOrr67Fw4ULMnTvXaEEd9V52bb4hCIAktdv6zHRnON/hw9CYd0J/DFE0agXnFRYG5cMznd5hjjvRERGRK6wruoo/F5ZBApBTVQ8AWB4ZavtFTpLa2UXWVGxsrP7PAQEBCAoKQnl5uUP3UKvVRuWxAwcONLvHjh07UF5ejiNHjmDcONsllPfffz/WrFmDn//855g3bx58fHzw29/+Fjk5OZDJ3LcFvNN9hhUKBX7605+6ci7Ug5htiHGz568Rw/9wbWRgTVu93bZwIa5v3Kg/bvz8pNG9vMPC9NsvX0tLM3qd4X2sLajjTnREROQKuTX10P10km4eu8vQoUMhCILdi+S8TEoLBUGAKIoAAJlMZhZct7a2OnQPnfj4eOTn52PTpk0YO3asUd2xJcuWLcOLL76I0tJS9O3bF4WFhfjVr36FqKgouz4uZ9gdDBsWVrfnoYcecmoy1HMYZVcBwOQ/DjM2MrCWdoYzPL6WlobG48fNMrm62l9IUttcYN+mG9yJjnobUSvi5L4io001ZHL3ZWGIeotEZR/kVLUFxMLNY3cJDg7G1KlTkZaWhqVLl5rVDVdXV5vVDVsTEhKCuro6NDQ06O9z6tQpp+Y1ZMgQrF27FsnJyZDL5Vi/fn27rxEEAYMGDQIAvPvuuwgLC8OYMe57l9buYNi0MbMgCGa/NeiifUudJqh30WVTazJ3orWkxDgLbEouh//YBH3m1tlnmWZyWftLZJ+T+4qQt7sAAPTbLnOTDaKOez5iAIC2jHCiso/+2F3S0tKQlJSE8ePH49VXX0VsbCw0Gg0OHDiA9PR0nD171q77JCYmwt/fHy+//DKWLl2K3NxcZGRkOD2vmJgYZGVlITk5GQqFwuYmHGvWrMG0adMgk8nw4Ycf4vXXX8f7778PuVzu9PPbY/ev/qIo6v/55JNPEBcXh//+97+orq5GdXU1/vvf/2LMmDHYt2+f2yZLnkOXXfUaPLj9wVotGnPzcP3ttzv0LNNNQvwSxnDTDSI7XDlfbfOYiJyjkAlYHhmK9+OisTwyFAqZXStqnBYVFYX8/HzcfffdWL58OUaNGoX77rsPBw8eRHp6ut33CQ4OxtatW/Hxxx9j9OjRePfdd7Fy5coOzW3YsGE4dOgQ3n33XSxfvtzquP/+97+YNGkSxo4di71792Lnzp1u3ylPkBytuAYwatQo/P3vf8cPfvADo/M5OTlYtGiR3b95eKra2loolUrU1NQgKCioq6fTrRU9+SQac+1bneoVFoboA5+47NmSRoOKDRuMMsaO7KZH1Fuc2FugzwwDwPgZkcwMU6/V1NSEgoICREZGmrX5ou7H1ufL3njNqcjgwoULFutOlEolCgsLnbkl9VRuXP3ZHtb+EtknYVoEABjVDBMR9RZOBcPjxo3DsmXLsGXLFgwY0Fb/cvXqVaxYsQLjx4936QTJc0kajfHCOUGA16BBaL1yxWINcdBDMzpxdkSkI5PLmAkmol7LqbTdpk2bUFpaivDwcERHRyM6Ohrh4eG4fPkyNm7c6Oo5koeq2LDBqERC8PZG6+XLFgNh/8TxCHn22c6cHhEREZFzmeHo6GicOXMGBw4c0PezGzFiBO699952+8dR7yBpNKjJ3Gl8rrnZ4li/8eMQvnEj63mJiIio0zkdfQiCgPvvvx/333+/K+dDPUTFhg1tLdVsMNwpjoEwERF1J070F6Au4IrPk1MRiG6faGteeeUVpyZDPYetnr4MgomIqLvS7arW2NgIPz+/Lp4NtaexsRGA+W54jnAqEvnoo4+MjltbW1FQUACFQoEhQ4YwGCbjHegEAf7jx0GQK9jijMgDcEc66s3kcjlUKhXKy8sBAP7+/iwB7YYkSUJjYyPKy8uhUqk6tCmHUxHJF198YXautrYW8+fPx6xZs5yeDPUclnaFYwBM5BlyMy8g/0BbmdOls1Uo+uYaHlk21uUBMYNu6q5CQ0MBQB8QU/elUqn0ny9nObXphjVffvklZsyY0eN7DXPTDSLqqUStiPTnsgGTnwzjHlBj/Iwolz6Lm31Qd6fVatHa2trV0yArvLy8bGaE3brphjU1NTWoqalx5S2JiKgTndxXZBYIA8C3uWUuD4a5DTR1d3K5vENvv5NncCoYfvPNN42OJUlCaWkptmzZgh/96EcumRgREXW+zgxIB0WrcOlsldExEVFncyoY/utf/2p0LJPJEBISgieffBK/+tWvXDIxIiLqfKYBqs6wRPOavI7W/HIbaCLqDpwKhgsKCtofREREHidhWgQuf1eFy99W68/dPkyFsdPVRuNErYhdb57Sj9MF0I7U/HIbaCLqDpxatrtgwQLU1dWZnW9oaMCCBQs6PCkiIuoaMrkMDy2Nw/gZkRg8oi/Gz4jEQ0vjzDK+J/cVGQXMAGt+icgzOdVNQi6Xo7S0FP379zc6X1FRgdDQUGg0GpdNsDtiNwki6u12rvvCrJyC3SCIqDtxSzeJ2tpaSJIESZJQV1cHX19f/TWtVouPP/7YLEAmIqKex7S2+PZhrPklIs/kUDCsUqkgCAIEQUBMTIzZdUEQsGrVKpdNjoiIuidLi9+4YQYReSKHguGsrCxIkoR77rkHH3zwAYKDg/XXvL29ERERgUGDBrl8kkRE1L1w8RsR9RQOBcOTJ08G0NZNIjw8nHt1ExEREZFHszsYPnPmDEaNGgWZTIaamhp8+eWXVsfGxsa6ZHJERERERO5kdzAcFxeHsrIy9O/fH3FxcRAEAZYaUQiCAK1W69JJEhERERG5g93BcEFBAUJCQvR/JiIiIiLydHYHwxERERb/TERE1Nk6uhU0EZGOU9sx79q1y+J5QRDg6+uL6OhoREZylTEREbnHyX1FyNvd9i6lM1tBExHpOBUMP/zwwxZrhnXnBEHAD37wA2RmZqJv374umSgREZGO6dbP3AqaiJzl1HtKBw4cwLhx43DgwAHU1NSgpqYGBw4cQGJiIvbs2YNPP/0U169fx0svveTq+RIREWFQtMrmMRGRvZzKDD///PP4xz/+gYkTJ+rPTZkyBb6+vli0aBG+/vprvPHGG1iwYIHLJkpERKRjaQc8IiJnOBUMX7hwAUFBQWbng4KCcPHiRQDA0KFDUVFR0bHZERERWcAd8IjIVZwqk0hISMCKFStw7do1/blr167hF7/4BcaNGwcA+P777xEWFuaaWRIR9VKSRoNraWkoXrAQ19LSIGk0XT2lHkXUijixtwA7132BE3sLIGrFrp4SEXUypzLDGzduxMyZMzF48GB9wFtSUoKoqCjs3LkTAFBfX4/f/OY3rpspEVEvVLFhAyrWpwGShIZjxwAAIampXTyrnoNdKYjIqWB42LBh+Oabb/DJJ5/gu+++05+77777IJO1JZsffvhhl02SiKi3unEyH9B17pGktmNyGXalICKngmEAkMlkmDZtGqZNm+bK+RARkQG/hDFtGWFJAgQBfgljjK5LGg0qNmzAjZP58EsYg37PPANB4fS39l5nULRKnxHWHRNR7+L0d8yDBw/i4MGDKC8vhyga11ht2rSpwxMjIiKg3zPPAIBRsGvIqIzi6FE05uUhfONGBsR2ELUiJFFCUD9fAMCwxFB2pSDqhZz6brlq1Sq8+uqrGDt2LAYOHAhBEFw9LyIiAiAoFBZrhHUZ4crNW26VUQBozM1DxYYNbqsr7kmZ6JP7inBib6H+WJAJ3NKZqBdy6jvY3//+d2RkZGDevHmung8REdnBMCNsyp11xT1pQR/rhYkIcLK1WktLi9GGG0RE1LkaPz9pMRAGAEmrcVsrtp60oI+72BER4GRm+KmnnsL27dvx29/+1tXzISIie4hao0PBxweK/v2hGBiKxrwTbsvctregz5NwFzsiApwMhpuamvCPf/wD//vf/xAbGwsvLy+j63/5y19cMjkiop7O6RpcmfEbe1JzM1pLStqCVCczt/bMpb0FfZ6Eu9gREeBkMHzmzBnExcUBAL766iuja1xMR0RkP0drcHUBa+ulyxava2trjY594+NcOhdrC/qIiDyVU8FwVlaWq+dBRNQr2arBtZSptbVwDgDEhgajY0fSEz2pHpiIyF4d7odz6dIlAMDgwYM7PBkiot7GVg2upUytUcBqida4lrgx/wu7SzF6Uj0wEZG9nAqGRVHE73//e6xduxb19fUAgMDAQCxfvhy//vWv9VsyExGRbbZqcC1lak0DVv9xY9FaWgZNeTmk5mbzB4hau0sxelI9MBGRvZwKhn/9619j48aNeP3115GUlAQA+Oyzz7By5Uo0NTVh9erVLp0kEVFPZasG11Km1lLAKigUuJaWZrl8Qiazu/yB9cBE1Bs5FQz/61//wj//+U889NBD+nOxsbG4/fbbsXjxYgbDREQucNvChWjMy0PTuW/hO3wYblu40GrAqguSazJ3tnWVANoyx2PHAgDLH4iIrHAqGK6srMTw4cPNzg8fPhyVlZUdnhQRkSdz1ZbF1zdu1PcMbsw7gesbN1rN3OqCZN0iO2tlF37xcZBEEcULFrY7t5609TIRkTVOfVe78847sX79erz55ptG59evX4/Y2FiXTIyIyFO5astiZ7o7WMsc685dS0vDdcO5iaK+lMI04O1JWy8TEVnjVDD8pz/9CQ888AD+97//YcKECQCAY8eOoaSkBB9//LFLJ0hE5GlMg9iazJ02s6vWMrDOdHewdi/d+crNW4zntms3Wi9dshjwstUaEfUGTgXDkydPxnfffYe0tDScO3cOAPDII49g0aJF+P3vf49Jkya5dJJERJ7EKIgF0FpSgtaSEqvZVWsZWGe6O1i7l8X+xLpNkqwEvGy1RkS9gdPFX4MGDTJbKHf69Gls3LgR//jHPzo8MSIiT9XvmWfQcPw4bpz43PiCleyqtQysM90drN3LtD+x4OOD255aCAnA9b+lWwx42WqNiHoDroQgInIxQaFA87ffWbhgObtqTwa2oxtn+CWMQcPRo7fu19wMyGQIeeYZCCY1w4YfB2uEiainYzBMROQGZhtgCAL6PddW+mAa2N62cCEA2xnYjm6c0e+ZZ4zbrt0cw4CXiHo7j9kqbvXq1Zg4cSL8/f2hUqnMrp8+fRopKSkICwuDn58fRowYgXXr1pmNy87OxpgxY+Dj44Po6GhkZGS4f/JE1Ov43mncWUfo00f/Z11g23D0KCrWp+lbpoVvavu3pYyvoxtnWLqX16CBBgNZA0xEBDiYGX7kkUdsXq+uru7IXGxqaWnB448/jgkTJmDjxo1m10+ePIn+/ftj69atCAsLw9GjR7Fo0SLI5XI899xzAICCggI88MAD+PnPf45t27bh4MGDeOqppzBw4EBMnTrVbXMnop7NKNMbHwcJgCCTwev229F67RrQ0gKprq4tswvnujR0tLOEpNWgMTdPf81//DjWABMRwcFgWKlUtnv9iSee6NCErFm1ahUAWM3kLliwwOg4KioKx44dw4cffqgPhv/+978jMjISa9euBQCMGDECn332Gf76178yGCYipxmVMBjU5UIQ4DV48K3ShJuBrzOBbUc7S5hqOvctKjZs4EYaHk6r1SInJwfFxcUIDw/HpEmTIJfLu3paRB7Foe+A77zzjrvm4RY1NTUIDg7WHx87dgz33nuv0ZipU6fihRdesHmf5uZmNBvU/9XW1rp0nkTk2Uw7NehJErQ1NUanDANZRwLbDneWMCHW1LQFyjY23TD6ULgbXbfT3NyMv/71r2hqagIAXLx4EQCQnJzchbMi8jw99jvZ0aNH8d5772Hv3r36c2VlZRgwYIDRuAEDBqC2thY3btyAn5+fxXv94Q9/0GemiYhMmfYVNiSa/PKsaWwE0Dk7uZlmoP3Hj0PTuW8h6gL0djbdMMTd6Lqfv/3tb/pAWOf06dPMDhM5qEuD4V/+8pf44x//aHPM2bNnMXz4cIfu+9VXX2HmzJn43e9+h/vvv78jUwQA/OpXv8KyZcv0x7W1tQgLC+vwfYmoZzDK9N6sGa7duastyDRRvXETms+cgczL22UZVmtZW0sZaKPSiXY23TDE3eg6j2npQ1JSEo4cOWJWClFj8q4DAFRVVSEnJ4fZYSIHdGkwvHz5csyfP9/mmKioKIfu+c0332DKlClYtGgRfvOb3xhdCw0NxdWrV43OXb16FUFBQVazwgDg4+MDHx8fh+ZBRL2HpRKG2l27rY7XbcbRcPQoqj/KhGrWwx0Kiq1lbS3NyzRAlkTR6qYbhrgbXefJyclBdnY2gLbSh8LCQhQWFuqPP/vsM2g0GquvLy4qxom9BbhyvhoDo9rW+pReqIEkSYAA3D60LxKmRUAm95iGUuShRK2Ik/uKcOV8NQZFq7rt112XBsMhISEICQlx2f2+/vpr3HPPPXjyySfNdscDgAkTJuDjjz82OnfgwAFMmDDBZXMgInKE5tIlfZcJZ8sOHMnamgbIkkZjddMNQ9yNrvMUFxcbHZsmcWwFwgCgaA5C3u4CAMCls1Vm1y+fqwYAjHsgsgOzJE/WWUHqyX1FZl+L3fHrzmNqhouLi1FZWYni4mJotVqcOnUKABAdHY0+ffrgq6++wj333IOpU6di2bJlKCsrAwDI5XJ9wP3zn/8c69evxy9+8QssWLAAhw4dwvvvv29UV0xE5AzTUoXABx9AZfrf7Xxxx8oOOpK1tXdhHjfn6Dzh4eH6xXBA29oWXWa4PWq1Gv7VYaiCeQmFoSvnqzswQ/J0nRWkmn6dddevO48Jhl955RX861//0h/Hx8cDALKyspCcnIwdO3bg2rVr2Lp1K7Zu3aofFxERof8mEhkZib179+LFF1/EunXrMHjwYPzzn/9kWzUi6jDTUoV+i5+F1+2D0Hr5SvsvFgT4xcfhWlqaU90a3Jm1ZReJzjdp0iQAbUmgwYMHQ5IklJSUQKvV2nydSqXCvHnzkL+vGJfP2Q6GB0WrXDVdI2z15hk6K0gdFK0yenfCXV93HSVIkpW+O2RVbW0tlEolampqEBQU1NXTIaJuoHjBQqMewwETJ2Lw39Lw3Q8mQaqvvzXQ3x/+o0e1LV6TJEAmh//YBLPa3X7Ppbo1E2tvkHstLc1owZ2750XGsrKycPjwYbvGqtVqCBDQcMULYvEACBCMrgfe5ougEF+31gxnZ2fr652BtjZvXMzX/ZzYW6DPDAPA+BmRbskMd3XNsL3xGn+9JyJyAUulCjJfX/iNHo3Gm4vaAEARHIzwjRvNAs/iBQs7tVuDva3S2EWi62i1WuTm5toc4+vri4EDB0KSpFulFBLgH9CMgIYIo7HK/n6Y+Xy8m2bbxrTe2fSYuoeEaW1fG4ZBqjvI5LJuWSNsqvst6SMi8kD9nnkG/Z5LRcDEiej3XKq+VMF/bILROM2lS6jYsMHs9X4JY261OuuEbg32BrmdPS+6JScnx6yPsKnx48fjySefhExm8ONcAFq9zcskdJ0l3Ck8PNzmMXUPuiB15vPxGPdAZLfs8NCZmBkmInIBawvM+j3zDGoyd97akhlA4+efm9UH37ZwIRrz8tB07lv4Dh+G2xYuBGDwNuP31S5tjWXvojt2keg69mRVhZu/qBgtupMArxb3B76WGNY762qGibo7BsNERG4kKBRQPjzTeKMLUTQrUdA0NqIxNw8A0Jibh6IFC6DevBkn95cY1fYBrmmNZW+Qyy4SXce0q4RKpUJTU5NRtrjk5i9ZuqCzsLAI189J8Gkw3xiq9KLtRXWuIJfLWSNMHofBMBGRC9hakGYaeDZ+ftKsRKHBoK4YAJryv0DFhg24oplo8XmGq7+dWaTCILf7s5RlNdyQA7hVhqALQk/sLUDe8QJLt+u2K/mJuhqDYSIiF7C1IM008LyWlobG48eNShQMO1Ho3DiZj0GPTre4cUL/sEC8/eKnaLmhgVwhg1YjAnBNz1C2U+seLGVZ2ytDsNYiS6YQ3LZIisjT8bsbEZELONJ1wVKJQsXf0gGTPrJ+CWNurfo2qRn+4kAxWpvaxusCYZ2O9gy1t9MEdT5bZQharRYNfkWo7lsIrxYl/BvC9e3VxtwX3usXSRFZw2CYiMgFOrILHAB4jxmDlhMn9MfyQYPaMrJWWhOZ1hEb6ujb4Wyn5plycnLw3ZVTgA/Q6lMNH38FAhoi0C+sDxJ+xKwwkTUMhomIXMCRrguWMq9BdyWi4vPP9cF030cfsVma4O2nQMsNjdG5oH6+GD5hYIffDu9oYE9dw7T7RL3mOhSNt+Pyt9X44kBJp/Z75U505EkYDBMRuYAjC9IsZV7D/rFBf81nzBgUhE/D0XVfWF0QN3dlIt75f0eMzgWF+Lkk4GE7Nc9k2n3CsL2au7bbtcZwoZ9uTuwyQd0Vg2Eiok5guChN0hpkdG9mXg2D6RN7C3DiZhmEtQVxX392xewZNeU3sPONLzBoaMe2PWWnCc9kuLhO0RSEyvxA/bXO7iTBnejIkzAYJiLqBIalERAE+CeOhyBXWMy8mmbxTI9FrYhzx0rNnlF3vQl115tw6VzHO0qQ5zFcXCdqRZy8vcjt2+2a0pVHVFUZd0DhTnTUnTEYJiLqBKalEYJcgfBNGy2OHRStMmqnZprV+/zjQtRW2N6m19rb4s70JCbPI7Oy8NLdTPsgKxQKDB48GElJSZ0+FyJ7MRgmIuoEjixK07dTs5DVE7UiTmeVWHupniRKELWiWaB7cl+RvhOFK3oSE+lotVqcPn3a6JxGo0FhYSGOHDnCmuFerLv/Es5gmIhcort/s+tqjixKs5XVO7mvCC2NWovXDF3+thon9xWZ3ae9EgwiZ1kqj9BhzXDX68rv0d39l3AGw0TkEt39m11Xc9WiNEeCV0tj2yvBIHKWrYCXNcNdryu/R3f3X8IZDBORS3T3b3Y9hWkw295YU7ZKMIg6wrS1GwD07dsXd955p9m20dT5XPE92tnscnf/JZzBMBG5RHf/ZtdTJEyLgCRK+OJ/RdA0S1bH9Qn2hqgRkbf7Ikov1hj94GLGvmfpLhtcJCUl4fjx42hqurW4s2/fvqwV7iZc8T3a2exyd/8lnMEwEblEd/9m1110tG5PJpdh/IwojJ2uxsl9RTh9sATNjRqzcfWVLfj8v0X6Y5au9FzdZYOLI0eOGAXCAMsjuhNXfI92Nrvc3X8JZzBMRC7R3b/ZdSVRK+LzjwvxbW4Zmhs1+uC1IwGq7u/78ndVuPxttV2vYelKz9RdNrgwfW7fvn1ZHtGNuOJ7dE99B5DBMBGRm33+cSFO7C20eO3K99U4sbfAaqbYlSvAe8oPLjJmWqvbVdlY03nceeedXVKuQe7TU98BZDBMRORm3+aWWb0mSZLNGjxXrQAP6ucLSZSwc90XbH3Xwxhuw6yrGe4MprXKuo01Onse1Hl66juADIaJiLqA3EuGhGkRuPy9cWeI9mryzEodBPueF3ibrz47zfphz2DvwjjDbZg7U3epVSbqKKYFiIjcbFhiqNm5AZGBGPdAJG4f2tfovGkpQ3vHpq+35PZhKrOgmfXD3Z8u2Lx48SKys7ORk5PT1VMy0pm1ylqtFtnZ2di8eTOys7Oh1ba/8QyRvZgZJiJys7HT1Th3vBR115v15wRZW3TaXg1ee9fj7wvD5e+qUHGpHt6+CtRdN17Nr3vWoGgVLp+r1p9j/XD356pg0107j9mqVbaU1QbgdAs4ZqHJnRgMExG5mUwuw4iJg/S1v8CtjG57NXjtXf/iQIm+m0Rzg3mLNQCoKb+Ba0V1CLzNF4H9fDA4JrjHLHzpyVy1MM5dO4/ZqlW2FLwCcDqg7S4dM6hnYjBMRJ3KXVmq7k63WYZuMZ0kShC1IgB06O/DnnIHXba4uVGDoH6+rBX2EK5aGOeu3SFt1SrbE7w6EtB2l44Z1DMxGCaiTuWuLFV3J5PLIMgE1Fa0BaYn9hbqSyU68vfhyPbMAFBxqd7useR+thbJuWphXFf0hrUWvDob0HZVxwzqHRgME1GncleWyhOYfqxnj5WisabZ5pj2GNYUS6LU7gYc/Qb3cej+5F6HDx/Gp59+CqAtUBRFEffcc49D92jv3Zau6A1rK3h1JqDtqo4Z1DswGCaiTtVTdzCyh+nHXldhvthtYJTSoXsa1hTrgqLL31fhWlE9Wm4Y1xD3CfbBg6mxTsyc3OXLL780O3Y0GG7v3Zau6A1rLXhlQEvdEYNhIupUPXUHI3sYfuyOlDY4qq6iySwQBoAREwZC4c1v+55GV0pRVFQESZIgCAIiIiL0JRW9+d0Wcq/essaD3xWJqFP11B2M7GH4saf9/JDFMaUXa4yO2/thZHi9vTIJ03tT14uNjcXhw4eNjk0ZdmbQKShoywQnJyebveNQe+0GTuwt6LaBi1arxeHDh/VZ8djYWPzwhz/k1s3dUG9Z48FgmIioKwgAJPPTpmUj7f0wMrzent5UktLdGS6cU6vVRtleU9a6LujO695xOHesFLUVTaitaNJ/TYx7ILLbZfdycnL0ddJAW920IAiYNGmS2fbOR44ccaovMblGb3nXgcEwEVEXGHNvGPIPlBidGxStNCsbcXh7ZgsCb/PBiImDelVJSndnmu394Q9/CADYtm2bWeBn2plBR9EUhJ3rvtAHuFfOV+u7lQBtwXHCtIhuk93T/QKQm5trdu306dOQJEmfJb948SIKCwtRWFioPxZFETKZzGq5CLleb1njwWCYiHosjShhXdFV5NbUI1HZB89HDIBCJrT/wk6Q+PAQyL3l+Da3DM2NGnj7yXH7MPOtldv7YWR6/fZhKtRdbzIKiobfNbBHvrXpyUyzvV9++SWqqto+j7rAV5cpLSoqwm2BoaipuKF/Q6FfUCgq8wNRhSr959+sXKKiSZ8RNtRV2T1L5R46VVVVOHPmjNG5q1evGh0b/h3pGJaLkOv1ljUeDIaJqMdaV3QVfy4sgwQgp6qtv+7yyNCundRNMrkM42dEQZAJyNtdgOZGjb73sGHg6sx2zbvXnzYKhlkr3P0MHjzYKNsrScY1M8ePHzfKjEIC/FsiENDQ9vnWVrdV2uicPliC2LsHI/A2H6Ntv3VfF90hu+fornEDBgy49fG78L5kv96yxoPBMBG5VHeqT8ytqdeX5Uo3j7ub9rJ2hj+MWm60Yusrx1FX2QS5Qoa4ewZj/ENRZj+sukvwQ9YJgvE7FDdu3DA6bmpqMg4EBaDVuwZouHlsUm+u+2VqUIzKKBg2/AXKXdk9WxuHGLJW7qEzevRoyGQyqzXDhmUUpvcl6ggGw0TkUq6uT+xIcJ2o7IOcqraAWLh53FnsnffAKKVR4Gqrz/C/f39Cv7WytlXEyf3FkHvLzf5+e8tbm56spMS4Xry5udnyQN0XrwR4tbTfg7qipA7jHlCj9GINBkWrEH9fmNt/OTUsf9AFu5bKFnSLAz/77DNoNLda/ykUCvzgBz+wGEQb3ker1UIQBIs1w0QdwWCYiFzK1fWJHQmun48YAABGNcOdxR2LluqrzDfpsPT321ve2vQkhr2CRVE0q4cFYBT4GgfAArxalPBvaD8D2nJDC0EmYObz8QCAE3sL3L54zrRMwVrZgm4jDlEUjbpJTJw40a6aX+5CR+7CYJiIXMrVb9F3JLhWyIQO1wg7uwjP3nmb1vPqji1llvv09dVnhnVYAuE8UdSgsCgd1dUnoFKNgzriWchkHf+xaBj4arVaXL58GVqttv0XCgBEObxa+8AwABbQ/tebIV0XCZlc1imL50zLH9orW5g8ebJROYQzmV3D0ozBgwdDEASUlJSwBRs5hcEwEbmUq9+i7+r6V2cX4dk7b2vjLGWW5/xmXFuphEHNMEsgbnE0uC0sSkdBwToAEqqqjgIAoiKXdHgetrom2CQB/g2D9YvknKXrIjHugchO+e9HF8zaG9y6IsNrqTRD92ddCzb2JyZ7MRgmIpdy1Vv0uszo5e+rcPswFQRBwKChnV//6uwiPHt/KbA2zlJGb9wDkXhi9USHP4bewtHgtrr6BGDw2W077jinuhtIgEzrY1cphD10Xz+dUT/eFeULtv6OLbWpY3kF2cJgmIi6HVErIvMvX6D0wq0SgoSp4V1SB+vsIjx7fymwNq6rM+KeyDS4LSl5BwCMMsSG2WNJMi5duHGjGBcL3jLLKNvKOFt6u76ystLxyQuATOvrcEmENYZbMndl/bi9nSYcZaszhWmbuqKiog4/j3o2BsNE1O2c3FdkFAgDwKlDl3DXrOhOn0tXLcJjRwjHqVTjbmaE24IhjabmZqb4VobYMHsMCFCp7kJT0xU0NRWjqanEbDwAFBSuR2HhWwCAqqojKCh4AwICIEnJOHasHzQaEQBstg1rlwR429EtwhpvXzlCIgJRe70JdRa2ZO4q9naacJRhacbgwYMBtGWEAUAURaOxpsExdZ7u1GrTFgbDRNTtWFrko9WI5gM7gSsW4TmDHSEcp454FgBQUvIONBrdL1PG5Q+m2WNBkMPPLwxNTcUWxwNAWdlHZs+S0AAJezFoUCyKi+90yfx1s/L2U6DlhsboWlA/XwAw2kzFUGtrW5Y76DZf1BmM6ard5nTs7TThKMPSDK1Wiy1btpjtTqdj2tO5N+nqYLS7bAXenu4XnhNRryNqRZzYW4Cd677Aib0FFnvtBgb7dsHMqDsTRQ0uFryF/C+ewMWCtsxtVOQSDB78pNE4pTJB/2eVahxu7d0mQKUaZ/Gc4TOami5bfL4gAP0HdCAbbHQzQONdCwBouaFB4G3GX+/DJwxEUIif1ZdLWuDyt9WorTDevKOry2tMO0u4Y4OMnJwcmzvVRUT03ndVdMHopbNVyNtdgJP7OrdkpLtsBd4eZoaJqMuZZg/GPaBGwrRwnPpfCbRaCX36+mDOb8YZvaarMx7U9awvmDN+W7y09ENUV+dBEGRQKhOgVi9BTc1Jff2vTlVVHgAR1dV5+trhgsI0s/sZc91b8IabagT180VQP19UXKpHv8F9EH9fGAAY1ZFbUlfZbLTpRleX19jbaaIjtcWWss0qlQrNzc0YMGAAkpKSnP8APFxXB6OesvaBwTARdTnTb9ClF2sw8/l43PWw5RphUSti57ovcOW7trfCL52twqVvqzDz+TgGxL2ItW4QNTX5RuOamy+hufkSAKCq6hgiI5/HmPjNRmOiIpfgIt4yCK6PQdQ2o7jkH1afL0mAQtEMQISzb7Sq1WrIZDIomoJQmR9odO3yt9X6f+fvbwv4BBkg2aoYkmC06UZXs7fTREdqi00X0ykUClRXVwMACgsLsW3bNsybN69Xtlfr6mDUU9Y+MBgmoi7n6Dfszz8u1AfCOle+q9b3VqXeQalMQFXVEf1xY2MRLha8dfP8rYV0xiSUln6o7wghihoUFK5HWdlOtLRchWFwXVScbvP5ggAoFBqEh3+F4uJYi2O8vb0hiiK0Wq3RQi4/Pz8kJibqM6CiVsTJ22+903H5e+MM8Le5ZVbrhU1117eibelIbbEu23z69GlUVVUZbfUMtAXEOTk5vbK9WlcHo56y9oHBMBF1OUe/YX+bW2bxfHcIApzdsY7spxEl/LWwDO9eGgcN1iMJn2IWdqC5+RIKCtYhImIxVKpE1NR8AUlqNnt9U1MxCovSoY54Fl+cehLV1cednosgAEFKC1srA/D19UVTk+UAVhcIG5UGTJuEcfKbgcNe4PK5auvPtZEh7q5vRdvi6C52hnTZ5+LiYquL6Fy1cM/TeEow2tUYDBORyzlaz+uqb9iDolXQtGiwe/1pXC2og8JLhtGTb8e4ByNdVj7RXrDr7I51ZL91RVextugqAH9A8MdH0uMQIWA23gMg4erV3WhqKoEuyyuXB0EUG4z6CldXn0Ah0KFAGGgrlRCs1A37+flZDIYnT54MURSxfv16q5tDmP6CKIkSTuwt1N9j0FCVvowCQNvGNDKhW78VbYuju9hZYqv3sDsW7lHPwWCYiFzO3e10hiWGGgUG3v4K3Hl329bEu948pS+h0LaK+Py/RRBkAsbPiOrQM3VB8PtllShqagFgOdh1dsc6sp/Z36kgw/+kH90MhgW0/c3fClC12lqzeyiVCS7ZcU4QAB9f889xREQE1Go1Dh8+bOE1gsXzhtlL018QRa0IQSbog+P4+8LwxYGSHrOA1BW72Jn2HhYEASUlJU4H19R7MBgmIpdz9wrmsdPVRoGBYSBQcck8MPk2t6zDwbBhxldHAvBW0VX849I1KOUyPDqgLzSicZbQ3h3ryH6Jyj74tMr489wCbwByREYugSSJNzfJsN7pobo6F0rlOKOaY+fdemdApVIhLi5OH3yZBr2CIFh9y95W9tLSuyd8+9tYV2wLTT0Dg2EicjlnVzDbW15hq6yi3+A+Rm8fu4phxtdQkyShSaNFjUaLvxaXG11LUnXejnW9yfMRA/Dv0usoaW4BIACShGh8B4UiAFGRSyCKGgiCDAUFbwHQWrxHdXUuampOdXgukgQ0NwXoj4ODg41qgcPCwlBSUqK/npSUBIVCYfR2ft++fXHnnXcye0nURRgME5HLObuC2dnyCsMgemCUEjXXGlFf2aK/Piyx4zW7ico+yKm6FRD7ygQ0idYzjwAgF8DFc26gkAnISRyBB3N2oEAMRQSKsAK/B2SDsLag7GY99+MYjTdhq5mWpcV1jhIEQDLIDIeHhxu1CQNutU8zfbvemZ66ROR6DIaJyOWcXRDnbHmFpU07TOsrT+wtMAvOHVnkp8vw6hbOiZJ0cxGXZQJYIuFOvnIZNoSXorDwV/pzn/g/j00GixcfFR7DLOl9/XUtZPgQj+MAfoQWeCMa3+EX+D28obHwBPtIEiATYhAVFaUPbLdt22Y0RiaT4YknnjA6x7fziboPBsNE1G04W15hbdMOnRN7C4yC5bNHSzFs/AB8/t8i/TnAdhZaIROMFsppRAn/uVqF4qYWs7G+goAlEQNYIuFmkepUCIIM1dUnoFKNw/fVIyGhAUBbtfB+YRYkScKD+Ah7MAufIhnXMKAtnQvgrDQKf8Rv8FusdHoOggCMHj0KQ4feCnY70iaMiDofg2Ei6jacLa+wFUSLWhHnjpUaja+73oQvD182OufoIj+FTMCPQ4OxptC857HPzQzzT85cYK9hN5LJFDe3X26TWFCGnOoGfSlLneSND4Uf4xxi8bU0Qh8E6wkCvpOGd3geV8t3YejQ5fpjV7QJI6LOw2CYiLoNZ8srbAXRJ/cVWdy5S9NqvGOBoxsVaEQJoiRBDvMlWpIksddwF0gN74+j1fXIra7XFz5IEHBZMRrQWF5IZ9gJwllabZ3RMbsaEHkWBsNE5PFsBdHWMr4DIgMxeFiw09uUriu6ir8UXbXYYUKpkKFW2xZss9ewe1ja/CStuBxHq427fggARvbxMzsPAJAkxOBch+eiUAR1+B5E1HUYDBNRj2ZaQiH3kiE0KggPpsZC4W39W2B7bd6stVoDgDBfH1xq1kACF9K5i2Hf50+r6vF+WSUA487CKoUcTw8OQWp4f6QVl+O9skoUNzVD146tH8rx//B/HZ5LaOjDHb4HEXUdBsNE1KNZKqGwZ6eu9tq8mbZaMyQXBLykDjXKWpLzLGWBj5tkeotMFjIKAJ4eHKIvT1keGYrnIwZg5eldOF5VhWE4h5n4AHIYl8s4Qi4PQnj4AqgjnnX6HkTU9RgME1GPZmlbW9M2a5aC4/bavOkC3LcvXUO1ST3qXao+rBF2IcMssK4G21oIG+HrjQg/b4u/hChkAl698wFkZQ9zybzCwuYbLeAjIs/EYJiIepX2Mr6iVsTnHxfiWpHxoqiBUUqjY5kk4Yff3MC5Wg12DxD067CUCjlESYJGlNhBwkUMS1J0NdgyCzl5AcDs0GCbv4jIZAooleNRU5NnY0wgRFH3+RegUiVCEOSQJA2qq3MNRtredIWIPAODYSLqcvZuw+yK+1nL+OqC4NOHStByw7zzQP6BtvvdHtMXCdMi9EF1rADUjvDFtyMDUCaTUKPR4i9FVyETBGaHXcSwJMWwBvszgzZqEb7emB0abFdJStyd7+B47v1objZurxcR8Ryih7wIUdSgsChd379YHfEsZDIF8r8w3jijpibfBR8dEXU1BsNE1OWc3YZZxzT4lUQJJ/YWWryftZ7EJ/cV6V9jibZFwuVvq3H522qcPVqK5sa25l0yCfjhN024NMAL6O8FoC1feODCNbwY3r9DQT21Md39zzDgNTxnbyZeofDFxAmHUFC4HmVlOwFICA2dhUh1KgDz/sU6KtU4VFUdBW6G5SrVuI5+aETUDTAYJqIu5+w2zDqmwXRQP1+r99MvqPu+GpIk4fL3VcBetP3bTnXXzfsWD77aigshiraNHSQJym/qsOvLU3hoaRwD4g4y3f1PpyOZd5lMgSFRL2BI1At2v0a3UM4wY0xEno/BMBF1OWe3YdZpL3iWRAk73/gCknSrxrO24gbqrjcDAC6fq4bcq2MB6w/OtgXIxSFeCL/Wih+cbcJlqQkn9xU5tZFIb2Spa0R3qru2ljEmIs/GYJiIupyz2zDrmAbTwxJDIcgEXDlfDUlsK29oj7bV+RZbwK1yCcA4a3zl+/afTW0sdY1g3TURuRuDYSLqcs5uw6xjrZewqBWx7XfHXTVNp4giOw7Yy1LXCCIid2MwTEQez1owfXJfEWorzOt7Dfn4K/SL4Szp09cHMrmA5kaNzXHW1F2/4fBreitrXSOIiNyJwTAR9Vjt1RLfPkyFB1Njkb+/GOeOl6Llhhbefgr0CfZBfVUzWho1qK9q7tAcBKH71Lx2d7a6RhARuQuDYSLqsUxriU3VXW/C3vQvMShaheF3DcSJvYVobtRY7BbhrGGJrHm1l7WuEURE7sRgmIh6rIRpEZBECd/mlqG5UQNJkow21KitaEJtRZPNgNmWPsE+qK+0nDkO6ueL4RMGOrwYkIiIOheDYSLq9pzdoU4ml2H8jCiMnxGl32HuTNYlp2p/deReAgKUPhiWGIoxU8OxJ+2MUbcKwyCY/YWJiLo/BsNE1O11ZIc6XSB97lhpu4vp7JEwTW307IeWxrl0K2kiIupcDIaJqNvryA51hoG0IwJv89EvfusT7AtBBtw+tK9Z2UNH28IREVHXYjBMRN2eIzvUmZZUOLvpRZ++vnjkpQSnXktERJ7DY97LW716NSZOnAh/f3+oVCqz66dPn0ZKSgrCwsLg5+eHESNGYN26dUZjPvzwQ9x3330ICQlBUFAQJkyYgP3793fSR0BEzkqYFoHxMyIxeERfjJ8RaXNRmi4TfOlsFfJ2FxhtweyIqwU1zk6XiIg8iMdkhltaWvD4449jwoQJ2Lhxo9n1kydPon///ti6dSvCwsJw9OhRLFq0CHK5HM899xwA4NNPP8V9992H1157DSqVCu+88w5mzJiB3NxcxMfHd/aHRER2cqQUwayEQgDGz4jUZ4rtLZkQte2PISIizydIzqZNukhGRgZeeOEFVFdXtzs2NTUVZ8+exaFDh6yOGTlyJH784x/jlVdesXsOtbW1UCqVqKmpQVBQkN2vIyL3O7G3wCjgHT8j0iiQTnv2EGDnd73Uv9/j6ukREVEnsTde85jMsDNqamoQHBxs9booiqirq7M5hog8i66EwrC7g6H4ewbji4OX2r1PQF9vt8yPiIi6lx4bDB89ehTvvfce9u7da3XMn//8Z9TX12P27Nk279Xc3Izm5luN9Wtra102TyJyrfZKKu56JBpe/l649F0l6q41oa6q2SxTHBjsgzm/He/mmRIRUXfQpcHwL3/5S/zxj3+0Oebs2bMYPny4Q/f96quvMHPmTPzud7/D/fffb3HM9u3bsWrVKuzcuRP9+/e3eb8//OEPWLVqlUNzIKLuSRcssx0aEREBXVwzfO3aNVy/ft3mmKioKHh733q7sr2a4W+++QZ33303nnrqKaxevdrimH//+99YsGAB/vOf/+CBBx5od56WMsNhYWGsGSYiIiLqpjyiZjgkJAQhISEuu9/XX3+Ne+65B08++aTVQPjdd9/FggUL8O9//9uuQBgAfHx84OPj47J5EhEREVH34DE1w8XFxaisrERxcTG0Wi1OnToFAIiOjkafPn3w1Vdf4Z577sHUqVOxbNkylJWVAQDkcrk+4N6+fTuefPJJrFu3DomJifoxfn5+UCqVXfJxEREREVHX8ZjWavPnz8e//vUvs/NZWVlITk7GypUrLdb1RkREoLCwEACQnJyMw4cPm4158sknkZGRYfdc2FqNiIiIqHuzN17zmGC4O2EwTERERNS9eUTNMBERkSuJWhEn9xUZ9ZmWyWUOjyGi3oPBMBEReSRLQe3JfUX6HQgvna2CJEoQZILNMQDYao+oF2MwTERE3ZalgBcATu4rwrljpaitaALQFtSeO1aK5kaN0eu/zS0zGgO07U5oyPSYiHoXBsNERNQtaVo02L4qD3XXbwWzukyvLrNrSBf0GjINjnVBtS4wBoBB0SoALJ8g6q0YDBMRUbe0J+2MPhDWOZN1CRDsv4dpMGyYXb5yvhoDo5SQRAk7130BSZRw+dtqAOblEwyUiXouBsNERNQtVVyqNztnGtzaQ+4lIEDpg2GJofogVhfknthbYDHLDBiXT7DOmKjn4q+1RETULfUb3Mcl99G2SqitaIIgE8yyubbqhXXlE5bGsc6YqOdgMExERN3Sg6mxGBSjcqgswpbL31eZnTMMeAHg9mEqDB7RF+NnROrLKSyNMz0mIs/FMgkiIuqWFN4KzFo2xmYpgyNqrzVB1IpG2WHD+mFbtcCWxhFRz8Ad6JzAHeiIiDqPbvHa6UMlaG64VTMsVwjQahz7ETZ+RiRrfYl6Ce5AR0REHkHSaFCxYQNunMyHX8IY9HvmGQiKWz+eDBe8GWaIx0yNwOXvq3Hlu2q7n3XuWKnFnsXsEkHUezEYJiKiLqELgmsyd6K1pAQA0HDsGAAgJDXVbLylUoWxAE7sKcCXhy+j+YYGaCdRXFvRhNqKJqM+w4ZdIi5/VwVBJjAwJupFGAwTEZFLSRoNrqWno3bnLmhrayEPCkLQzIfQ7+mncX3jRjR+/jkgimi5fAWaS5dMXizhxsl8i/c1zBAbSpw5BIkzh2DnG1/g0jnzRXLWXP6+CrXXbhifM+gzLIkSxs+Isvt+ROSZGAwTEZFLaOvrUTBzJlovXzE6L9bW4nra31D5z42Qmptt30QQ4JcwxqnnDxqqMgqGg/r5IvA2X32Aa+rKd9WQROv3y/+kCIJMYIaYqIdjMExERC5xYcZD0JaWWr3eXiDsNXgwvG4fhMbPT+JaWppZ7XB7rHV80NUED4xSAgC+zS1DbUWTzUAYaOtPrCuh4KI7op6LwTAREbmErUDYFiGwD/zuuAMtl6+gMTcPANB4/DgAy7XD1lgrozA9V3qxBrUVTWbjrLn8fRWwt/32a0TkmRgMExFRl5Lq6vVB8K2TEqo/yrTaYaIjBkWrjBbQmfLxVxhv+yyBWzET9WAMhomIyDW8vYGWFpfdTnPpEjSXLtnsMOGMhGkREDUizmRfQssNrdE1H38F+oXd3AZaAG4f2hdXvq82GsOtmIl6Fr7PQ0RELnHbz+a758aShJrMnZA0mvbH2kEmlyFx5hA8/dfJGD/DOMPb3KjB5W+rcfnbaohaEQnTIjBoqMpoDLdiJupZmBkmIiKXCFmyBJDJcH3DPwCxndVpDmotKUHFhg0uyw7r6BbZnTtWalZHXPp9LU7uK+JWzEQ9HINhIiJyGUGhgP/4cWg88Tmg1bb/Agc0fv65S+8H3Fp0d+V8tcVFdVfOV2OcnFs4E/VkDIaJiMglKjZsQMX6NECSAEGALDAQYl2d6x7g4myzIWuL6lgSQdTzsWaYiIhc4sbJ/LZAGAAkCX6jR6PfkucAQWj3tf7jx0EICrQ9SCZ3wSwtS5gWgbE/ioC3vwKCrG0h3dgfRbAkgqgXYGaYiIhcwi9hTFvnh5uZYd/4ONRk7rwVINvQmHfC9gBBgP/YBBfN1JxuUV3izCFuewYRdU8MhomIyCX6PfMMAKDx85OQtBpUbdkKsbbWaIwsKAhiQ4N99cSC0JYxliv0vYaJiFyNwTAREbmEoFAgJDUV19LSUPHWerPrXmFhGPLfj3EtPR3X0/5m5SbmAbCrNtsgIrKE32GIiMilbpzMt3he+fDMtoD52WchyGSoydyJ1pIS/XWvsDAoH57JAJiIOhW/2xARkUv5JYxBw9GjRuf8E8fryxx0GeR+zzyDig0b3LLlMhGRvfhdh4iIXKrfM89AEkXU7toNAFA+NAP9nn3WLNDVBcUAIGk0VgNjW9eIiDqK302IiMilBIUC/ZcsQf8lS+waL2k0KF64EI25eQDQ1pEC0AfKhv2LTa8REXUU+wwTEVGXqtiwQR8IAwAkCTWZOyFpNADM+xdbq0kmInIGg2EiIupSloLb1pISVGzYAKCtBlm/cYcgtB0TEbkIyySIiKhLWVpwB9wKknUL7wxrhgHWEhORa/C7BhERdTqjQDY+DrelLkbtrt23Wq0ZZIANF9oZYi0xEbkCg2EiIup0poFsv+dSMeS/H5tlem1hLTERuQKDYSIi6nSWAllrGWBLJI0GklZjdI61xETkDC6gIyKiTtfRRXEVGzagMe+E/thwUw8iIkcwM0xERJ3O2qI4exlllgEIcgUXzxGRU/idg4iIOp0jJRGW+CWMaVs0J0lst0ZEHcJgmIiIPE5HM8tERDoMhomIyON0NLNMRKTDYJiIiKgTiVoRJ/cV4cr5agyKViFhWgRkcuvr2Z3dXISbkhDZh/9VEBERdaKT+4qQt7sAAHDp7P9v796DojrvP45/dhcwClkQxBgjiBEvY72EmPwsTK0WrcRaf5o4iZ00IXHMGBO1YqrWzDRFp7XaVhMniRqntYiSjjG2EhObGCLFiZUoYEjBRmNuxUSIEmQXpCCw+/vDYX8sd2FvsO/XDH/sOWfP+eI843x8/J7nuSpJunfOiHavv5nNRZoHYHtjg2pOnZYkNiUBOkAYBgDAA5pmhD/Kvuh0/NKnlR1+72Y2FynfuVPl23e0PuGmTUmYfUZfwIgFAMADms8INzc0NqzVsaaQWZOfr+slJU7n6kpKdGX79jaDp+Xwm20/3E0rbrAlNvoCwjAAAB7Qcga4X3CAJiVGafJ9w1tdW75rly6/vFP/iZ6lyoh7FBbwmYaXHJXRblPDV1+p/KWXVZG+VyazWQFDb5fBFKAB90yWvdnay5JkNJvVf/x4t624wZbY6AsIwwAAeMDQ2DBHj7AkTUqMatUr3DQjXLF3n/4TPUtfxMyRDAZdHThWkjTiP287rrVZrbJZrar/6itJUk1uroxms9P9Bj76iAavWOGuX4n1ntEnEIYBAPCAphng5qtItNS87aBy+EinLasrQ0d2+gyb1SrpxoywKTRU0o2A7a4+3qbZ5pr8AsnWqJr8fF156SXZJdV+WEgfMXoFRicAAB5gNBk7XDVCcm47CLN8dmNG2GCQ7HaFWT7r8rOaZo2/3bFTBqPRbX28Tes9X9m+3RHia3I/cJynjxi9AWEYAAAf0bztYHjJu5KkytCRCrPc6Bluj9FsdswKO/FQH69T77AXng/0BGEYAAAf0XKb6YHV1bKkvex8kcEg45Ah6hc1TAaTSQPuuUcRixfr2927W60v7Kk+Xqfe4Ra10kcMX0cYBgDAR7TcZtre0KDAkJAurePb9L221v5t77irenmdQnzcXa16hgFfZrC3XIcFnbJarQoNDZXFYpG5xZu7AAD0lCuDq72hQeU7d6piX4ZTK0XEsqcV+dRTbJqBPqureY0RDwCAl7QXeru6mUVXQnP5rl1t7kp3dV+GJOnbHTvZNAN+jTAMAICHNYVYS+Ybqr94Y3vm5mG0q5tZdBaa7Q0NsmS+0eZ3bVarrIffZNMM+D2jtwsAAMDfNIXYpiAsySmM9p98t9Maw+29hNZZaC7ftcv5GS00XL78/x942Q1+iplhAAA8rM2lyJqF0ZarSrT3ElpnO8B1NtNrr6uTJAVGRSl0/jxedoNfIgwDAOBhLZciaxlGW64q0Z7OQnOrJc/69VPgoEGqt1qlqirHdUFRUfQKw28RhgEA8LC2Qmx3VnHoLDS395zmO8a5sj3Cncu3Ae7CCAUAwMO6OvPrrud0tQ2jpc7CbldXwQB8CWEYAAA387UZ0+6G8c7CbldXwQB8CWEYAAA36+mMqa+E6c7Cbmcv9AG+iDAMAICb9XTG1FfaDzoLu91tvwC8iTAMAEAPdTZz29MZU19oP7A3NMhusylw2DBJUuj/zm0Vdj3VCw24EmEYAIAe6mzmtqczpr7QflC+a5dj62YZDJLRyEoR6BMYxQAA9FBnM7c9nTF1ZftBd/uPfWF2GnAHwjAAAD3k7plbV7YfdLf/2BdmpwF3IAwDANBDvenFse7O8Pam3xG4GYRhAAB6qL2ZW08vidaV53V3hrcns9O+sjQc0BZGIgAAbuKqJdG6GiY7e569oUFqtiKEuY0VIdzBV5aGA9pCGAYAwE1c9dJZV8Nky+fV5OfryvbtjhBtt9mcVoQweGhFCF6+gy8zersAAAD6qv6T776xDJnUo5fOuhomWz5PNpvKX96uaydPqvzl7bIeftMrodRVfw6AOzAzDACAm7jqpbOu9vm2fF5NfoFT+LU1Njpdf+2DD/TpjJkKiIpS8L33uK2Xl5fv4MsIwwAAuImrlkS72TBpt9tUc/q0rn99qVkxBjV+843zhTab6r/+WvVff63/njolyT29vOxMB19GGAYAwMd1NUw27y1uLjAqSqHz56n8pZfb/7IL2yZYPQK9CSMTAIA+wqm3uIWa/PwbfbvtnHdlLy+rR6A34QU6AAD6CKcX1Zqpv3hRNbkftBuEDWazBi1f5rJeXlaPQG/CzDAAAH1EU5ityc+XbDbJaFL9V1+p/uLF9r9kMCjisWSXztyydTN6E8IwAAB9RFu9xVe2b2/dR2wwaMD/3CuDKcAtqzuwegR6k14Thjdu3KgjR46osLBQQUFBqqysdDr/0UcfafPmzTpx4oTKy8sVExOjpUuXauXKlW3e75///KemTZum8ePHq7Cw0P2/AAAAXtDWbPGAeya79aU2Vo9Ab9JrwvD169f14IMPKj4+Xrt37251vqCgQIMHD1ZGRoaioqJ08uRJLVmyRCaTScuXL3e6trKyUsnJyZoxY4a+abnMDAAAfQjBFOiYwW5v77VS37Rnzx6lpKS0mhluy7Jly/Txxx8rOzvb6fhPfvITjRo1SiaTSZmZmTc9M2y1WhUaGiqLxSKz2XxT3wUAAID7dTWv9enVJCwWi8LDw52OpaWl6fPPP1dqamqX71NXVyer1er0AwAAgN6v17RJ3KyTJ0/qtdde05EjRxzHLly4oHXr1un9999XwE30SW3atEkbNmxwR5kAAADwIq/ODK9bt04Gg6HDn3Pnzt30fYuLizVv3jylpqZq1qxZkqTGxkY9/PDD2rBhg0aPHn1T93v22WdlsVgcPxc7WqIGAAAAvYZXe4avXLmib7/9tsNr7rzzTgUFBTk+d9Yz/O9//1s/+MEP9MQTT2jjxo2O45WVlRo4cKBMJpPjmM1mk91ul8lk0rvvvqvExMQu1U3PMAAAgG/ral7zaptEZGSkIiMjXXa/s2fPKjExUY899phTEJYks9msoqIip2M7duxQdna2Dh48qBEjRrisDgAAAPQOvaZnuKSkRBUVFSopKVFjY6NjBYjY2FiFhISouLhYiYmJSkpK0jPPPKOysjJJkslkUmRkpIxGo8aPH+90z8GDB+uWW25pdRwAAAD+odeE4V/96ldKT093fI6Li5Mk/eMf/9D06dN18OBBXblyRRkZGcrIyHBcN3z4cH355ZeeLhcAAAC9QK9bZ9gX0DMMAADg21hnGAAAAOgEYRgAAAB+izAMAAAAv0UYBgAAgN8iDAMAAMBvEYYBAADgtwjDAAAA8Fu9ZtMNX9K0NLPVavVyJQAAAGhLU07rbEsNwnA3VFVVSZKioqK8XAkAAAA6UlVVpdDQ0HbPswNdN9hsNl26dEm33nqrDAaDt8vxOVarVVFRUbp48SI79EESYwKtMSbQEmMCzbliPNjtdlVVVWno0KEyGtvvDGZmuBuMRqOGDRvm7TJ8ntls5i80OGFMoCXGBFpiTKC5no6HjmaEm/ACHQAAAPwWYRgAAAB+izAMl+vXr59SU1PVr18/b5cCH8GYQEuMCbTEmEBznhwPvEAHAAAAv8XMMAAAAPwWYRgAAAB+izAMAAAAv0UYBgAAgN8iDKPbdu7cqYkTJzoWxI6Pj9fbb7/d6jq73a7Zs2fLYDAoMzPT84XCI7oyHnJzc5WYmKjg4GCZzWZ9//vf13//+18vVQx362xMlJWV6dFHH9WQIUMUHBysu+++W3/961+9WDE8afPmzTIYDEpJSXEcq62t1bJlyxQREaGQkBAtWLBA33zzjfeKhEe1HBMVFRVasWKFxowZo/79+ys6Olo/+9nPZLFYXPpcwjC6bdiwYdq8ebMKCgqUn5+vxMREzZs3T2fPnnW6btu2bWxb7Qc6Gw+5ubm67777NGvWLJ0+fVp5eXlavnx5h1tkonfrbEwkJyfr/PnzOnz4sIqKivTAAw/ooYce0ocffujlyuFueXl52rVrlyZOnOh0fNWqVXrzzTf1+uuv6/jx47p06ZIeeOABL1UJT2prTFy6dEmXLl3Sli1bVFxcrD179uidd97R4sWLXftwO+BCAwcOtP/pT39yfP7www/td9xxh720tNQuyX7o0CHvFQePaz4epkyZYv/lL3/p5Yrgbc3HRHBwsH3v3r1O58PDw+1//OMfvVEaPKSqqso+atQoe1ZWln3atGn2lStX2u12u72ystIeGBhof/311x3Xfvzxx3ZJ9tzcXC9VC09ob0y05cCBA/agoCB7fX29y57PlAxcorGxUfv379e1a9cUHx8vSaqpqdHDDz+s7du3a8iQIV6uEJ7UcjxcvnxZp06d0uDBg5WQkKDbbrtN06ZN04kTJ7xdKjykrb8jEhIS9Nprr6miokI2m0379+9XbW2tpk+f7t1i4VbLli3TnDlzNHPmTKfjBQUFqq+vdzo+duxYRUdHKzc319NlwoPaGxNtsVgsMpvNCggIcNnzXXcn+KWioiLFx8ertrZWISEhOnTokMaNGyfpxn93JSQkaN68eV6uEp7S3nj44IMPJEnr16/Xli1bdNddd2nv3r2aMWOGiouLNWrUKC9XDnfp6O+IAwcOaOHChYqIiFBAQIAGDBigQ4cOKTY21stVw13279+vM2fOKC8vr9W5srIyBQUFKSwszOn4bbfdprKyMg9VCE/raEy0VF5erl//+tdasmSJS2sgDKNHxowZo8LCQlksFh08eFCPPfaYjh8/rk8//VTZ2dn0/vmZ9saDzWaTJD355JNatGiRJCkuLk7Hjh3Tn//8Z23atMmbZcON2hsT48aN03PPPafKykq99957GjRokDIzM/XQQw/p/fff14QJE7xdOlzs4sWLWrlypbKysnTLLbd4uxz4gJsZE1arVXPmzNG4ceO0fv16l9bBdsxwqZkzZ2rkyJHq37+/XnzxRaeXoxobG2U0GjV16lTl5OR4r0h4TNN4WLdune68807t27dPjzzyiOP8woULFRAQoFdffdWLVcKTmsbE2rVrFRsbq+LiYn3nO99xOh8bG6tXXnnFi1XCHTIzM3X//ffLZDI5jjU2NspgMMhoNOro0aOaOXOmrl696jQ7PHz4cKWkpGjVqlVeqBru1NmYqKurk8lkUlVVlZKSkjRgwAC99dZbLv/HFDPDcCmbzaa6ujpt2LBBTzzxhNO5CRMm6IUXXtDcuXO9VB08rWk8xMTEaOjQoTp//rzT+U8++USzZ8/2UnXwhqYxUVNTI0mtVhMxmUyO/0lA3zJjxgwVFRU5HVu0aJHGjh2rX/ziF4qKilJgYKCOHTumBQsWSJLOnz+vkpISR585+pbOxoTJZJLValVSUpL69eunw4cPu+V/FQjD6LZnn31Ws2fPVnR0tKqqqvSXv/xFOTk5Onr0qIYMGdLmS3PR0dEaMWKEF6qFu3U0HgwGg9asWaPU1FRNmjRJd911l9LT03Xu3DkdPHjQ26XDTToaE2PHjlVsbKyefPJJbdmyRREREcrMzFRWVpbeeustb5cON7j11ls1fvx4p2PBwcGKiIhwHF+8eLGeeeYZhYeHy2w2a8WKFYqPj9d3v/tdb5QMN+tsTFitVs2aNUs1NTXKyMiQ1WqV1WqVJEVGRjrNKPcEYRjddvnyZSUnJ6u0tFShoaGaOHGijh49qh/+8IfeLg1e0Nl4SElJUW1trVatWqWKigpNmjRJWVlZGjlypJcrh7t0Nib+/ve/a926dZo7d66qq6sVGxur9PR0/ehHP/Jy5fCWF154QUajUQsWLFBdXZ2SkpK0Y8cOb5cFLzlz5oxOnTolSa1erP3iiy8UExPjkufQMwwAAAC/xTrDAAAA8FuEYQAAAPgtwjAAAAD8FmEYAAAAfoswDAAAAL9FGAYAAIDfIgwDAADAbxGGAcCPxMTEaNu2bW659/Tp05WSkuKWewOAuxCGAcBHPf7445o/f363vrtnzx6FhYW1Op6Xl6clS5Y4PhsMBmVmZnavQADoA9iOGQD8SGRkpLdLAACfwswwAPRCzz//vCZMmKDg4GBFRUXp6aefVnV1tSQpJydHixYtksVikcFgkMFg0Pr16yU5t0nExMRIku6//34ZDAbH57ZmpFNSUjR9+nTH52vXrik5OVkhISG6/fbbtXXr1lY11tXVafXq1brjjjsUHBysKVOmKCcnx4V/CgDQc4RhAOiFjEajXnzxRZ09e1bp6enKzs7W2rVrJUkJCQnatm2bzGazSktLVVpaqtWrV7e6R15eniQpLS1NpaWljs9dsWbNGh0/flxvvPGG3n33XeXk5OjMmTNO1yxfvly5ubnav3+//vWvf+nBBx/UfffdpwsXLvTgNwcA16JNAgB6oeYvqsXExOg3v/mNli5dqh07digoKEihoaEyGAwaMmRIu/doapkICwvr8LqWqqurtXv3bmVkZGjGjBmSpPT0dA0bNsxxTUlJidLS0lRSUqKhQ4dKklavXq133nlHaWlp+u1vf3szvy4AuA1hGAB6offee0+bNm3SuXPnZLVa1dDQoNraWtXU1GjAgAFuffZnn32m69eva8qUKY5j4eHhGjNmjONzUVGRGhsbNXr0aKfv1tXVKSIiwq31AcDNIAwDQC/z5Zdf6sc//rGeeuopbdy4UeHh4Tpx4oQWL16s69ev9zgMG41G2e12p2P19fU3dY/q6mqZTCYVFBTIZDI5nQsJCelRfQDgSoRhAOhlCgoKZLPZtHXrVhmNN179OHDggNM1QUFBamxs7PRegYGBra6LjIxUcXGx07HCwkIFBgZKkkaOHKnAwECdOnVK0dHRkqSrV6/qk08+0bRp0yRJcXFxamxs1OXLlzV16tTu/aIA4AG8QAcAPsxisaiwsNDpZ9CgQaqvr9dLL72kzz//XPv27dMrr7zi9L2YmBhVV1fr2LFjKi8vV01NTZv3j4mJ0bFjx1RWVqarV69KkhITE5Wfn6+9e/fqwoULSk1NdQrHISEhWrx4sdasWaPs7GwVFxfr8ccfdwRzSRo9erR++tOfKjk5WX/729/0xRdf6PTp09q0aZOOHDnihj8pAOgewjAA+LCcnBzFxcU5/ezbt0/PP/+8fve732n8+PF69dVXtWnTJqfvJSQkaOnSpVq4cKEiIyP1+9//vs37b926VVlZWYqKilJcXJwkKSkpSc8995zWrl2re++9V1VVVUpOTnb63h/+8AdNnTpVc+fO1cyZM/W9731PkydPdromLS1NycnJ+vnPf64xY8Zo/vz5ysvLc8wmA4AvMNhbNoYBAAAAfoKZYQAAAPgtwjAAAAD8FmEYAAAAfoswDAAAAL9FGAYAAIDfIgwDAADAbxGGAQAA4LcIwwAAAPBbhGEAAAD4LcIwAAAA/BZhGAAAAH6LMAwAAAC/9X91hn15oKDJugAAAABJRU5ErkJggg==\n", @@ -839,7 +854,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Examples Green Taxi.ipynb b/docs/example_notebooks/Examples Green Taxi.ipynb index 8f680f26b..f0328c480 100644 --- a/docs/example_notebooks/Examples Green Taxi.ipynb +++ b/docs/example_notebooks/Examples Green Taxi.ipynb @@ -428,14 +428,14 @@ }, "outputs": [], "source": [ - "reference = X_test.copy() # using the test set as a reference\n", - "reference['y_pred'] = y_pred_test # reference predictions\n", - "reference['tip_amount'] = y_test # ground truth (currect targets)\n", - "reference = reference.join(data['lpep_pickup_datetime']) # date\n", + "reference_df = X_test.copy() # using the test set as a reference\n", + "reference_df['y_pred'] = y_pred_test # reference predictions\n", + "reference_df['tip_amount'] = y_test # ground truth (currect targets)\n", + "reference_df = reference_df.join(data['lpep_pickup_datetime']) # date\n", "\n", - "analysis = X_prod.copy() # features\n", - "analysis['y_pred'] = y_pred_prod # prod predictions\n", - "analysis = analysis.join(data['lpep_pickup_datetime']) # date" + "analysis_df = X_prod.copy() # features\n", + "analysis_df['y_pred'] = y_pred_prod # prod predictions\n", + "analysis_df = analysis_df.join(data['lpep_pickup_datetime']) # date" ] }, { @@ -449,16 +449,7 @@ "id": "3dfbd7a4", "outputId": "8d3b7567-66e8-4c09-8654-096ca2c5fa90" }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/home/nikml/.cache/pypoetry/virtualenvs/nannyml-Os0Ylq-N-py3.11/lib/python3.11/site-packages/lightgbm/basic.py:2065: UserWarning: Using categorical_feature in Dataset.\n", - " _log_warning('Using categorical_feature in Dataset.')\n" - ] - } - ], + "outputs": [], "source": [ "dle = nml.DLE(\n", " metrics=['mae'],\n", @@ -469,8 +460,8 @@ " chunk_period='d' # perform an estimation daily\n", ")\n", "\n", - "dle.fit(reference) # fit on the reference (test) data\n", - "estimated_performance = dle.estimate(analysis) # estimate on the prod data" + "dle.fit(reference_df) # fit on the reference (test) data\n", + "estimated_performance = dle.estimate(analysis_df) # estimate on the prod data" ] }, { @@ -498,7 +489,22 @@ "metadata": { "id": "3a7b6877" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "drdc = nml.DataReconstructionDriftCalculator(\n", " column_names=features,\n", @@ -506,8 +512,8 @@ " chunk_period='d',\n", ")\n", "\n", - "drdc.fit(reference)\n", - "multivariate_data_drift = drdc.calculate(analysis)" + "drdc.fit(reference_df)\n", + "multivariate_data_drift = drdc.calculate(analysis_df)" ] }, { @@ -543,8 +549,8 @@ " chunk_period='d',\n", ")\n", "\n", - "udc.fit(reference)\n", - "univariate_data_drift = udc.calculate(analysis)" + "udc.fit(reference_df)\n", + "univariate_data_drift = udc.calculate(analysis_df)" ] }, { @@ -559,7 +565,15 @@ "id": "GnGnV5v0d7Fp", "outputId": "8b4933d6-c799-4f70-9d38-fe138e26d588" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = univariate_data_drift.filter(period='all', metrics='jensen_shannon', column_names=['DOLocationID']).plot(kind='distribution')\n", "figure.write_image(f'../_static/example_green_taxi_location_udc.svg')" @@ -576,7 +590,22 @@ "id": "ofutS6MwgFEd", "outputId": "5c9f19f2-6452-422e-8620-8bf38065a6c3" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = univariate_data_drift.filter(period='all', metrics='jensen_shannon', column_names=['pickup_time']).plot(kind='distribution')\n", "figure.write_image(f'../_static/example_green_taxi_pickup_udc.svg')" @@ -595,7 +624,15 @@ "id": "QCIMHtwkhG9K", "outputId": "f63aa06d-d290-469d-858c-4ee0fd98b168" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = univariate_data_drift.filter(period='all', metrics='jensen_shannon').plot(kind='distribution')\n", "\n", @@ -626,8 +663,8 @@ " chunk_period='d'\n", ")\n", "\n", - "perfc.fit(reference)\n", - "realized_performance = perfc.calculate(analysis.assign(tip_amount = y_prod))\n", + "perfc.fit(reference_df)\n", + "realized_performance = perfc.calculate(analysis_df.assign(tip_amount = y_prod))\n", "\n", "figure = estimated_performance.filter(period='analysis').compare(realized_performance).plot()\n", "figure.write_image(f'../_static/example_green_taxi_dle_vs_realized.svg')" @@ -653,7 +690,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/How It Works - Data Reconstruction with PCA.ipynb b/docs/example_notebooks/How It Works - Data Reconstruction with PCA.ipynb index 1d8168ed9..ec72d3a03 100644 --- a/docs/example_notebooks/How It Works - Data Reconstruction with PCA.ipynb +++ b/docs/example_notebooks/How It Works - Data Reconstruction with PCA.ipynb @@ -120,10 +120,10 @@ "outputs": [], "source": [ "# Let's first create the analysis and reference datasets NannyML needs.\n", - "reference = datadf.loc[datadf['partition'] == 'reference'].reset_index(drop=True)\n", - "reference.drop(['week', 'partition'], axis=1, inplace=True)\n", - "analysis = datadf.loc[datadf['partition'] == 'analysis'].reset_index(drop=True)\n", - "analysis.drop(['y_true', 'week', 'partition'], axis=1, inplace=True)\n", + "reference_df = datadf.loc[datadf['partition'] == 'reference'].reset_index(drop=True)\n", + "reference_df.drop(['week', 'partition'], axis=1, inplace=True)\n", + "analysis_df = datadf.loc[datadf['partition'] == 'analysis'].reset_index(drop=True)\n", + "analysis_df.drop(['y_true', 'week', 'partition'], axis=1, inplace=True)\n", "\n", "feature_column_names = ['feature1', 'feature2', 'feature3']\n", "\n", @@ -135,10 +135,10 @@ " categorical_methods=['chi2'],\n", " chunk_size=DPP\n", ")\n", - "univariate_calculator.fit(reference_data=reference)\n", + "univariate_calculator.fit(reference_data=reference_df)\n", "\n", "# let's compute (and visualize) results across all the dataset.\n", - "univariate_results = univariate_calculator.calculate(data=analysis)\n", + "univariate_results = univariate_calculator.calculate(data=analysis_df)\n", "figure = univariate_results.filter(\n", " period='all',\n", " column_names=univariate_results.continuous_column_names\n", @@ -151,7 +151,15 @@ "execution_count": null, "id": "70eb0fc4-6c23-4b90-9751-53f039ff6a14", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure.write_image('../_static/butterfly-univariate-drift-distributions.svg')" ] @@ -168,9 +176,9 @@ " column_names=feature_column_names,\n", " timestamp_column_name='ordered',\n", " chunk_size=DPP\n", - ").fit(reference_data=reference)\n", + ").fit(reference_data=reference_df)\n", "# let's compute results for analysis period\n", - "rcerror_results = rcerror_calculator.calculate(data=analysis)\n", + "rcerror_results = rcerror_calculator.calculate(data=analysis_df)\n", "\n", "# let's visualize results across all the dataset\n", "figure = rcerror_results.plot()\n", @@ -182,7 +190,15 @@ "execution_count": null, "id": "fc33d4df", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure.write_image('../_static/butterfly-multivariate-drift.svg')" ] @@ -204,7 +220,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/How it Works - Chunking Data.ipynb b/docs/example_notebooks/How it Works - Chunking Data.ipynb index 68bb182fa..f150825a6 100644 --- a/docs/example_notebooks/How it Works - Chunking Data.ipynb +++ b/docs/example_notebooks/How it Works - Chunking Data.ipynb @@ -20,15 +20,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/home/nikml/Source/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", + "/home/niels/Code/nml/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", + " warnings.warn(\n", + "/home/niels/Code/nml/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", " warnings.warn(\n" ] }, @@ -36,24 +30,24 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", + "/home/niels/Code/nml/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", " warnings.warn(\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] } ], "source": [ "import nannyml as nml\n", - "reference, analysis, _ = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, _ = nml.load_synthetic_car_loan_dataset()\n", "cbpe = nml.CBPE(\n", " y_pred_proba='y_pred_proba',\n", " y_pred='y_pred',\n", @@ -62,8 +56,8 @@ " chunk_number=5,\n", " metrics=['roc_auc'],\n", " problem_type='classification_binary',\n", - ").fit(reference_data=reference)\n", - "est_perf = cbpe.estimate(analysis)" + ").fit(reference_data=reference_df)\n", + "est_perf = cbpe.estimate(analysis_df)" ] }, { @@ -88,6 +82,13 @@ "id": "181ddd49-e709-4d45-9ce6-5d61f99a65c5", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAHICAYAAAASm6MRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIF0lEQVR4nO3de3zP9f//8fvbbO/Nxhy2sWU2pszIIafIsaiYUzn2VeZQ+tQklLJO8ilGSYqcSvg4RI6JQkLqUzmVPuRDyJCc2cFk2J6/P/z2/nh7b7P3vGaW2/VyeV8uez/fz9fr9Xi/X6/3633f62gzxhgBAABYoEhBFwAAAP4+CBYAAMAyBAsAAGAZggUAALAMwQIAAFiGYAEAACxDsAAAAJYhWAAAAMsQLAAAgGUIFsDf1LFjx9S5c2eVKVNGNptN48aNK+iSctSrVy+Fh4cXdBluWb9+vWw2m9avX19gNdhsNr3++utObZs3b1ajRo3k6+srm82mbdu26fXXX5fNZiuYInFLKVrQBeDWNHHiRMXGxqp+/frauHFjQZfztzRo0CCtWrVKw4YNU7ly5VS3bt2CLgk3wMWLF9WlSxd5e3vr3XffVbFixRQWFlbQZeEWQrBAgZgzZ47Cw8O1adMm7d27V5UrVy7okv521q5dqw4dOuj5558v6FKQj/766y8VLfq/Vfm+fft04MABffjhh3r88ccd7a+88oqGDh1aECXiFsOuENxw+/fv1/fff6+xY8cqMDBQc+bMKeiSspWamlrQJeTZ8ePHVbJkyTwNe+nSJV24cMHagpAvvL29nYLF8ePHJcll3hctWlTe3t6WTffcuXOWjQt/LwQL3HBz5sxRqVKlFB0drc6dO2cbLBITEzVo0CCFh4fLbrerfPny6tmzp06ePOnoc/78eb3++uu644475O3treDgYD388MPat2+fpOz3gSckJMhms2nGjBmOtl69esnPz0/79u1TmzZtVLx4cfXo0UOS9O2336pLly6qUKGC7Ha7QkNDNWjQIP31118ude/atUtdu3ZVYGCgfHx8VKVKFb388suSpHXr1slms2nJkiUuw82dO1c2m00//PBDjp/f77//ri5duqh06dIqVqyY7r77bq1YscLx+owZM2Sz2WSM0QcffCCbzZbjvvXMz2LMmDEaN26cIiIiZLfbtXPnTl24cEGvvfaa6tSpI39/f/n6+qpJkyZat25dtuOYOnWqYxz16tXT5s2bXaa5dOlSVa9eXd7e3qpevXqWn4d0Odg999xzCg0Nld1uV5UqVTRmzBhdfVNmm82m/v37a8GCBYqKipKPj48aNmyo7du3S5KmTJmiypUry9vbW82bN1dCQkKOn3Gmw4cPq2/fvgoJCZHdblfFihX11FNP5Ri6crusHD16VL1791b58uVlt9sVHBysDh06ONW2ZcsWPfDAAwoICJCPj48qVqyoPn36uLz3zGMsevXqpWbNmkmSunTpIpvNpubNm0tStsdYzJ49W3Xq1JGPj49Kly6t7t2769ChQ059mjdvrurVq2vr1q1q2rSpihUrppdeeilXnyFuPewKwQ03Z84cPfzww/Ly8tIjjzyiSZMmafPmzapXr56jz9mzZ9WkSRP997//VZ8+fXTXXXfp5MmTWrZsmf744w8FBAQoPT1dbdu21ddff63u3bvr2WefVUpKir766ivt2LFDERERbtd26dIlPfDAA2rcuLHGjBmjYsWKSZIWLFigc+fO6amnnlKZMmW0adMmjR8/Xn/88YcWLFjgGP4///mPmjRpIk9PT/Xr10/h4eHat2+fPv/8c40YMULNmzdXaGio5syZo4ceesjlc4mIiFDDhg2zre/YsWNq1KiRzp07pwEDBqhMmTKaOXOm2rdvr4ULF+qhhx5S06ZNNWvWLD322GNq1aqVevbsmav3Pn36dJ0/f179+vWT3W5X6dKllZycrI8++kiPPPKInnjiCaWkpGjatGl64IEHtGnTJtWqVctpHHPnzlVKSoqefPJJ2Ww2vfXWW3r44Yf1+++/y9PTU5K0evVqderUSVFRUYqPj9epU6ccP7BXMsaoffv2Wrdunfr27atatWpp1apVGjJkiA4fPqx3333Xqf+3336rZcuWKTY2VpIUHx+vtm3b6oUXXtDEiRP19NNP68yZM3rrrbfUp08frV27NsfP488//1T9+vWVmJiofv36KTIyUocPH9bChQt17tw5eXl5ZTlcbpeVTp066ddff9Uzzzyj8PBwHT9+XF999ZUOHjzoeH7//fcrMDBQQ4cOVcmSJZWQkKDFixdnW/OTTz6p2267TSNHjtSAAQNUr149lS1bNtv+I0aM0KuvvqquXbvq8ccf14kTJzR+/Hg1bdpUP//8s9NWj1OnTql169bq3r27Hn300RzHi1ucAW6gLVu2GEnmq6++MsYYk5GRYcqXL2+effZZp36vvfaakWQWL17sMo6MjAxjjDEff/yxkWTGjh2bbZ9169YZSWbdunVOr+/fv99IMtOnT3e0xcTEGElm6NChLuM7d+6cS1t8fLyx2WzmwIEDjramTZua4sWLO7VdWY8xxsTFxRm73W4SExMdbcePHzdFixY1w4YNc5nOlQYOHGgkmW+//dbRlpKSYipWrGjCw8NNenq6o12SiY2NzXF8xvzvsyhRooQ5fvy402uXLl0yaWlpTm1nzpwxZcuWNX369HEZR5kyZczp06cd7Z999pmRZD7//HNHW61atUxwcLDT+1+9erWRZMLCwhxtS5cuNZLMm2++6TT9zp07G5vNZvbu3ev0Xu12u9m/f7+jbcqUKUaSKVeunElOTna0x8XFGUlOfbPSs2dPU6RIEbN582aX13JavnKzrJw5c8ZIMm+//Xa201+yZImRlOX0ryTJabnJrGnBggVO/YYNG2auXOUnJCQYDw8PM2LECKd+27dvN0WLFnVqb9asmZFkJk+enGMtgDHGsCsEN9ScOXNUtmxZtWjRQtLlzbjdunXTvHnzlJ6e7ui3aNEi1axZ0+W/+sxhMvsEBATomWeeybZPXjz11FMubT4+Po6/U1NTdfLkSTVq1EjGGP3888+SpBMnTmjDhg3q06ePKlSokG09PXv2VFpamhYuXOhomz9/vi5duqRHH300x9q++OIL1a9fX40bN3a0+fn5qV+/fkpISNDOnTvde7NX6NSpkwIDA53aPDw8HP+ZZ2Rk6PTp07p06ZLq1q2rn376yWUc3bp1U6lSpRzPmzRpIuny7htJOnLkiLZt26aYmBj5+/s7+rVq1UpRUVEu79XDw0MDBgxwan/uuedkjNGXX37p1H7fffc5na7aoEEDx/sqXry4S3tmTVnJyMjQ0qVL1a5duyzPpslp+crNsuLj4yMvLy+tX79eZ86cyXI8mVsLli9frosXL2Y7vbxavHixMjIy1LVrV508edLxKFeunG6//XaX3V12u129e/e2vA78/RAscMOkp6dr3rx5atGihfbv36+9e/dq7969atCggY4dO6avv/7a0Xffvn2qXr16juPbt2+fqlSp4nTg2vUqWrSoyyZ5STp48KB69eql0qVLy8/PT4GBgY592UlJSZL+90N1rboj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9ttvO52+m917za6m7E7HzMqBAwdMz549TWBgoLHb7aZSpUomNjbWcQpuVqeb5mZZOXnypImNjTWRkZHG19fX+Pv7mwYNGphPP/3UMZ6ffvrJPPLII6ZChQrGbreboKAg07ZtW7Nly5YcP9/cnm6aadGiRaZx48bG19fX+Pr6msjISBMbG2t2797t6NOsWTNTrVq1a35egDHG2Iy5AUdVAXBx6dIlhYSEqF27dpo2bVpBlwMAluAYC6CALF26VCdOnMj1lTEBoDBgiwVwg23cuFH/+c9/9MYbbyggICDLC00BQGHFFgvgBps0aZKeeuopBQUF6V//+ldBlwMAlmKLBQAAsAxbLAAAgGUIFgAAwDIEC0nHjh1T586dVaZMGdlsNo0bN66gS8p3vXr1croT5K0y7WsJDw9Xr169CroMt61fv142m03r168v6FLyRfPmzdW8efOCLiNbb7/9tipVqiQPDw/H1TH/bpo3b56nm7L9Hdzsy9/NhmAhadCgQVq1apXi4uI0a9YsPfjggwVdEv6mRo4cqaVLlxZ0GbDQ6tWr9cILL+iee+7R9OnTNXLkyGz77t69W4MGDVKjRo3k7e0tm82mhISEbPsvW7ZMd911l7y9vVWhQgUNGzZMly5dcumXmJiofv36KTAwUL6+vmrRogVnG7lp586dev3113OcH8gdLumty3fd7NChA5evRb4bOXKkOnfurI4dOxZ0KbDI2rVrVaRIEU2bNu2atxX/4Ycf9P777ysqKkpVq1Z1ucz7lb788kt17NhRzZs31/jx47V9+3a9+eabOn78uCZNmuTol5GRoejoaP3yyy8aMmSIAgICNHHiRDVv3lxbt27N8hb1cLVz504NHz5czZs3d9miunr16oIpqpAiWEg6fvx4ltf9z6vz58/Ly8sr1/dtuHTpkjIyMq65UgJw8zl+/Lh8fHxy9f1t3769EhMTVbx4cY0ZMybHYPH888+rRo0aWr16tYoWvbyqLlGihEaOHKlnn31WkZGRki7fgfb777/XggULHPee6dq1q+644w4NGzZMc+fOvf43eRNxd/1qBdbN7rmld4XMmDFDNptNxhh98MEHstlsTreG/v3339WlSxeVLl1axYoV0913360VK1Y4jSNz3/a8efP0yiuv6LbbblOxYsWUnJyc5TQTEhJks9k0ZswYjRs3ThEREbLb7dq5c6cuXLig1157TXXq1JG/v798fX3VpEkTrVu3LttxTJ061TGOevXqafPmzS7TXLp0qapXry5vb29Vr149yzuGSpfvkvncc88pNDRUdrtdVapU0ZgxY1zufGiz2dS/f38tWLBAUVFR8vHxUcOGDbV9+3ZJ0pQpU1S5cmV5e3urefPmOW5aNMYoPDxcHTp0cHnt/Pnz8vf315NPPpnt8NLlO2M2btxYJUuWlJ+fn6pUqaKXXnrJqU9aWpqGDRumypUry263KzQ0VC+88EKu7hKZmJiogQMHOj6XypUra/To0crIyHDql5GRoffee0933nmnvL29FRgYqAcffNBxd0ybzabU1FTNnDnTsaxdeTzH4cOH1adPH5UtW1Z2u13VqlXTxx9/7FLPH3/8oY4dO8rX11dBQUEaNGhQru92mZKSooEDByo8PFx2u11BQUFq1aqV02bzb7/9Vl26dFGFChUcn9WgQYP0119/OY2rV69e8vPz08GDB9W2bVv5+fnptttu0wcffCDp8i3E7733Xvn6+iosLMzlBy7z+7dhwwY9+eSTKlOmjEqUKKGePXtmeYO3q+V2nuZm+cjKpUuX9MYbbzi+X+Hh4XrppZecxm+z2TR9+nSlpqY65umMGTOyHWfp0qWdbgGfnZ07d2rnzp3q16+fI1RI0tNPPy1jjBYuXOhoW7hwocqWLauHH37Y0RYYGKiuXbvqs88+y9WyMXHiRFWrVk12u10hISGKjY1VYmJiln23bt2qRo0aycfHRxUrVtTkyZNd+mTeVK5YsWIqVaqU6tat6zL/c7O8Z7d+/emnn2Sz2TRz5kyXaa9atUo2m03Lly+XJB04cEBPP/20qlSpIh8fH5UpU0ZdunRxWi/NmDFDXbp0kSS1aNHCMS8zj1nK6hiL48ePq2/fvipbtqy8vb1Vs2ZNl3rcWVcfPXpUvXv3Vvny5WW32xUcHKwOHToUzl0zBXWTkpvBvn37zKxZs4wk06pVKzNr1iwza9YsY4wxR48eNWXLljXFixc3L7/8shk7dqypWbOmKVKkiFm8eLFjHJk3/ImKijK1atUyY8eONfHx8dnebCvzxkhRUVGmUqVKZtSoUebdd981Bw4cMCdOnDDBwcFm8ODBZtKkSeatt94yVapUMZ6enubnn392GUft2rVN5cqVzejRo81bb71lAgICTPny5c2FCxccfVetWmWKFCliqlevbsaOHWtefvll4+/vb6pVq+Z0w6eMjAxz7733GpvNZh5//HEzYcIE065dOyPJDBw40Ok9SDI1atQwoaGhZtSoUWbUqFHG39/fVKhQwUyYMMFERUWZd955x7zyyivGy8vLtGjRwmn4q2829fLLLxtPT09z6tQpp36ffvqpkWQ2bNiQ7TzcsWOH8fLyMnXr1jXvvfeemTx5snn++edN06ZNHX3S09PN/fffb4oVK2YGDhxopkyZYvr372+KFi1qOnTo4DS+sLAwExMT43iemppqatSoYcqUKWNeeuklM3nyZNOzZ09js9nMs88+6zRsr169jCTTunVrM27cODNmzBjToUMHM378eGOMMbNmzTJ2u900adLEsax9//33xpjLy1v58uVNaGio+ec//2kmTZpk2rdvbySZd9991zGNc+fOmTvuuMN4e3ubF154wYwbN87UqVPH1KhRw+VmWFn5v//7P+Pl5WUGDx5sPvroIzN69GjTrl07M3v2bEefZ555xrRp08aMHDnSTJkyxfTt29d4eHiYzp07O40rJibGeHt7m6ioKPOPf/zDfPDBB6ZRo0aOm22FhISYIUOGmPHjx5tq1aoZDw8P8/vvvzuGnz59upFk7rzzTtOkSRPz/vvvm9jYWFOkSBHTtGlTpxuNNWvWzDRr1szteZqb5SM7MTExRpLp3Lmz+eCDD0zPnj2NJNOxY0dHn1mzZpkmTZoYu93umKdX3gAvJ2+//baRZPbv3+/y2uzZs40ks3HjRpfXypcvbx5++GHH88qVK5vWrVu79Pvoo4+MJPOf//wnxzoyb07WsmVLM378eNO/f3/j4eFh6tWr57QuadasmQkJCTFBQUGmf//+5v333zeNGzc2ksy0adMc/aZOner43KZMmWLee+8907dvXzNgwABHn9wu7zmtXytVqmTatGnj8n569+5tSpUq5ah9wYIFpmbNmua1114zU6dONS+99JIpVaqUCQsLc6yn9+3bZwYMGGAkmZdeeskxL48ePep471cuf+fOnTNVq1Y1np6eZtCgQeb99983TZo0MZLMuHHjHP3cWVc3atTI+Pv7m1deecV89NFHZuTIkaZFixbmm2++yXH+3Yxu6WCRSVncGXHgwIFGkvn2228dbSkpKaZixYomPDzcpKenG2P+t+BXqlTJnDt37prTylzQSpQoYY4f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1atXy8PDQxkZGbrzzjs1duzYLMdxdRi6UkZGhlq1aqUXXnghy9czV6rXI/NH7tFHH1VMTEyWfWrUqHHd05Euny3QpEkTLVmyRKtXr9bbb7+t0aNHa/HixWrdurXS09PVqlUrnT59Wi+++KIiIyPl6+urw4cPq1evXi4/yFYvB7mV23mam+UjJ9fa2pRfgoODJV3e6nj18nnkyBHVr1/fqe+RI0dcxpHZFhISko+Vuqpatap2796t5cuXa+XKlVq0aJEmTpyo1157TcOHD8/T8p7d+rVbt24aMWKETp48qeLFi2vZsmV65JFHnA54feaZZzR9+nQNHDhQDRs2lL+/v2w2m7p37+7WVqzrkZvvw8CBA9WuXTstXbpUq1at0quvvqr4+HitXbtWtWvXviF1WoVgkY2wsDDt3r3bpX3Xrl2O1622cOFCVapUSYsXL3ZaoWW1eT03Mmvcs2ePy2tXv7ewsDCtWbNGKSkpTlst8vP9Xql06dKKjo7WnDlz1KNHD/373//O9RVQixQpovvuu0/33Xefxo4dq5EjR+rll1/WunXr1LJlS0VEROiXX37Rfffd5/YPRUREhM6ePevYQpFTv1WrVun06dM5brXIavqBgYEqXry40tPTrzmdsLAw7dixQ8YYp3FltaxmJzg4WE8//bSefvppHT9+XHfddZdGjBih1q1ba/v27frtt980c+ZM9ezZ0zHMV199levxu2vPnj1q0aKF4/nZs2d15MgRtWnTJtth3Jmn11o+shIWFqaMjAzt2bPH8V+odPkqvYmJifn+fci8eueWLVucQsSff/6pP/74w2nXV61atfTtt98qIyPD6T/ojRs3qlixYjmG38z3sXv3blWqVMnRfuHCBe3fv9/l8/nzzz+VmprqtNXit99+kySnXaO+vr7q1q2bunXrpgsXLujhhx/WiBEjFBcX59byfi3dunXT8OHDtWjRIpUtW1bJycnq3r27U5+FCxcqJiZG77zzjqPt/PnzLme9uLNuCAsL03/+8x+Xz/x615cRERF67rnn9Nxzz2nPnj2qVauW3nnnHc2ePTtP4yso7ArJRps2bbRp0yb98MMPjrbU1FRNnTpV4eHhLscoWCEz1V6ZYjdu3OhUgzuCg4NVq1YtzZw502mT31dffeVyjEibNm2Unp6uCRMmOLW/++67stlsat26dZ5qcMdjjz2m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0aJFtXv3bkVERORv0cjz9+1Knp6eql27tvbu3ZsfJSILeZlvwcHB8vT0lIeHh6OtatWqOnr0qC5cuCAvL698rRnX931LTU3VvHnz9M9//jM/S7xpWHqMhVW3Vc/IyFBaWpqVpSEH7s63yMhIbd++Xdu2bXM82rdvrxYtWmjbtm0KDQ29keXfsqz4vqWnp2v79u0KDg7OrzJxlbzMt3vuuUd79+51BHhJ+u233xQcHEyouEGu5/u2YMECpaWl6dFHH83vMm8OVh8NOm/ePGO3282MGTPMzp07Tb9+/UzJkiUdp7Q99thjZujQoY7+I0eONKtXrzb79u0zO3fuNGPGjDFFixY1H374odWlIQfuzrercVZIwXB3vg0fPtysWrXK7Nu3z2zdutV0797deHt7m19//bWg3sItyd35dvDgQVO8eHHTv39/s3v3brN8+XITFBRk3nzzzYJ6C7ekvK4nGzdubLp163ajyy0wlh9jca3bqh88eFBFivxvQ0lqaqqefvpp/fHHH/Lx8VFkZKRmz56tbt26WV0acuDufMPNwd35dubMGT3xxBM6evSoSpUqpTp16uj7779XVFRUQb2FW5K78y00NFSrVq3SoEGDVKNGDd1222169tln9eKLLxbUW7gl5WU9uXv3bn333XdavXp1QZRcILhtOgAAsAz/ggIAAMsQLAAAgGUIFgAAwDIECwAAYBmCBQAAsAzBAgAAWIZgAQAALEOwAAAAliFYAAAAyxAsAACAZQgWAADAMgQLAABgmf8HmIe4QdZF0tIAAAAASUVORK5CYII=\n", @@ -166,14 +167,6 @@ "SEM_std = np.std(obs_level_accuracy)/np.sqrt(sample_size)\n", "np.round(SEM_std, 3), np.round(np.std(accuracy_scores), 3)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "07045636-abdd-44e8-bcd9-ada3b143b222", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -192,7 +185,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/How it Works - DLE.ipynb b/docs/example_notebooks/How it Works - DLE.ipynb index c42c71bb3..567b30955 100644 --- a/docs/example_notebooks/How it Works - DLE.ipynb +++ b/docs/example_notebooks/How it Works - DLE.ipynb @@ -320,7 +320,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/How it Works - Ranking.ipynb b/docs/example_notebooks/How it Works - Ranking.ipynb index 38aec73a2..78eb0f5a9 100644 --- a/docs/example_notebooks/How it Works - Ranking.ipynb +++ b/docs/example_notebooks/How it Works - Ranking.ipynb @@ -124,9 +124,9 @@ "import matplotlib.pyplot as plt\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", - "analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "column_names = [\n", " 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', 'size_of_downpayment', 'driver_tenure',\n", @@ -290,7 +290,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/How it Works - Thresholds.ipynb b/docs/example_notebooks/How it Works - Thresholds.ipynb index 240eb1493..543c11ef1 100644 --- a/docs/example_notebooks/How it Works - Thresholds.ipynb +++ b/docs/example_notebooks/How it Works - Thresholds.ipynb @@ -132,7 +132,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Quickstart.ipynb b/docs/example_notebooks/Quickstart.ipynb index 04ef3b054..8f9d24b0c 100644 --- a/docs/example_notebooks/Quickstart.ipynb +++ b/docs/example_notebooks/Quickstart.ipynb @@ -388,9 +388,9 @@ } ], "source": [ - "df_reference, df_analysis, _ = nml.load_us_census_ma_employment_data()\n", - "display(df_reference.head())\n", - "display(df_analysis.head())" + "reference_df, analysis_df, _ = nml.load_us_census_ma_employment_data()\n", + "display(reference_df.head())\n", + "display(analysis_df.head())" ] }, { @@ -420,7 +420,7 @@ } ], "source": [ - "print_some_of_the_columns_only_markdown(df_reference, 2, 5)" + "print_some_of_the_columns_only_markdown(reference_df, 2, 5)" ] }, { @@ -450,7 +450,7 @@ } ], "source": [ - "print_some_of_the_columns_only_markdown(df_analysis, 2, 5)" + "print_some_of_the_columns_only_markdown(analysis_df, 2, 5)" ] }, { @@ -490,94 +490,94 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] } ], "source": [ - "estimator = estimator.fit(df_reference)\n", - "estimated_performance = estimator.estimate(df_analysis)" + "estimator = estimator.fit(reference_df)\n", + "estimated_performance = estimator.estimate(analysis_df)" ] }, { @@ -606,18 +606,33 @@ "execution_count": null, "id": "8c36d21e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ - "features = ['AGEP', 'SCHL', 'MAR', 'RELP', 'DIS', 'ESP', 'CIT', 'MIG', 'MIL', 'ANC',\n", - " 'NATIVITY', 'DEAR', 'DEYE', 'DREM', 'SEX', 'RAC1P']\n", + "feature_column_names = ['AGEP', 'SCHL', 'MAR', 'RELP', 'DIS', 'ESP', 'CIT', 'MIG',\n", + " 'MIL', 'ANC', 'NATIVITY', 'DEAR', 'DEYE', 'DREM', 'SEX', 'RAC1P']\n", "\n", "univariate_calculator = nml.UnivariateDriftCalculator(\n", - " column_names=features,\n", + " column_names=feature_column_names,\n", " chunk_size=chunk_size\n", ")\n", "\n", - "univariate_calculator.fit(df_reference)\n", - "univariate_drift = univariate_calculator.calculate(df_analysis)" + "univariate_calculator.fit(reference_df)\n", + "univariate_drift = univariate_calculator.calculate(analysis_df)" ] }, { @@ -795,7 +810,15 @@ "execution_count": null, "id": "1960da77", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure.write_image(f'../_static/quickstart/quick-start-univariate-distribution.svg', width=1000)" ] @@ -807,7 +830,7 @@ "metadata": {}, "outputs": [], "source": [ - "_, _, analysis_targets = nml.load_us_census_ma_employment_data()" + "_, _, analysis_targets_df = nml.load_us_census_ma_employment_data()" ] }, { @@ -1000,8 +1023,8 @@ } ], "source": [ - "df_analysis_with_targets = pd.concat([df_analysis, analysis_targets], axis=1)\n", - "display(df_analysis_with_targets.head())" + "analysis_with_targets_df = pd.concat([analysis_df, analysis_targets_df], axis=1)\n", + "display(analysis_with_targets_df.head())" ] }, { @@ -1031,7 +1054,7 @@ } ], "source": [ - "print_some_of_the_columns_only_markdown(df_analysis_with_targets.head(), 2, 5)" + "print_some_of_the_columns_only_markdown(analysis_with_targets_df.head(), 2, 5)" ] }, { @@ -1049,8 +1072,8 @@ " metrics=['roc_auc'],\n", " chunk_size=chunk_size)\n", "\n", - "performance_calculator.fit(df_reference)\n", - "calculated_performance = performance_calculator.calculate(df_analysis_with_targets)\n", + "performance_calculator.fit(reference_df)\n", + "calculated_performance = performance_calculator.calculate(analysis_with_targets_df)\n", "\n", "figure = estimated_performance.filter(period='analysis').compare(calculated_performance).plot()\n", "figure.show()" @@ -1065,14 +1088,6 @@ "source": [ "figure.write_image(f'../_static/quickstart/quick-start-estimated-and-realized.svg', width=1000)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "220b48c7", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1091,7 +1106,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Review Comparison Plots.ipynb b/docs/example_notebooks/Review Comparison Plots.ipynb index b679f3a90..59645d3eb 100644 --- a/docs/example_notebooks/Review Comparison Plots.ipynb +++ b/docs/example_notebooks/Review Comparison Plots.ipynb @@ -12,27 +12,34 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] } ], "source": [ @@ -40,8 +47,8 @@ "from IPython.display import display\n", "\n", "# Load synthetic data\n", - "reference, analysis, target = nml.load_synthetic_car_loan_dataset()\n", - "# display(reference.head())\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "# display(reference_df.head())\n", "\n", "column_names = [\n", " 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', 'size_of_downpayment', 'driver_tenure', 'y_pred_proba', 'y_pred'\n", @@ -52,8 +59,8 @@ " timestamp_column_name='timestamp',\n", " chunk_size=5000\n", ")\n", - "rce.fit(reference)\n", - "rcerr = rce.calculate(analysis)\n", + "rce.fit(reference_df)\n", + "rcerr = rce.calculate(analysis_df)\n", "\n", "estimator = nml.CBPE(\n", " y_pred_proba='y_pred_proba',\n", @@ -65,10 +72,10 @@ " problem_type='classification_binary',\n", " normalize_confusion_matrix='pred',\n", ")\n", - "estimator.fit(reference)\n", - "estimated = estimator.estimate(analysis)\n", + "estimator.fit(reference_df)\n", + "estimated = estimator.estimate(analysis_df)\n", "\n", - "analysist = analysis.merge(target, left_index=True, right_index=True)\n", + "analysis_with_targets_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "realize = nml.PerformanceCalculator(\n", " y_pred_proba='y_pred_proba',\n", " y_pred='y_pred',\n", @@ -77,8 +84,8 @@ " problem_type='classification_binary',\n", " metrics=['roc_auc'],\n", " chunk_size=5000)\n", - "realize.fit(reference)\n", - "realized = realize.calculate(analysist)\n", + "realize.fit(reference_df)\n", + "realized = realize.calculate(analysis_with_targets_df)\n", "\n", "\n", "drift = nml.UnivariateDriftCalculator(\n", @@ -88,8 +95,8 @@ " continuous_methods=['jensen_shannon'],\n", " categorical_methods=['jensen_shannon'],\n", ")\n", - "drift.fit(reference)\n", - "drifted = drift.calculate(analysis)" + "drift.fit(reference_df)\n", + "drifted = drift.calculate(analysis_df)" ] }, { @@ -141,14 +148,6 @@ "drifted.filter(column_names=['salary_range']).compare(realized).plot().show()\n", "realized.compare(drifted.filter(column_names=['salary_range'])).plot().show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1df75719-34ee-42ef-a5c8-3bc60991e9e1", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -167,7 +166,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Adjusting plots.ipynb b/docs/example_notebooks/Tutorial - Adjusting plots.ipynb index 11b21a1e9..6c4dbf2c3 100644 --- a/docs/example_notebooks/Tutorial - Adjusting plots.ipynb +++ b/docs/example_notebooks/Tutorial - Adjusting plots.ipynb @@ -8,7 +8,7 @@ "outputs": [], "source": [ "import nannyml as nml\n", - "reference, analysis, analysis_target = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", "estimator = nml.CBPE(\n", " y_pred_proba='y_pred_proba',\n", @@ -18,9 +18,9 @@ " metrics=['roc_auc'],\n", " chunk_size=5000,\n", " problem_type='classification_binary',\n", - ").fit(reference)\n", + ").fit(reference_df)\n", "\n", - "estimated_performance = estimator.estimate(analysis)\n", + "estimated_performance = estimator.estimate(analysis_df)\n", "figure = estimated_performance.plot(kind='performance')\n", "\n", "# indicate period of interest\n", @@ -65,7 +65,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Calculating Business Value - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Calculating Business Value - Binary Classification.ipynb index d6d7429fb..71c857f77 100644 --- a/docs/example_notebooks/Tutorial - Calculating Business Value - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Calculating Business Value - Binary Classification.ipynb @@ -113,9 +113,9 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", - "analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "display(reference_df.head(3))" ] @@ -842,7 +842,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Binary Classification.ipynb index a63836c31..a74024efd 100644 --- a/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Binary Classification.ipynb @@ -113,9 +113,9 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", - "analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "display(reference_df.head(3))" ] @@ -1025,7 +1025,15 @@ "outputs_hidden": false } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = results.plot()\n", "figure.write_image(f'../_static/tutorials/performance_calculation/binary/tutorial-confusion-matrix-calculation-binary-car-loan-analysis.svg')" @@ -1055,7 +1063,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Multiclass Classification.ipynb b/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Multiclass Classification.ipynb index 7b50170a4..e87922f45 100644 --- a/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Multiclass Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Calculating Confusion Matrix - Multiclass Classification.ipynb @@ -1068,7 +1068,22 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = results.plot()\n", "figure.write_image(f'../_static/tutorials/performance_calculation/multiclass/tutorial-confusion-matrix-calculation-multiclass.svg')\n", @@ -1100,7 +1115,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Calculating Standard Metrics - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Calculating Standard Metrics - Binary Classification.ipynb index 972cef538..99babebce 100644 --- a/docs/example_notebooks/Tutorial - Calculating Standard Metrics - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Calculating Standard Metrics - Binary Classification.ipynb @@ -113,9 +113,9 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", - "analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "display(reference_df.head(3))" ] @@ -1024,7 +1024,15 @@ "outputs_hidden": false } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = results.plot()\n", "figure.write_image(f'../_static/tutorials/performance_calculation/binary/tutorial-standard-metrics-calculation-binary-car-loan-analysis.svg')\n", @@ -1056,7 +1064,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Chunking.ipynb b/docs/example_notebooks/Tutorial - Chunking.ipynb index bb6389797..89d07b212 100644 --- a/docs/example_notebooks/Tutorial - Chunking.ipynb +++ b/docs/example_notebooks/Tutorial - Chunking.ipynb @@ -7,7 +7,7 @@ "outputs": [], "source": [ "import nannyml as nml\n", - "reference, analysis, _ = nml.load_synthetic_car_loan_dataset()" + "reference_df, analysis_df, _ = nml.load_synthetic_car_loan_dataset()" ] }, { @@ -19,15 +19,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", - " warnings.warn(\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/home/nikml/Source/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", + "/home/niels/Code/nml/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", + " warnings.warn(\n", + "/home/niels/Code/nml/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", " warnings.warn(\n" ] }, @@ -35,15 +29,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", + "/home/niels/Code/nml/nannyml/nannyml/chunk.py:181: UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk.\n", " warnings.warn(\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] }, @@ -141,8 +135,8 @@ " problem_type='classification_binary',\n", " chunk_period=\"Q\", # here we define the chunk period.\n", ")\n", - "cbpe.fit(reference)\n", - "est_perf = cbpe.estimate(analysis)\n", + "cbpe.fit(reference_df)\n", + "est_perf = cbpe.estimate(analysis_df)\n", "\n", "est_perf.data.iloc[:3, :6]" ] @@ -183,33 +177,33 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] }, @@ -307,8 +301,8 @@ " problem_type='classification_binary',\n", " chunk_size=3500, # here we define the chunk size.\n", ")\n", - "cbpe.fit(reference)\n", - "est_perf = cbpe.estimate(analysis)\n", + "cbpe.fit(reference_df)\n", + "est_perf = cbpe.estimate(analysis_df)\n", "\n", "est_perf.data.iloc[:3, :6]\n" ] @@ -472,23 +466,23 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] }, @@ -515,8 +509,8 @@ "\n", ")\n", "\n", - "cbpe.fit(reference)\n", - "est_perf = cbpe.estimate(analysis)\n", + "cbpe.fit(reference_df)\n", + "est_perf = cbpe.estimate(analysis_df)\n", "\n", "len(est_perf.filter(period='reference'))\n" ] @@ -665,25 +659,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] } @@ -698,8 +692,8 @@ " problem_type='classification_binary',\n", ")\n", "\n", - "cbpe.fit(reference)\n", - "est_perf = cbpe.estimate(analysis)\n", + "cbpe.fit(reference_df)\n", + "est_perf = cbpe.estimate(analysis_df)\n", "\n", "print(len(est_perf.filter(period='reference')))\n" ] @@ -723,12 +717,12 @@ "from nannyml.chunk import SizeBasedChunker, CountBasedChunker\n", "\n", "# The reference dataset contains 50000 records\n", - "print(f\"Size of reference data: {reference.shape[0]}\")\n", + "print(f\"Size of reference data: {reference_df.shape[0]}\")\n", "\n", "# We can use the 'drop' strategy to handle incomplete chunks\n", "chunker = SizeBasedChunker(chunk_size=3500 , incomplete='drop')\n", "\n", - "last = chunker.split(reference)[-1]\n", + "last = chunker.split(reference_df)[-1]\n", "print(f\"The last index: {last.end_index}\")\n", "print(f\"Last chunk size: {len(last)}\")" ] @@ -750,12 +744,12 @@ ], "source": [ "# The reference dataset contains 50000 records\n", - "print(f\"Size of reference data: {reference.shape[0]}\")\n", + "print(f\"Size of reference data: {reference_df.shape[0]}\")\n", "\n", "# We can use a different chunker with another 'incomplete' strategy\n", "chunker_count_drop = CountBasedChunker(chunk_number=9, incomplete='append')\n", "\n", - "last = chunker_count_drop.split(reference)[-1]\n", + "last = chunker_count_drop.split(reference_df)[-1]\n", "print(f\"The last index: {last.end_index}\")\n", "print(f\"Last chunk size: {len(last)}\")" ] @@ -764,7 +758,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "cbpe = nml.CBPE(\n", " y_pred_proba='y_pred_proba',\n", @@ -774,7 +776,7 @@ " metrics=['roc_auc'],\n", " problem_type='classification_binary',\n", " chunker=chunker_count_drop\n", - ").fit(reference_data=reference)" + ").fit(reference_data=reference_df)" ] }, { @@ -791,9 +793,9 @@ " metrics=['roc_auc'],\n", " problem_type='classification_binary',\n", " chunk_size=5_000\n", - ").fit(reference_data=reference)\n", + ").fit(reference_data=reference_df)\n", "\n", - "est_perf = cbpe.estimate(analysis)\n", + "est_perf = cbpe.estimate(analysis_df)\n", "figure = est_perf.plot(kind='performance')\n", "figure.show()\n" ] @@ -802,9 +804,17 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ - "figure.write_image(f'../_static/tutorials/chunking/chunk-size.svg')\n" + "figure.write_image(f'../_static/tutorials/chunking/chunk-size.svg')" ] } ], @@ -824,7 +834,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Compare Estimated and Realized Performance.ipynb b/docs/example_notebooks/Tutorial - Compare Estimated and Realized Performance.ipynb index 65f28077e..dc558c752 100644 --- a/docs/example_notebooks/Tutorial - Compare Estimated and Realized Performance.ipynb +++ b/docs/example_notebooks/Tutorial - Compare Estimated and Realized Performance.ipynb @@ -62,9 +62,9 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", - "analysis_target_df.head(3)" + "analysis_targets_df.head(3)" ] }, { @@ -89,7 +89,7 @@ } ], "source": [ - "print(analysis_target_df.head(3).to_markdown(tablefmt=\"grid\"))" + "print(analysis_targets_df.head(3).to_markdown(tablefmt=\"grid\"))" ] }, { @@ -200,7 +200,7 @@ } ], "source": [ - "analysis_with_targets = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_with_targets = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "display(analysis_with_targets.head(3))" ] @@ -257,25 +257,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] }, @@ -961,7 +961,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Creating and Estimating a Custom Metric - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Creating and Estimating a Custom Metric - Binary Classification.ipynb index 6cfe44ed4..d4a44a587 100644 --- a/docs/example_notebooks/Tutorial - Creating and Estimating a Custom Metric - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Creating and Estimating a Custom Metric - Binary Classification.ipynb @@ -178,13 +178,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1015: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1015: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1043: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1043: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1063: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1063: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1091: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1091: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n" ] }, @@ -1008,7 +1008,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Data Requirements.ipynb b/docs/example_notebooks/Tutorial - Data Requirements.ipynb index 848e8cafe..858887aa5 100644 --- a/docs/example_notebooks/Tutorial - Data Requirements.ipynb +++ b/docs/example_notebooks/Tutorial - Data Requirements.ipynb @@ -88,8 +88,8 @@ ], "source": [ "import nannyml as nml\n", - "reference, analysis, _ = nml.load_synthetic_car_loan_dataset()\n", - "reference[['timestamp', 'y_pred_proba', 'y_pred', 'repaid']].head()" + "reference_df, analysis_df, _ = nml.load_synthetic_car_loan_dataset()\n", + "reference_df[['timestamp', 'y_pred_proba', 'y_pred', 'repaid']].head()" ] }, { @@ -118,7 +118,7 @@ } ], "source": [ - "print(reference[['timestamp', 'y_pred_proba', 'y_pred', 'repaid']].head().to_markdown(tablefmt=\"grid\"))\n" + "print(reference_df[['timestamp', 'y_pred_proba', 'y_pred', 'repaid']].head().to_markdown(tablefmt=\"grid\"))\n" ] }, { @@ -233,7 +233,7 @@ } ], "source": [ - "reference[[\n", + "reference_df[[\n", " 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', 'size_of_downpayment', 'driver_tenure'\n", "]].head()" ] @@ -265,7 +265,7 @@ ], "source": [ "print(\n", - " reference[[\n", + " reference_df[[\n", " 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', 'size_of_downpayment', 'driver_tenure'\n", " ]].head().to_markdown(tablefmt=\"grid\")\n", ")" @@ -280,25 +280,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" ] } @@ -314,8 +314,8 @@ " problem_type='classification_binary',\n", ")\n", "\n", - "estimator.fit(reference)\n", - "results = estimator.estimate(analysis)\n", + "estimator.fit(reference_df)\n", + "results = estimator.estimate(analysis_df)\n", "metric_fig = results.filter(period='analysis').plot()\n", "metric_fig.write_image(file=f\"../_static/tutorials/data_requirements/data-requirements-time-based-x-axis.svg\")" ] @@ -329,43 +329,43 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n" @@ -382,8 +382,8 @@ " problem_type='classification_binary',\n", ")\n", "\n", - "estimator2.fit(reference)\n", - "results = estimator2.estimate(analysis)\n", + "estimator2.fit(reference_df)\n", + "results = estimator2.estimate(analysis_df)\n", "metric_fig2 = results.filter(period='analysis').plot()\n", "metric_fig2.write_image(file=f\"../_static/tutorials/data_requirements/data-requirements-index-based-x-axis.svg\")\n" ] @@ -405,7 +405,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Drift - Multivariate.ipynb b/docs/example_notebooks/Tutorial - Drift - Multivariate.ipynb index a88b2519f..18d9ab7c0 100644 --- a/docs/example_notebooks/Tutorial - Drift - Multivariate.ipynb +++ b/docs/example_notebooks/Tutorial - Drift - Multivariate.ipynb @@ -147,8 +147,8 @@ "from IPython.display import display\n", "\n", "# Load synthetic data\n", - "reference, analysis, _ = nml.load_synthetic_car_loan_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, _ = nml.load_synthetic_car_loan_dataset()\n", + "display(reference_df.head())" ] }, { @@ -178,7 +178,7 @@ } ], "source": [ - "print(reference.head().to_markdown(tablefmt=\"grid\"))" + "print(reference_df.head().to_markdown(tablefmt=\"grid\"))" ] }, { @@ -192,7 +192,7 @@ "\n", "# Define feature columns\n", "feature_column_names = [\n", - " col for col in reference.columns\n", + " col for col in reference_df.columns\n", " if col not in non_feature_columns\n", "]\n", "\n", @@ -201,8 +201,8 @@ " timestamp_column_name='timestamp',\n", " chunk_size=5000\n", ")\n", - "calc.fit(reference)\n", - "results = calc.calculate(analysis)" + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)" ] }, { @@ -884,12 +884,27 @@ "execution_count": null, "id": "0253ebfa", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "non_feature_columns = ['timestamp', 'y_pred_proba', 'y_pred', 'repaid']\n", "\n", "feature_column_names = [\n", - " col for col in reference.columns\n", + " col for col in reference_df.columns\n", " if col not in non_feature_columns\n", "]\n", "\n", @@ -902,8 +917,8 @@ " imputer_categorical=SimpleImputer(strategy='constant', fill_value='missing'),\n", " imputer_continuous=SimpleImputer(strategy='median')\n", ")\n", - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n" + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n" ] } ], @@ -923,7 +938,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Drift - Univariate.ipynb b/docs/example_notebooks/Tutorial - Drift - Univariate.ipynb index 4c72ed67f..140f3a741 100644 --- a/docs/example_notebooks/Tutorial - Drift - Univariate.ipynb +++ b/docs/example_notebooks/Tutorial - Drift - Univariate.ipynb @@ -1268,14 +1268,7 @@ "| 8 | [40000:44999] | 8 | 40000 | 44999 | 2018-08-31 04:48:00 | 2018-09-30 11:15:16.848000 | reference | 0.00842 | 0.0185838 | | False | 0.0248975 | 0.1 | | False |\n", "+----+---------------+-----------------+-----------------+---------------+---------------------+----------------------------+------------+--------------------------+---------------------+---------------------+-----------+--------------------+---------------------+---------------------+-----------+\n", "| 9 | [45000:49999] | 9 | 45000 | 49999 | 2018-09-30 11:24:00 | 2018-10-30 17:51:16.848000 | reference | 0.00786 | 0.0185838 | | False | 0.0284742 | 0.1 | | False |\n", - "+----+---------------+-----------------+-----------------+---------------+---------------------+----------------------------+------------+--------------------------+---------------------+---------------------+-----------+--------------------+---------------------+---------------------+-----------+" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" + "+----+---------------+-----------------+-----------------+---------------+---------------------+----------------------------+------------+--------------------------+---------------------+---------------------+-----------+--------------------+---------------------+---------------------+-----------+\n" ] } ], @@ -1301,7 +1294,15 @@ "execution_count": null, "id": "6ef9daa7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure.write_image(f'../_static/tutorials/detecting_data_drift/univariate_drift_detection/jensen-shannon-continuous.svg')" ] @@ -1388,7 +1389,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Estimating Business Value - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Estimating Business Value - Binary Classification.ipynb index 4f5d84341..e101d9026 100644 --- a/docs/example_notebooks/Tutorial - Estimating Business Value - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Estimating Business Value - Binary Classification.ipynb @@ -188,7 +188,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1582: UserWarning: No 'y_true' values given for chunk, returning NaN as realized business value.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1582: UserWarning: No 'y_true' values given for chunk, returning NaN as realized business value.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized business value.\")\n" ] }, @@ -588,7 +588,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" }, "vscode": { "interpreter": { diff --git a/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Binary Classification.ipynb index 486bbf04d..d8ca862ba 100644 --- a/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Binary Classification.ipynb @@ -187,13 +187,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1015: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1015: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1043: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1043: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1063: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1063: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1091: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1091: UserWarning: No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized confusion matrix.\")\n" ] }, @@ -639,7 +639,15 @@ "outputs_hidden": false } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "metric_fig = results.plot()\n", "metric_fig.write_image(file=f\"../_static/tutorials/performance_estimation/binary/tutorial-confusion-matrix-estimation-binary-car-loan-analysis-with-ref.svg\")\n" @@ -670,7 +678,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" }, "vscode": { "interpreter": { diff --git a/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Multiclass Classification.ipynb b/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Multiclass Classification.ipynb index bafad9411..50bcad025 100644 --- a/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Multiclass Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Estimating Confusion Matrix - Multiclass Classification.ipynb @@ -193,7 +193,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:2222: UserWarning: No 'y_true' values given for chunk, returning NaN as realized precision.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:2222: UserWarning: No 'y_true' values given for chunk, returning NaN as realized precision.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized precision.\")\n" ] }, @@ -641,7 +641,22 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "metric_fig = results.plot()\n", "metric_fig.write_image(file=f\"../_static/tutorials/performance_estimation/multiclass/tutorial-confusion-matrix-estimation-multiclass-analysis-with-ref.svg\")\n" @@ -664,7 +679,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Estimating Performance - Multiclass Classification.ipynb b/docs/example_notebooks/Tutorial - Estimating Performance - Multiclass Classification.ipynb index aa293201f..77c3ff18b 100644 --- a/docs/example_notebooks/Tutorial - Estimating Performance - Multiclass Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Estimating Performance - Multiclass Classification.ipynb @@ -188,51 +188,45 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", - " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1766: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:1829: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n" ] }, @@ -691,7 +685,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Estimating Performance - Regression.ipynb b/docs/example_notebooks/Tutorial - Estimating Performance - Regression.ipynb index 36730f7da..87dfe39a2 100644 --- a/docs/example_notebooks/Tutorial - Estimating Performance - Regression.ipynb +++ b/docs/example_notebooks/Tutorial - Estimating Performance - Regression.ipynb @@ -158,22 +158,6 @@ "id": "f826dce1-cd48-4335-bb44-57460b082077", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/home/nikml/.cache/pypoetry/virtualenvs/nannyml-Os0Ylq-N-py3.11/lib/python3.11/site-packages/lightgbm/basic.py:2065: UserWarning: Using categorical_feature in Dataset.\n", - " _log_warning('Using categorical_feature in Dataset.')\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/home/nikml/.cache/pypoetry/virtualenvs/nannyml-Os0Ylq-N-py3.11/lib/python3.11/site-packages/lightgbm/basic.py:2065: UserWarning: Using categorical_feature in Dataset.\n", - " _log_warning('Using categorical_feature in Dataset.')\n" - ] - }, { "data": { "text/html": [ @@ -1050,7 +1034,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Estimating Standard Performance Metrics - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Estimating Standard Performance Metrics - Binary Classification.ipynb index 542674902..5e22b3db8 100644 --- a/docs/example_notebooks/Tutorial - Estimating Standard Performance Metrics - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Estimating Standard Performance Metrics - Binary Classification.ipynb @@ -186,65 +186,65 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning: No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:842: UserWarning: No 'y_true' values given for chunk, returning NaN as realized accuracy.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized accuracy.\")\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n" ] }, @@ -690,7 +690,15 @@ "outputs_hidden": false } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "metric_fig = results.plot()\n", "metric_fig.write_image(file=f\"../_static/tutorials/performance_estimation/binary/tutorial-performance-estimation-binary-car-loan-analysis-with-ref.svg\")\n" @@ -721,7 +729,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" }, "vscode": { "interpreter": { diff --git a/docs/example_notebooks/Tutorial - Missing Values.ipynb b/docs/example_notebooks/Tutorial - Missing Values.ipynb index 7479e92d9..7d0b5b1e6 100644 --- a/docs/example_notebooks/Tutorial - Missing Values.ipynb +++ b/docs/example_notebooks/Tutorial - Missing Values.ipynb @@ -170,8 +170,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_titanic_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_titanic_dataset()\n", + "display(reference_df.head())" ] }, { @@ -202,7 +202,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -214,11 +214,11 @@ }, "outputs": [], "source": [ - "selected_columns = [\n", + "feature_column_names = [\n", " 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked',\n", "]\n", "calc = nml.MissingValuesCalculator(\n", - " column_names=selected_columns,\n", + " column_names=feature_column_names,\n", ")" ] }, @@ -890,8 +890,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -976,21 +976,28 @@ "execution_count": null, "id": "4d60ecc5-f1c0-4c6d-9aa5-4c72ad00bdf9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "for column_name in results.column_names:\n", " results.filter(column_names=column_name).plot().write_image(\n", " f\"../_static/tutorials/data_quality/missing-titanic-{column_name}.svg\"\n", " )" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a9fb36c4-28ee-4379-a7fa-902b2e7a6d39", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1009,7 +1016,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Ranking.ipynb b/docs/example_notebooks/Tutorial - Ranking.ipynb index bedc936d7..223053a1b 100644 --- a/docs/example_notebooks/Tutorial - Ranking.ipynb +++ b/docs/example_notebooks/Tutorial - Ranking.ipynb @@ -292,8 +292,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", - "analysis_full_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "analysis_full_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "column_names = [\n", " 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', 'size_of_downpayment', 'driver_tenure', 'y_pred_proba', 'y_pred', 'repaid'\n", @@ -1776,7 +1776,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Realized Performance - Binary Classification.ipynb b/docs/example_notebooks/Tutorial - Realized Performance - Binary Classification.ipynb index df2b3e69b..cc049be1e 100644 --- a/docs/example_notebooks/Tutorial - Realized Performance - Binary Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Realized Performance - Binary Classification.ipynb @@ -113,9 +113,9 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", "\n", - "analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "display(reference_df.head(3))" ] @@ -1017,7 +1017,15 @@ "outputs_hidden": false } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = results.plot()\n", "figure.write_image(f'../_static/tutorials/performance_calculation/binary/tutorial-performance-calculation-binary-car-loan-analysis.svg')\n", @@ -1042,7 +1050,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Realized Performance - Multiclass Classification.ipynb b/docs/example_notebooks/Tutorial - Realized Performance - Multiclass Classification.ipynb index 00da5ceb7..54f069987 100644 --- a/docs/example_notebooks/Tutorial - Realized Performance - Multiclass Classification.ipynb +++ b/docs/example_notebooks/Tutorial - Realized Performance - Multiclass Classification.ipynb @@ -126,9 +126,9 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference_df, analysis_df, analysis_target_df = nml.load_synthetic_multiclass_classification_dataset()\n", + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_multiclass_classification_dataset()\n", "\n", - "analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", "\n", "display(reference_df.head(3))" ] @@ -197,6 +197,13 @@ } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + }, { "data": { "text/html": [ @@ -1042,7 +1049,15 @@ "outputs_hidden": false } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure = results.plot()\n", "figure.write_image(f'../_static/tutorials/performance_calculation/multiclass/tutorial-performance-calculation-multiclass.svg')\n" @@ -1065,7 +1080,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Realized Performance - Regression.ipynb b/docs/example_notebooks/Tutorial - Realized Performance - Regression.ipynb index b59ec6f04..cb31ec77f 100644 --- a/docs/example_notebooks/Tutorial - Realized Performance - Regression.ipynb +++ b/docs/example_notebooks/Tutorial - Realized Performance - Regression.ipynb @@ -106,8 +106,8 @@ "\n", "reference_df = nml.load_synthetic_car_price_dataset()[0]\n", "analysis_df = nml.load_synthetic_car_price_dataset()[1]\n", - "analysis_target_df = nml.load_synthetic_car_price_dataset()[2]\n", - "analysis_df = analysis_df.join(analysis_target_df)\n", + "analysis_targets_df = nml.load_synthetic_car_price_dataset()[2]\n", + "analysis_df = analysis_df.join(analysis_targets_df)\n", "\n", "display(reference_df.head(3))" ] @@ -1026,7 +1026,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "figure.write_image(f'../_static/tutorials/performance_calculation/regression/tutorial-performance-calculation-regression.svg')" ] @@ -1066,7 +1074,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Stats - Avg.ipynb b/docs/example_notebooks/Tutorial - Stats - Avg.ipynb index 3521a663a..e45d0f472 100644 --- a/docs/example_notebooks/Tutorial - Stats - Avg.ipynb +++ b/docs/example_notebooks/Tutorial - Stats - Avg.ipynb @@ -148,8 +148,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_synthetic_car_loan_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "display(reference_df.head())" ] }, { @@ -180,7 +180,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -192,11 +192,11 @@ }, "outputs": [], "source": [ - "selected_columns = [\n", + "feature_column_names = [\n", " 'car_value', 'debt_to_income_ratio', 'driver_tenure'\n", "]\n", "calc = nml.SummaryStatsAvgCalculator(\n", - " column_names=selected_columns,\n", + " column_names=feature_column_names,\n", ")" ] }, @@ -870,8 +870,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -1058,10 +1058,10 @@ " metrics=['roc_auc'],\n", " chunk_size=5000)\n", "\n", - "calc1.fit(reference)\n", + "calc1.fit(reference_df)\n", "\n", - "analysis = analysis.merge(analysis_targets, left_index=True, right_index=True)\n", - "results1 = calc1.calculate(analysis)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", + "results1 = calc1.calculate(analysis_df)\n", "\n", "ranker1 = nml.CorrelationRanker()\n", "\n", @@ -1076,14 +1076,6 @@ "\n", "display(correlation_ranked_features1)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "019c74d6-3acb-4da7-afba-0ebd0ccdf93c", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1102,7 +1094,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Stats - Count.ipynb b/docs/example_notebooks/Tutorial - Stats - Count.ipynb index 14565d3e5..675126a10 100644 --- a/docs/example_notebooks/Tutorial - Stats - Count.ipynb +++ b/docs/example_notebooks/Tutorial - Stats - Count.ipynb @@ -148,8 +148,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_synthetic_car_loan_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "display(reference_df.head())" ] }, { @@ -185,7 +185,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -628,8 +628,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -721,14 +721,6 @@ " f\"../_static/tutorials/stats/count.svg\"\n", ")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a9fb36c4-28ee-4379-a7fa-902b2e7a6d39", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -747,7 +739,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Stats - Median.ipynb b/docs/example_notebooks/Tutorial - Stats - Median.ipynb index 3cf5e9ea8..1584eabc6 100644 --- a/docs/example_notebooks/Tutorial - Stats - Median.ipynb +++ b/docs/example_notebooks/Tutorial - Stats - Median.ipynb @@ -148,8 +148,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_synthetic_car_loan_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "display(reference_df.head())" ] }, { @@ -180,7 +180,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -192,11 +192,11 @@ }, "outputs": [], "source": [ - "selected_columns = [\n", + "feature_column_names = [\n", " 'car_value', 'debt_to_income_ratio', 'driver_tenure'\n", "]\n", "calc = nml.SummaryStatsMedianCalculator(\n", - " column_names=selected_columns,\n", + " column_names=feature_column_names,\n", ")" ] }, @@ -870,8 +870,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -1055,10 +1055,10 @@ " metrics=['roc_auc'],\n", " chunk_size=5000)\n", "\n", - "calc1.fit(reference)\n", + "calc1.fit(reference_df)\n", "\n", - "analysis = analysis.merge(analysis_targets, left_index=True, right_index=True)\n", - "results1 = calc1.calculate(analysis)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", + "results1 = calc1.calculate(analysis_df)\n", "\n", "ranker1 = nml.CorrelationRanker()\n", "\n", @@ -1073,14 +1073,6 @@ "\n", "display(correlation_ranked_features1)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "564b9a53-d322-43b7-a322-10cdd06a3eb1", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1099,7 +1091,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Stats - Std.ipynb b/docs/example_notebooks/Tutorial - Stats - Std.ipynb index 683274c8a..787f42312 100644 --- a/docs/example_notebooks/Tutorial - Stats - Std.ipynb +++ b/docs/example_notebooks/Tutorial - Stats - Std.ipynb @@ -148,8 +148,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_synthetic_car_loan_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "display(reference_df.head())" ] }, { @@ -180,7 +180,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -192,11 +192,11 @@ }, "outputs": [], "source": [ - "selected_columns = [\n", + "feature_column_names = [\n", " 'car_value', 'debt_to_income_ratio', 'driver_tenure'\n", "]\n", "calc = nml.SummaryStatsStdCalculator(\n", - " column_names=selected_columns,\n", + " column_names=feature_column_names,\n", ")" ] }, @@ -870,8 +870,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -1055,10 +1055,10 @@ " metrics=['roc_auc'],\n", " chunk_size=5000)\n", "\n", - "calc1.fit(reference)\n", + "calc1.fit(reference_df)\n", "\n", - "analysis = analysis.merge(analysis_targets, left_index=True, right_index=True)\n", - "results1 = calc1.calculate(analysis)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", + "results1 = calc1.calculate(analysis_df)\n", "\n", "ranker1 = nml.CorrelationRanker()\n", "\n", @@ -1091,7 +1091,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Stats - Sum.ipynb b/docs/example_notebooks/Tutorial - Stats - Sum.ipynb index 7dab052e1..3baedd157 100644 --- a/docs/example_notebooks/Tutorial - Stats - Sum.ipynb +++ b/docs/example_notebooks/Tutorial - Stats - Sum.ipynb @@ -148,8 +148,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_synthetic_car_loan_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset()\n", + "display(reference_df.head())" ] }, { @@ -180,7 +180,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -192,11 +192,11 @@ }, "outputs": [], "source": [ - "selected_columns = [\n", + "feature_column_names = [\n", " 'car_value', 'debt_to_income_ratio', 'driver_tenure'\n", "]\n", "calc = nml.SummaryStatsSumCalculator(\n", - " column_names=selected_columns,\n", + " column_names=feature_column_names,\n", ")" ] }, @@ -870,8 +870,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -1055,10 +1055,10 @@ " metrics=['roc_auc'],\n", " chunk_size=5000)\n", "\n", - "calc1.fit(reference)\n", + "calc1.fit(reference_df)\n", "\n", - "analysis = analysis.merge(analysis_targets, left_index=True, right_index=True)\n", - "results1 = calc1.calculate(analysis)\n", + "analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True)\n", + "results1 = calc1.calculate(analysis_df)\n", "\n", "ranker1 = nml.CorrelationRanker()\n", "\n", @@ -1091,7 +1091,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Storing and Loading Calculators - Univariate.ipynb b/docs/example_notebooks/Tutorial - Storing and Loading Calculators - Univariate.ipynb index 5966c6ccf..5502a61eb 100644 --- a/docs/example_notebooks/Tutorial - Storing and Loading Calculators - Univariate.ipynb +++ b/docs/example_notebooks/Tutorial - Storing and Loading Calculators - Univariate.ipynb @@ -835,7 +835,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Thresholds.ipynb b/docs/example_notebooks/Tutorial - Thresholds.ipynb index f7f6ee77d..b7abd5e4a 100644 --- a/docs/example_notebooks/Tutorial - Thresholds.ipynb +++ b/docs/example_notebooks/Tutorial - Thresholds.ipynb @@ -213,7 +213,7 @@ { "data": { "text/plain": [ - "StandardDeviationThreshold{'std_lower_multiplier': 3, 'std_upper_multiplier': 3, 'offset_from': }" + "StandardDeviationThreshold{'std_lower_multiplier': 3, 'std_upper_multiplier': 3, 'offset_from': }" ] }, "execution_count": 6, @@ -243,7 +243,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning: No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", " warnings.warn(\"No 'y_true' values given for chunk, returning NaN as realized F1 score.\")\n" ] }, @@ -575,7 +575,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "metric_fig.write_image('../_static/tutorials/thresholds/est_f1_default_thresholds.svg')" ] @@ -610,7 +618,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:503: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized F1 score.\n", "\n" @@ -984,7 +992,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Unseen Values.ipynb b/docs/example_notebooks/Tutorial - Unseen Values.ipynb index ea10545bf..21895e262 100644 --- a/docs/example_notebooks/Tutorial - Unseen Values.ipynb +++ b/docs/example_notebooks/Tutorial - Unseen Values.ipynb @@ -170,8 +170,8 @@ "import nannyml as nml\n", "from IPython.display import display\n", "\n", - "reference, analysis, analysis_targets = nml.load_titanic_dataset()\n", - "display(reference.head())" + "reference_df, analysis_df, analysis_targets_df = nml.load_titanic_dataset()\n", + "display(reference_df.head())" ] }, { @@ -202,7 +202,7 @@ ], "source": [ "from docs.utils import print_multi_index_markdown\n", - "print_multi_index_markdown(reference.head())" + "print_multi_index_markdown(reference_df.head())" ] }, { @@ -212,11 +212,11 @@ "metadata": {}, "outputs": [], "source": [ - "selected_columns = [\n", + "feature_column_names = [\n", " 'Sex', 'Ticket', 'Cabin', 'Embarked',\n", "]\n", "calc = nml.UnseenValuesCalculator(\n", - " column_names=selected_columns,\n", + " column_names=feature_column_names,\n", ")" ] }, @@ -868,8 +868,8 @@ } ], "source": [ - "calc.fit(reference)\n", - "results = calc.calculate(analysis)\n", + "calc.fit(reference_df)\n", + "results = calc.calculate(analysis_df)\n", "display(results.filter(period='all').to_df())" ] }, @@ -985,7 +985,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/example_notebooks/Tutorial - Working with results.ipynb b/docs/example_notebooks/Tutorial - Working with results.ipynb index 7216c40cd..ddd5d638a 100644 --- a/docs/example_notebooks/Tutorial - Working with results.ipynb +++ b/docs/example_notebooks/Tutorial - Working with results.ipynb @@ -1399,7 +1399,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "results.plot().write_image(f'../_static/tutorials/working_with_results/result_plot.svg')" ] @@ -1435,7 +1443,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "filtered_results.plot(kind='distribution').write_image(f'../_static/tutorials/working_with_results/distribution_plot.svg')" ] @@ -1449,43 +1465,43 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n", - "/var/home/nikml/Source/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", + "/home/niels/Code/nml/nannyml/nannyml/performance_estimation/confidence_based/metrics.py:406: UserWarning:\n", "\n", "No 'y_true' values given for chunk, returning NaN as realized ROC-AUC.\n", "\n" @@ -1575,7 +1591,15 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "error uploading: HTTPSConnectionPool(host='api.segment.io', port=443): Max retries exceeded with url: /v1/batch (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\n" + ] + } + ], "source": [ "!rm nml.db" ] @@ -1602,7 +1626,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.8.8" } }, "nbformat": 4, diff --git a/docs/how_it_works/chunking_data.rst b/docs/how_it_works/chunking_data.rst index 6989bda89..cc3215bef 100644 --- a/docs/how_it_works/chunking_data.rst +++ b/docs/how_it_works/chunking_data.rst @@ -21,7 +21,7 @@ far from optimal, but it is a reasonable minimum. If there are less than 6 chunk .. code-block:: python >>> import nannyml as nml - >>> reference, analysis, _ = nml.load_synthetic_car_loan_dataset() + >>> reference_df, analysis_df, _ = nml.load_synthetic_car_loan_dataset() >>> cbpe = nml.CBPE( ... y_pred_proba='y_pred_proba', ... y_pred='y_pred', @@ -30,8 +30,8 @@ far from optimal, but it is a reasonable minimum. If there are less than 6 chunk ... chunk_number=5, ... metrics=['roc_auc'], ... problem_type='classification_binary', - >>> ).fit(reference_data=reference) - >>> est_perf = cbpe.estimate(analysis) + >>> ).fit(reference_data=reference_df) + >>> est_perf = cbpe.estimate(analysis_df) UserWarning: The resulting number of chunks is too low. Please consider splitting your data in a different way or continue at your own risk. diff --git a/docs/tutorials/performance_calculation/binary_performance_calculation/standard_metric_calculation.rst b/docs/tutorials/performance_calculation/binary_performance_calculation/standard_metric_calculation.rst index 466cb81da..9b2ea90c4 100644 --- a/docs/tutorials/performance_calculation/binary_performance_calculation/standard_metric_calculation.rst +++ b/docs/tutorials/performance_calculation/binary_performance_calculation/standard_metric_calculation.rst @@ -38,7 +38,7 @@ In order to monitor a model, NannyML needs to learn about it from a reference da subject to actual analysis, provided as the analysis dataset.You can read more about this in our section on :ref:`data periods`. -The ``analysis_target_df`` dataframe contains the target results of the analysis period. This is kept separate in the +The ``analysis_targets_df`` dataframe contains the target results of the analysis period. This is kept separate in the synthetic data because it is not used during :ref:`performance estimation`. But it is required to calculate the :term:`Realized Performance`, so the first thing we need to in this case is set up the right data in the right dataframes. diff --git a/nannyml/data_quality/missing/calculator.py b/nannyml/data_quality/missing/calculator.py index 4a2470461..d9bf3513a 100644 --- a/nannyml/data_quality/missing/calculator.py +++ b/nannyml/data_quality/missing/calculator.py @@ -67,14 +67,14 @@ def __init__( Examples -------- >>> import nannyml as nml - >>> reference, analysis, _ = nml.load_synthetic_car_price_dataset() - >>> column_names = [col for col in reference.columns if col not in ['timestamp', 'y_pred', 'y_true']] + >>> reference_df, analysis_df, _ = nml.load_synthetic_car_price_dataset() + >>> feature_column_names = [col for col in reference_df.columns if col not in ['timestamp', 'y_pred', 'y_true']] >>> calc = nml.MissingValuesCalculator( - ... column_names=column_names, + ... column_names=feature_column_names, ... timestamp_column_name='timestamp', - ... ).fit(reference) - >>> res = calc.calculate(analysis) - >>> for column_name in res.column_names: + ... ).fit(reference_df) + >>> res = calc.calculate(analysis_df) + >>> for column_name in res.feature_column_names: ... res = res.filter(period='analysis', column_name=column_name).plot().show() """ super(MissingValuesCalculator, self).__init__( diff --git a/nannyml/drift/ranker.py b/nannyml/drift/ranker.py index 3e9ac8bf0..962653aa4 100644 --- a/nannyml/drift/ranker.py +++ b/nannyml/drift/ranker.py @@ -145,14 +145,14 @@ def rank( -------- >>> import nannyml as nml >>> from IPython.display import display - >>> reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset() - >>> analysis_full_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True) - >>> column_names = [ + >>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset() + >>> analysis_full_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True) + >>> feature_column_names = [ ... 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', ... 'size_of_downpayment', 'driver_tenure', 'y_pred_proba', 'y_pred', 'repaid' >>> ] >>> univ_calc = nml.UnivariateDriftCalculator( - ... column_names=column_names, + ... column_names=feature_column_names, ... treat_as_categorical=['y_pred', 'repaid'], ... timestamp_column_name='timestamp', ... continuous_methods=['kolmogorov_smirnov', 'jensen_shannon'], @@ -199,56 +199,56 @@ class CorrelationRanker: """Ranks the features according to their correlation with changes in realized or estimated performance. Examples - -------- - >>> import nannyml as nml - >>> from IPython.display import display - >>> reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset() - >>> analysis_full_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True) - >>> column_names = [ - ... 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', - ... 'size_of_downpayment', 'driver_tenure', 'y_pred_proba', 'y_pred', 'repaid' - >>> ] - >>> univ_calc = nml.UnivariateDriftCalculator( - ... column_names=column_names, - ... treat_as_categorical=['y_pred', 'repaid'], - ... timestamp_column_name='timestamp', - ... continuous_methods=['kolmogorov_smirnov', 'jensen_shannon'], - ... categorical_methods=['chi2', 'jensen_shannon'], - ... chunk_size=5000 - >>> ) - >>> univ_calc.fit(reference_df) - >>> univariate_results = univ_calc.calculate(analysis_full_df) - >>> realized_calc = nml.PerformanceCalculator( - ... y_pred_proba='y_pred_proba', - ... y_pred='y_pred', - ... y_true='repaid', - ... timestamp_column_name='timestamp', - ... problem_type='classification_binary', - ... metrics=['roc_auc', 'recall',], - ... chunk_size=5000) - >>> realized_calc.fit(reference_df) - >>> realized_perf_results = realized_calc.calculate(analysis_full_df) - >>> ranker2 = nml.CorrelationRanker() - >>> # ranker fits on one metric and reference period data only - >>> ranker2.fit( - ... realized_perf_results.filter(period='reference', metrics=['recall'])) - >>> # ranker ranks on one drift method and one performance metric - >>> correlation_ranked_features2 = ranker2.rank( - ... univariate_results.filter(period='analysis', methods=['jensen_shannon']), - ... realized_perf_results.filter(period='analysis', metrics=['recall']), - ... only_drifting = False) - >>> display(correlation_ranked_features2) - column_name pearsonr_correlation pearsonr_pvalue has_drifted rank - 0 repaid_loan_on_prev_car 0.96897 3.90719e-06 True 1 - 1 y_pred_proba 0.966157 5.50918e-06 True 2 - 2 loan_length 0.965298 6.08385e-06 True 3 - 3 car_value 0.963623 7.33185e-06 True 4 - 4 salary_range 0.963456 7.46561e-06 True 5 - 5 size_of_downpayment 0.308948 0.385072 False 6 - 6 debt_to_income_ratio 0.307373 0.387627 False 7 - 7 y_pred -0.357571 0.310383 False 8 - 8 repaid -0.395842 0.257495 False 9 - 9 driver_tenure -0.575807 0.0815202 False 10 + -------- + >>> import nannyml as nml + >>> from IPython.display import display + >>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset() + >>> analysis_full_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True) + >>> feature_column_names = [ + ... 'car_value', 'salary_range', 'debt_to_income_ratio', 'loan_length', 'repaid_loan_on_prev_car', + ... 'size_of_downpayment', 'driver_tenure', 'y_pred_proba', 'y_pred', 'repaid' + >>> ] + >>> univ_calc = nml.UnivariateDriftCalculator( + ... column_names=feature_column_names, + ... treat_as_categorical=['y_pred', 'repaid'], + ... timestamp_column_name='timestamp', + ... continuous_methods=['kolmogorov_smirnov', 'jensen_shannon'], + ... categorical_methods=['chi2', 'jensen_shannon'], + ... chunk_size=5000 + >>> ) + >>> univ_calc.fit(reference_df) + >>> univariate_results = univ_calc.calculate(analysis_full_df) + >>> realized_calc = nml.PerformanceCalculator( + ... y_pred_proba='y_pred_proba', + ... y_pred='y_pred', + ... y_true='repaid', + ... timestamp_column_name='timestamp', + ... problem_type='classification_binary', + ... metrics=['roc_auc', 'recall',], + ... chunk_size=5000) + >>> realized_calc.fit(reference_df) + >>> realized_perf_results = realized_calc.calculate(analysis_full_df) + >>> ranker2 = nml.CorrelationRanker() + >>> # ranker fits on one metric and reference period data only + >>> ranker2.fit( + ... realized_perf_results.filter(period='reference', metrics=['recall'])) + >>> # ranker ranks on one drift method and one performance metric + >>> correlation_ranked_features2 = ranker2.rank( + ... univariate_results.filter(period='analysis', methods=['jensen_shannon']), + ... realized_perf_results.filter(period='analysis', metrics=['recall']), + ... only_drifting = False) + >>> display(correlation_ranked_features2) + column_name pearsonr_correlation pearsonr_pvalue has_drifted rank + 0 repaid_loan_on_prev_car 0.96897 3.90719e-06 True 1 + 1 y_pred_proba 0.966157 5.50918e-06 True 2 + 2 loan_length 0.965298 6.08385e-06 True 3 + 3 car_value 0.963623 7.33185e-06 True 4 + 4 salary_range 0.963456 7.46561e-06 True 5 + 5 size_of_downpayment 0.308948 0.385072 False 6 + 6 debt_to_income_ratio 0.307373 0.387627 False 7 + 7 y_pred -0.357571 0.310383 False 8 + 8 repaid -0.395842 0.257495 False 9 + 9 driver_tenure -0.575807 0.0815202 False 10 """ def __init__(self) -> None: diff --git a/nannyml/performance_calculation/calculator.py b/nannyml/performance_calculation/calculator.py index d2670fb16..60cc0c7d3 100644 --- a/nannyml/performance_calculation/calculator.py +++ b/nannyml/performance_calculation/calculator.py @@ -20,8 +20,8 @@ >>> import nannyml as nml >>> from IPython.display import display ->>> reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset() ->>> analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True) +>>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset() +>>> analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True) >>> display(reference_df.head(3)) >>> calc = nml.PerformanceCalculator( ... y_pred_proba='y_pred_proba', @@ -178,8 +178,8 @@ def __init__( -------- >>> import nannyml as nml >>> from IPython.display import display - >>> reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset() - >>> analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True) + >>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset() + >>> analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True) >>> display(reference_df.head(3)) >>> calc = nml.PerformanceCalculator( ... y_pred_proba='y_pred_proba', diff --git a/nannyml/performance_calculation/result.py b/nannyml/performance_calculation/result.py index dc2911b6d..62aa17278 100644 --- a/nannyml/performance_calculation/result.py +++ b/nannyml/performance_calculation/result.py @@ -131,8 +131,8 @@ def plot( -------- >>> import nannyml as nml >>> from IPython.display import display - >>> reference_df, analysis_df, analysis_target_df = nml.load_synthetic_car_loan_dataset() - >>> analysis_df = analysis_df.merge(analysis_target_df, left_index=True, right_index=True) + >>> reference_df, analysis_df, analysis_targets_df = nml.load_synthetic_car_loan_dataset() + >>> analysis_df = analysis_df.merge(analysis_targets_df, left_index=True, right_index=True) >>> display(reference_df.head(3)) >>> calc = nml.PerformanceCalculator( ... y_pred_proba='y_pred_proba', diff --git a/poetry.lock b/poetry.lock index aeceb0db6..32da5724e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -924,6 +924,7 @@ files = [ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, @@ -932,6 +933,7 @@ files = [ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, @@ -940,6 +942,7 @@ files = [ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, @@ -948,6 +951,7 @@ files = [ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, @@ -1770,6 +1774,7 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -1778,6 +1783,7 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -1807,6 +1813,7 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -1815,6 +1822,7 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -2590,6 +2598,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -5757,6 +5775,31 @@ files = [ {file = "types_PyYAML-6.0.12.10-py3-none-any.whl", hash = "sha256:662fa444963eff9b68120d70cda1af5a5f2aa57900003c2006d7626450eaae5f"}, ] +[[package]] +name = "types-requests" +version = "2.31.0.6" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, + {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, +] + +[package.dependencies] +types-urllib3 = "*" + +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +description = "Typing stubs for urllib3" +optional = false +python-versions = "*" +files = [ + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, +] + [[package]] name = "typing-extensions" version = "4.6.3" @@ -6240,4 +6283,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.7,<3.12" -content-hash = "defd21a8b4911c92f7c9bcbe6d8af0f8eafed21ba0704bec2dbdc623c94986fe" +content-hash = "4ad5ecf3760c56e4cbcddd62adea2654927c6bfde4b8dbda96f35172fcbce307"