qis 3.0.4__tar.gz → 3.0.5__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.
Files changed (150) hide show
  1. {qis-3.0.4 → qis-3.0.5}/PKG-INFO +1 -1
  2. {qis-3.0.4 → qis-3.0.5}/pyproject.toml +8 -3
  3. {qis-3.0.4 → qis-3.0.5}/qis/plots/boxplot.py +1 -0
  4. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/perf_table.py +11 -0
  5. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/multi_portfolio_data.py +34 -9
  6. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/strategy_benchmark_factsheet.py +1 -0
  7. {qis-3.0.4 → qis-3.0.5}/qis/settings.yaml +1 -0
  8. {qis-3.0.4 → qis-3.0.5}/LICENSE.txt +0 -0
  9. {qis-3.0.4 → qis-3.0.5}/README.md +0 -0
  10. {qis-3.0.4 → qis-3.0.5}/qis/__init__.py +0 -0
  11. {qis-3.0.4 → qis-3.0.5}/qis/examples/best_returns.py +0 -0
  12. {qis-3.0.4 → qis-3.0.5}/qis/examples/bond_futures_portfolio.py +0 -0
  13. {qis-3.0.4 → qis-3.0.5}/qis/examples/bootstrap_analysis.py +0 -0
  14. {qis-3.0.4 → qis-3.0.5}/qis/examples/boxplot_conditional_returns.py +0 -0
  15. {qis-3.0.4 → qis-3.0.5}/qis/examples/btc_asset_corr.py +0 -0
  16. {qis-3.0.4 → qis-3.0.5}/qis/examples/constant_notional.py +0 -0
  17. {qis-3.0.4 → qis-3.0.5}/qis/examples/constant_weight_portfolios.py +0 -0
  18. {qis-3.0.4 → qis-3.0.5}/qis/examples/core/perf_bbg_prices.py +0 -0
  19. {qis-3.0.4 → qis-3.0.5}/qis/examples/core/price_plots.py +0 -0
  20. {qis-3.0.4 → qis-3.0.5}/qis/examples/core/us_election.py +0 -0
  21. {qis-3.0.4 → qis-3.0.5}/qis/examples/credit_spreads.py +0 -0
  22. {qis-3.0.4 → qis-3.0.5}/qis/examples/credit_trackers.py +0 -0
  23. {qis-3.0.4 → qis-3.0.5}/qis/examples/europe_futures.py +0 -0
  24. {qis-3.0.4 → qis-3.0.5}/qis/examples/factsheets/multi_assets.py +0 -0
  25. {qis-3.0.4 → qis-3.0.5}/qis/examples/factsheets/multi_strategy.py +0 -0
  26. {qis-3.0.4 → qis-3.0.5}/qis/examples/factsheets/pyblogs_reports.py +0 -0
  27. {qis-3.0.4 → qis-3.0.5}/qis/examples/factsheets/strategy.py +0 -0
  28. {qis-3.0.4 → qis-3.0.5}/qis/examples/factsheets/strategy_benchmark.py +0 -0
  29. {qis-3.0.4 → qis-3.0.5}/qis/examples/generate_option_rolls.py +0 -0
  30. {qis-3.0.4 → qis-3.0.5}/qis/examples/interpolation_infrequent_returns.py +0 -0
  31. {qis-3.0.4 → qis-3.0.5}/qis/examples/leveraged_strategies.py +0 -0
  32. {qis-3.0.4 → qis-3.0.5}/qis/examples/long_short.py +0 -0
  33. {qis-3.0.4 → qis-3.0.5}/qis/examples/momentum_indices.py +0 -0
  34. {qis-3.0.4 → qis-3.0.5}/qis/examples/oakmark_analysis.py +0 -0
  35. {qis-3.0.4 → qis-3.0.5}/qis/examples/ohlc_vol_analysis.py +0 -0
  36. {qis-3.0.4 → qis-3.0.5}/qis/examples/overnight_returns.py +0 -0
  37. {qis-3.0.4 → qis-3.0.5}/qis/examples/perf_external_assets.py +0 -0
  38. {qis-3.0.4 → qis-3.0.5}/qis/examples/perp_pricing.py +0 -0
  39. {qis-3.0.4 → qis-3.0.5}/qis/examples/readme_performances.py +0 -0
  40. {qis-3.0.4 → qis-3.0.5}/qis/examples/risk_return_frontier.py +0 -0
  41. {qis-3.0.4 → qis-3.0.5}/qis/examples/rolling_performance.py +0 -0
  42. {qis-3.0.4 → qis-3.0.5}/qis/examples/seasonality.py +0 -0
  43. {qis-3.0.4 → qis-3.0.5}/qis/examples/sharpe_vs_sortino.py +0 -0
  44. {qis-3.0.4 → qis-3.0.5}/qis/examples/simulate_quant_strats.py +0 -0
  45. {qis-3.0.4 → qis-3.0.5}/qis/examples/test_ewm.py +0 -0
  46. {qis-3.0.4 → qis-3.0.5}/qis/examples/test_scatter.py +0 -0
  47. {qis-3.0.4 → qis-3.0.5}/qis/examples/try_pybloqs.py +0 -0
  48. {qis-3.0.4 → qis-3.0.5}/qis/examples/universe_corrs.py +0 -0
  49. {qis-3.0.4 → qis-3.0.5}/qis/examples/vix_beta_to_equities_bonds.py +0 -0
  50. {qis-3.0.4 → qis-3.0.5}/qis/examples/vix_conditional_returns.py +0 -0
  51. {qis-3.0.4 → qis-3.0.5}/qis/examples/vix_spy_by_year.py +0 -0
  52. {qis-3.0.4 → qis-3.0.5}/qis/examples/vix_tenor_analysis.py +0 -0
  53. {qis-3.0.4 → qis-3.0.5}/qis/examples/vol_without_weekends.py +0 -0
  54. {qis-3.0.4 → qis-3.0.5}/qis/file_utils.py +0 -0
  55. {qis-3.0.4 → qis-3.0.5}/qis/local_path.py +0 -0
  56. {qis-3.0.4 → qis-3.0.5}/qis/models/README.md +0 -0
  57. {qis-3.0.4 → qis-3.0.5}/qis/models/__init__.py +0 -0
  58. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/__init__.py +0 -0
  59. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/auto_corr.py +0 -0
  60. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/corr_cov_matrix.py +0 -0
  61. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/ewm.py +0 -0
  62. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/ewm_convolution.py +0 -0
  63. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/ewm_factors.py +0 -0
  64. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/ewm_winsor_outliers.py +0 -0
  65. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/pca.py +0 -0
  66. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/plot_correlations.py +0 -0
  67. {qis-3.0.4 → qis-3.0.5}/qis/models/linear/ra_returns.py +0 -0
  68. {qis-3.0.4 → qis-3.0.5}/qis/models/stats/__init__.py +0 -0
  69. {qis-3.0.4 → qis-3.0.5}/qis/models/stats/bootstrap.py +0 -0
  70. {qis-3.0.4 → qis-3.0.5}/qis/models/stats/ohlc_vol.py +0 -0
  71. {qis-3.0.4 → qis-3.0.5}/qis/models/stats/rolling_stats.py +0 -0
  72. {qis-3.0.4 → qis-3.0.5}/qis/models/stats/test_bootstrap.py +0 -0
  73. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/README.md +0 -0
  74. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/__init__.py +0 -0
  75. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/cond_regression.py +0 -0
  76. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/config.py +0 -0
  77. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/desc_table.py +0 -0
  78. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/fx_ops.py +0 -0
  79. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/perf_stats.py +0 -0
  80. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/regime_classifier.py +0 -0
  81. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/returns.py +0 -0
  82. {qis-3.0.4 → qis-3.0.5}/qis/perfstats/timeseries_bfill.py +0 -0
  83. {qis-3.0.4 → qis-3.0.5}/qis/plots/README.md +0 -0
  84. {qis-3.0.4 → qis-3.0.5}/qis/plots/__init__.py +0 -0
  85. {qis-3.0.4 → qis-3.0.5}/qis/plots/bars.py +0 -0
  86. {qis-3.0.4 → qis-3.0.5}/qis/plots/contour.py +0 -0
  87. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/__init__.py +0 -0
  88. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/data_timeseries.py +0 -0
  89. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/desc_table.py +0 -0
  90. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/drawdowns.py +0 -0
  91. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/prices.py +0 -0
  92. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/regime_class_table.py +0 -0
  93. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/regime_data.py +0 -0
  94. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/regime_pdf.py +0 -0
  95. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/regime_scatter.py +0 -0
  96. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/returns_heatmap.py +0 -0
  97. {qis-3.0.4 → qis-3.0.5}/qis/plots/derived/returns_scatter.py +0 -0
  98. {qis-3.0.4 → qis-3.0.5}/qis/plots/errorbar.py +0 -0
  99. {qis-3.0.4 → qis-3.0.5}/qis/plots/heatmap.py +0 -0
  100. {qis-3.0.4 → qis-3.0.5}/qis/plots/histogram.py +0 -0
  101. {qis-3.0.4 → qis-3.0.5}/qis/plots/histplot2d.py +0 -0
  102. {qis-3.0.4 → qis-3.0.5}/qis/plots/lineplot.py +0 -0
  103. {qis-3.0.4 → qis-3.0.5}/qis/plots/pie.py +0 -0
  104. {qis-3.0.4 → qis-3.0.5}/qis/plots/qqplot.py +0 -0
  105. {qis-3.0.4 → qis-3.0.5}/qis/plots/reports/__init__.py +0 -0
  106. {qis-3.0.4 → qis-3.0.5}/qis/plots/reports/econ_data_single.py +0 -0
  107. {qis-3.0.4 → qis-3.0.5}/qis/plots/reports/gantt_data_history.py +0 -0
  108. {qis-3.0.4 → qis-3.0.5}/qis/plots/reports/price_history.py +0 -0
  109. {qis-3.0.4 → qis-3.0.5}/qis/plots/reports/utils.py +0 -0
  110. {qis-3.0.4 → qis-3.0.5}/qis/plots/scatter.py +0 -0
  111. {qis-3.0.4 → qis-3.0.5}/qis/plots/stackplot.py +0 -0
  112. {qis-3.0.4 → qis-3.0.5}/qis/plots/table.py +0 -0
  113. {qis-3.0.4 → qis-3.0.5}/qis/plots/time_series.py +0 -0
  114. {qis-3.0.4 → qis-3.0.5}/qis/plots/utils.py +0 -0
  115. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/README.md +0 -0
  116. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/__init__.py +0 -0
  117. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/backtester.py +0 -0
  118. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/ewm_portfolio_risk.py +0 -0
  119. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/portfolio_data.py +0 -0
  120. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/__init__.py +0 -0
  121. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/brinson_attribution.py +0 -0
  122. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/config.py +0 -0
  123. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/multi_assets_factsheet.py +0 -0
  124. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/multi_strategy_factseet_pybloqs.py +0 -0
  125. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/multi_strategy_factsheet.py +0 -0
  126. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/strategy_benchmark_factsheet_pybloqs.py +0 -0
  127. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/strategy_factsheet.py +0 -0
  128. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/reports/strategy_signal_factsheet.py +0 -0
  129. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/strats/__init__.py +0 -0
  130. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/strats/quant_strats_delta1.py +0 -0
  131. {qis-3.0.4 → qis-3.0.5}/qis/portfolio/strats/seasonal_strats.py +0 -0
  132. {qis-3.0.4 → qis-3.0.5}/qis/sql_engine.py +0 -0
  133. {qis-3.0.4 → qis-3.0.5}/qis/test_data.py +0 -0
  134. {qis-3.0.4 → qis-3.0.5}/qis/utils/README.md +0 -0
  135. {qis-3.0.4 → qis-3.0.5}/qis/utils/__init__.py +0 -0
  136. {qis-3.0.4 → qis-3.0.5}/qis/utils/dates.py +0 -0
  137. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_agg.py +0 -0
  138. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_cut.py +0 -0
  139. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_freq.py +0 -0
  140. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_groups.py +0 -0
  141. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_melt.py +0 -0
  142. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_ops.py +0 -0
  143. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_str.py +0 -0
  144. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_to_scores.py +0 -0
  145. {qis-3.0.4 → qis-3.0.5}/qis/utils/df_to_weights.py +0 -0
  146. {qis-3.0.4 → qis-3.0.5}/qis/utils/generic.py +0 -0
  147. {qis-3.0.4 → qis-3.0.5}/qis/utils/np_ops.py +0 -0
  148. {qis-3.0.4 → qis-3.0.5}/qis/utils/ols.py +0 -0
  149. {qis-3.0.4 → qis-3.0.5}/qis/utils/sampling.py +0 -0
  150. {qis-3.0.4 → qis-3.0.5}/qis/utils/struct_ops.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: qis
