autogluon.timeseries 1.1.0b20240415__tar.gz → 1.1.0b20240417__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of autogluon.timeseries might be problematic. Click here for more details.
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/PKG-INFO +1 -1
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/configs/presets_configs.py +2 -2
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/autogluon_tabular/mlforecast.py +4 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/local/abstract_local_model.py +0 -2
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/presets.py +23 -13
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/predictor.py +6 -4
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/trainer/abstract_trainer.py +1 -1
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/features.py +8 -6
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/version.py +1 -1
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/PKG-INFO +1 -1
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/requires.txt +3 -3
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/setup.cfg +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/setup.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/configs/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/dataset/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/dataset/ts_dataframe.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/evaluator.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/learner.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/metrics/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/metrics/abstract.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/metrics/point.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/metrics/quantile.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/metrics/utils.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/abstract/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/abstract/abstract_timeseries_model.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/abstract/model_trial.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/autogluon_tabular/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/autogluon_tabular/utils.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/chronos/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/chronos/model.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/chronos/pipeline.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/chronos/utils.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/ensemble/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/ensemble/abstract_timeseries_ensemble.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/ensemble/greedy_ensemble.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/gluonts/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/gluonts/abstract_gluonts.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/gluonts/torch/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/gluonts/torch/models.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/local/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/local/naive.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/local/npts.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/local/statsforecast.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/multi_window/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/models/multi_window/multi_window_model.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/splitter.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/trainer/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/trainer/auto_trainer.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/datetime/__init__.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/datetime/base.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/datetime/lags.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/datetime/seasonality.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/datetime/time_features.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/forecast.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon/timeseries/utils/warning_filters.py +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/SOURCES.txt +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/dependency_links.txt +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/namespace_packages.txt +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/top_level.txt +0 -0
- {autogluon.timeseries-1.1.0b20240415 → autogluon.timeseries-1.1.0b20240417}/src/autogluon.timeseries.egg-info/zip-safe +0 -0
|
@@ -33,13 +33,13 @@ TIMESERIES_PRESETS_CONFIGS = dict(
|
|
|
33
33
|
chronos_ensemble={
|
|
34
34
|
"hyperparameters": {
|
|
35
35
|
"Chronos": {"model_path": "small"},
|
|
36
|
-
**get_default_hps("
|
|
36
|
+
**get_default_hps("light_inference"),
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
chronos_large_ensemble={
|
|
40
40
|
"hyperparameters": {
|
|
41
41
|
"Chronos": {"model_path": "large", "batch_size": 8},
|
|
42
|
-
**get_default_hps("
|
|
42
|
+
**get_default_hps("light_inference"),
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
45
|
)
|
|
@@ -257,6 +257,10 @@ class AbstractMLForecastModel(AbstractTimeSeriesModel):
|
|
|
257
257
|
if not df[col].isin([0, 1]).all():
|
|
258
258
|
df[f"__scaled_{col}"] = df[col] / df[col].abs().groupby(df[ITEMID]).mean().reindex(df[ITEMID]).values
|
|
259
259
|
|
|
260
|
+
# Convert float64 to float32 to reduce memory usage
|
|
261
|
+
float64_cols = list(df.select_dtypes(include="float64"))
|
|
262
|
+
df[float64_cols] = df[float64_cols].astype("float32")
|
|
263
|
+
|
|
260
264
|
# We assume that df is sorted by 'unique_id' inside `TimeSeriesPredictor._check_and_prepare_data_frame`
|
|
261
265
|
return df.rename(columns=column_name_mapping)
|
|
262
266
|
|
|
@@ -230,8 +230,6 @@ def seasonal_naive_forecast(
|
|
|
230
230
|
return arr[np.maximum.accumulate(idx)]
|
|
231
231
|
|
|
232
232
|
forecast = {}
|
|
233
|
-
# Convert to float64 since std computation can be unstable in float32
|
|
234
|
-
target = target.astype(np.float64)
|
|
235
233
|
# At least seasonal_period + 2 values are required to compute sigma for seasonal naive
|
|
236
234
|
if len(target) > seasonal_period + 1 and seasonal_period > 1:
|
|
237
235
|
if np.isnan(target[-(seasonal_period + 2) :]).any():
|
|
@@ -79,21 +79,23 @@ DEFAULT_MODEL_PRIORITY = dict(
|
|
|
79
79
|
Average=100,
|
|
80
80
|
SeasonalAverage=100,
|
|
81
81
|
Zero=100,
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
82
|
+
RecursiveTabular=90,
|
|
83
|
+
DirectTabular=85,
|
|
84
|
+
# All local models are grouped together to make sure that joblib parallel pool is reused
|
|
85
|
+
NPTS=80,
|
|
86
|
+
ETS=80,
|
|
87
|
+
CrostonSBA=80,
|
|
88
|
+
Theta=75,
|
|
89
|
+
DynamicOptimizedTheta=75,
|
|
90
|
+
AutoETS=70,
|
|
91
|
+
AutoARIMA=60,
|
|
92
|
+
Chronos=55,
|
|
93
|
+
# Models that can early stop are trained at the end
|
|
94
|
+
TemporalFusionTransformer=45,
|
|
92
95
|
DeepAR=40,
|
|
93
|
-
|
|
94
|
-
WaveNet=25,
|
|
95
|
-
PatchTST=20,
|
|
96
|
+
PatchTST=30,
|
|
96
97
|
# Models below are not included in any presets
|
|
98
|
+
WaveNet=25,
|
|
97
99
|
AutoCES=10,
|
|
98
100
|
ARIMA=10,
|
|
99
101
|
ADIDA=10,
|
|
@@ -128,6 +130,13 @@ def get_default_hps(key):
|
|
|
128
130
|
"DirectTabular": {},
|
|
129
131
|
"TemporalFusionTransformer": {},
|
|
130
132
|
},
|
|
133
|
+
"light_inference": {
|
|
134
|
+
"SeasonalNaive": {},
|
|
135
|
+
"DirectTabular": {},
|
|
136
|
+
"RecursiveTabular": {},
|
|
137
|
+
"TemporalFusionTransformer": {},
|
|
138
|
+
"PatchTST": {},
|
|
139
|
+
},
|
|
131
140
|
"default": {
|
|
132
141
|
"SeasonalNaive": {},
|
|
133
142
|
"CrostonSBA": {},
|
|
@@ -143,6 +152,7 @@ def get_default_hps(key):
|
|
|
143
152
|
"TemporalFusionTransformer": {},
|
|
144
153
|
"PatchTST": {},
|
|
145
154
|
"DeepAR": {},
|
|
155
|
+
"Chronos": {"model_path": "base"},
|
|
146
156
|
},
|
|
147
157
|
}
|
|
148
158
|
return default_model_hps[key]
|
|
@@ -293,7 +293,7 @@ class TimeSeriesPredictor(TimeSeriesPredictorDeprecatedMixin):
|
|
|
293
293
|
Preprocessed data in TimeSeriesDataFrame format.
|
|
294
294
|
"""
|
|
295
295
|
df = self._to_data_frame(data, name=name)
|
|
296
|
-
df = df.astype({self.target: "
|
|
296
|
+
df = df.astype({self.target: "float64"})
|
|
297
297
|
# MultiIndex.is_monotonic_increasing checks if index is sorted by ["item_id", "timestamp"]
|
|
298
298
|
if not df.index.is_monotonic_increasing:
|
|
299
299
|
df = df.sort_index()
|
|
@@ -499,7 +499,7 @@ class TimeSeriesPredictor(TimeSeriesPredictorDeprecatedMixin):
|
|
|
499
499
|
with reasonable training time.
|
|
500
500
|
- ``"high_quality"``: All ML models available in AutoGluon + additional statistical models (``NPTS``, ``AutoETS``, ``AutoARIMA``, ``CrostonSBA``,
|
|
501
501
|
``DynamicOptimizedTheta``). Much more accurate than ``medium_quality``, but takes longer to train.
|
|
502
|
-
- ``"best_quality"``: Same models as in ``"high_quality"
|
|
502
|
+
- ``"best_quality"``: Same models as in ``"high_quality"``, but performs validation with multiple backtests. Usually better than ``high_quality``, but takes even longer to train.
|
|
503
503
|
|
|
504
504
|
Available presets with the `Chronos <https://github.com/amazon-science/chronos-forecasting>`_ model:
|
|
505
505
|
|
|
@@ -507,8 +507,10 @@ class TimeSeriesPredictor(TimeSeriesPredictorDeprecatedMixin):
|
|
|
507
507
|
See the documentation for ``ChronosModel`` or see `Hugging Face <https://huggingface.co/collections/amazon/chronos-models-65f1791d630a8d57cb718444>`_ for more information.
|
|
508
508
|
Note that a GPU is required for model sizes ``small``, ``base`` and ``large``.
|
|
509
509
|
- ``"chronos"``: alias for ``"chronos_small"``.
|
|
510
|
-
- ``"chronos_ensemble"``: builds an ensemble of
|
|
511
|
-
|
|
510
|
+
- ``"chronos_ensemble"``: builds an ensemble of seasonal naive, tree-based and deep learning models with fast inference
|
|
511
|
+
and ``"chronos_small"``.
|
|
512
|
+
- ``"chronos_large_ensemble"``: builds an ensemble of seasonal naive, tree-based and deep learning models
|
|
513
|
+
with fast inference and ``"chronos_large"``.
|
|
512
514
|
|
|
513
515
|
Details for these presets can be found in ``autogluon/timeseries/configs/presets_configs.py``. If not
|
|
514
516
|
provided, user-provided values for ``hyperparameters`` and ``hyperparameter_tune_kwargs`` will be used
|
|
@@ -613,7 +613,7 @@ class AbstractTimeSeriesTrainer(SimpleAbstractTrainer):
|
|
|
613
613
|
break
|
|
614
614
|
|
|
615
615
|
if random_seed is not None:
|
|
616
|
-
seed_everything(random_seed)
|
|
616
|
+
seed_everything(random_seed + i)
|
|
617
617
|
|
|
618
618
|
if contains_searchspace(model.get_user_params()):
|
|
619
619
|
fit_log_message = f"Hyperparameter tuning model {model.name}. "
|
|
@@ -73,7 +73,7 @@ class ContinuousAndCategoricalFeatureGenerator(PipelineFeatureGenerator):
|
|
|
73
73
|
Imputes missing categorical features with the most frequent value in the training set.
|
|
74
74
|
"""
|
|
75
75
|
|
|
76
|
-
def __init__(self, verbosity: int = 0, minimum_cat_count=2, float_dtype: str = "
|
|
76
|
+
def __init__(self, verbosity: int = 0, minimum_cat_count=2, float_dtype: str = "float64", **kwargs):
|
|
77
77
|
generators = [
|
|
78
78
|
CategoryFeatureGenerator(minimum_cat_count=minimum_cat_count, fillna="mode"),
|
|
79
79
|
IdentityFeatureGenerator(infer_features_in_args={"valid_raw_types": [R_INT, R_FLOAT]}),
|
|
@@ -111,7 +111,7 @@ class ContinuousAndCategoricalFeatureGenerator(PipelineFeatureGenerator):
|
|
|
111
111
|
class TimeSeriesFeatureGenerator:
|
|
112
112
|
"""Takes care of preprocessing for static_features and past/known covariates.
|
|
113
113
|
|
|
114
|
-
All covariates & static features are converted into either
|
|
114
|
+
All covariates & static features are converted into either float64 or categorical dtype.
|
|
115
115
|
|
|
116
116
|
Missing values in the target column are left as-is but missing values in static features & covariates are imputed.
|
|
117
117
|
Imputation logic is as follows:
|
|
@@ -121,16 +121,18 @@ class TimeSeriesFeatureGenerator:
|
|
|
121
121
|
covariate values are missing, we fill them with the median of the training set.
|
|
122
122
|
"""
|
|
123
123
|
|
|
124
|
-
def __init__(self, target: str, known_covariates_names: List[str], float_dtype: str = "
|
|
124
|
+
def __init__(self, target: str, known_covariates_names: List[str], float_dtype: str = "float64"):
|
|
125
125
|
self.target = target
|
|
126
126
|
self.float_dtype = float_dtype
|
|
127
127
|
self._is_fit = False
|
|
128
128
|
self.known_covariates_names = list(known_covariates_names)
|
|
129
129
|
self.past_covariates_names = []
|
|
130
|
-
self.known_covariates_pipeline = ContinuousAndCategoricalFeatureGenerator()
|
|
131
|
-
self.past_covariates_pipeline = ContinuousAndCategoricalFeatureGenerator()
|
|
130
|
+
self.known_covariates_pipeline = ContinuousAndCategoricalFeatureGenerator(float_dtype=float_dtype)
|
|
131
|
+
self.past_covariates_pipeline = ContinuousAndCategoricalFeatureGenerator(float_dtype=float_dtype)
|
|
132
132
|
# Cat features with cat_count=1 are fine in static_features since they are repeated for all time steps in a TS
|
|
133
|
-
self.static_feature_pipeline = ContinuousAndCategoricalFeatureGenerator(
|
|
133
|
+
self.static_feature_pipeline = ContinuousAndCategoricalFeatureGenerator(
|
|
134
|
+
minimum_cat_count=1, float_dtype=float_dtype
|
|
135
|
+
)
|
|
134
136
|
self.covariate_metadata: CovariateMetadata = None
|
|
135
137
|
self._train_covariates_real_median: Optional[pd.Series] = None
|
|
136
138
|
self._train_static_real_median: Optional[pd.Series] = None
|
|
@@ -15,9 +15,9 @@ utilsforecast<0.0.11,>=0.0.10
|
|
|
15
15
|
tqdm<5,>=4.38
|
|
16
16
|
orjson~=3.9
|
|
17
17
|
tensorboard<3,>=2.9
|
|
18
|
-
autogluon.core[raytune]==1.1.
|
|
19
|
-
autogluon.common==1.1.
|
|
20
|
-
autogluon.tabular[catboost,lightgbm,xgboost]==1.1.
|
|
18
|
+
autogluon.core[raytune]==1.1.0b20240417
|
|
19
|
+
autogluon.common==1.1.0b20240417
|
|
20
|
+
autogluon.tabular[catboost,lightgbm,xgboost]==1.1.0b20240417
|
|
21
21
|
|
|
22
22
|
[all]
|
|
23
23
|
optimum[onnxruntime]<1.19,>=1.17
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|