3
- Version: 3.0.4
3
+ Version: 3.0.5
4
4
  Summary: Implementation of visualisation and reporting analytics for Quantitative Investment Strategies
5
5
  License: LICENSE.txt
6
6
  Keywords: quantitative,investing,portfolio optimization,systematic strategies,volatility
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "qis"
3
- version = "3.0.4"
3
+ version = "3.0.5"
4
4
  description = "Implementation of visualisation and reporting analytics for Quantitative Investment Strategies"
5
5
  license = "LICENSE.txt"
6
6
  authors = ["Artur Sepp <artursepp@gmail.com>"]
@@ -50,6 +50,11 @@ pyarrow = ">=10.0.1"
50
50
  fsspec = ">=2022.11.0"
51
51
  yfinance = ">=0.1.38"
52
52
 
53
+ #[build-system]
54
+ #requires = ["poetry-core>=1.0.0"]
55
+ #
56
+
53
57
  [build-system]
54
- requires = ["poetry-core>=1.0.0"]
55
- build-backend = "poetry.core.masonry.api"
58
+ requires = ["poetry-core>=1.0.0", "hatchling==1.27.0", "hatch-vcs"]
59
+ #build-backend = "hatchling.build"
60
+ build-backend = "poetry.core.masonry.api"
@@ -552,6 +552,7 @@ def run_unit_test(unit_test: UnitTests):
552
552
  hue_var_name='instruments',
553
553
  y_var_name='weights',
554
554
  ylabel='weights',
555
+ legend_loc=None,
555
556
  showmedians=True,
556
557
  add_y_median_labels=True)
557
558
 
@@ -125,6 +125,8 @@ def plot_ra_perf_table_benchmark(prices: pd.DataFrame,
125
125
  fontsize: int = 10,
126
126
  transpose: bool = False,
127
127
  alpha_an_factor: float = None,
128
+ is_convert_to_str: bool = True,
129
+ df_to_add: pd.DataFrame = None,
128
130
  ax: plt.Subplot = None,
129
131
  **kwargs
130
132
  ) -> Tuple[Optional[plt.Figure], pd.DataFrame]:
@@ -138,10 +140,19 @@ def plot_ra_perf_table_benchmark(prices: pd.DataFrame,
138
140
  perf_columns=perf_columns,
139
141
  column_header=column_header,
140
142
  alpha_an_factor=alpha_an_factor,
143
+ is_convert_to_str=is_convert_to_str,
141
144
  **kwargs)
142
145
  if not drop_benchmark and special_rows_colors is None:
143
146
  special_rows_colors = [(1, 'skyblue')] # for benchmarl separation
144
147
  kwargs = sop.update_kwargs(kwargs, dict(special_rows_colors=special_rows_colors))
148
+
149
+ if df_to_add is not None:
150
+ df_to_add = df_to_add.reindex(index=ra_perf_table.index)
151
+ if is_convert_to_str:
152
+ df_to_add = df_to_add.fillna('')
153
+ ra_perf_table = pd.concat([ra_perf_table, df_to_add], axis=1)
154
+
155
+
145
156
  fig = ptb.plot_df_table(df=ra_perf_table,
146
157
  transpose=transpose,
147
158
  special_columns_colors=special_columns_colors,
@@ -427,6 +427,9 @@ class MultiPortfolioData:
427
427
  time_period: TimePeriod = None,
428
428
  perf_params: PerfParams = PERF_PARAMS,
429
429
  perf_columns: List[PerfStat] = rpt.BENCHMARK_TABLE_COLUMNS,
430
+ strategy_idx: int = 0,
431
+ benchmark_idx: int = 1,
432
+ add_turnover: bool = False,
430
433
  ax: plt.Subplot = None,
431
434
  **kwargs
432
435
  ) -> pd.DataFrame:
@@ -437,6 +440,14 @@ class MultiPortfolioData:
437
440
  drop_benchmark = False
438
441
  ra_perf_title = f"RA performance table for {perf_params.freq_vol}-freq returns with beta to {benchmark}: " \
439
442
  f"{qis.get_time_period(prices).to_str()}"
443
+
444
+ if add_turnover:
445
+ turnover = self.get_turnover(time_period=time_period, **kwargs)
446
+ turnover = turnover.mean(axis=0).to_frame('Turnover')
447
+ df_to_add = qis.df_to_str(turnover, var_format='{:,.0%}')
448
+ else:
449
+ df_to_add = None
450
+
440
451
  fig, ra_perf_table = ppt.plot_ra_perf_table_benchmark(prices=prices,
441
452
  benchmark=benchmark,
442
453
  perf_params=perf_params,
@@ -444,6 +455,7 @@ class MultiPortfolioData:
444
455
  drop_benchmark=drop_benchmark,
445
456
  title=ra_perf_title,
446
457
  rotation_for_columns_headers=0,
458
+ df_to_add=df_to_add,
447
459
  ax=ax,
448
460
  **kwargs)
449
461
  return ra_perf_table
@@ -598,7 +610,24 @@ class MultiPortfolioData:
598
610
  **kwargs)
599
611
  if benchmark is not None:
600
612
  self.add_regime_shadows(ax=ax, regime_benchmark=benchmark, index=diff.index, regime_params=regime_params)
601
-
613
+
614
+ def get_turnover(self,
615
+ time_period: TimePeriod = None,
616
+ turnover_rolling_period: Optional[int] = 12,
617
+ freq_turnover: Optional[str] = 'ME',
618
+ is_unit_based_traded_volume: bool = True,
619
+ **kwargs
620
+ ):
621
+ turnover = []
622
+ for portfolio in self.portfolio_datas:
623
+ turnover.append(portfolio.get_turnover(roll_period=turnover_rolling_period, freq=freq_turnover, is_agg=True,
624
+ is_unit_based_traded_volume=is_unit_based_traded_volume).rename(
625
+ portfolio.nav.name))
626
+ turnover = pd.concat(turnover, axis=1)
627
+ if time_period is not None:
628
+ turnover = time_period.locate(turnover)
629
+ return turnover
630
+
602
631
  def plot_turnover(self,
603
632
  benchmark: str = None,
604
633
  time_period: TimePeriod = None,
@@ -609,14 +638,10 @@ class MultiPortfolioData:
609
638
  is_unit_based_traded_volume: bool = True,
610
639
  ax: plt.Subplot = None,
611
640
  **kwargs) -> None:
612
-
613
- turnover = []
614
- for portfolio in self.portfolio_datas:
615
- turnover.append(portfolio.get_turnover(roll_period=turnover_rolling_period, freq=freq_turnover, is_agg=True,
616
- is_unit_based_traded_volume=is_unit_based_traded_volume).rename(portfolio.nav.name))
617
- turnover = pd.concat(turnover, axis=1)
618
- if time_period is not None:
619
- turnover = time_period.locate(turnover)
641
+
642
+ turnover = self.get_turnover(turnover_rolling_period=turnover_rolling_period, freq_turnover=freq_turnover,
643
+ is_unit_based_traded_volume=is_unit_based_traded_volume,
644
+ time_period=time_period)
620
645
  freq = pd.infer_freq(turnover.index)
621
646
  turnover_title = f"{turnover_rolling_period}-period rolling {freq}-freq Turnover"
622
647
  pts.plot_time_series(df=turnover,
@@ -542,6 +542,7 @@ def weights_tracking_error_report(multi_portfolio_data: MultiPortfolioData,
542
542
  add_benchmarks_to_navs=add_benchmarks_to_navs,
543
543
  perf_params=perf_params,
544
544
  time_period=time_period,
545
+ add_turnover=True,
545
546
  ax=ax,
546
547
  **kwargs)
547
548
  dfs['ra_perf_table'] = ra_perf_table
@@ -3,6 +3,7 @@
3
3
  # remove from git tracking:
4
4
  # git rm -r --cached setting.yaml
5
5
 
6
+
6
7
  RESOURCE_PATH:
7
8
  "..\\"
8
9
 
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
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